CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

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

Гусеницеподобный робот на Arduino
Гусеница сделана из строительной перфоленты, контроллера Arduino Nano и трёх сервомашинок
На ПК происходит опрос нажатых клавиш, буквы которых передаются через bluetooth-адаптер(который просто эмулирует COM-порт) на Arduino (принимаются приёмником Bluetooth Bee) для дальнейшего преобразования и выполнения.
На Arduino используется библиотека NewSoftSerial.
Питается робот от четырёх батареек ААА, закрепленных в держателе.

Видео работы:

Отличный робот :) Перфоленту можно заменить на пластинки из пластика — например, из поликапролактона и будет вообще красота :)

крупный план разных типов движений робота:




скетч:

//==========================================================
//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
  • +1
  • 17 июля 2011, 18:27
  • admin

Комментарии (3)

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

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

xtile

  • 18 июля 2011, 19:28
+
0
а почему вы решили, что сервы доработаны? :)
avatar

admin

  • 18 июля 2011, 20:30
+
0
2е видео + здравый смысл.

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

xtile

  • 18 июля 2011, 20:45

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.