Информатизация и образование

Высшее образование - Информационная поддержка: новости ГИА и ЕГЭ, электронное обучение, библиотеки, программное обеспечение и борьба с плагиатом

  • Full Screen
  • Wide Screen
  • Narrow Screen
  • Increase font size
  • Default font size
  • Decrease font size

Lego EV3 Basic: краткое руководство

I. Экран, кнопки на блоке, подсветка блока, динамик

 

1.    Экран

 

EV3 имеет черно-белый экран с разрешением 178 x 128 пикселей. Левый верхний угол экран имеет координаты (0,0), правый нижний (178,128).

Для работы с экраном EV3 Бейсик имеет следующие команды:

LCD.BmpFile(цвет, xy, имя_файла) выводит к заданных координатах картинку из файла RGF. Может содержать путь к файлу. Файл можно создать в официальном ПО от LEGO.

LCD.Clear() Очищает экран

LCD.Circle(цвет, xy, радиус) Рисует круг заданного радиуса к указанных координатах

LCD.FillCircle(цвет, xy, радиус) Рисует закрашенный круг заданного радиуса к указанных координатах

LCD.Rect (цвет, xy, ширина, высота) Рисует прямоугольник заданных размеров к указанных координатах

LCD.FillRect (цвет, xy, ширина, высота) Рисует закрашенный прямоугольник заданных размеров к указанных координатах

LCD.InverseRect (xy, ширина, высота) Инвертирует (меняет на противоположный) цвет пикселей в указанной прямоугольной области

LCD.Line (цвет, x1, y1, x2, y2) Рисует линию из точки x1, y1 в точку x2, y2

LCD.Pixel (цвет, xy) Закрашивает пиксель указанным цветом

LCD.Text (цвет, xy, размер, "текст") Пишет текст заданного размера и цвета в указанной позиции

LCD.Write (xy, "текст") Пишет текст среднего размера в позиции  xy

LCD.StopUpdate () Перестает обновлять экран до вызова LCD.Updateнакапливая изменения

LCD.Update () Выводит все накопленные изменения после LCD.StopUpdate на экран

Программирование традиционно начинают с вывода Hello, World!

LCD.Clear() ' очищаем экран

LCD.write(45,60,"Hello World")  ' печатаем начиная с точки (45,60) на экране

Program.Delay(10000)    ' ждем 10 секунд прежде чем завершить программу

Команда LCD.write печатает текст всегда среднего размера, чтобы напечатать текст меньшего 0, среднего 1 или большого 2 размера изменив в программе оператор наLCD.text

LCD.Clear()

LCD.text(1,0,55,2,"Hello World")      '1=черный цвет, пишем начиная с (0,55),  2=размер

Program.Delay(10000)       'ждем чтобы успеть рассмотреть результат

Размер 1 и 0 одинаков, но 1 – более жирный. Размер 0 очень мелкий, трудно рассмотреть текст, зато можно уместить 22 символа в строке и около 10 строк на экране при размере символа 12 пикселей по высоте. Большой шрифт имеет символы в высоту около 20 пикселей, в строке умещается 11 символов и строк может быть до 6. Если Вам нужно напечатать несколько строк текста, хорошая идея выключить обновление экрана функцией LCD.StopUpdate, напечатать текст, затем включить обновление функцией LCD.Update выведя весь текст за раз.

2.    Кнопки на блоке

Блок EV3 имеет 6 кнопок, но только 5 из них может использовать EV3 Бейсик. Шестая кнопка (Назад) завершает выполняющуюся программу. Кнопки обозначаются так: Вверх (U), Вниз (D), Влево (L), Вправо (R) и  Ввод (E). Для работы с кнопками имеются следующие команды:

Buttons.Current Возвращает коды кнопок в моменты, когда они нажаты. Например, если вызвать функция в момент, когда Вы удерживаете Влево и Вверх, то функция выдаст строку "LU".

Buttons.Wait() waits Ждет, пока одна из кнопок не будет нажата и отпущена.

Buttons.GetClicks() Проверяет, какие кнопки были нажали с момента последнего вызова GetClicks и возвращает строку, с их перечислением

Buttons.Flush() Удаляет из памяти состояния всех кнопок. Последующие вызовыGetClicks выдаст только кнопки, которые были нажаты после вызова этой функции.

Следующая программа ждет нажатия кнопок и выводит на экран соответствующие им символы

Buttons.Wait()

LCD.Clear()

LCD.Text(1,70,35,2,"You")

LCD.Text(1,35,55,2,"pressed")

LCD.Text(1,80,85,2,Buttons.GetClicks())

Program.Delay(6000)

3.    Подсветка на блоке

EV3 блок имеет подсветку, расположенную под кнопками. Она может загораться зеленым, красным и оранжевым цветом. Есть всего лишь одна команда для управления подсветкой на блоке

EV3.SetLEDColor (Цвет, Эффект) Управляет подсветкой и ее режимом

Цвет может быть "OFF" (выключена), "GREEN" (зеленый), "RED" (красный) or"ORANGE" (оранжевый).

Эффект может быть "NORMAL" (горит постоянно), "FLASH" (вспыхивает) or  "PULSE" (пульсирует).

4.    Динамик

В EV3 Бейсик есть ряд команд для работы с динамиком. По умолчанию при вызове команды, проигрывающей звук программа продолжается и не ждем, пока проигрывание закончится. Чтобы дождаться проигрывания воспользуйтеськомандойSpeaker.Wait().

Speaker.Tone(громкость, частота, длительность) Проигрывает тон указанной частоты. Громкость 0-100, частота в герцах 250-10000. Длительность вмиллисекундах.

Speaker.Note(громкость, нота, длительность) Тоже самое, что и предыдущая, но воспроизводит ноту, от ДО 4 октавы "C4" to СИ седьмой "B7" и полутона в форме "C#5".

Speaker.Play(громкость, имя_файла) Проигрывает звуковой файл формата RSF, имеющийся на блоке. Может содержать путь к файлу. Файл можно создать в официальном ПО от LEGO.

Speaker.Stop() останавливает проигрывающийся звук, файл или тон.

Speaker.Wait() Ждет, пока текущий проигрывающийся звук не закончится.

Пример программы по главам 1-4. Вы можете скопировать ее в EVBasic и запустить, подключив блок EV3. Чтобы программа автоматически красиво отформатировалась Щелкните на код правой кнопкой мыши и выберите «Format Program» .

********************************************************************

LCD.Clear()

LCD.Write(15,55, "Press buttons other")

LCD.Write(40,70, "than 'Back'")

While "True"

   Program.Delay(200)

   'Проверяем пять раз в секунду какие кнопки нажаты

   click = Buttons.GetClicks()   'переменная 'click' содержит символы

   'кнопок, нажатых и отпущенных с момент последнего вызова этой функции

   If click <> "" Then  'Очищаем экран если кнопка нажата

       LCD.Clear()

   EndIf

 

   If Text.IsSubText(click, "U") Then  'Если в строке есть символ "U" (Вверх)

      LCD.Write(0,0, "This is written at")

      LCD.Write(0,10, "(0,0) using LED.Write")

      EV3.SetLEDColor ("OFF", "Normal")

      Speaker.Tone(100, 500, 400)  

      'Играем 500 Гц тон 0.4 секунды на полной громкости

 

   ElseIf Text.IsSubText(click,"D") Then

     LCD.Text(1, 0,12, 0, "This is written at")

     LCD.Text(1, 0,24, 0, "(0,12) using LED.Text")

     LCD.Text(1, 0,36, 0, "in size 0 (small).")

     EV3.SetLEDColor ("RED", "Flash")

     Speaker.Note(50, "D2", 400)  'Играем ноту"D2" 0.4 секунды на 50% громкости

 

   ElseIf Text.IsSubText(click,"L") Then

     LCD.Text(1, 0,12, 1, "This is written at")

     LCD.Text(1, 0,24, 1, "(0,12) using LED.Text")

     LCD.Text(1, 0,36, 1, "in size 1 (medium).")

     EV3.SetLEDColor ("GREEN", "Pulse") 

     'Включаем зеленую пульсирующую подсветку

 

  ElseIf Text.IsSubText(click,"R") Then

    LCD.Text(1, 0,20, 2, "This is")

    LCD.Text(1, 0,40, 2, "made using")

    LCD.Text(1, 0,60, 2, "LED.Text in")

    LCD.Text(1, 0,80, 2, "size 2")

    LCD.Text(1, 0,100, 2, "(large).")

    EV3.SetLEDColor ("ORANGE", "Normal")  'Включаем красную подсветку

   

  ElseIf Text.IsSubText(click,"E") Then

    LCD.Write(0,0,"Circle(1,50,70,30)")

    LCD.Circle(1, 50, 70, 30)  ' color,x,y,radius

    LCD.Write(0,12,"FillRect(1,90,80,60,40)")

    LCD.FillRect (1, 90, 80, 60, 40)   ' color,x,y,width,height

    LCD.Write(0,24,"Line(1,100,50,160,60)")

    LCD.Line(1,100,50,160,60)   ' color,x1,y1,x2,y2

    for i=1 to 3

      EV3.SetLEDColor ("RED", "Normal")

      Program.Delay(500)  'wait 0.5 seconds (500 milliseconds)

      EV3.SetLEDColor ("Green", "Normal")

      Program.Delay(500)

      EV3.SetLEDColor ("Orange", "Normal")

      Program.Delay(500)

    EndFor

  EndIf 

