
Гусеница сделана из строительной перфоленты, контроллера 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е видео + здравый смысл.
Извините, я не обратил внимания, что вы не автор разработки, пойду спрошу на хабре