Скриншот
Не смотря на сказанное ранее у этой программы недостатков больше, чем достоинств. Консольный интерфейс. Очень ограниченное число положений качалок сервоприводов. Невозможность одновременного изменения положения качалок нескольких сервоприводов. Все эти недостатки устранимы, но мне пока лень. Если дело дойдет до улучшения платформы тогда придется сделать GUI. Управление даже четырьмя сервоприводами из консоли напрягает. Возможно кто-то из читателей сделает то, что не сделал я :-)
Итак окончательный вариант скетча. Работа именно этой программы показана на видео.Добавлено (26.02.2013, 07:33)
---------------------------------------------
Код
////////////////////////
//
// Arduino Leonardo
//
////////////////////////
//
// Sketch: walking robot
//
#include <Servo.h>
int data = 0;
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
unsigned int time_1 = 1500;
unsigned int time_2 = 1500;
unsigned int time_3 = 1500;
unsigned int time_4 = 1500;
void check_receiver( void )
{
while (Serial1.available() > 0)
{
data = Serial1.read();
}
}
void stop_0( void )
{
// servo 1 --- 1500
// servo 2 --- 1500
// servo 3 --- 1500
// servo 4 --- 1500
time_1 = 1500;
servo1.writeMicroseconds(time_1);
time_2 = 1500;
servo2.writeMicroseconds(time_2);
time_3 = 1500;
servo3.writeMicroseconds(time_3);
time_4 = 1500;
servo4.writeMicroseconds(time_4);
delay(600);
}
void stop_1( void )
{
// servo 1 --- 1500
// servo 2 --- 1500
// servo 3 --- 1500
// servo 4 --- 1500
while (1)
{
if ( time_1 == 1500 )
if ( time_2 == 1500 )
if ( time_3 == 1500 )
if ( time_4 == 1500 )
break;
if ( time_1 < 1500 ) time_1 += 1;
if ( time_1 > 1500 ) time_1 -= 1;
servo1.writeMicroseconds(time_1);
if ( time_2 < 1500 ) time_2 += 1;
if ( time_2 > 1500 ) time_2 -= 1;
servo2.writeMicroseconds(time_2);
if ( time_3 < 1500 ) time_3 += 1;
if ( time_3 > 1500 ) time_3 -= 1;
servo3.writeMicroseconds(time_3);
if ( time_4 < 1500 ) time_4 += 1;
if ( time_4 > 1500 ) time_4 -= 1;
servo4.writeMicroseconds(time_4);
delay(1);
}
delay(100);
}
Добавлено (26.02.2013, 07:34)
---------------------------------------------
Код
void left( void )
{
// servo 1 --- 1500
// servo 2 --- 1500
// servo 3 --- 1500
// servo 4 --- 1500
time_1 = 1500;
servo1.writeMicroseconds(time_1);
time_2 = 1500;
servo2.writeMicroseconds(time_2);
time_3 = 1500;
servo3.writeMicroseconds(time_3);
time_4 = 1500;
servo4.writeMicroseconds(time_4);
delay(100);
// servo 1 --- 1800
// servo 2 --- 1500
// servo 3 --- 1500
// servo 4 --- 2000
while (1)
{
if ( time_1 == 1800 ) break;
time_1 += 1;
servo1.writeMicroseconds(time_1);
if ( time_4 < 2000 ) time_4 += 3;
servo4.writeMicroseconds(time_4);
delay(1);
}
// servo 1 --- 1800
// servo 2 --- 1500
// servo 3 --- 1300
// servo 4 --- 2000
while (1)
{
if ( time_3 == 1300 ) break;
time_3 -= 1;
servo3.writeMicroseconds(time_3);
delay(1);
}
// servo 1 --- 1500
// servo 2 --- 1500
// servo 3 --- 1300
// servo 4 --- 1500
while (1)
{
if ( time_1 == 1500 )
if ( time_4 == 1500 )
break;
if ( time_1 > 1500 ) time_1 -= 1;
servo1.writeMicroseconds(time_1);
if ( time_4 > 1500 ) time_4 -= 1;
servo4.writeMicroseconds(time_4);
delay(1);
}
// servo 1 --- 1000
// servo 2 --- 1500
// servo 3 --- 1300
// servo 4 --- 1200
while (1)
{
if ( time_4 == 1200 ) break;
if ( time_1 > 1000 ) time_1 -= 3;
servo1.writeMicroseconds(time_1);
time_4 -= 1;
servo4.writeMicroseconds(time_4);
delay(1);
}
// servo 1 --- 1000
// servo 2 --- 1500
// servo 3 --- 1500
// servo 4 --- 1200
while (1)
{
if ( time_3 == 1500 ) break;
time_3 += 1;
servo3.writeMicroseconds(time_3);
delay(1);
}
// servo 1 --- 1500
// servo 2 --- 1500
// servo 3 --- 1500
// servo 4 --- 1500
while (1)
{
if ( time_1 == 1500 )
if ( time_4 == 1500 )
break;
if ( time_1 < 1500 ) time_1 += 1;
servo1.writeMicroseconds(time_1);
if ( time_4 < 1500 ) time_4 += 1;
servo4.writeMicroseconds(time_4);
delay(1);
}
}
Добавлено (26.02.2013, 07:35)
---------------------------------------------
Код
void right( void )
{
// servo 1 --- 1500
// servo 2 --- 1500
// servo 3 --- 1500
// servo 4 --- 1500
time_1 = 1500;
servo1.writeMicroseconds(time_1);
time_2 = 1500;
servo2.writeMicroseconds(time_2);
time_3 = 1500;
servo3.writeMicroseconds(time_3);
time_4 = 1500;
servo4.writeMicroseconds(time_4);
delay(100);
// servo 1 --- 1000
// servo 2 --- 1500
// servo 3 --- 1500
// servo 4 --- 1200
while (1)
{
if ( time_4 == 1200 ) break;
if ( time_1 > 1000 ) time_1 -= 3;
servo1.writeMicroseconds(time_1);
time_4 -= 1;
servo4.writeMicroseconds(time_4);
delay(1);
}
// servo 1 --- 1000
// servo 2 --- 1700
// servo 3 --- 1500
// servo 4 --- 1200
while (1)
{
if ( time_2 == 1700 ) break;
time_2 += 1;
servo2.writeMicroseconds(time_2);
delay(1);
}
// servo 1 --- 1500
// servo 2 --- 1700
// servo 3 --- 1500
// servo 4 --- 1500
while (1)
{
if ( time_1 == 1500 )
if ( time_4 == 1500 )
break;
if ( time_1 < 1500 ) time_1 += 1;
servo1.writeMicroseconds(time_1);
if ( time_4 < 1500 ) time_4 += 1;
servo4.writeMicroseconds(time_4);
delay(1);
}
// servo 1 --- 1800
// servo 2 --- 1700
// servo 3 --- 1500
// servo 4 --- 2000
while (1)
{
if ( time_1 == 1800 ) break;
time_1 += 1;
servo1.writeMicroseconds(time_1);
if ( time_4 < 2000 ) time_4 += 3;
servo4.writeMicroseconds(time_4);
delay(1);
}
// servo 1 --- 1800
// servo 2 --- 1500
// servo 3 --- 1500
// servo 4 --- 2000
while (1)
{
if ( time_2 == 1500 ) break;
time_2 -= 1;
servo2.writeMicroseconds(time_2);
delay(1);
}
// servo 1 --- 1500
// servo 2 --- 1500
// servo 3 --- 1500
// servo 4 --- 1500
while (1)
{
if ( time_1 == 1500 )
if ( time_4 == 1500 )
break;
if ( time_1 > 1500 ) time_1 -= 1;
servo1.writeMicroseconds(time_1);
if ( time_4 > 1500) time_4 -= 1;
servo4.writeMicroseconds(time_4);
delay(1);
}
}
Добавлено (26.02.2013, 07:42)
---------------------------------------------
Код
void forward( void )
{
// servo 1 --- 1500
// servo 2 --- 1500
// servo 3 --- 1500
// servo 4 --- 1500
time_1 = 1500;
servo1.writeMicroseconds(time_1);
time_2 = 1500;
servo2.writeMicroseconds(time_2);
time_3 = 1500;
servo3.writeMicroseconds(time_3);
time_4 = 1500;
servo4.writeMicroseconds(time_4);
delay(100);
// servo 1 --- 1800
// servo 2 --- 1500
// servo 3 --- 1500
// servo 4 --- 2000
while (1)
{
if ( time_1 == 1800 ) break;
time_1 += 1;
servo1.writeMicroseconds(time_1);
if ( time_4 < 2000 ) time_4 += 3;
servo4.writeMicroseconds(time_4);
delay(1);
}
while (1)
{
// servo 1 --- 1800
// servo 2 --- 1300
// servo 3 --- 1300
// servo 4 --- 2000
while (1)
{
if ( time_2 == 1300 ) break;
time_2 -= 1;
servo2.writeMicroseconds(time_2);
time_3 -= 1;
servo3.writeMicroseconds(time_3);
delay(1);
}
// servo 1 --- 1500
// servo 2 --- 1300
// servo 3 --- 1300
// servo 4 --- 1500
while (1)
{
if ( time_1 == 1500 )
if ( time_4 == 1500 )
break;
if ( time_1 > 1500 ) time_1 -= 1;
servo1.writeMicroseconds(time_1);
if ( time_4 > 1500 ) time_4 -= 1;
servo4.writeMicroseconds(time_4);
delay(1);
}
// servo 1 --- 1000
// servo 2 --- 1300
// servo 3 --- 1300
// servo 4 --- 1200
while (1)
{
if ( time_4 == 1200 ) break;
if ( time_1 > 1000 ) time_1 -= 3;
servo1.writeMicroseconds(time_1);
time_4 -= 1;
servo4.writeMicroseconds(time_4);
delay(1);
}
// servo 1 --- 1000
// servo 2 --- 1500
// servo 3 --- 1500
// servo 4 --- 1200
while (1)
{
if ( time_2 == 1500 ) break;
time_2 += 1;
servo2.writeMicroseconds(time_2);
time_3 += 1;
servo3.writeMicroseconds(time_3);
delay(1);
}
check_receiver();
if ( data != 'w' && data != 'W' )
{
stop_1();
break;
}
// servo 1 --- 1000
// servo 2 --- 1700
// servo 3 --- 1700
// servo 4 --- 1200
while (1)
{
if ( time_2 == 1700 ) break;
time_2 += 1;
servo2.writeMicroseconds(time_2);
time_3 += 1;
servo3.writeMicroseconds(time_3);
delay(1);
}
// servo 1 --- 1500
// servo 2 --- 1700
// servo 3 --- 1700
// servo 4 --- 1500
while (1)
{
if ( time_1 == 1500 )
if ( time_4 == 1500 )
break;
if ( time_1 < 1500 ) time_1 += 1;
servo1.writeMicroseconds(time_1);
if ( time_4 < 1500 ) time_4 += 1;
servo4.writeMicroseconds(time_4);
delay(1);
}
// servo 1 --- 1800
// servo 2 --- 1700
// servo 3 --- 1700
// servo 4 --- 2000
while (1)
{
if ( time_1 == 1800 ) break;
time_1 += 1;
servo1.writeMicroseconds(time_1);
if ( time_4 < 2000 ) time_4 += 3;
servo4.writeMicroseconds(time_4);
delay(1);
}
// servo 1 --- 1800
// servo 2 --- 1500
// servo 3 --- 1500
// servo 4 --- 2000
while (1)
{
if ( time_2 == 1500 ) break;
time_2 -= 1;
servo2.writeMicroseconds(time_2);
time_3 -= 1;
servo3.writeMicroseconds(time_3);
delay(1);
}
check_receiver();
if ( data != 'w' && data != 'W' )
{
stop_1();
break;
}
}
}
Добавлено (26.02.2013, 07:45)
---------------------------------------------
Код
void backward( void )
{
// servo 1 --- 1500
// servo 2 --- 1500
// servo 3 --- 1500
// servo 4 --- 1500
time_1 = 1500;
servo1.writeMicroseconds(time_1);
time_2 = 1500;
servo2.writeMicroseconds(time_2);
time_3 = 1500;
servo3.writeMicroseconds(time_3);
time_4 = 1500;
servo4.writeMicroseconds(time_4);
delay(100);
// servo 1 --- 1000
// servo 2 --- 1500
// servo 3 --- 1500
// servo 4 --- 1200
while (1)
{
if ( time_4 == 1200 ) break;
if (time_1 > 1000 ) time_1 -= 3;
servo1.writeMicroseconds(time_1);
time_4 -= 1;
servo4.writeMicroseconds(time_4);
delay(1);
}
while (1)
{
// servo 1 --- 1000
// servo 2 --- 1300
// servo 3 --- 1300
// servo 4 --- 1200
while (1)
{
if ( time_2 == 1300 ) break;
time_2 -= 1;
servo2.writeMicroseconds(time_2);
time_3 -= 1;
servo3.writeMicroseconds(time_3);
delay(1);
}
// servo 1 --- 1500
// servo 2 --- 1300
// servo 3 --- 1300
// servo 4 --- 1500
while (1)
{
if ( time_1 == 1500 )
if ( time_4 == 1500 )
break;
if ( time_1 < 1500 ) time_1 += 1;
servo1.writeMicroseconds(time_1);
if ( time_4 < 1500 ) time_4 += 1;
servo4.writeMicroseconds(time_4);
delay(1);
}
// servo 1 --- 1800
// servo 2 --- 1300
// servo 3 --- 1300
// servo 4 --- 2000
while (1)
{
if ( time_1 == 1800 ) break;
time_1 += 1;
servo1.writeMicroseconds(time_1);
if ( time_4 < 2000 ) time_4 += 3;
servo4.writeMicroseconds(time_4);
delay(1);
}
// servo 1 --- 1800
// servo 2 --- 1500
// servo 3 --- 1500
// servo 4 --- 2000
while (1)
{
if ( time_2 == 1500 ) break;
time_2 += 1;
servo2.writeMicroseconds(time_2);
time_3 += 1;
servo3.writeMicroseconds(time_3);
delay(1);
}
check_receiver();
if ( data != 'x' && data != 'X' )
{
stop_1();
break;
}
// servo 1 --- 1800
// servo 2 --- 1700
// servo 3 --- 1700
// servo 4 --- 2000
while (1)
{
if ( time_2 == 1700 ) break;
time_2 += 1;
servo2.writeMicroseconds(time_2);
time_3 += 1;
servo3.writeMicroseconds(time_3);
delay(1);
}
// servo 1 --- 1500
// servo 2 --- 1700
// servo 3 --- 1700
// servo 4 --- 1500
while (1)
{
if ( time_1 == 1500 )
if ( time_4 == 1500 )
break;
if ( time_1 > 1500 ) time_1 -= 1;
servo1.writeMicroseconds(time_1);
if ( time_4 > 1500 ) time_4 -= 1;
servo4.writeMicroseconds(time_4);
delay(1);
}
// servo 1 --- 1000
// servo 2 --- 1700
// servo 3 --- 1700
// servo 4 --- 1200
while (1)
{
if ( time_4 == 1200 ) break;
if ( time_1 > 1000 ) time_1 -= 3;
servo1.writeMicroseconds(time_1);
time_4 -= 1;
servo4.writeMicroseconds(time_4);
delay(1);
}
// servo 1 --- 1000
// servo 2 --- 1500
// servo 3 --- 1500
// servo 4 --- 1200
while (1)
{
if ( time_2 == 1500 ) break;
time_2 -= 1;
servo2.writeMicroseconds(time_2);
time_3 -= 1;
servo3.writeMicroseconds(time_3);
delay(1);
}
check_receiver();
if ( data != 'x' && data != 'X' )
{
stop_1();
break;
}
}
}
Добавлено (26.02.2013, 07:48)
---------------------------------------------
Код
void setup()
{
Serial1.begin(9600);
servo1.attach(4);
servo2.attach(5);
servo3.attach(6);
servo4.attach(7);
servo1.writeMicroseconds(1500);
servo2.writeMicroseconds(1500);
servo3.writeMicroseconds(1500);
servo4.writeMicroseconds(1500);
delay(600);
}
void loop()
{
check_receiver();
if ( data == 's' || data == 'S' )
{
stop_0();
}
if ( data == 'w' || data == 'W' )
{
forward();
}
if ( data == 'x' || data == 'X' )
{
backward();
}
if ( data == 'a' || data == 'A' )
{
left();
}
if ( data == 'd' || data == 'D' )
{
right();
}
}
Добавлено (26.02.2013, 07:49)
---------------------------------------------
На ПК для управления роботом используется программа http://forumdvrobot.ru/forum/3-49-1
Теперь немного о грустном. Четырех батареек АА 1.5 V хватает минут на 10. Для питания лучше использовать аккумулятор LiPo 2S 7.4 V. Иначе можно разорится. Да и поменять батарейки непросто.
Правда, платформа капризная. Замена батареек на аккумулятор может привести к изменению массы и смещению центра тяжести. Это может потребовать внесения изменений в программу. Такова цена простоты.
Вообще, питание сервоприводов через линейный стабилизатор ардуино не самая лучшая идея. Для сервоприводов лучше использовать импульсный понижающий DC-DC преобразователь ампер на 15 (с запасом). Но так как на данной платформе сервоприводов немного и в состоянии покоя они почти не потребляют энергию, то все работает нормально.