EndWhile

 

'************************************************************

5.    Пользовательские картинки и звуки

EV3 Бейсик может работать только с LEGO-форматами звуков RSF и графики RGF/

Звуки и графика должны быть помещены в папку с проектом с помощью EV3Explorer. Можно использовать звуки и графику из других проектов, указав в имени файла путь, включающий имя проекта, из которого заимствуются ресурсы. Файл можно создать в официальном ПО от LEGO, нарисовав, записав на микрофон, скачав из интернета.

Пример использования пути к файлу:

 

LCD.Clear()

LCD.BmpFile(1, 0, 0, "Images/Angry")  'цвет 1 - черный, x=0,y=0, файл Angry изпроекта (папки) Images

Speaker.Play(100, "Sounds/T-rex roar") ' расширение файла не указывается

Program.Delay(10000) ' ждем 10 секунд

 

II. Использование моторов

 

EV3 Бейсик совместим со средними и большими моторами EV3, а также с моторами NXT и, по большому счету, не делает различий при работе с ними.

EV3 Бейсик имеет 9 команд, которые могут использоваться для управления моторами и только 4 из них достаточно простые, чтобы использоваться начинающими робототехниками: Motor.Move, Motor.MoveSync, Motor.Start и Motor.StartSync. И, конечно же, Вам потребуется Motor.Stop для того, чтобы останавливать мотор.

Команды для работы с моторами используют следующие параметры:

порт – порт EV3, к которому подключен мотор, например "BC". "A". Если моторов в параметре несколько – они всегда в алфавитном порядке.

угол – угол поворота мотораВсегда положительное значение, в случае отрицательного – знак игнорируется. Если мотор нужно вращать в обратную сторону – меняйте знак у скорости, а не у угла! Конвертация оборотов в градусы – умножением на 360 и наоборот.

тормоз = "True", когда после остановки мотор должен затормозить, иначе "False"

скорость – от -100 до 100, знак числа определяет направление

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

 

Motor.Move(порт, скорость, угол, тормоз) - для поворота одного мотор на определенный угол

Пример: Motor.Move("A", 40, 80, "True") – мотор А на скорости 40 повернуть на 80 градусов и затормозить.

Motor.Move(порты, скорость, угол, тормоз) - для поворота нескольких мотор на определенный угол с одинаковой скоростью

Пример: Motor.Move("BC", -30, 720, "True") - моторы B и C на скорости -30 повернуть на 2 оборота (720 градусов) и затормозить.

Motor.MoveSync(порты, скорость1, скорость2, угол, тормоз) – команда используется для того, чтобы робот мог двигаться по изогнутой линии или разворачиваться на месте используя два мотора с разными скоростями вращения, контролируя угол поворота мотора. Скорость1 и скорсоть2 – скорости моторов, от меньшего по алфавиту порта к большему. Угол – угол, на который должен повернуться более быстрый из двух моторов. Команда похожа на блок «Танк» в стандартном ПО LEGO EV3-G/

Пример: Motor.MoveSync("BC", 30, 40, 720, "True") – моторы B и C включить со скоростями 30 и 40 до того момента, пока мотор C не сделает два оборота (720 градусов), затем затормозить.

 

Примеры использования при работе мотора заданный промежуток времени:

Чтобы мотор работал определенный промежуток времени нужно запустить его, подождать командой Program.Delay и выключить командой Motor.Stop

Motor.Start(порты, скорость) - чтобы включить один или более моторов определенной (одинаковой для нескольких) скоростью.

Пример: включаем моторы B и С на 3 секунды со скоростью 80

    Motor.Start("BC",80)

    Program.Delay(3000)   ' ждем 3 секунды

    Motor.Stop("BC","True")    ' "True" для торможения

 

Motor.StartSync(порты, скорость1, скорость2) - команда используется для того, чтобы робот мог двигаться по изогнутой линии или разворачиваться на месте используя два мотора с разными скоростями вращения.

Пример: робот разворачивается на месте 5 секунд, затем останавливается

    Motor.StartSync("BC", 50, -50)

    Program.Delay(5000)

    Motor.Stop("BC","True")

Изменение скорости: если мотор уже вращается с какой-то скоростью, то команда Motor.Start изменит его скорость на новую, заданную в ней.

 

В следующей таблице приведены рекомендации по выбору команд для управления моторами

 

 

 

Двигаться x градусов, программа ждет завершения

Включиться на постоянное вращение

Запуститься для вращения x градусов

Регулировка  скорости

Motor.Move

Motor.Start

Motor.Schedule

Регулировка мощности

Motor.MovePower

Motor.StartPower

Motor.SchedulePower

Синхронизация моторов

Motor.MoveSync

Motor.StartSync

Motor.ScheduleSync

 

 

Другие команды:

 

Motor.GetCount (порт) – прочитать показания энкодера на порту

Motor.ResetCount (порты) – сбросить показания энкодера на портах

Motor.GetSpeed (порт) – выдает скорость мотора, подключенного к порту

Motor.IsBusy (порты) – выдает True", если один или несколкьомоторов заняты, иначе "False"

Motor.MovePower (порты, мощность, угол, торможение) – тоже самое,  что иMotor.Move, но вместо скорсоти мотора оперирует его мощностью

Motor.Schedule (порты, скорость, угол1, угол2, угол3, тормоз) – поворот на заданный угол с плавным стартом и остановом. Общий угол поворота – угол1+угол2+угол3, причем на участке угол1 происходит ускорение, на участке угол2 – заданная скорость поддерживается, на участке угол3 – происходит замедление. Важно! Команда не ждет завершения работы мотора. Если енобходимо дождаться выполнения, используйте Motor.Wait(порты)

Motor.SchedulePower(порты, мощность, угол1, угол2, угол3, тормоз) – тоже самое, что и предыдущая, но оперирует мощностью вместо скорости.

Motor.Wait(порты) – ожидает, пока Schedule или Move команда не закончит свою работу

 

Пример программ для управления моторами:

 

'************************************************************

 

' Простое управление моторами, подключенными к портам B и С

' У вас может оказаться реверсивное подключение моторов, поэтому

' если наблюдаете движение робота в обратном направлении

' измените знак у параметра скорости

 

' Робот поворачивает направо используя мотор B

' включенный на 50% скорости на угол 360°, затем тормозит

Motor.Move ("B", 50, 360, "True")

Program.Delay(2000)  ' Пауза 2 секунды (2000 миллисекунд)

 

' Робот движется вперед на 30% скорости на два оборота мотора

' (720°), затем тормозит

Motor.Move ("BC", 30, 720, "True")

Program.Delay(2000)

 

' Чтобы выполнить старт и останов более плавным используем команды 'Schedule' или

SchedulePower. Эти команды имеют зону (угол поворота мотора) разгона,

' зону постоянной скорости и зону торможения. Для примера

Motor.Schedule (порты, скорость, зона1, зона2, зона3, торможение)

' зона1 and зона3 это углы, в пределах которых мотор загоняется и замедляется

 

' Чтоыб разогнать робота в течении одного оборота моторов,

' затем поддерживать скорость 60% в течении двух оборотов моторов (720°),

' затем замедляться в течении трех оборотов(1080°) при движении вперед:

Motor.Schedule("BC", 60, 360, 720, 1080, "True")

Motor.Wait ("BC")

' Замечание – команда Schedule не ждет пока мотор отработает заданное действие,

' поэтому если Вам не нужно в это время выполнять других действий воспользуйтесь

' командой Motor.Wait() чтобы дождаться окончания команды Schedule

Program.Delay(2000)

 

' Если вы применяете команду Motor.Move() к нескольким моторам

' они будут вращаться с одинаковой скоростью. Как же можно

' заставить их вращаться с разными скоростями?

 

' В стандартном графическом ПО от LEGO есть программный блок “Move Tank

' для вращения двух моторов с разными скоростями на определенное количество

' градусов, оборотов или по времени.

 

' В среде EVBasic заменой такому танковому блоку, управляющему

' двумя моторами для движения по искривленной траектории

' с разными скоростями на каждом из моторов является команда

Motor.MoveSync(порты, скорость1, скорость2, угол, тормоз)

' Скорость1 и скорость2 – скорости двух моторов, перечисленных в портах

' в алфавитном порядке, угол – для более быстрого из двух моторов

 

Motor.MoveSync("BC", 50, -60, 215, "True")

' В этом примере мотор B повернется со скоростью 50%, а мотор C со скоростью -60%

' в обратном направлении на 215 градусов, считая по мотору С, т.к. он быстрее

' Для разворота робота на месте скорости моторов должны быть равны, но

' противоположны по знаку.

Motor.MoveSync заставляет программу ждать, пока она выполняется

 

Program.Delay(2000)

 

' Ниже приведен пример программы для рисования роботом квадрата

' Возможно Вам придется изменить угол 430° в зависимости от конструкции робота

' Чтобы заставить повернуть его на 90°

 

For i=1 to 4

  Motor.Move ("BC", 40, 720, "True")

  Motor.Move ("B", 40, 430, "True")

EndFor

Program.Delay(2000)

 

' Приведенный выше пример ведет робота по квадрату с закругленными углами

' так как робот не разворачивается на месте, а вращает одним мотором

' В следующем примере робот проедет по квадрату с поворотами в его углах

' вокруг своей оси, для этого его моторы будут вращаться в противоположных

' направлениях

 

For i=1 to 4

  Motor.Move ("BC", 40, 720, "True")   'Move forwards

  Motor.MoveSync("BC", 40, -40, 215, "True")

EndFor

 

'*******************************************************

' В следующем роботе робот едет по правильному многоугольнику,

' Число сторон которого вводит пользователь в появившемся текстовом окне

 

Textwindow.Write ("Trace a polygon with how many sides (3-9)?")

sides=textwindow.ReadNumber()

degrees=2.39*360/sides 'Каждое колесо должно повернуться на этот угол

' Поскольку при повороте каждого колеса на 215° робот поворачивал на 90°

' мы должны повернуть каждое колесо на 215/90=2.39° чтобы робот повернул на 1°.

 

For i=1 to sides

  Motor.Move("BC", 50, 720, "True")

  Program.Delay(500)

  Motor.MoveSync("BC", 20, -20, degrees, "True")

  Program.Delay(500)

EndFor

 

'*******************************************************

' Следующая программа использует кнопки EV3 для управления

' моторами, подключенными к портам B и C.

 

LCD.Clear()

LCD.Text(1, 0,30, 1, "Control motors with")

LCD.Text(1, 0,45, 1, "directional buttons")

LCD.Text(1, 0,70, 1, "Left/Right: Motor B")

LCD.Text(1, 0,85, 1, "Up/Down: Motor C")

 

while "True"  '"True" это всегда истина, этот цикл будет бесконечен

  K = Buttons.Current  ' запросим состояние кнопок

 

  SB = 0   ' установим скорость мотора B в 0

  SC = 0   ' установим скорость мотора C в 0

  If Text.IsSubText(K, "L") then

' проверяем нет ли в строке символа L, то есть не нажата ли кнопка Влево

    SB = -40   

  elseif Text.IsSubText(K, "R") then

    SB = 40

  endif

  If Text.IsSubText(K, "U") then

    SC = 40   

  elseif Text.IsSubText(K, "D") then

    SC = -40

  endif

 

  ' Устанавливаем скорости моторам

  Motor.Start("B", SB)

  Motor.Start("C", SC)

  

  ' ждем 100 миллисекунд, чтобы не сильно нагружать опросом кнопок блок

  Program.Delay(100)

Endwhile

 

III. Датчики

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

Как и в LEGO EV3-G многие датчики могут использоваться в нескольких режимах. Чтобы переключить датчик в определенный режим используется командаSensor.Setmode(порт, режим), например команда Sensor.SetMode(3, 1)переключит датчик на порту 3 в режим  Важно всегда устанавливать режим работы датчика перед его использованием..

  • Некоторые режимы датчиков возвращают значение в процентах. Для чтения показаний таких датчиков используйте функцию Sensor.ReadPercent(порт). К примеру датчик касания возвращает в этом режиме 0, если кнопка не нажата и 100 в нажатом положении.
  • Некоторые режимы датчиков возвращают значение не в процентах. Например, датчик цвета в режиме 2 «определение цвета» возвращает коды цветов от 0 до 7 (0 – неизвестно, 1 – черный и т.д.), ультразвуковой датчик в режиме 0 выдает целые числа от 0 до 255, соответствующие измеренному им расстоянию до объекта в миллиметрах. Для чтения одного значения, не в процентах, используйте функцию Sensor.ReadRawValue(порт, индекс).Индекс как правило равен 0, за исключением особых случаях, о которых – ниже.
  • Некоторые режиме датчиков возвращают несколько значений одновременно, в массиве. Чтобы прочитать этот массив используйте функциюSensor.ReadRaw(порт, количество_элементов). Например, чтобы получитьRGB (красную, зеленую и синюю составляющие цвета) с датчика цвета на порту 3 используйте функцию Sensor.ReadRaw(3, 3). Нумерация элементов в массиве начинается с нуля. Первый элемент имеет индекс [0], это интенсивность красной компоненты света, [1] – зеленой и [2] – синей.

 

1.    Датчик касания (кнопка)

Датчик касания (кнопка) используется с функцией Sensor.ReadPercent(порт), которая возвращает 0, если кнопка не нажата и 100 в нажатом положении.

 

2.    Цветосветовой датчик

В EV3 Бейсике цветосветовой датчик может работать в 4 режимах:

·       Режим отраженного света (режим 0)

·       Режим измерения уровня внешней освещенности (режим 1)

·       Режим измерения цвета (режим 2)

·       Режим измерения RBG-составляющих цвета (режим 4)

 

В режиме 0 датчик возвращает по функции ReadPercent(порт) уровень отраженного света в процентах (от 0 до 100).

В режиме 1 датчик возвращает 0 при минимуме внешнего освещения и 199 на ярком свету, используется функция ReadPercent(порт). Ниже пример программы, выводящей на экран уровень внешней освещенности в %

 

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

While "True"

    LCD.StopUpdate()    ' не обновляем экран, пока не подготовим вывод текста

    LCD.Clear()

    LCD.Text(1,30,20, 2, "Ambient")

    LCD.Text(1,40,40, 2, "light")

    LCD.Text(1,10,60, 2, "intensity:")

    LCD.Text(1,80,90, 2, Sensor.ReadPercent(3))

    LCD.Update()

    Program.Delay(100)  ждем 0.1 секунду

EndWhile

 

