Manual in Russian

Many Thanks to Андрей Степанов (Andrey Stepanov) for translating the manual into Russian. Visit Andrey's site about Robotics (Mindstorms, Arduino, etc.) HERE.

Язык программирования EV3 Basic.                            

Краткий перевод официального руководства

Оригинал: https://sites.google.com/site/ev3basic/ev3-basic-programming  

Перевод: Андрей Степанов

«Карандаш и Самоделкин»

 

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

 

1.    Экран

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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. Вы можете скопировать ее в EV3 Basic и запустить, подключив блок 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/

Звуки и графика должны быть помещены в папку с проектом с помощью EV3 Explorer. Можно использовать звуки и графику из других проектов, указав в имени файла путь, включающий имя проекта, из которого заимствуются ресурсы. Файл можно создать в официальном ПО от 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 изменит его скорость на новую, заданную в ней.

 

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

 

 

 

 

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

 

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”

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

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

 

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

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

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

' 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 в режим  Важно всегда устанавливать режим работы датчика перед его использованием..

 

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 датчики

 

 

 

NXT датчики

 

Справочник по командам 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 (цвет, x, y, размер_шрифта, текст)

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

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

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

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

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

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

 

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

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

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

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

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

 

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

 

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

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

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

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

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

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

 

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

Вывести файл заданным цветом на экран. Поддерживаются только файлы в формате .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.StartSteer (ports, speed, turn)

This command is available only in versions 1.2 and later of the EV3 extension. Set two motors to run with a specified speed and relative ratio. This ratio is determined by the 'turn' parameter which basically determines into which direction a vehicle with a simple two-wheel drive would make its turn (given that the motor with the lower port letter is mounted on the left side). The two motors will be synchronized which means that when one motor experiences some resistance and cannot keep up its speed, the other motor will also slow down or stop altogether. This is especially useful for vehicles with two independently driven wheels which still need to go straight or make a specified turn. The motors will keep running until stopped by another command.

ports  Name of two motor ports (for example "AB" or "CD").

speed  Speed value from -100 (full reverse) to 100 (full forward) for the faster motor.

turn  Turn ratio from -100 (rotating left on the spot) to 100 (rotating right on the spot).

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

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

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

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

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

 

Motor.GetSpeed (порт)

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

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

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

 

Motor.IsBusy (порты)

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

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

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

Motor.Invert (ports)

This command is available only in versions 1.2 and later of the EV3 extension. Invert the polarity (direction) of one or more motors. This will affect all future commands that move this motors and also the tacho and speed readings will deliver inverted values. This operation makes it easy to change the way a motor is built into a robot without altering the rest of the program. You just need to add a single Motor.Invert() command at the very start of the program. Note that there is intentionally no way to disable the inversion later on.

ports  Motor port name(s)

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.ScheduleSteer (ports, speed, turn, degrees, brake)

This command is available only in versions 1.2 and later of the EV3 extension. Move 2 motors a defined number of degrees with a specified speed and relative ratio. This ratio is determined by the 'turn' parameter which basically determines into which direction a vehicle with a simple two-wheel drive would make its turn (given that the motor with the lower port letter is mounted on the left side). The two motors are synchronized which means that when one motor experiences some resistance and cannot keep up its speed, the other motor will also slow down or stop altogether. This is especially useful for vehicles with two independently driven wheels which still need to go straight or make a specified turn. The distance to move is for the motor with the higher speed. This function returns immediately. You can use IsBusy() to detect the end of the movement or call Wait() to wait until movement is finished.

ports  Names of 2 motor ports (for example "AB" or "CD"

speed  Speed value from -100 (full reverse) to 100 (full forward) of the faster motor.

turn  Turn ratio from -100 (rotating left on the spot) to 100 (rotating right on the spot).

degrees  The angle through which the faster motor should rotate.

brake  "True", if the motors should switch on the brake after movement.

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.MoveSteer (ports, speed, turn, degrees, brake)

This command is available only in versions 1.2 and later of the EV3 extension. Move 2 motors a defined number of degrees with a specified speed and relative ratio. This ratio is determined by the 'turn' parameter which basically determines into which direction a vehicle with a simple two-wheel drive would make its turn (given that the motor with the lower port letter is mounted on the left side). The two motors are synchronized which means that when one motor experiences some resistance and cannot keep up its speed, the other motor will also slow down or stop altogether. This is especially useful for vehicles with two independently driven wheels which still need to go straight or make a specified turn. The angle to move is for the motor with the higher speed.

ports  Names of 2 motor ports (for example "AB" or "CD"

speed  Speed value from -100 (full reverse) to 100 (full forward) of the faster motor.

turn  Turn ratio from -100 (rotating left on the spot) to 100 (rotating right on the spot).

degrees  The angle of the faster motor to rotate

brake  "True", if the motors should switch on the brake after movement

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.ReadI2CRegister (port, address, registernumber)

This command addresses one device on the I2C-bus and tries to receive the value of a single register of a connected I2C slave. 

port  Number of the sensor port

address  Address (0 - 127) of the I2C slave on the I2C bus

registernumber  Number of register in the slave to read data from.

Returns  The content of the register

Sensor.ReadI2CRegisters (port, address, registernumber, readbytes)

This command is available only in versions 1.2 and later of the EV3 extension. This command addresses one device on the I2C-bus and tries to receive the values of multiple registers of a connected I2C slave. Note that this command does not work over daisy-chaining.

port  Number of the sensor port

address  Address (0 - 127) of the I2C slave on the I2C bus

registernumber  Number of the first register in the slave to read data from.

readbytes  How many register to read (maximum 32).

Returns  An array holding the requested number of values. Index starts at 0.

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).

Sensor.WriteI2CRegister (port, address, registernumber, value)

This command is available only in versions 1.2 and later of the EV3 extension. This command addresses one device on the I2C-bus and tries to write the value of a single register of a connected I2C slave. Note that this command does not work over daisy-chaining.

port  Number of the sensor port

address  Address (0 - 127) of the I2C slave on the I2C bus

registernumber  Number of the register in the slave to write data to.

value  Value to write into the register.

Sensor.WriteI2CRegisters (port, address, registernumber, writebytes, writedata)

This command is available only in versions 1.2 and later of the EV3 extension. This command addresses one device on the I2C-bus and tries to write the values of multiple registers of a connected I2C slave. Note that this command does not work over daisy-chaining.

port  Number of the sensor port

address  Address (0 - 127) of the I2C slave on the I2C bus

registernumber  Number of the first register in the slave to write data to.

writebytes  How many bytes to write into the registers (maximum 30).

writedata  Array holding the data bytes to be written (starting at 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)

Операция умножения матриц. Входные вектора рассматриваются как двумерные матрицы заданной ширины и высоты. Отдельные строки матрицы хранятся в векторе непосредственно одна за другой. Чтобы узнать больше об этой математической операции, см. http://en.wikipedia.org/wiki/Matrix_multiplication

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

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

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

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

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

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