Архив рубрики: CLEV3R для LEGO EV3

Статьи про среду разработки программ CLEV3R и примеры программ. Эта среда разработки позволила использовать монитор блока LEGO EV3. Созданы игры с интерактивным управлением.

Экран LEGO EV3 с русскими буквами

LEGO EV3 научился писать по-русски!

Блок LEGO EV3 является настоящим компьютером с операционной системой и другими атрибутами компьютера. Но это маленький и специализированный компьютер. Поэтому есть всяческие особенности. Блок EV3 может работать только с латинскими (английскими) символами (буквами).

На просторах интернета обнаружен пакет для вывода русских букв на дисплей блока EV3 для среды разработки Clever (встречаются ещё такие варианты написания названия этой среды разработки — clEV3r или CLEV3R). Пакет называется EV3_Basic_Plus_Russian.

Общие впечатления о работе с модулем

Пакет EV3_Basic_Plus_Russian имеет недостатки, поэтому я решил сначала о них написать. Так вам будет понятно, нужно вам его скачивать или нет.

Для начала, всё-таки, главный плюс — это работает и даёт возможность не очень сложными действиями вывести текст на русском языке на дисплей. Ещё плюс, что пакет снабжён подробными пояснениями и есть возможность изменять кодировку растра. Вносить изменения я не пробовал, но уже хочется.

Заметно увеличивается время компиляции простой программы. Если программа использует и другие модули, то возможно время компиляции не сильно изменится. Но если программа простая, то компиляция перестаёт пролетать моментально.

Вывод текста на дисплей происходит очень медленно. Вместо 3 — 5 миллисекунд английскими буквами получается 1,5 секунды русскими.

Не работает связка команд StopUpdate — Update. Выглядит так — будто блок EV3 с трудом понимает русский язык и медленно прорисовывает буквы. Я не смог остановить обновление командой StopUpdate, хотя перепробовал все варианты.

В итоге, я планирую использовать этот модуль в неспешных частях программ. Например, в начальных пояснениях или при вводе данных кнопками. В процессе экранной игры попытка вывести на дисплей русские буквы приостановит игру.

Где скачать и как установить?

Скачать можно с платформы github.com. Там выложены все необходимые файлы.

Ссылка на страницу с пакетом: https://github.com/Avdor1963/EV3_Basic_Plus_Russian

Скриншот страницы GitHub модуля 
EV3_Basic_Plus_Russian

На странице читаем пояснения или сразу жмём на зелёную кнопку «< > Code». В открывшемся выпадающем окне жмём на «Download ZIP». Скачается архив со всеми файлами.

По инструкции в файле Readme.txt скопировал файл LCDRu.xml в папку на компьютере …> clev3r > Help > ru. Сразу появилась «справка» по модулю в среде CLEV3R.

Скриншот размещения файла LCDRu.xml

Справка по модулю LCDRu
Справка по модулю LCDRu

Файлы с шрифтами font8x8_0.fnt, font8x8_1.fnt и font16x16.fnt загрузил в EV3 в папку prjs. Я ещё не разобрался с правильным расположением файлов в EV3 и в среде CLEV3R. Если загружаю файлы шрифтов в папку с программой, то текст на русском не отображается на дисплее блока EV3.

Вместо загрузки файлов шрифтов в EV3 можно запустить программы для пересоздания шрифтов. Это пункт 5 в файле Readme.txt. Размещаем на компьютере в одной папке программы CreateFont8x8_0.bp, CreateFont8x8_1.bp и CreateFont16x16.bp и модули Font8x8_0.bpm, Font8x8_1.bpm и Font16x16.bpm. В среде CLEV3R создаём папку в блоке EV3, например, папку rus в папке prjs. Открываем эту папку rus. В среде CLEV3R открываем и запускаем по очереди программы для пересоздания шрифтов. Создадутся файлы шрифтов в папке prjs в блоке EV3. Теперь можно удалить на EV3 папку rus. Можно проверять.

Пишем русские буквы на LEGO EV3

Создаём новую программу в CLEV3R и указываем куда её сохранять на компьютере. В это же место размещаем файл модуля LCDRu.bpm. В блок EV3 вручную ни чего загружать не требуется. При компиляции автоматически будут созданы дополнительные папки и файлы в блоке EV3.