В режиме 2 датчик цвета возвращает код цвета (0 – цвет не определен, 1 – черный, 2 – синий, 3 – зеленый, 4 – желтый, 5 – красный, 6 – белый, 7 – коричневый). Для работы с датчиком в этом режиме используйте функциюSensor.ReadRawValue(порт, 0). Ниже приведен пример программы, отображающей на экране название цвета, который определил датчик.

 

Sensor.SetMode(3,2)  'Устанавливаем режим 2 датчика цвета на порту 3

 

While "True"

    LCD.StopUpdate()    'не обновлять экран пока не выведем на него текст

    LCD.Clear()

    code=Sensor.ReadRawValue(3, 0)

    LCD.Text(1,33,40, 2, "Color "+ code)

    If code =0 Then

        col="UNKNOWN"

    ElseIf code =1 Then

        col="BLACK"

    ElseIf code =2 Then

        col="BLUE"

    ElseIf code =3 Then

        col="GREEN"

    ElseIf code =4 Then

        col="YELLOW"

    ElseIf code =5 Then

        col="RED"

    ElseIf code =6 Then

        col="WHITE"

    ElseIf code =7 then

        col="BROWN"

    EndIf

    LCD.Text(1,33,75, 2, col)

    LCD.Update()

    Program.Delay(100)

EndWhile

 

Эту же самую программу можно написать красивее, используя массив цветов.

 

Sensor.SetMode(3,2)

 

' Заполняем массив цветов

Colors[0]="UNKNOWN"

Colors[1]="BLACK"

Colors[2]="BLUE"

Colors[3]="GREEN"

Colors[4]="YELLOW"

Colors[5]="RED"

Colors[6]="WHITE"

Colors[7]="BROWN"

 

While "True"

    LCD.StopUpdate()

    LCD.Clear()

    code=Sensor.ReadRawValue(3, 0)

    LCD.Text(1,33,40, 2, "Color "+ Code)

    LCD.Text(1,33,75, 2, Colors[Code])

    LCD.Update()

    Program.Delay(100)

EndWhile

 

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

Программа с массивом, указанная выше будет прекрасно работать в режиме, когда вы запустите ее с ПК из Small Basic, но не запустится автономно на блоке EV3. Это связано с ограничениями прошивки LEGO, в данном случае связанными с невозможностью работать с массивами строк.

 

В режиме 4 (не 3! третьего режима у датчика цвета нет) датчик цвета возвращает массив из RBG-составляющих цвета. Это позволит Вам определить любой оттенок цвета, ориентируясь на его составляющие.

 

3.    Ультразвуковой датчик

Для определения расстояния, которое возвращает ультразвуковой датчик используйте функцию Sensor.ReadRawValue(port number, 0). Датчик ультразвукаEV3 в режиме 0 возвращает расстояние в миллиметрах (не в сантиметрах!). Датчик ультразвука  NXT  в режиме 0 возвращает расстояние в сантиметрах.Датчик EV3 в режиме 1 возвращает расстояние в десятых дюймах.

Ниже приведена программа, которая постоянно отображает на экране расстояние, измеренное ультразвуковым датчиком EV3, переводя его в сантиметры делением на 10:

' Ультразвуковой датчик подключен к 4 порту

Sensor.SetMode(4,0) ' устанавливаем порт 4 в режим 0 – измерения в расстоянии в мм

 

While "True"

    LCD.StopUpdate() ' для избежание мерцания не обновляем экран пока текст не готов

    LCD.Clear()

    LCD.Text(1,45,55,2,Sensor.ReadRawValue(4, 0)/10+" cm")  ' Переводим мм в см

    LCD.Update()

EndWhile

 

4.    Инфракрасный датчик

 

В EV3 Бейсике инфракрасный датчик из домашней версии набора EV3 может работать в следующих режимах:

 

Режим 0 – измерение расстояния до объекта в см

Режим 1 – измерение расстояния и направления на ИК-маяк

Режим 2 – сигналы, принятые от ИК-маяка (или от маяков, до 4 одновременно)

 

По умолчанию датчик работает в режиме 0 и функция Sensor.ReadPercent() возвращает целое число от 0 до 100 - расстояния до объекта в см. Это расстояние не особо точное, зависит от освещенности объекта. Более точно измеряется расстояние до ярко освещенных объектов.

 

Ниже приведена программа, которая постоянно отображает на экране расстояние, измеренное инфракрасным датчиком в сантиметрах:

 

' Подключите ИК-датчик к 4 порту

Sensor.SetMode(4,0)  ' устанавливаем режим работы 4 порта в 0, для измерения в см

 

While "True"

    LCD.StopUpdate() ' для избежание мерцания не обновляем экран пока текст не готов

    LCD.Clear()

    LCD.Text(1,45,55,2,Sensor.ReadPercent(4)+" cm")

    LCD.Update()

EndWhile

 

При переключении в режим 1 с помощью команды Sensor.SetMode(4,1) ИК датчик на 4 порту начинает возвращать расстояние и направление на ИК-маяк. При этом он возвращает оба значения одновременно по функции Sensor.ReadRaw(порт, 2). Возвращаемое ей значение – массив, в 0 элементе – направление на ИК маяк, в 1 элементе - расстояние до ИК-маяка в см.

 

После переключения в режим 2 IR-REMOTE, с помощью команды.SetMode(4,2) ИК-датчик, подключенный в порт 4, начинает определять, какие кнопки нажаты на удаленном маяке (маяках).

В случае, если только один маяк передает коды нажатых кнопок на ИК-датчик, необходимо использовать Sensor.ReadRawValue(4, канал_передачи) для получения кодов кнопок.

А - левая верхняя, B – левая нижняя, С – правая верхняя, D – правая нижняя. E - средняя

Коды, принимаемые Sensor.ReadRawValue(4, канал_передачи)

 

 A = 1        A и B = 10      B и C = 7

 B = 2        A и C = 5        B и D = 8

 C = 3        A и D = 6        C и D = 11

 D = 4        E = 9

Все другие комбинации выдадут 0

В случае, если несколько маяков одновременно передают коды нажатых кнопок на ИК-датчик на разных каналах, необходимо использовать функциюSensor.ReadRaw(4, 4), которая возвращает массив из 4 значений, одного на каждый канал. 0-й элемент массива соответствует маяку на 1 канале и т.д.

 

5.    Гироскоп

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

Очень важно, чтобы датчик гироскопа был неподвижен в момент запуска блока EV3 или при подключении кабеля между гироскопом и включенным блоком, иначе показания гироскопа будут постоянно отклоняться (явление «дрейфа»). Для устранения дрейфа можно переподключить кабель к неподвижному датчику. Проверить, проявляется ли дрейф можно в меню «Port View»? показания дна порту с гироскопом должны быть стабильны при неподвижном датчике.

Режим 0 гироскопа измеряет угов в градусах относительно позиции датчика на момент старта программы или сброса его показаний. Датчик одноосный, может измерять отклонения или в горизонтальной или в вертикальной плоскости – зависит от того как Вы установите его на робота. Для чтения показаний в этом режиме используйте функцию Sensor.ReadRawValue(порт, 0) которая возвращает массив из единственного 0-го элемента.

Ниже приведена программа, отображающая на экране показания гироскопа в градусах

Гироскоп подключен к 2 порту

Sensor.SetMode(2,0)  ' Режим 0 – измерение отклонения в градусах

 

While "True"

    LCD.StopUpdate()    ' для избежание мерцания не обновляем экран пока текст не готов

    LCD.Clear()

    LCD.Text(1,35,50,2, Sensor.ReadRawValue(2,0) + " deg")

    LCD.Update()

    Program.Delay(100)  ' ждем 0.1 секунду

EndWhile

 

Режим 1 гироскопа измеряет скорость изменения отклонения в градусах в секунду. Предыдущая программа подходит для примера работы в этом режиме, замените в ней выбор режима работы на Sensor.SetMode(2,1) и увидите на экране скорость изменения отклонения в градусах в секунду.

Обратите внимание, что несмотря на то, что датчик гироскопа измеряет отклонения в градусах, встроенные тригонометрические функции Small Basic используют радианы, радиан - это примерно  57.3°.

6.    Мотор как датчик угла

