Мой первый робот

Mastino
Offline
Зарегистрирован: 03.12.2011
LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Прикольный робот))) больше всего понравилась прога на компе и продуманная система выключения. Как я понял через реле? То есть сначала вручную включаешь. Вижу будет продолжение? Столько датчиков по кругу.
Да и сортир зачётный)))
 

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Планировка туалета на мою похожа, ты не на ул.Удальцова живешь случайно? 

Mastino
Offline
Зарегистрирован: 03.12.2011

LEVV2006 пишет:

Вижу будет продолжение?

да теперь осталось писать много кода.. Выложу новое видео когда сделаю что нибудь новое:)

carduino.ru пишет:

Планировка туалета на мою похожа, ты не на ул.Удальцова живешь случайно?

Нет, я уже как 15 лет в литве живу - в Клайпеде.. но родом из Рязани:)

 

Mastino
Offline
Зарегистрирован: 03.12.2011

Ну вот и продолжение, а скорее вопрос - что делать, чтобы робот прямо ехал?
На видео видно о чем идет речь.
Код с английскими командами ну там и так все ясно.

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;
*/

 

Zapek@n
Offline
Зарегистрирован: 16.02.2012

 Проект очень симпатичный вышел. 

А можно полюбопытствовать на первой и второй фотке хорошо видно две детали(датчика?) - желтые цилиндры примотанные резинкой. Это какой-то дальномер? Или что?

Mastino
Offline
Зарегистрирован: 03.12.2011

IR дальномер

Zapek@n
Offline
Зарегистрирован: 16.02.2012

Mastino пишет:

IR дальномер

Спасибо. А какая у него эффективная дальность? Если известно можно моделью поинтересоваться.

Mastino
Offline
Зарегистрирован: 03.12.2011
Mastino
Offline
Зарегистрирован: 03.12.2011
ttt1970
Offline
Зарегистрирован: 02.05.2012

Интересно, но я что-то не пойму зачем столько дальномеров? Несколько ультразвуковых и ик еще, или на будущее? Чтобы ездить и объезжать препятствия достаточно одного ультразвукового дальномера.

leshak
Offline
Зарегистрирован: 29.09.2011

Mastino пишет:

Ну вот и продолжение, а скорее вопрос - что делать, чтобы робот прямо ехал?
На видео видно о чем идет речь.
Код с английскими командами ну там и так все ясно.

 

Подход 1.

Завести для каждого колеса отдельную переменную, в которой хранится скорость колеса. Уменьшать  сначала ее, а потом уже из нее, а не констант, устанавливать скорость на колесо. Тогда эта стабилизирующая функция будет несколько раз "поправлять скорость", если одноразовой поправки не хватило. А не как сейчас делать "фиксированную разницу скорости колес" (и не известно "достаточно" этого или "слишком много").

Подход 2.

Запоминать время когда произошела смена L_forward_esc_counter и R_forward_esc_counter. Из их раницы вычислять "точно необходимую поправку".

Подход 3.

PID библиотека ;)  Запоминать время X_forward_esc_counter, вычислять "время круга". Тогда входом для PID будет желаемая RMP, обратной связью "реальная скорость" (RPM), а управляющим воздействием - нужный PWM.

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

Варианты решения:

  1. Уменьшить размеры колес
  2. Сделать отдельне маленькие колеса, без движков, но с датчиками оборотов. Для измерения скорости.
  3. Сделать ссади, по центру, маленькое колесико. Свободно поворачивающиеся. И на эту ось поворота посадить что-то типа энкодера или переменного резистора. И по его значению узнавать "едем прямо или нет".

 

P.S. И да, попроуйте еще уменьшить значения trimminus, timplus. Возможно он у вас изначально едет "почти прямо", а потом как включется корректировка где разница скорости колес почти 50%-процентов это выглядит как "поворот". Вообщем он у вас отклонился от прямой на пару градусов вправо, а вы, вместо "чуть-чуть довернуть влево", выполнили "боевой разворот влево".

Mastino
Offline
Зарегистрирован: 03.12.2011

думаю нужно увеличивать резолюцию энкодера. сейчас 8 "зубов" то есть 16 сигналов за один оборот, А нужно чтобы было как минимум 18 "зубов" то есть каждый десять градусов. А так конечно подход 3, самый правильный. Также и скетч изменился, сейчас задается скорость сантиметрами в секунду - то есть если speedo 30. Значит робот будет ехать 30 см в сек, не важно в гору или с горки. Только сейчас времени нету PID библиотеку изучать, да и с самим роботом заниматься. А то и так проект на проекте и нечего законченного.

trunker
Offline
Зарегистрирован: 05.05.2012

Мне бы таую программу, да под андроид, вообще шикарно было бы)

если не трудно поделись исходником, мож его за основу возьму)

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

leshak
Offline
Зарегистрирован: 29.09.2011

 >Мне бы таую программу, да под андроид, вообще шикарно было бы)

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

То есть предсказать сколько времени выполнялся тот или иной кусок кода - не возможно.

Поэтому чем-то "управлять напрямую", считывать тики датчиков - практически не реально.

На нем можно делать "удобный/красивый" интерфейс. Что-бы он передавал ардуине "высокоуровневые команды" (прямо, правей, левей, держи такую скорость и т.п.) А уж какой pwm включать, засекать с какой скоростью колесо крутится, время прихода эха от сенсора засекать  - это в любом случае должна ардуина делать.

Ну "а хочу", у вас есть три варианта:

  1. Писать самому
  2. Искать годовое
  3. Нанять программера (но это дорогое удовольствие)