воскресенье, 29 ноября 2015 г.

Решение задачи №1. Проехать заданное расстояние за определенное время

По просьбам подписчиков начинаем публикацию ответов на "Задачки по робототехнике Карандаша и Самоделкина". Сегодня мы рассмотрим решение задачи №1.


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

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

// пусть роботу нужно проехать 2 м за 35 секунд
R = 2000
T = 35
pi = 3.14
// Размер колеса робота, мм
W = 56
// Рассчитываем, сколько градусов всего нужно проехать, с учетом размера колес
S = R * 360 / (W * pi)
// Рассчитываем среднюю скорость в град/сек
С = S / T
// Мощность на моторах, с которой робот проезжает заданное расстояние за +/- приблизительное заданное время
P = 50
// начинаем движение
Моторы(P)
// Коэф-т ускорения
K = 2
ЦИКЛ
  {
  E1 = считываем показание энкодера моторов
  Ждать (1 сек)
  E2 = считываем показание энкодера моторов   
  // смотрим сколько проехал робот за секунду
  E = E2 - E1  
  // корректируем мощность на моторах
  ЕСЛИ (E > C) ТОГДА P = P - K
  ЕСЛИ (E < C) ТОГДА P = P + K
  Моторы(P)
  // корректируем среднюю скорость с учетом оставшегося расстояния, осталось проехать:
  S = R * 360 / (W * pi) - E2
  // обновление средней скорости
  C = S / (T - таймер)  
  }

Второй вариант решения, с использованием ПИД-регулятора:

// пусть роботу нужно проехать 2 м за 35 секунд
R = 2000
T = 35
pi = 3.14
// Размер колеса робота, мм
W = 56
// Рассчитываем, сколько мм он должен проезжать за 0.1 сек 
S = R / (T * 10)
// Теперь в градусах оборотов мотора c учетом размера колес
S = ((R / (T * 10)) * 360 / (W * pi)
// Мощность на моторах, с которой робот проезжает заданное расстояние за +/- приблизительное заданное время
P = 50

// Коэфт-ты ПИД регулятора
Kp = 0.1
Ki = 0.0001
Kd = 0.2

// начальное значение ошибки регулятора
E = 0

ЦИКЛ
  {
  // предыдущее значение ошибки
  Eold = E
  E1 = считываем показание энкодера моторов
  Ждать (0.1 сек)
  E2 = считываем показание энкодера моторов
  ?/ вычисляем ошибку - на сколько градусов 
  // быстрее или медленнее у робота получилось
  E = (E2-E1) - S
  // сумма всех ошибок - интеграл
  I = I + E
  // ПИД-регулятор
  V = (Kp * E) + (Ki * I) + (Kd * (E - Eold))
  // подаем мощность M на моторы 
  M = P - V
  Моторы(М)
  }


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

NXT Mine Sweeper

Вы думаете EV3 так крут, что мы забыли об NXT? Ничего подобного! В этот раз мы собираем робота NXT Mine Sweeper по инструкции из старенькой книжки Daniele Benedettelli "Creating Cool MINDSTORMS NXT Robots" и программируем его в среде EV3-G.

Нашу программу для робота, написанную на EV3-G можно скачать по ссылке



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

Справочник по аналогам команд EV3 Basic и EV3-G

Для тех робототехников, кто уже умеет немного программировать на EV3-G при первом знакомстве c EV3 Basic встает вопрос - каким программным блокам среды LEGO Mindstorms EV3-G какие команды или конструкции языка EV3 Basic соответствуют. Мы подготовили краткий справочник-шпаргалку с такими соответствиями.

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


Примеры страниц справочника:




суббота, 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

четверг, 5 ноября 2015 г.

Задачки по робототехнике Карандаша и Самоделкина №15-16

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


Для тех читателей, которые не знакомы с нашими задачками публикуем полный их перечень, задачи №1 - 14







вторник, 3 ноября 2015 г.

Русская версия EV3 Basic

Некоторое время назад мы познакомились с такой замечательной штукой как EV3 Basic - свободно распространяемой средой программирования для платформы LEGO Mindstorms EV3, основанной на языке Бейсик. Не секрет, что при программировании на "леговском" языке EV3-G при большом количестве программного кода, даже на компьютерах с большим объемом памяти начинаются необъяснимые "глюки" и вылеты среды программирования. EV3 Basic почти столь же прост, как и EV3-G, но в тоже время обладает рядом преимуществ, присущих текстовым языкам программирования.
EV3 Basic является расширением для Microsoft Small Basic, для его установки следует выпонить следующие шаги
1. Скачиваем и устанавливаем бесплатный Microsoft Small Basic
2. Скачиваем и устанавливаем расширение EV3 Basic

Либо Вы можете скачать архив, содержащий все необходимое по ссылке:
EV3 Basic 1.0.9 RUS (перевод Карандаша и Самоделкина) с доп.материалами

Наша команда перевела "Справочник по командам" и "Руководство по программированию на EV3 Basic" на русский язык. Кроме этого мы выполнили перевод встроенной Intellisense-справки, которая в момент ввода команды отображает информацию о ней, ее параметрах и вариантах использования - это очень удобно и наглядно.



Скачать наш перевод можно по ссылке. В архиве два PDF-файла  "Справочник по командам" (содержит описание всех команд языка, предназначенных для работы с EV3) и "Руководство по программированию на EV3 Basic" (примеры использования основных команд при работе с моторами, датчиками, экраном и пр.).
Файл SmallBasicEV3Extension.ru.XML содержит наш перевод встроенной системы справки Intellisense, его нужно скопировать в c:\Program Files (x86)\Microsoft\Small Basic\Lib\ (или c:\Program Files\Microsoft\Small Basic\Lib\).

воскресенье, 1 ноября 2015 г.

Добро пожаловать!

На днях нашему проекту исполняется четыре года. Именно столько прошло с тех пор, как мы распаковали наш первый LEGO Mindstorms NXT 2.0 и собрали первого робота, Шутербота. 


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


Все новые проекты будут публиковаться в блоге и дублироваться на страницах сообщества. Рабочее обсуждение мы планируем продолжать вести на стене нашей с вами группы . Блог планируется как структурированное хранилище наших проектов и сопутствующих материалов к ним. Добро пожаловать!

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