Также как и в официальном ПО от LEGO моторы могут использоваться в качестве датчиков угла. Функция Motor.GetCount (порт) показывает в градусах угол поворота оси мотора, подключенного к порту, указанному в ее параметрах.

7.    Перечень режимов датчиков

 

EV3 датчики

 

Тип

Режим

Название режима

Доступные функции

Возвращаемое значение

16

0

TOUCH 

ReadPercent

0=не нажат,  100=нажат

29
29
29


29

0
1
2


4

COL-REFLECT
COL-AMBIENT
COL-COLOR


RGB-RAW

ReadPercent
ReadPercent
ReadRawValue


ReadRaw (3 vals)

0=нет отраженного света, 100=макс
0=нет внеш. освещ., 100=макс
0=неизвестно, 1=черный, 2=синий, 3=зеленый, 4=желный, 5=красный, 6=белый, 7=коричневый
value0=красная составляющая,value1=зеленая составляющая,value2=синяя составляющая

30
30

0
1

US-DIST-CM
US-DIST-IN

ReadRawValue
ReadRawValue

Расстояние в миллиметрах 
Расстояние в десятых дюйма

32
32

0
1

GYRO-ANG
GYRO-RATE

ReadRawValue
ReadRawValue

Угол отклонения в градусах
Скорость изменения угла отклонения в градусах в секунду

33
33

33

0
1

2

IR-PROX
IR-SEEK

IR-REMOTE

ReadPercent
ReadRaw (2 vals)

ReadRawValue***

Расстояние в см (примерное)
value0=направление на ИК-маяк

value1=Расстояние до ИК-маяка
value0=сигнал на канал 1

value1= сигнал на канал 2…

 

 

NXT датчики

 

Тип

Режим

Название режима

Доступные функции

Возвращаемое значение

1

0

NXT-TOUCH 

ReadPercent

0=не нажат,  100=нажат

4
4
4

0
1
2

NXT-REFLECT
NXT-AMBIENT
NXT-COLOR

ReadPercent
ReadPercent
ReadRawValue

0=нет отраженного света, 100=макс
0=нет внеш. освещ., 100=макс
1=черный, 2=синий, 3=зеленый, 4=желтый, 5=красный, 6=белый

5

0

NXT-US-CM

ReadRawValue

Расстояние в сантиметрах

 

Справочник по командам EV3 Бейсик

Перевод: Андрей Степанов, «Карандаш и Самоделкин»

Assert

Тестовая функция утверждения помогает проверить на корректность твой код. Добавив утверждение ты сможешь проще найти ошибки в программе. Например, когда часть программы зависит от переменной А, имеющей положительное значение, ты можешь вызвать Assert.Greater(A,0,"A должна быть > 0!"). В случае, если в этом месте программы переменная А будет меньше нуля, выведется указанное тобой предупреждение.

 

Assert.Failed (сообщение)

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

Сообщение: Сообщение, которое будет выведено на экран

 

Assert.Equal(А, B, сообщение)

Утверждаем, что два значения равны. проверяется полное совпадение, даже "True" и "tRue" считаются различными выражениями.

А: Первый параметр 

B: Второй параметр 

Сообщение: Сообщение, которое будет выведено, если утверждение ошибочно

 

Assert.NotEqual(А, B, сообщение)

Утверждаем, что два значения не равны. проверяется полное совпадение, даже "True" и "tRue" считаются различными выражениями.

A: Первый параметр 

B: Второй параметр 

Сообщение: Сообщение, которое будет выведено, если утверждение ошибочно

 

Assert.Less(А, B, сообщение)

Утверждаем, что первое число меньше второго.

A: Первый параметр 

B: Второй параметр 

Сообщение: Сообщение, которое будет выведено, если утверждение ошибочно

 

Assert.Greater(А, B, сообщение)

Утверждаем, что первое число больше второго.

A: Первый параметр 

B: Второй параметр 

Сообщение: Сообщение, которое будет выведено, если утверждение ошибочно

 

Assert.LessEqual(А, B, сообщение)

Утверждаем, что первое число меньше или равно второму.

A: Первый параметр 

B: Второй параметр 

Сообщение: Сообщение, которое будет выведено, если утверждение ошибочно

 

Assert.GreaterEqual(А, B, сообщение)

Утверждаем, что первое число больше или равно второму.

A: Первый параметр 

B: Второй параметр 

Сообщение: Сообщение, которое будет выведено, если утверждение ошибочно

 

Assert.Near(А, B, сообщение)

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

A: Первый параметр 

B: Второй параметр 

Сообщение: Сообщение, которое будет выведено, если утверждение ошибочно

 

Buttons

Прочитать состояния и нажатия (включая щелчки) кнопок на блоке EV3. Кнопки обозначаются с использованием следующих символов:

 

U         Вверх

D         Вниз

L         Влево

R         Вправо

E         Центр

Buttons.GetClicks()

Проверяет какие кнопки были нажаты с момент последнего вызова GetClicks и возвращает текст, содержащий соответствующие им символы. Состояние кнопок при этом очищается. Также издает звук, когда зафиксировано нажатие кнопок.

Возвращает: Текст, содержащий символы нажатых кнопок (может быть пустым, если ничего не нажато)

 

Buttons.Wait ()

Ждать, пока одна из кнопок на блоке не будет нажата.

 

Buttons.Flush ()

Очистить состояние нажатых кнопок. Последующие вызовы GetClicks покажет только те кнопки, которые были нажаты после очистки.

 

Buttons.Current

Кнопки, которые в данный момент нажаты. Содержит текст с символами, соответствующим всем кнопкам, нажатым в данный момент.

 

EV3File

Доступ к файловой системе блока EV3 для чтения или записи данных. К именам файлов домет быть добавлен абсолютный путь начиная с '/' для доступа к любому файлу в файловой системе или относительный, начиная с папки prjs.

 

EV3File.OpenWrite(имя_файла)

Открывает файл для записи. если файл уже существует, он будет перезаписан.

имя_файла: Имя файла для записи/перезаписи 

Возвращает: Номер, идентифицирующий данный открытый файл (file handle)

 

EV3File.OpenAppend(имя_файла)

Открывает файл для добавления в него данных. Если файл не существует, он будет создан.

имя_файла: Имя файла для создания/добавления данных 

Возвращает: Номер, идентифицирующий данный открытый файл (file handle)

 

EV3File.OpenRead(имя_файла)

Открывает файл для чтения. Если файл не существует, возвращает 0.

имя_файла: Имя файла для чтения 

Возвращает: Номер, идентифицирующий данный открытый файл (file handle) или 0, если файл не существует

 

EV3File.Close(идентификатор)

Закрывает открытый файл.

Идентификатор: Идентификатор файла (file handle), полученный в момент открытия файла

 

EV3File.WriteLine(идентификатортекст)

Записывает текстовую строку в файл. Строка будет записана в кодировке ISO-8859-1 и оканчиваться символом перевода строки (код 10).

Идентификатор: Идентификатор файла (file handle), полученный в момент открытия файла 

Текст: Текст для записи в файл

 

WriteByte(идентификаторчисло)

Записывает один байт данных в файл.

Идентификатор: Идентификатор файла (file handle), полученный в момент открытия файла 

Число: Один байт для записи (значение от 0 до 255).

 

EV3File.ReadLine(идентификатор)

Прочитать текстовую строку из файла. Строка будет прочитана в кодировке ISO-8859-1 и должна оканчиваться символом перевода строки (код 10).

Идентификатор: Идентификатор файла (file handle), полученный в момент открытия файла 

Возвращает: Текстовая строка, прочитанная из текущей строки файла

 

EV3File.ReadByte(идентификатор)

Прочитать один байт из файла.

Идентификатор: Идентификатор файла (file handle), полученный в момент открытия файла 

Возвращает: Следующий по счету байт из файла (число)

 

EV3File.ReadNumberArray(идентификатор, размер)

Читает массив чисел из бинарного файла. Числа будт раскодированы с использованием кодировки IEEE как тип Float с одинарной точностью

Идентификатор: Идентификатор файла (file handle), полученный в момент открытия файла 

Размер: Размер массива, который будет прочитан 

Возвращает: Массив чисел указанного размера

 

EV3File.ConvertToNumber(текст)

Конвертация текста в число.

Текст: Текст, содержащий числа, может содержать также дробную часть числа 

Возвращает: Число

 

EV3File.TableLookup(имя_файла, байт_в_строке, строка, столбец)

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

имя_файла: Имя файла 

байт_в_строке: Если файл имеет структуру строк/столбцов, в параметре указывается число байт в строке, иначе указывай 1 

строка: Какую строку читать (начиная с 0) 

столбец: Какой столбец читать (начиная с 0) 

Возвращает: Байт из указанной позиции

 

LCD

Управление ЖК-экраном на блоке EV3. EV3 имеет черно-белый дисплей с разрешением 178x128 точек. Координаты отсчитываются от левого верхнего угла экрана, имеющего координаты 0,0

LCD.StopUpdate()

Начинать запоминать всю выводимую экран информацию без ее отображения. При следующем вызове Update() все накопленные изменения наконец-то отобразятся. Вы можете использовать эту функцию, чтобы предотвратить мерцание или для ускорения рисования сложных изображений в ЖК-дисплее.

 

LCD.Update()

Вывести на экран все изменения, которые произошли с момента последнего вызова StopUpdate().

 

LCD.Clear()

Очистка экрана. Все пиксели закрашиваются в белый цвет.

 

LCD.Pixel(цвет, x, y)

Вывод на экран одиночного пикселя указанного цвета.

Цвет: 0 (белый) или 1 (черный) 

X: Координата X по горизонтали 

Y: Координата Y по вертикали

 

LCD.Line (цвет, x1, y1, x2, y2)

Вывод на экран линии указанного цвета.

Цвет: 0 (белый) или 1 (черный) 

x1: Координата X начальной точки 

y1: Координата Y начальной точки 

x2: Координата X конечной точки 

y2: Координата Y конечной точки

 

LCD.Circle (цвет, x, y, радиус)

Рисует не закрашенный круг указанного размера.

Цвет: 0 (белый) или 1 (черный) 

X: Координата X центра круга 

Y: Координата Y центра круга 

Радиус: Радиус круга

LCD.Text (цвет, xy, размер_шрифта, текст)

Напечатать заданный текст или числа на экране.

Цвет: 0 (белый) или 1 (черный) 

X: Координата X начала печати 

Y: Координата Y начала печати 

Размер_шрифта: Размер шрифта: 0 (маленький), 1 (средний), 2 (большой) 

Текст: Текст или числа для вывода на дисплей

 

LCD.Write (x, y, текст)

Напечатать заданный текст черным цветом на экране. Если нужно выводить текст с выбором цвета и размера, используй LCD.Text

X: Координата X начала печати 

Y: Координата Y начала печати 

Текст: Текст или числа для вывода на дисплей

 

LCD.FillRect (цвет, xy, ширина, высота)

Рисует закрашенный заданным цветом прямоугольник.

Цвет: 0 (белый) или 1 (черный) 

X: Координата X левой стороны прямоугольника 

Y: Координата Y верхней стороны прямоугольника 

Ширина: Ширина прямоугольника

Высота: Высота прямоугольника

 

LCD.Rect (цвет, xy, ширина, высота)

Рисует не закрашенный прямоугольник с границей заданного цвета.

Цвет: 0 (белый) или 1 (черный) 

X: Координата X левой стороны прямоугольника 

Y: Координата Y верхней стороны прямоугольника 

Ширина: Ширина прямоугольника

Высота: Высота прямоугольника

 

LCD. InverseRect (цвет, xy, ширина, высота)

Инвертирует все пиксели в границах прямоугольника.

Цвет: 0 (белый) или 1 (черный) 

X: Координата X левой стороны прямоугольника 

Y: Координата Y верхней стороны прямоугольника 

Ширина: Ширина прямоугольника

Высота: Высота прямоугольника

 

LCD. FillCircle(цвет, xy, радиус)

Рисует закрашенный круг указанного размера.

Цвет: 0 (белый) или 1 (черный) 

X: Координата X центра круга 

Y: Координата Y центра круга 

Радиус: Радиус круга

 

LCD.BmpFile (цвет, xy, имя_файла)

Вывести файл заданным цветом на экран. Поддерживаются только файлы в формате .rgf

Цвет: 0 (белый) или 1 (черный) 

X: Координата X левой стороны изображения 

Y: Координата Y верхней стороны изображения 

Имя_файла: имя файла без расширения .rgf. Может содержать относительный путь от папки 'prjs' или абсолютный, начинаясь с '/').

 

 

EV3

Полезные функции блока EV3.

EV3.SetLEDColor (цветэффект)

Установить цвет подсветки кнопок блока EV3 и ее эффектыПодсветка: OFF - выключена, GREEN - зеленая, RED - красная, ORANGE - оранжевая. Эффекты: NORMAL - гореть постоянно, FLASH - вспыхивать, PULSE - пульсировать.

Цвет: Может быть "OFF", "GREEN", "RED", "ORANGE" 

Эффект: Может быть "NORMAL", "FLASH", "PULSE"

 

EV3.SystemCall (системная_команда)

Запустить одну системную команду в операционной системе EV3 Linux. Выполняемая программа будет ждать, пока запущенная в операционной системе программа не завершит работу.

системная_команда: Системная команда. Статус завершения запущенной команды

  

EV3.QueueNextCommand()

Повышение производительности при работе в режиме "ПК". Не посылать следующую команду на блок сразу же, а подождать, поставив ее в очередь. В режиме запуска программы на блоке не имеет смысла.

 

EV3.Time

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

 

EV3.BatteryLevel

Возвращает текущий заряд батарей, от 0 до 100.

 

Motor

Управление моторами, подлеченными к блоку EV3. Для функции Motor необходимо указать один или несколько портов, к которым подключены моторы, например "A", "BC", "ABD". Для блоков, подключенных к главному блоку по USB порты указываются так: 3BC", "2A". В этом режиме только двигатели одного блока доступны в одной команде. Скорость и Мощность - разные понятия. При вызове команды для вращения мотора с постоянной скоростью, электрическая мощность, подаваемая на него будет автоматически регулироваться, чтобы поддерживать заданную скорость. При вызове команды для вращения мотора с постоянной мощностью, его скорость будет зависеть от сопротивления, которое он испытывает во время работы.

 

Motor.Stop (порты, торможение)

Остановить один или несколько моторов. Команда завершает так же все запланированные или незавершенные команды управления этими моторами.

Порты: Порт(ы) моторов 

Торможение: "True", если необходимо удерживать положение после останови моторов

 

Motor.Start (порты, скорость)

Запустить один или несколько моторов с указанной скоростью или изменить скорость уже запущенных моторов на указанную.

Порты: Порт(ы) моторов 

Скорость: Скорость от -100 (полный назад) до 100 (полный вперед).

Motor.StartPower (порты, мощность)

Запустить один или несколько моторов с указанной мощностью или изменить мощность уже запущенных моторов на указанную.

Порты: Порт(ы) моторов 

Мощность: Мощность от -100 (полный назад) до 100 (полный вперед).

 

Motor.StartSync (порты, скорость1, скорость2)

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

Порты: Имена двух портов для моторов (например "AB" или "CD"). 

Скорсоть1: Скорость от -100 (полный назад) до 100 (полный вперед) мотора с младшим по алфавиту номером порта 

Скорость2: Скорость от -100 (полный назад) до 100 (полный вперед) мотора со старшим по алфавиту номером порта

 

Motor.GetSpeed (порт)

Запросить текущую скорость мотора

Порт: Порт мотора 

Возвращает: Текущая скорость в диапазоне от -100 до 100

 

Motor.IsBusy (порты)

Проверить один или несколько моторов на занятость.

Порты: Порты моторов 

Возвращает: "True" если хотя бы один из моторов запущен, "False" в противном случае.

 

Motor.Schedule (порты, скорость, зона1, зона2, зона3, торможение)

Запустить один или несколько моторов с указанной скоростью с возможностью плавного старта и плавного замедления. Скорость может регулироваться в пределах общего угла поворота, в зоне1 двигатель разгоняется до указанной скорости, в зоне 2 поддерживает ее, в зоне 3 - замедляется до полной остановки. Полный угол, на который повернется мотор - это сумма углов поворота зона1 + зона2 + зона3. Команда передает управление в программу сразу, не ждет, пока мотор повернется. Чтобы отследить окончания отработки команды, используйте IsBusy(). Чтобы дождаться конца, пока мотор закончит отработку команды - используйте Wait().

Порты: Порты моторов 

Скорость: Скорость от -100 (полный назад) до 100 (полный вперед) 

зона1: часть общего угла поворота мотора, в пределах которой мотор разгоняется 

зона2: часть общего угла поворота мотора, в пределах которой мотор поддерживает указанную скорость 

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

Возвращает: "True", если необходимо удерживать положение после останови моторов

 

Motor.SchedulePower (порты, мощность, зона1, зона2, зона3, торможение)

Запустить один или несколько моторов с указанной мощностью с возможностью плавного старта и плавного замедления. Мощность может регулироваться в пределах общего угла поворота, в зоне1 двигатель плавно наращивает мощность до указанной, в зоне 2 поддерживает ее, в зоне 3 - плавно уменьшает подаваемую мощность до полной остановки. Полный угол, на который повернется мотор - это сумма углов поворота зона1 + зона2 + зона3. Команда передает управление в программу сразу, не ждет, пока мотор повернется. Чтобы отследить окончания отработки команды, используйте IsBusy(). Чтобы дождаться конца, пока мотор закончит отработку команды - используйте Wait().

Порты: Порты моторов 

Мощность: Мощность от -100 (полный назад) до 100 (полный вперед) 

зона1: часть общего угла поворота мотора, в пределах которой мотор разгоняется 

зона2: часть общего угла поворота мотора, в пределах которой мотор поддерживает указанную скорость 

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

Возвращает: "True", если необходимо удерживать положение после останови моторов

 

Motor.ScheduleSync (порты, скорость1, скорость2, угол, торможение)

Поворачивает два мотора синхронно на определенное количество градусов. Синхронная работа двигателей означает, что когда один двигатель нагружен и что-то препятствует его вращению, второй двигатель пропорционально замедлится или даже вообще остановится. Это команда особенно полезна для колесных роботов - для возможности сохранить траекторию движения. Угол, на который будет повернуты моторы относится к мотору с наибольшей скоростью вращения, угол поворота второго мотора будет рассчитан пропорционально его скорости. Команда передает управление в программу сразу, не ждет, пока мотор повернется. Чтобы отследить окончания отработки команды, используйте IsBusy(). Чтобы дождаться конца, пока мотор закончит отработку команды - испольузйте Wait().

Порты: Имена двух портов для моторов (например "AB" или "CD") 

Скорость1: Скорость от -100 (полный назад) до 100 (полный вперед) мотора с младшим по алфавиту номером порта 

Скорость2: Скорость от -100 (полный назад) до 100 (полный вперед) мотора со старшим по алфавиту номером порта 

Угол: Угол поворота (мотора с наибольшей скоростью) 

Возвращает: "True", если необходимо удерживать положение после останови моторов

 

Motor.ResetCount (порты)

Сбросить счетчик оборотов одного или несколько моторов в 0.

Порты: Порты моторов

 

Motor.GetCount (порт)

Запросить данные счетчика оборота с указанного мотора. Счетчик оборотов работает даже если мотор вращается не по командам блока EV3, а путем приложения внешней силы.

Порт: Порт мотора 

Возвращает: Текущее значение счетчика оборотов мотора в градусах

 

Motor.Move (порты, скорость, угол, торможение)

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

Порты: Порты моторов 

Скорость: Скорость от -100 (полный назад) до 100 (полный вперед) 

Угол: Угол поворота 

Возвращает: "True", если необходимо удерживать положение после останови моторов

 

Motor.MovePower (порты, скорость, угол, торможение)

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

Порты: Порты моторов 

Мощность: Мощность от -100 (полный назад) до 100 (полный вперед) 

Угол: Угол поворота 

Возвращает: "True", если необходимо удерживать положение после останови моторов

 

Motor.MoveSync (порты, скорость1, скорость2, угол, торможение)

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

Порты: Имена двух портов для моторов (например "AB" или "CD") 

Скорость1: Скорость от -100 (полный назад) до 100 (полный вперед) мотора с младшим по алфавиту номером порта 

Скорость2: Скорость от -100 (полный назад) до 100 (полный вперед) мотора со старшим по алфавиту номером порта 

Угол: Угол поворота (мотора с наибольшей скоростью) 

Возвращает: "True", если необходимо удерживать положение после останови моторов

 

Motor.Wait (порты)

Подождать, пока моторы не закончат выполнять команды Schedule или Move. Использование этой команды, как правило, лучше, чем вызов IsBusy() в цикле.

Порты: Порты моторов

 

Sensor

Работа с датчиками, подключенными к блоку EV3. Чтобы указать локальный датчик, используется номер порта 1..4, для указания номеров портов на первом в цепочке подключенных по USB блоках используйте 5..8, на третьем - 9..12

 

Sensor.GetName (порт)

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

Порт: Номер порта датчика 

Возвращает: Текст описания (например "TOUCH")

 

Sensor.GetType (порт)

Запросить цифровой идентификатор датчика, подключенного к указанному порту.

Порт: Номер порта датчика 

Возвращает: Цифровой идентификатор датчика (например 16 для датчика нажатия)

 

Sensor.GetMode (порт)

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

Порт: Номер порта датчика 

Возвращает: Текущий режим работы датчика (0 для режима по умолчанию)

 

Sensor.SetMode (порт, режим)

Переключить режим работы датчика, подключенного к указанному порту. Датчики могут работать с различных режимах, например: EV3 датчик цвета, режимы 0 - отраженный свет, 1 - внешняя освещенность, 2 - цвет. Для уточнения какой датчик в какой режим можно переключить - смотрите документацию. Программа не продолжится до тех пор, пока датчик не переключится в новый режим и данные с него не будут доступны. Обратите внимание, что датчик будет оставаться в выбранном режиме даже после того, как программа завершит работу, поэтому чтобы избежать путаницы всегда устанавливайте режим в начале программы перед использованием датчика.

Порт: Номер порта датчика 

Режим: Новый режим работы из перечня разрешенных для данного типа датчика

 

Sensor.IsBusy (порт)

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

Порт: Номер порта датчика 

Возращение: "True" если датчик занят (не доступен)

 

Sensor.Wait (порт)

Дождаться, пока датчик не переключится в новый режим или не инициализируется. Обычно тебе не нужно использовать эту команду, так как SetMode() дожидается смены режима. Если ты используешь параллельные задачи - без этой команды не обойтись - в ней датчик мог менять режим и стать на время недоступным.

Порт: Номер порта датчика

 

Sensor.ReadPercent (порт)

Прочитать текущее показание датчика с отображением его в процентах (0..100). Большинство датчиков могут перевести свои показания в проценты, например у датчика нажатия 0 - не нажат, 100 - нажат.

Порт: Номер порта датчика 

Возвращает: Текущее показание датчика

(Пример для датчика освещенности 0 - очень темно, 100 - очень светло)

Sensor.ReadRaw (порт, сколько_значений)

Прочитать текущее показание датчика в "сыром" режиме, без перевода в проценты. В некоторых режимах показания датчика не могут быть переведены в проценты, например цвета, в этом случае используется команда чтения ReadRaw.

Порт: Номер порта датчика 

Сколько_значений: Размер возвращаемого массива с показаниями 

Возвращает: Массив с показаниями датчика с требуемым числом элементов. Массив начинается с 0 элемента. Элементы, в которых данные не получены, будут равны 0

 

Sensor.ReadRawValue (порт, элемент)

Похожа на ReadRaw, но возвращает только одно "сырое" показание с датчика, а не массив показаний. Например для работы с цветосветовым датчиком в режиме определения цвета используйте функцию ReadRawValue(порт, 0).

Порт: Номер порта датчика 

Элемент: Индекс элемента массива с показаниями, начиная с 0.