Папка с программой и модулем LCDRu.bpm
Папка с программой и модулем LCDRu.bpm

Увидев как долго прорисовывает EV3 русские буквы я набросал проверочный тест. Этот тест не является истиной в последней инстанции, но позволяет оценить задержку времени.

import"LCDRu"

Time.Reset1()
LCDRu.Clear()
LCDRu.StopUpdate()
LCDru.Text(1,10,5,2,"LEGO EV3")
LCDRu.TextRU (1,10,25,1,"yfexbkcz gbcfnm")
LCDRu.TextRU (1,10,40,2,"GJ-HECCRB")
Program.Delay(2000)
LCDRu.TextRu(1,20,60,1,"yj \nj yt ghjcnj!")
LCDRu.TextRu(1,5,80,2,"DHTVZ "+Time.Get1())
LCDRu.Update()
Program.Delay(10000)

Time.Reset1()
LCD.Clear()
LCD.StopUpdate()
LCD.Text(1,10,5,2,"LEGO EV3")
LCD.Text(1,10,25,1,"wants to write only")
Program.Delay(2000)
LCD.Text(1,0,35,2,"in English")
LCD.Text(1,5,80,2,"TIME "+Time.Get1())
LCD.Update()
Program.Delay(10000)

В первой части программы используются методы LCDRu, а во второй только стандартные LCD. Программа должна очистить дисплей, примерно через 2 секунды вывести на дисплей надписи на русском. Фактически программа после очистки дисплея сразу начинает рисовать буквы. Затем задержка 2 секунды и продолжает вырисовывать буквы. Таймер успевает насчитать порядка 3598 миллисекунд. Вычитая 2 секунды задержки, понимаем, что буквы рисовались 1,5 секунды!

Экран LEGO EV3 с русскими буквами
Экран LEGO EV3 с русскими буквами

Во второй части программы всё выполняется по программе. Очистка дисплея, пауза порядка 2 секунд и появление всего текста по команде LCD.Update(). Таймер успевает насчитать 2008 миллисекунд. Вычитая 2 секунды задержки, очевидно, что работа с латинскими символами заняла порядка 8 миллисекунд.

Надписи на дисплее LEGO EV3 при тесте на скорость методов LCD
Дисплей LEGO EV3 при тесте на скорость методов LCD

Прошу в комментариях указать, если я не правильно что-то описал. Как можно ускорить работу с русскими словами?

Короткое видео про вывод русских букв на LEGO EV3

Видео просто показывает, что на дисплее блока EV3 выводятся текст на русском. Ни какой исследовательской ценности в ролике нет. Скорее видео информирует о существовании сайта robiki.ru Но на канале есть другие интересные видеоролики и не только про LEGO.

Ссылка на видео: https://youtube.com/shorts/fO46urSJZf4

LEGO птички для игры Flappy Bird

Игра Flappy Bird на LEGO EV3 в CLEV3R

Рассмотрим как написать простую игру для LEGO EV3 в CLEV3R. Про среду CLEV3R можно найти материалы на сайте разработчика clev3r.ru

Программа рабочая. Пока пишу статью и пока снимал видеоролик много раз успел поиграть. Мой рекорд 80 очков, хотя мой сын смог набрать аж 107.

Листинг (текст) программы целиком есть в конце статьи. Можно копировать и вставлять. После листинга ссылка на файл архива. В не архивированном виде не получилось разместить на сайте.

Видеоролик написания программы с проверками результата

Видеоролик показывает написание программы с небольшими пояснениями. На канале есть ещё несколько видео посвященных LEGO конструкциям.

https://youtu.be/ClRLi08aQcY

Если видео не получается просмотреть, напишите в комментариях и я попробую разместить на другой площадке.

Координаты на экране блока LEGO EV3

Экран блока LEGO EV3 является жидкокристаллическим индикатором ЖКИ или на английский манер LCD. Координаты объектов на экране задаются в пикселях (в точках). Каждая точка может быть в одном из двух состояний — черная (тёмная) или белая (светлая). Когда EV3 выключен или после выполнения команды LCD.Clear() все пиксели экрана в состоянии светлая.

Начало координат в левом верхнем углу экрана. Координата самого левого верхнего пикселя x=0 и y=0. Всего столбцов точек по горизонтали, по координате x 178 штук, а строк точек по вертикали, по координате y 128 штук. Получается, что координата самой правой нижней точки x=177 и y=127.

