Управление двигателем через C

Я работаю над роботом NXT lego mindstorm, и я создаю робота-следящего за линией с одним датчиком отраженного света, и я программирую на языке C.

датчик преобразует исходное аналоговое значение в цифровое значение в диапазоне от 0 до 1023.

Я должен закодировать, что линия черная, тогда двигатель будет двигаться вперед, и если нет линии (белая основа), тогда остановитесь, и если есть серый цвет (между белой и черной линией), то немного сдвиньте вправо, а затем влево по-другому, чтобы найти потерянную черную линию.

Итак, код похож на

While (1)
{
a=ecrobot_get_light_sensor(port_led); //storing the A/D converted value in variable

while (a<300)   // White area
{
ecrobot_status_monitor("White Area");
nxt_motor_set_speed(port_motor_l, 0, 1); // left motor turns off
nxt_motor_set_speed(port_motor_r, 0, 1); // right motor turns off
}
while (a>=600) // Black Line
{
ecrobot_status_monitor("Black Area");
nxt_motor_set_speed(port_motor_l, 100, 1); // left motor turns on
nxt_motor_set_speed(port_motor_r, 100, 1); // right motor turns on
}

while (a>=300 || a<600) // Robot loosing the black line
{
ecrobot_status_monitor("grey Area");
nxt_motor_set_speed(port_motor_l, 50, 1); // left motor move forward
nxt_motor_set_speed(port_motor_r, -50, 1); // right motor move backward

delay_ms(200)
nxt_motor_set_speed(port_motor_l, -50, 1); // left motor move backward
nxt_motor_set_speed(port_motor_r, 50, 1); // right motor move forward
delay_ms(200)

}

Проблема в том, что если робот теряет линию, то начинает движение по часовой стрелке без остановки и движение против часовой стрелки после задержки в 200 мс.

В чем проблема с моим кодом?

Как я могу остановить двигатель после этого интервала, и двигатель должен двигаться в другом направлении после этого интервала в поисках линии, и тогда он обязательно найдет линию

Спасибо!


c nxt
person user2828488    schedule 05.11.2013    source источник


Ответы (2)


Я вижу пару вещей,

  • Некоторые точки с запятой отсутствуют. Я уверен, что это не так в вашем реальном коде, поскольку он даже не компилируется. Также попробуйте использовать правильные скобки в своих утверждениях (лучшая практика :-)

  • Вам также необходимо перечитать датчик, находясь в шлейфах, чтобы избежать мертвой блокировки !!!

  • Также, как уже упоминалось, используйте операторы if / else if в большом цикле while.

  • Вы можете добавить пороги, чтобы сделать его более плавным :-)

Удачи

person opcode    schedule 05.11.2013
comment
Благодаря вам обоим, я изменил циклы while на условия if, теперь проблема в том, что если датчик находится на черной линии, то иногда он его обнаруживает, в противном случае он просто вращается на 200 мс по часовой стрелке и 200 мс против часовой стрелки, есть ли способ постоянно определять линия во время движения и если он находит черную линию, то двигаться по ней? Спасибо - person user2828488; 05.11.2013

Одно из решений - заменить все операторы while внутри цикла while (1) на операторы if.

Например, в вашем последнем операторе while, когда робот теряет черную линию, ваш робот будет вращаться по часовой стрелке, а затем вращаться против часовой стрелки в течение 200 мс в каждом направлении независимо от новых значений, считываемых с вашего датчика. Это связано с тем, что последний оператор while завершит свое выполнение раньше, чем обновится ваш a.

person mirage1s7    schedule 05.11.2013