суббота, 7 ноября 2015 г.

Начинаем программировать на EV3 BASIC

Сегодня ребята из команды "Карандаш и Самоделкин" снова будут решать вместе с вами задачки по робототехнике. Программировать робота для решения задач мы будем на новом языке программирования EV3 BASIC. 
EV3 BASIC - свободно распространяемая среда программирования для платформы LEGO Mindstorms EV3, основанная на языке Бейсик. 
Наш перевод EV3 BASIC на русский язык вошел в новую версию среды программирования 1.0.9, которая уже доступна для скачивания
Инструкцию по сборке робота и программы из этой серии вы сможете скачать в разделе Инструкции по сборке 




Инструкция на учебного робота доступна в двух форматах - 3D модель в LEGO Digital Designer и пошаговая сборка в PDF.




Задача 1: Робот должен при первом нажатии датчика касания определиться с направлением движения (короткое - назад, длинное - вперед), при втором - с расстоянием, которое необходимо проехать в указанном направлении (чем дольше нажата кнопка - тем дальше едет робот), затем начать движение.

Код программы:

Sensor.SetMode(4,0)
While Sensor.ReadPercent(4) = 0
EndWhile
A = EV3.Time
While Sensor.ReadPercent(4) = 100
EndWhile
B = EV3.Time
X = B - A
Program.Delay(1000)
While Sensor.ReadPercent(4) = 0
EndWhile
A = EV3.Time
While Sensor.ReadPercent(4) = 100
EndWhile
B = EV3.Time
z = A - B
If X > 1000 Then
  Motor.Schedule("BC",100,z / 3,z / 3,z / 3,"True")
  Motor.Wait("BC")
Else
  Motor.Schedule("BC",-100,z / 3,z / 3,z / 3,"True")
  Motor.Wait("BC")
EndIf

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

Код программы:

Sensor.SetMode(1,0)
Sensor.SetMode(3,0)
Sensor.SetMode(2,0)
Sensor.SetMode(2,1)
Sensor.SetMode(2,0)
Sensor.SetMode(2,1)
Sensor.SetMode(2,0)

Bl_Keg = 100
Dl_keg = 0
Am_Bl_Keg = 0
Am_Dl_keg = 0
loop = "True"

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

While loop
  
  Gyro = Sensor.ReadRawValue(2,0)
  IR = Sensor.ReadRawValue(1,0)
  If Gyro < -360 Then
    loop = "False"
  EndIf
  
  If IR < Bl_Keg Then
    Bl_Keg = IR
    Am_Bl_Keg = Gyro 
  EndIf
  
  If IR > Dl_keg Then
    Dl_Keg = IR
    Am_Dl_keg = Gyro
  EndIf
  
EndWhile

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

LCD.Clear()
LCD.Text(1, 0, 0, 1, Bl_keg)
LCD.Text(1, 50, 0, 1, Am_Bl_keg)
LCD.Text(1, 0, 20, 1, Dl_keg)
LCD.Text(1, 50, 20, 1, Am_Dl_keg)

Motor.StartSync("BC", -10, 10)
While Sensor.ReadRawValue(2,0) < Am_Bl_Keg - 5  
EndWhile
Motor.Stop("BC", "True")

Motor.Schedule("BC", 30, 100, 10000, 100, "True")
While Sensor.ReadPercent(3) > 25    
EndWhile
Motor.Stop("BC","False")
Motor.Schedule("BC", 30, 0, 0, 100, "True")

Motor.Wait("BC")

Задача 3: Усложненный кегельринг. Робот должен выбить все кегли за пределы круга, при этом подвижный флажок, установленный на роботе должен всегда смотреть в направлении старта робота.

Код программы:

Sensor.SetMode(2,0)
Sensor.SetMode(2,1)
Sensor.SetMode(2,0)
Sensor.SetMode(1,0)
Sensor.SetMode(3,0)
Sensor.SetMode(4,0)

Thread.Run = FLAG

S = 15

Sub FLAG
  Motor.ResetCount("A")
  Pk = 0.15
  Kk = 0.0001
  While "True"
    Er = Sensor.ReadRawValue(2,0) + Motor.GetCount("A")
    V = Er*Pk + Er*Er*Er*Kk 
    Motor.Start("A",-V)
  EndWhile
EndSub

While Sensor.ReadPercent(4) < 50
  Program.Delay(1)
EndWhile
While "True"
  Motor.StartSync("BC", S, -S)
  If Sensor.ReadPercent(1) < 63 Then
    Motor.Stop("BC","True") 
    Motor.ResetCount("BC")
    Motor.StartSync("BC", 50, 50)
    While Sensor.ReadPercent(3) > 25
      Program.Delay(1)
    EndWhile
    Motor.Stop("BC","True")    
    Motor.MoveSync("BC", -50, -50, Motor.GetCount("C"), "True")
    Motor.Stop("BC","True")    
  EndIf

EndWhile 

Задача 4: Робот, двигаясь по линии, должен останавливаться перед препятствием и ожидать, пока его не уберут. Кроме этого должна быть возможность поставить робота "на паузу" по датчику-кнопке.

Код программы:

Sensor.SetMode(3,0)
Sensor.SetMode(1,0)

Pk = 0.09
Kk = 0.0016
Sp = 30
Ser = 48
Stop = 1
Trigger = 1

Thread.Run = Start_Stop

Sub Start_Stop
  While "True"
    If Sensor.ReadRawValue(1,0) < 40 Then
      Stop = 0
    Else
      Stop = 1
    EndIf
 
    If Sensor.ReadPercent(4) > 50 Then
      If Trigger = 0 Then
        Trigger = 1
      Else
        Trigger = 0
      EndIf
      Speaker.Note(75, "D5", 1000)
      Speaker.Wait()
    EndIf
  EndWhile
EndSub

While "True"
  Er = Sensor.ReadPercent(3) - Ser
  V = Er*Pk + Er*Er*Er*Kk/10
  Motor.StartSync("BC", (Sp+V) * Stop * Trigger, (Sp-V) * Stop * Trigger)
EndWhile

Задача 5: Движение по "восьмерке", используя только датчик-гироскоп.

Код программы:

Sensor.SetMode(2,0)
Sensor.SetMode(2,1)
Sensor.SetMode(2,0)
Sensor.SetMode(2,1)
Sensor.SetMode(2,0)

Napr = 0
Er = 0
Pk = 1.8
Kk = 0.003
Sp = 20

Thread.Run = NAPRAVLENIE

Sub NAPRAVLENIE
  While "True"
    
    For Napr = 0 To 360
      Program.Delay(30)
    EndFor
    
    For Napr = 360 To 0 Step -1
      Program.Delay(30)
    EndFor
    
  EndWhile
EndSub

While "True"
  Er = Napr - Sensor.ReadRawValue(2,0)
  V = Er * Pk + Er * Er * Er * Kk
  Motor.StartSync("BC", Sp-V, Sp+V)
EndWhile

8 комментариев:

  1. Прошу прощения за дилетантский вопрос: как программу, созданную в EV3 Basic залить в блок управления роботом?

    ОтветитьУдалить
    Ответы
    1. Для этого служит программа EV3 Explorer, которая установилась вместе с EV3 Basic. Она является одновременно компилятором и файловым менеджером. Нужно сохранить программу в файл, отметить его на правой панели, а на левой создать в памяти EV3 папку, например EV3Basic, затем зайти в нее. После этого кнопкой Compile скомпилировать и загрузить на блок программу. На блоке программу найдете и сможете запустить ее из меню.

      Удалить
  2. Объясните Пожалуйста, (как работает) вот эта часть программы :

    If Sensor.ReadPercent(4) > 50 Then
    If Trigger = 0 Then
    Trigger = 1
    Else
    Trigger = 0
    EndIf
    Speaker.Note(75, "D5", 1000)
    Speaker.Wait()
    EndIf

    взятая из задачи номер 4.

    ОтветитьУдалить
    Ответы
    1. Если датчик-кнопка, подключенный к 4 порту нажат, то меняем переменную Trigger с 1 на 0 или в 0 на 1, в зависимости от того, чему она была равна в момент нажатия. После этого проигрываем звук-ноту, для контроля того, что кнопка нажата и для предотвращения многократного срабатывания триггера.

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

      Удалить
    2. Спасибо, теперь понятно.

      Удалить
  3. Здравствуйте! Скажите, пожалуйста, зачем в программе к задаче №5 первые пять строк? Это ведь установка режима гироскопа? Почему пять раз, и в такой последовательности? Режим 0 аж три раза повторяется. А то у меня проблемы с этим датчиком, а в обоих вариантах руководства (и англо- и русскоязычном) подробностей нет.

    ОтветитьУдалить
    Ответы
    1. Это устранение глюка датчика, "дрейфа". По сути это неоднократный сброс режима. Выполняться он должен при полностью неподвижном роботе (датчике).

      Удалить

Самое популярное