Общее описание программы

Программа получилась простая, но выделить разделы в ней можно.

Начальные установки программы игры

Присваиваем начальные значения переменным и константам. Здесь нет разделения на переменные и константы. Некоторые переменные имеют одно значение, не меняют его в процессе выполнения программы. Например, коэффициент гравитации g.

Некоторые переменные периодически меняют своё значение. Например, координата птицы по вертикали yb.

Функция для вывода на экран изображений препятствий — труб. Бывает удобно выделить определённую последовательность команд в отдельный блок, в отдельную функцию. Например, если одну и ту же последовательность требуется выполнить в разных местах программы. При такой организации удобно настраивать программу. Изменения вносить в одном месте легче, чем копировать несколько раз.

Функция в программе игры Flappy Bird
Оформление начала игры Flappy Bird

Эта группа команд устанавливает режим датчика, обнуляет таймер и делает начало программы более заметным. Для заметности поручам блоку EV3 пикнуть и отобразить на экране надпись.

Главный, основной цикл программы получился длинный, поэтому только кусок на картинке. Внутри этого цикла есть ещё цикл и условия и формулы. Пока мы играем в игру, программа выполняет этот цикл.

Начало главного цикла игры Flappy Bird
Финальное оформление игры Flappy Bird

После завершения игры и соответственно выхода из главного цикла, блок EV3 пикает и отображает на экране набранные очки. Назовём эту часть программы: «декоративное оформление конца игры».

Если возникают сложности с пониманием работы программы, напишите в комментариях и я сделаю пояснения.

Текст программы игры Flappy Bird

t=100 'время между прорисовками
yb=30 'положение птички по вертикали
xb=15 'положение птички по горизонтали
vy=0 ' скорость птички по вертикали
g=1 'коэффициент гравитации
vymax=5 'максимальная скорость снижения высоты птички
vfl=-3 'скорость птички вверх после нажатия кнопки
x1=178 'положение по горизонтали препятствия 1
x2=267 'положение по горизонтали препятствия 2
y1=64 'положение коридора в препятствии 1 по вертикали
y2=64 'положение коридора в препятствии 2 по вертикали
vx=-3 'скорость перемещения препятствий по горизонтали
c=3 'количество допустимых столкновений
c1=0 'флаг для исключения многократных срабатываний при одном столкновении
s=0 'количество набранных очков

Function Tube(in number Xt, in number Yt) 'функция прорисовки препятствия
  LCD.FillRect(1,Xt-10,0,20,128)
  LCD.FillRect(1,Xt-12,Yt-25,24,50)
  LCD.FillRect(0,Xt-12,Yt-20,24,40)
EndFunction

Sensor.SetMode(1,0) 'установка режима датчика порта 1

Speaker.Tone(30,500,200)
LCD.Clear()
LCD.Text(1,20,20,2,"START")
Program.Delay(1000)
Time.Reset1() 'обнуление таймера для отслеживания времени между прорисовками

