
Гусеница сделана из строительной перфоленты, контроллера Arduino Nano и трёх сервомашинок
На ПК происходит опрос нажатых клавиш, буквы которых передаются через bluetooth-адаптер(который просто эмулирует COM-порт) на Arduino (принимаются приёмником Bluetooth Bee) для дальнейшего преобразования и выполнения.
На Arduino используется библиотека NewSoftSerial.
Питается робот от четырёх батареек ААА, закрепленных в держателе.
Видео работы:
Отличный робот 🙂 Перфоленту можно заменить на пластинки из пластика — например, из поликапролактона и будет вообще красота 🙂
крупный план разных типов движений робота:
http://www.youtube.com/watch?v=d1Rd4nRYzmk
http://www.youtube.com/watch?v=Z1FG716vD8E
http://www.youtube.com/watch?v=Mr_V4jFnI34
//==========================================================
//Inchworm Arduino Program Source Code v 1.0
//
//Author: Dmitry Votintsev
//Web: www.dmitryvv.ru
//E-mail: mail@dmitryvv.ru
//
//ATTENTION: Any commercial use is prohibited
//==========================================================
#include <Servo.h>
#include <NewSoftSerial.h>
//==DEFINITIONS=============================================
#define RxD 0
#define TxD 1
#define SERVO_FRONT_PIN 6
#define SERVO_TAIL_PIN 5
#define SERVO_MIDDLE_PIN 3
#define TUMBLER_PIN_1 11
#define TUMBLER_PIN_2 12
#define DEBUG_ENABLED 1
#define VIRGIN_STATE servoMiddle.write (90);\
servoTail.write (90);\
servoFront.write (90);\
delay (250);
#define STEP_FORWARD servoTail.write(93); \
delay (300); \
servoFront.write(93);\
delay (300); \
servoTail.write(30); \
delay (300); \
servoFront.write(30);
#define STEP_BACKWARD servoFront.write(93); \
delay (300); \
servoTail.write (93); \
delay (300); \
servoFront.write(30); \
delay (300); \
servoTail.write (30);
#define TURN_AROUND_LEFT servoFront.write(110); \
servoTail.write (80); \
delay (100); \
servoMiddle.write(30); \
delay (300); \
servoFront.write (80); \
servoTail.write (110); \
delay (100); \
servoMiddle.write(150);\
delay (300);
#define TURN_AROUND_RIGHT servoFront.write(110); \
servoTail.write (80); \
delay (100); \
servoMiddle.write(150);\
delay (300); \
servoFront.write (80); \
servoTail.write (110); \
delay (100); \
servoMiddle.write(30); \
delay (300);
#define WHEELY_MODE_LEFT servoTail.write (40); \
servoFront.write(40); \
delay (350); \
servoMiddle.write (20); \
delay (350); \
servoTail.write (140); \
servoFront.write(140); \
delay (350); \
servoMiddle.write (160);\
delay (350);
#define WHEELY_MODE_RIGHT servoTail.write (40); \
servoFront.write(40); \
delay (350); \
servoMiddle.write (160);\
delay (350); \
servoTail.write (140); \
servoFront.write(140); \
delay (350); \
servoMiddle.write (20); \
delay (350);
#define STEPPING_MODE_LEFT servoTail.write (70); \
servoFront.write(70); \
delay (350); \
servoMiddle.write (50); \
delay (350); \
servoTail.write (110); \
servoFront.write(110); \
delay (350); \
servoMiddle.write (130);\
delay (350);
#define STEPPING_MODE_RIGHT servoTail.write (70); \
servoFront.write(70); \
delay (350); \
servoMiddle.write (130);\
delay (350); \
servoTail.write (110); \
servoFront.write(110); \
delay (350); \
servoMiddle.write (50); \
delay (350);
//==INITIALIZATION==========================================
Servo servoFront;
Servo servoTail;
Servo servoMiddle;
NewSoftSerial blueToothSerial(RxD,TxD);
void demonstrationMode ();
void presentationMode ();
void serialControlMode ();
void setupBlueToothConnection();
void setup()
{
pinMode(SERVO_FRONT_PIN , OUTPUT);
pinMode(SERVO_TAIL_PIN , OUTPUT);
pinMode(SERVO_MIDDLE_PIN, OUTPUT);
pinMode(TUMBLER_PIN_1, INPUT);
pinMode(TUMBLER_PIN_2, INPUT);
pinMode(RxD, INPUT);
pinMode(TxD, OUTPUT);
servoFront.attach (SERVO_FRONT_PIN );
servoTail.attach (SERVO_TAIL_PIN );
servoMiddle.attach(SERVO_MIDDLE_PIN);
setupBlueToothConnection();
}
void setupBlueToothConnection()
{
blueToothSerial.begin(38400);
delay(1000);
sendBlueToothCommand("\r\n+STWMOD=0\r\n");
sendBlueToothCommand("\r\n+STNA=Inchworm robot\r\n");
sendBlueToothCommand("\r\n+STAUTO=0\r\n");
sendBlueToothCommand("\r\n+STOAUT=1\r\n");
sendBlueToothCommand("\r\n +STPIN=8912\r\n");
delay(2000);
sendBlueToothCommand("\r\n+INQ=1\r\n");
delay(2000);
}
void CheckOK()
{
char a,b;
while(1)
{
if(int len = blueToothSerial.available())
{
a = blueToothSerial.read();
if('O' == a)
{
b = blueToothSerial.read();
if('K' == b)
{
break;
}
}
}
}
while( (a = blueToothSerial.read()) != -1) {}
}
void sendBlueToothCommand(char command[])
{
blueToothSerial.print(command);
CheckOK();
}
//==MAIN_LOOP===============================================
void loop ()
{
int tumblerMode1 = 0;
int tumblerMode2 = 0;
tumblerMode1 = digitalRead(TUMBLER_PIN_1);
if (tumblerMode1 == HIGH)
{
demonstrationMode ();
}
tumblerMode2 = digitalRead(TUMBLER_PIN_2);
if (tumblerMode2 == HIGH)
{
serialControlMode ();
}
if (tumblerMode1 == LOW && tumblerMode2 == LOW)
{
presentationMode ();
}
}
//------------------------------------------------------------
//inchworm demonstrates all his movements
//------------------------------------------------------------
void demonstrationMode ()
{
int i = 0;
delay (3000);
VIRGIN_STATE
while (i<8)
{
STEP_FORWARD
i++;
}
VIRGIN_STATE
i = 0;
delay (2000);
while (i<6)
{
TURN_AROUND_LEFT
i++;
}
VIRGIN_STATE
i = 0;
delay (2000);
while (i<4)
{
STEPPING_MODE_LEFT
i++;
}
VIRGIN_STATE
i = 0;
delay (2000);
//stepping back mode
while (i<4)
{
STEPPING_MODE_RIGHT
i++;
}
VIRGIN_STATE
i = 0;
delay (2000);
while (i<6)
{
TURN_AROUND_RIGHT
i++;
}
VIRGIN_STATE
i = 0;
delay (2000);
while (i<3)
{
WHEELY_MODE_LEFT
i++;
}
VIRGIN_STATE
i = 0;
delay (2000);
while (i<3)
{
WHEELY_MODE_RIGHT
i++;
}
VIRGIN_STATE
i = 0;
delay (15000);
}
//------------------------------------------------------------
//Inchworm listens to The Master's commands
//------------------------------------------------------------
void serialControlMode ()
{
static int val = 0;
static int mid = 90;
if (blueToothSerial.available())
{
char data = blueToothSerial.read();
switch (data)
{
case 's': //Very sorry for this sh!t. Really easier to process.
STEP_FORWARD
servoTail.write(93);
delay (300);
servoFront.write(93);
delay (300);
break;
case 'b':
STEP_BACKWARD
servoFront.write(93);
delay (300);
servoTail.write(93);
delay (300);
break;
case 'l':
servoMiddle.write(mid-20);
mid-=20;
delay (200);
break;
case 'r':
servoMiddle.write(mid+20);
mid+=20;
delay (200);
break;
case 'a':
WHEELY_MODE_LEFT
VIRGIN_STATE
break;
case 'c':
WHEELY_MODE_RIGHT
VIRGIN_STATE
break;
case 'd':
STEPPING_MODE_LEFT
VIRGIN_STATE
break;
case 'e':
STEPPING_MODE_RIGHT
VIRGIN_STATE
break;
case 'f':
TURN_AROUND_LEFT
VIRGIN_STATE
break;
case 'g':
TURN_AROUND_RIGHT
VIRGIN_STATE
break;
}
}
}
//------------------------------------------------------------
//Inchworm makes small movements and nods his "head".
//------------------------------------------------------------
void presentationMode ()
{
int i = 0;
delay (30000);
servoMiddle.write (150);
delay (1000);
while (i < 40)
{
servoFront.write (90+i);
delay (20);
i++;
}
i = 0;
while (i < 40)
{
servoFront.write (130-i);
delay (20);
i++;
}
i = 0;
delay (1000);
servoMiddle.write (90);
delay (1000);
while (i < 40)
{
servoFront.write (90+i);
delay (20);
i++;
}
i = 0;
while (i < 40)
{
servoFront.write (130-i);
delay (20);
i++;
}
i = 0;
delay (1000);
servoMiddle.write (30);
delay (1000);
while (i < 40)
{
servoFront.write (90+i);
delay (20);
i++;
}
i = 0;
while (i < 40)
{
servoFront.write (130-i);
delay (20);
i++;
}
i = 0;
}
//==www.dmitryvv.ru=========================================
Ссылки
Робот «Inchworm» на базе Arduino Nano
По теме
Будущее за бионическими роботами?
Змеелок–3 - робот-змея из Санкт-Петербурга
Робозмея ACM-R5H
Израильская армия примет на вооружение змею-робота
Робот-червяк на базе Arduino

0 комментариев на «“Гусеницеподобный робот на Arduino Nano”»
я правильно понимаю, что сервоприводы дорабатывались, т.е. как минимум вал выводился на обе стороны сервы?
Если да, можно вас попросить сделать детальное фото — как это выглядит?
а почему вы решили, что сервы доработаны? 🙂
2е видео + здравый смысл.
Извините, я не обратил внимания, что вы не автор разработки, пойду спрошу на хабре