Плавное трогание с места

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

Добрый день всем!
Так вот занимаюсь я своим роботом http://arduino.ru/forum/proekty/moi-pervyi-robot
И чуть чуть застрял на одном месте.. Хоть и задача не сложна, не как не могу найти идеальное решение.
Сама задача в том, как заставить плавно трогаться и разгоняться робота?

Какие сведения имеются:
1. Запрашиваемая скорость(по сериалу отсылается информация с какой скоростью должен ехать робот = сантиметров в секунду. В коде это значение называется SPEEDO.
Минимальная скорость ≈ 10см/сек (SPEEDO = 10;) Максимальная скорость ≈ 150см/сек (SPEEDO = 150;)
2. Информация с энкодера колес - каждые 100 m, приходит информация о нынешней скорости робота - см/сек(ROBOT_SPEED). Минимальная скорость которую мне удалось измерить ≈ 20 см/сек(ROBOT_SPEED = 20;), Максимальная скорость которую мне удалось измерить ≈ 145 см/сек(ROBOT_SPEED = 145;)
3. Также энкодеры колес позволяют вычислить расстояние.

Методы контроля робота:
Можно управлять ходовыми моторами робота по отдельности:

1.analogWrite (MOTORAF, leftspeedo); // Левый мотор вперед. Leftspeedo - с какой скоростью крутиться мотору. Минимальное значение leftspeedo = 70;,
максимальное leftspeedo = 255;

2.analogWrite (MOTORBF, rightspeedo); // Правый мотор вперед. Rightspeedo - с какой скоростью крутиться мотору. Минимальное значение rightspeedo = 70;,
максимальное rightspeedo = 255;

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

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

каждые 100 ms, приходит информация о нынешней скорости робота

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Не понятна проблема.

Т.е. вы выдаете аналоговый сигнал а скорость не меняется ?

Куда вы выдаете этот сигнал ?

Или проблема с генерацией аналогового сигнала ? 

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

Проблема в том, что если SPEEDO = 150;, a ROBOT_SPEED < 20; колеса будут буксовать сначала. Так как в данный момент rightspeedo и leftspeedo напрямую связаны с SPEEDO(if(SPEEDO == 150) { rightspeedo = 255;, leftspeedo = 255;}.

По этому надо как то придумать чтобы все выглядело как то так:
- команда ехать в период со скоростью 80см в сек.

* смотри какая у нас сейчас скорость?
если наша скорость 0, постепенно увеличиваем "педаль газа" до тех пор пока не разгоняется до 80см в сек.
если наша скорость больше чем 80см в сек. отпускаем "педаль газа".

 

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

Вот как то так, только без dealy.
 

if(ROBOT_SPEED != SPEEDO)
{
if(ROBOT_SPEED < SPEEDO)
{
rightspeedo++;
leftspeedo++;
delay(20);
}
if(ROBOT_SPEED > SPEEDO)
{
rightspeedo--;
leftspeedo--;
delay(20);
}

 

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Если с нуля нужно , плавно , разогнаться  до 80 , то оператор for вам в помощь.

Примерно вот так.

void setup() 
{ 
 
} 
 
 
void loop() 
{ 
  if(скорость ==0)
  {
  for(скорость = 0; скорость < 80; скорость += 1)  
  {                                  
    analogWrite(моторпин , скорость);             
    delay(15); 
  } 
  }  
  
}