While yb>0 And yb<127 'основной цикл пока птичка не вылетела за дисплей
  
  LCD.Clear() 'прорисовка во время игры
  Tube(x1,y1) 'переход в функцию прорисовки препятствия с координатами 1
  Tube(x2,y2) 'переход в функцию прорисовки препятствия с координатами 2
  LCD.Text(1,30,110,2,"health "+c) 'выводим на дисплей количество возможных столкновений
  LCD.Text(1,30,10,2,"SCORE "+s) 'выводим количество набранных очков
  LCD.FillCircle(1,xb,yb,5) 'птицу рисую кружком
  LCD.Update()
  LCD.StopUpdate()
  
  While Time.Get1()<t 'цикл отслеживающий нажатия кнопки и датчика касания длится пока длится время между прорисовками
    If Sensor.ReadPercent(1)>10 Or Buttons.GetClicks()="U" Then
      vy=vfl 'при нажатии кнопки скорость птички по вертикали становится равной скорости птички вверх
    EndIf
  EndWhile
  
  Time.Reset1() 'обнуление таймера
  t=100-(s/1.5) 'время между прорисовками уменьшается при увеличении количества набранных очков
  yb+=vy 'корректируем положение птички по вертикали
  If vy<vymax-g Then 'если скорость не очень большая, то увеличиваем
    vy+=g 'корректируем скорость птички по вертикали
  Else
    vy=vymax 'скорость птички по вертикали приравниваем заданному vymax
  EndIf
  
  If x1>0 Then 'если препятствие 1 не достигло левого края дисплея
    x1+=vx 'смещаем препятствие влево по дисплею
  Else
    x1=178 'перемещаем препятствие к правому краю дисплея
    s++ 'добавляем набранное очко
    c1=0 'сбрасываем флаг защиты от многократной фиксации одного столкновения
    Speaker.Tone(20,400,100)    
    If y1<100 Then 'если координата середины коридора препятствия 1 не слишком велика
      y1+=11 ' увеличиваем координату середины коридора
    Else
      y1-=80 'уменьшаем координату коридора, поднимаем к верхнему краю экрана
    EndIf
  EndIf
  
  If x2>0 Then 'аналогично для препятствия 2
    x2+=vx
  Else
    x2=178
    s++
    c1=0
     Speaker.Tone(20,300,100) 
    If y2>25 Then
      y2-=13
    Else
      y2+=80
    EndIf
  EndIf
  
  If (Math.Abs(x1-xb)<=10 And Math.Abs(y1-yb)>20 Or Math.Abs(x2-xb)<=10 And Math.Abs(y2-yb)>20) And c1=0 Then 'по координатам проверяем столкновение птицы с препятствиями
    c-- 'уменьшаем количество возможных столкновений
    c1=1 'устанавливаем флаг против многократной фиксации одного столкновения
    LCD.Clear() 'декоративное оформление столкновения
    LCD.FillRect(1,15,15,150,100)
    LCD.Text(0,40,30,2,"B A H !")
    LCD.Update()
    LCD.StopUpdate()
    Speaker.Tone(40,1500,100)
    Speaker.Tone(30,1200,100)
    Program.Delay(1000)
    Time.Reset1() 'обнуляем таймер, исключаем влияние столкновения на время до следующих прорисовок
  EndIf
  
  If c<0 Then 'выходим из основного цикла игры если закончилось количество возможных столкновений
    break
  EndIf
  
  
EndWhile 'конец основного цикла игры

Speaker.Tone(30,200,200) 'сигнал завершения игры
Speaker.Tone(30,300,200)
Speaker.Tone(30,100,400)
LCD.Clear()
LCD.Text(1,20,20,2,"The end")
LCD.Text(1,30,70,2,"SCORE "+s) 'выводим количество набранных очков
LCD.Update()
Program.Delay(3000)

Файл для скачивания

Можно скопировать программу прямо со странички сайта, а можно скачать файл и открыть его в CLEV3R.

Круг на экране блока LEGO EV3

Пример простой программы в CLEV3R

Для начала программирования может не хватать примеров простых программ. Очевидные для опытных программистов вещи могут быть не понятны начинающим. Даже употребление распространенных во многих языках операторов может вызывать затруднения. На примерах легче понять синтаксис и логику работы программ.

В среде программирования CLEV3R есть справочные описания, но нет примеров программ. У меня накопилось много интересных и довольно простых программ. К сожалению, я не могу утверждать, что использую оптимальные способы программирования. Предлагаю рассматривать все программы как образец рабочей программы, как возможный вариант.

Для начала предлагаю программу в которой два цикла, звуковые сигналы и рисование окружностей на экране.

CLEV3R пример программы
CLEV3R пример программы

Эта же программа с комментариями.

Пример программы с комментариями в CLEV3R
Пример программы с комментариями в CLEV3R

Слишком много комментариев тоже плохо. Программа стала нечитаемой. По хорошему, комментарии не должны пояснять работу операторов, функций и синтаксис. Комментарии должны пояснять за что отвечают переменные и какую функцию выполняют блоки программы.

Для каждой программы удобно создать отдельную папку в блоке EV3 с помощью CLEV3R. Все файлы относящиеся к конкретной программе будут в папке. Легче наводить порядок.

Саму программу можно набрать вручную непосредственно в редакторе в CLEV3R, а можно открыть готовый файл программы скачанный с сайта. Просто файл с расширением bp не получилось разместить, разместил архив с этим файлом. Кстати, можно просматривать файлы листинга программы в текстовом редакторе, например, в редакторе «Блокнот».

