Мой первый робот
- Войдите на сайт для отправки комментариев
Сб, 18/02/2012 - 11:43
Приветствую всех!
Мой первый робот. Наконец кончил собирать и устанавливать все компоненты и теперь пришло время для софта. :)
http://i1067.photobucket.com/albums/u427/Romas_Lina/1.jpg
http://i1067.photobucket.com/albums/u427/Romas_Lina/2.jpg
http://i1067.photobucket.com/albums/u427/Romas_Lina/3.jpg
http://i1067.photobucket.com/albums/u427/Romas_Lina/4.jpg
http://i1067.photobucket.com/albums/u427/Romas_Lina/5.jpg
http://i1067.photobucket.com/albums/u427/Romas_Lina/6.jpg
http://i1067.photobucket.com/albums/u427/Romas_Lina/7.jpg
http://i1067.photobucket.com/albums/u427/Romas_Lina/8.jpg
http://i1067.photobucket.com/albums/u427/Romas_Lina/9.jpg
Прикольный робот))) больше всего понравилась прога на компе и продуманная система выключения. Как я понял через реле? То есть сначала вручную включаешь. Вижу будет продолжение? Столько датчиков по кругу.
Да и сортир зачётный)))
Планировка туалета на мою похожа, ты не на ул.Удальцова живешь случайно?
Вижу будет продолжение?
да теперь осталось писать много кода.. Выложу новое видео когда сделаю что нибудь новое:)
Планировка туалета на мою похожа, ты не на ул.Удальцова живешь случайно?
Нет, я уже как 15 лет в литве живу - в Клайпеде.. но родом из Рязани:)
Ну вот и продолжение, а скорее вопрос - что делать, чтобы робот прямо ехал?
На видео видно о чем идет речь.
Код с английскими командами ну там и так все ясно.
http://www.youtube.com/watch?v=3LbTOSO0x_4&feature=plcp&context=C3730bee...
void forwardesc() { if(L_forward_esc_counter == R_forward_esc_counter) ///If left and right wheels has the same counts { forward(); //We go forward with both wheels } else if(L_forward_esc_counter > R_forward_esc_counter) // If left wheel has more turns then the right { analogWrite (MOTORAF,(speedo - trimminus)); //Slow down left wheel digitalWrite(MOTORAB, LOW); analogWrite (MOTORBF,(speedo + trimplius)); //More power to right wheel digitalWrite(MOTORBB, LOW); } else //else if right wheel has more turns then the left { analogWrite (MOTORBF,(speedo – trimminus)); //Slow down right wheel digitalWrite(MOTORBB, LOW); analogWrite (MOTORAF,(speedo + trimplius)); //More power to left wheel digitalWrite(MOTORAB, LOW); } } /* speedo – is speed that I set up from processing. In another words if speed is set to 100%, speedo will be 255. Trimminus and trimplius is the number how much slower or faster should the wheel spin. For example if speed set to 50%, the speedo will be 150, and trimplius 40, trimminus 40. Here is the whole table: /////SPEED SET TO 0%(MINIMUM)// trimminus = 0; trimplius = 30; speedo = 70; /////SPEED SET TO 25%// trimminus = 30; trimplius = 30; speedo = 100; /////SPEED SET TO 50%// trimminus = 40; trimplius = 40; speedo = 150; /////SPEED SET TO 75%// trimminus = 50; trimplius = 50; speedo = 200; /////SPEED SET TO 100%// trimminus = 60; trimplius = 30; speedo = 255; */Проект очень симпатичный вышел.
А можно полюбопытствовать на первой и второй фотке хорошо видно две детали(датчика?) - желтые цилиндры примотанные резинкой. Это какой-то дальномер? Или что?
IR дальномер
IR дальномер
Спасибо. А какая у него эффективная дальность? Если известно можно моделью поинтересоваться.
http://www.ebay.com/itm/Arduino-Infrared-Reflectance-Sensor-Sensor-Shiel...
Новое видео:) - http://www.youtube.com/watch?v=00byli7JjQY&context=C4f935f6ADvjVQa1PpcFO...
Интересно, но я что-то не пойму зачем столько дальномеров? Несколько ультразвуковых и ик еще, или на будущее? Чтобы ездить и объезжать препятствия достаточно одного ультразвукового дальномера.
Ну вот и продолжение, а скорее вопрос - что делать, чтобы робот прямо ехал?
На видео видно о чем идет речь.
Код с английскими командами ну там и так все ясно.
Подход 1.
Завести для каждого колеса отдельную переменную, в которой хранится скорость колеса. Уменьшать сначала ее, а потом уже из нее, а не констант, устанавливать скорость на колесо. Тогда эта стабилизирующая функция будет несколько раз "поправлять скорость", если одноразовой поправки не хватило. А не как сейчас делать "фиксированную разницу скорости колес" (и не известно "достаточно" этого или "слишком много").
Подход 2.
Запоминать время когда произошела смена L_forward_esc_counter и R_forward_esc_counter. Из их раницы вычислять "точно необходимую поправку".
Подход 3.
PID библиотека ;) Запоминать время X_forward_esc_counter, вычислять "время круга". Тогда входом для PID будет желаемая RMP, обратной связью "реальная скорость" (RPM), а управляющим воздействием - нужный PWM.
Все три подхода имеют, потенциально, одну общую проблему: что-бы робот стабилизировался должно произойте несколько оборотов колеса. А оно у вас большое. Пару раз крутнул и комната уже кончилась.
Варианты решения:
P.S. И да, попроуйте еще уменьшить значения trimminus, timplus. Возможно он у вас изначально едет "почти прямо", а потом как включется корректировка где разница скорости колес почти 50%-процентов это выглядит как "поворот". Вообщем он у вас отклонился от прямой на пару градусов вправо, а вы, вместо "чуть-чуть довернуть влево", выполнили "боевой разворот влево".
думаю нужно увеличивать резолюцию энкодера. сейчас 8 "зубов" то есть 16 сигналов за один оборот, А нужно чтобы было как минимум 18 "зубов" то есть каждый десять градусов. А так конечно подход 3, самый правильный. Также и скетч изменился, сейчас задается скорость сантиметрами в секунду - то есть если speedo 30. Значит робот будет ехать 30 см в сек, не важно в гору или с горки. Только сейчас времени нету PID библиотеку изучать, да и с самим роботом заниматься. А то и так проект на проекте и нечего законченного.
Мне бы таую программу, да под андроид, вообще шикарно было бы)
если не трудно поделись исходником, мож его за основу возьму)
я сейчас делаю четырехмоторного робота, у меня та же проблема с не прямой ездой, правда менее выражена, но у меня самодельная платформа, возможно еще на ней колеса не так точно установлены...
>Мне бы таую программу, да под андроид, вообще шикарно было бы)
Очень плохая идея. Андроид - не система реального времени. Там ваша программа может быть в любой момент выкинута из памяти, приостановлена, загнана в низкие приоритеты.
То есть предсказать сколько времени выполнялся тот или иной кусок кода - не возможно.
Поэтому чем-то "управлять напрямую", считывать тики датчиков - практически не реально.
На нем можно делать "удобный/красивый" интерфейс. Что-бы он передавал ардуине "высокоуровневые команды" (прямо, правей, левей, держи такую скорость и т.п.) А уж какой pwm включать, засекать с какой скоростью колесо крутится, время прихода эха от сенсора засекать - это в любом случае должна ардуина делать.
Ну "а хочу", у вас есть три варианта: