Гусеницеподобный робот на Arduino Nano


Гусеницеподобный робот на Arduino
Гусеница сделана из строительной перфоленты, контроллера 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: [email protected]
//
//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”»

  1. я правильно понимаю, что сервоприводы дорабатывались, т.е. как минимум вал выводился на обе стороны сервы?

    Если да, можно вас попросить сделать детальное фото — как это выглядит?

    • а почему вы решили, что сервы доработаны? 🙂

    • 2е видео + здравый смысл.

      Извините, я не обратил внимания, что вы не автор разработки, пойду спрошу на хабре

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна конкурс манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение