Сегодня ребята из команды "Карандаш и Самоделкин" снова будут решать вместе с вами задачки по робототехнике. Программировать робота для решения задач мы будем на новом языке программирования 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
EV3 BASIC - свободно распространяемая среда программирования для платформы LEGO Mindstorms EV3, основанная на языке Бейсик.
Наш перевод EV3 BASIC на русский язык вошел в новую версию среды программирования 1.0.9, которая уже доступна для скачивания.
Инструкцию по сборке робота и программы из этой серии вы сможете скачать в разделе Инструкции по сборке
Инструкция на учебного робота доступна в двух форматах - 3D модель в LEGO Digital Designer и пошаговая сборка в PDF.
Код программы:
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
Прошу прощения за дилетантский вопрос: как программу, созданную в EV3 Basic залить в блок управления роботом?
ОтветитьУдалитьДля этого служит программа EV3 Explorer, которая установилась вместе с EV3 Basic. Она является одновременно компилятором и файловым менеджером. Нужно сохранить программу в файл, отметить его на правой панели, а на левой создать в памяти EV3 папку, например EV3Basic, затем зайти в нее. После этого кнопкой Compile скомпилировать и загрузить на блок программу. На блоке программу найдете и сможете запустить ее из меню.
УдалитьОбъясните Пожалуйста, (как работает) вот эта часть программы :
ОтветитьУдалить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.
Если датчик-кнопка, подключенный к 4 порту нажат, то меняем переменную Trigger с 1 на 0 или в 0 на 1, в зависимости от того, чему она была равна в момент нажатия. После этого проигрываем звук-ноту, для контроля того, что кнопка нажата и для предотвращения многократного срабатывания триггера.
УдалитьДалее переменную Trigger мы используем для остановки робота, умножая ее на скорость. Если она равна нулю, скорость тоже станет равной 0 и робот остановится.
Спасибо, теперь понятно.
УдалитьЗдравствуйте! Скажите, пожалуйста, зачем в программе к задаче №5 первые пять строк? Это ведь установка режима гироскопа? Почему пять раз, и в такой последовательности? Режим 0 аж три раза повторяется. А то у меня проблемы с этим датчиком, а в обоих вариантах руководства (и англо- и русскоязычном) подробностей нет.
ОтветитьУдалитьЭто устранение глюка датчика, "дрейфа". По сути это неоднократный сброс режима. Выполняться он должен при полностью неподвижном роботе (датчике).
УдалитьСпасибо!
Удалить