Возвращает: Один элемент массива с показаниями

 

Sensor.CommunicateI2C (портадрес, writebytes, readbytes, writedata)

Взаимодействие с устройством, работающим по протоколу I2C, подключенному к одному из портов датчиков. Эта команда может посылать и принимать несколько байт по шине I2C, с ее помошью можно работать с датчиками сторонних производителей, использующих этот протокол обмена или, например, с Arduino. Обратите внимание, команда работает в пределах одного блока EV3 и только с подчиненными (slave) I2C устройствами.

Порт: Номер порта датчика 

Адрес (0 - 127) подчиненного I2C устройства на шине I2C 

writebytes: Количество байт для отправки I2C-устройству (максимум 31).

readbytes Количество байт для приема с I2C-устройства (максимум 32, минимум 1). 

writedata массив, содержащий байты для отправки (индекс первого элемента - 0)

Возвращает: Массив, содержащий запрошенное количество принятых байт с I2C-устройства (индекс первого элемента - 0)

 

Sensor.SendUARTData (порт, writebytes, writedata)

Посылает данные по протоколу UART устройству, подключенному к порту датчика. Функция полезна для общения с самодельными датчиками и исполнительными устройствами.

Порт: Номер порта датчика 

writebytes Количество байт для отправки на устройство (максимум 32). 

writedata Массив, содержащий байты для отправки по UART (младший индекс 0).

 

Bluetooth

Отправка сообщений между блоками EV3 посредством Bluetooth

 

Mailbox.Create (имя_ящика)

Создать почтовый ящик с указанным именем, который будет принимать входящие сообщения, адресованные этому блоку EV3 в данный ящик. Только после создания ящика входящие сообщения будут сохраняться. Максимальное количество создаваемых ящиков - 30.

Имя_ящика Имя почтового ящика для создания Цифровой идентификатор почтового ящика. Необходим для получения сообщения из ящика

 

Mailbox.Send (имя_блока_EV3, имя_ящика, сообщение)

Отправить сообщение на другой блок EV3 в указанный почтовый ящик.

имя_блока_EV3 Имя блока EV3, на который отправляется сообщение. Bluetooth-соединение с блоком должно быть предварительно установлено. Это поле можно оставить пустым, тогда сообщение будет отправлено всем подключенным блокам EV3. 

имя_ящика Имя почтового ящика, в который будет отправлено сообщение

Сообщение в виде текста. Пока поддерживаются только текстовые сообщения

 

Mailbox.IsAvailable (идентификатор)

Проверка наличия нового сообщения в указанном локальном почтовом ящике.

Идентификатор: Цифровой идентификатор почтового ящика "True" если сообщение пришло. "False" в противном случае

 

Mailbox.Receive (идентификатор)

Получить последнее сообщение из указанного локального почтового ящика. Если ящик пуст, программа будет ожидать до тех пор, пока не появится новое сообщение в ящике. После прочтения сообщение будет удалено и следующий вызов Receiveбудет ожидать нового сообщения в ящике. Чтобы избежать блокировки в его ожидании, используйте IsAvailable(). Если почтовый ящик с таким именем не существует, команда возвратит пустой текст.

Идентификатор: Цифровой идентификатор почтового ящика Сообщение в виде текста. Пока поддерживаются только текстовые сообщения

 

Mailbox.Connect (имя_блока_EV3)

Установить соединение с другим блоком EV3 по Bluetooth. Только после того как соединение установлено (этой командой или из меню блока EV3) могут отправляться и приниматься сообщения.

Имя_блока_EV3: Имя блока EV3, с которым нужно установить соединение

 

 

Speaker

Использование динамика на блоке EV3 для воспроизведения тонов, нот или звуковых файлов.

Speaker.Stop ()

Остановить звучание любого проигрываемого в данный момент тона или звукового файла.

 

Speaker.Tone (громкость, частота, длительность)

Воспроизвести тон указанной частоты и длительности.

Громкость тона 0 - 100 

Частота, Гц в диапазоне 250 - 10000 

Длительность тона в миллисекундах

 

Speaker.Note (громкость, нота, длительность)

Воспроизвести ноту указанной высоты и длительности.

Громкость 0 - 100 

Нота в виде текста, от "C4" до "B7" с полутонами в виде "C#5" 

Длительность ноты в миллисекундах

 

Speaker.Play (громкость, имя_файла)

Воспроизвести звуковой файл, хранящийся на блоке. Поддерживаются файлы только в формате .rsf

Громкость 0 - 100 

Имя_файла Имя звукового файла без расширения .rsf Имя файла может содержать относительный папки 'prjs' путь иил абсолютный, начиная с корня ФС '/'

 

Speaker.IsBusy ()

Проверить, занят ли динамик воспроизведением тона/ноты/звука

Возвращает: "True", если звук в данный момент проигрывается, "False" в противном случае.

 

Speaker.Wait ()

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

 

Thread

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

 

Thread.Yield ()

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

 

Thread.CreateMutex ()

Создать мьютекс (сокр. от "mutual exclusion") - взаимное исключение, который может быть использован для синхронизации потоков. Мьютекс может быть только создан, но не удален. Лучше всего создать все необходимые мьютексы при старте программы и держать их номера в глобальных переменных.

Возвращает: Идентификатор мьютекса. Будет использоваться в дальнейшем для блокировки и разблокировки

 

Thread.Lock (идентификатор)

Попытаться блокировать указанный мьютекс. Установка блокировки не позволит никакому другому потоку установить блокировку на него.

Идентификатор мьютекса (полученный от CreateMutex() )

Thread.Unlock (идентификатор)

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

Идентификатор мьютекса (полученный от CreateMutex() )

 

Thread.Run

Создать новый поток. Просто назначьте подпрограмму и она начнет выполняться в качестве независимого потока (пример Thread.Run = MYSUB). Любая подпрограмма может быть преобразована в независимы поток, однако одна подпрограмма может быть преобразована в поток только однократно, два потока из нее сделать не удастся. При использовании Thread.Run в то время, как подпрограмма уже работает, вызов потока поставится в очередь до тех пор, пока она не завершит свою работу. Это обеспечит корректную работу, но запуск потока вероятно может произойти позже запланированного. Все запущенные потоки остановятся, как только основная программа завершит свою работу.

 

Vector

Объект для выполнения операций над большим количеством чисел. Они называются векторами и будут храниться с использованием массивов с последовательными индексами (начиная с 0). В случае выполнений операций над массивами с различным числом элементов, недостающие элементы массивов будут рассматриваться кк элементы, содержащие 0.

 

Vector.Init (размер, значение)

Создать вектор заданного размера с указанным количеством элементов, содержащих одинаковое число.

Размер вектора 

Значение, для всех элементов 

Возвращает: Созданный вектор

 

Vector.Add (размер, A, B)

Сложение двух векторов путем сложения соответствующих элементов (C[0]=A[0]+B[0], C[1]=A[1]+B[1]...)

Размер: Сколько элементов брать складывать 

А: Первый вектор 

В: Второй вектор Вектор, содержащий результат сложения

 

Vector.Sort (размер, A)

Сортировать элементы вектора в порядке возрастания.

Размер: Количество элементов для сортировки 

А: Массив, содержащий элементы для сортировки 

Возвращает: Вектор, содержащий элементы в порядке возрастания значений

 

Vector.Multiply (строкстолбцов, k, A, B)

Операция умножения матриц. Входные вектора рассматриваются как двумерные матрицы заданной ширины и высоты. Отдельные строки матрицы хранятся в векторе непосредственно одна за другой. 

Строк: Количество строк в результирующей матрице 

Столбцов: Количество столбцов в результирующей матрице 

k: Количество столбцов в исходной матрице А и количество строк в исходной матрице В 

А: Матрица А размера строк * k 

В: Матрица В размера k * столбцов 

Возвращает: Матрица, содержащая результаты умножения

Отзывы и комментарии

blog comments powered by Disqus


Похожие статьи:
Следующие статьи:

Добавить комментарий

Защитный код
Обновить

You are here: Робототехника LEGO Lego EV3 Basic: краткое руководство