Гусеница сделана из строительной перфоленты, контроллера 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”»
я правильно понимаю, что сервоприводы дорабатывались, т.е. как минимум вал выводился на обе стороны сервы?
Если да, можно вас попросить сделать детальное фото — как это выглядит?
а почему вы решили, что сервы доработаны? 🙂
2е видео + здравый смысл.
Извините, я не обратил внимания, что вы не автор разработки, пойду спрошу на хабре