For i=20 To 5 Step -0.5 
  Speaker.Tone( i*5, i*100, 50)
  Speaker.Wait()
EndFor
LCD.Clear()
b=3
While b<100
  LCD.Circle(1,89,64,b)
  Program.Delay(30)
  b+=1
EndWhile
Program.Delay(2000)

Можно скопировать текст программы в среду CLEV3R. Для тренировки, попробуйте все способы.

Программа Krugi работает в EV3
Программа Krugi запущена на LEGO EV3
Внешний вид среды разработки CLEV3R

CLEV3R — новая среда разработки для EV3

Недавно заметил на просторах интернета новую среду разработки программ для LEGO EV3. Сайт разработчиков https://clev3r.ru/

Вступление

Скачать и установить на компьютер очень просто. Блок EV3 подключать к компьютеру через bluetooth получилось не сразу. Это от моего непонимания процесса подключения к компьютеру. Блок EV3 ранее уже был подключен к компьютеру через bluetooth и это подключение использовалось программой LEGO MINDSTORMS Education EV3. В компьютере в настройках в списке устройств было устройство EV3 со статусом «Сопряжено». Через CLEV3R удалось подключиться после удаления устройства EV3 из списка устройств.
В этой статье я хочу поделиться своими впечатлениями и начать цикл статей о CLEV3R с предусловием: пока хочу и есть возможность.

Впечатления о CLEV3R

Мне очень понравилась эта среда разработки. Только положительные эмоции. Хотя, неудачно попробовав использовать массивы, мы завесили блок EV3 и сбросили его до заводских настроек. Ни разу не столкнулся ни с лагами (подвисаниями) ни с багами (ошибками). Программирование ведётся на языке Basic Plus — это полноценный и адаптированный для EV3 язык программирования. Удобно, что не требуется производить специальных действий с самим блоком EV3.

С ev3basic без CLEV3R я не сталкивался, поэтому буду сравнивать с LEGO MINDSTORMS Education EV3 и с EV3 Classroom.

Во первых, в CLEV3R можно управлять файлами, записанными на блок EV3, а в LEGO MINDSTORMS Education EV3 и EV3 Classroom этого делать, насколько я знаю, нельзя.
Во вторых, в CLEV3R есть удобная справка, а в LEGO MINDSTORMS Education EV3 и EV3 Classroom её нету.
В третих, когда делаешь большую программу в LEGO MINDSTORMS Education EV3, то он начинает лагать, в CLEV3R такого не замечено.
В четвертых, при компиляции в CLEV3R происходит проверка синтаксиса.

Сравнение внешнего вида программ

Самый не удобный, на мой взгляд, вид программы это блочный в LEGO MINDSTORMS Education EV3. По началу мне нравилось, что можно запустить несколько веток программы одновременно. При разрастании программы читать её становится сложно и интерфейс сильно тормозит.

Программа игры "Flappy bird" в LEGO MINDSTORMS Education EV3
Программа игры Flappy bird в LEGO MINDSTORMS Education EV3

В EV3 Classroom более привычный и очень наглядный внешний вид программы. Есть перебор с упрощениями для юных программистов, но в целом очень хороший вариант. Удобная работа с переменными, можно проводить вычисления. Из недостатков, пожалуй, только отсутствие возможности рисовать на экране блока EV3. Говорят, есть временные задержки при работе с датчиками и моторами, но я пока не могу их оценить.

Программа шахматных часов в EV3 Classroom
Программа шахматных часов в EV3 Classroom

В CLEV3R программа достаточно наглядно выглядит. Есть возможность работать с файлами, есть возможность рисовать на экране блока EV3. Говорят, что временные задержки при работе с датчиками и моторами меньше чем в описанных выше языках программирования блока EV3.

Фрагмент программы в среде CLEV3R
Программа в среде CLEV3R

Итоги и планы

На данный момент, я считаю CLEV3R наиболее полноценным и удобным вариантом программирования блока EV3. Когда мой сын обнаружил эту среду разработки программ, то у него произошёл взрывной подъём интереса к программированию.

На страницах сайта robiki.ru я планирую разместить несколько примеров программ для блока EV3. Надеюсь на отклик энтузиастов.