Inchworm Robot — робот на Arduino Mini, двигающийся подобно червяку.
Робот приводится в движение пятью сервомашинками MG90S и двумя соленоидными электромагнитами (управляются через ULN2803). А управляется робот через Bluetooth-модуль HC-05.
Скетч для ардуино — Inchworm.ino
#include <Servo.h>
#include <SoftwareSerial.h>
#include <EEPROM.h>
SoftwareSerial mySerial(11, 12); // RX, TX
const int Tailmagnet = 8;
const int Headmagnet = 9;
Servo Stail; //tail servo
Servo Stail2;
Servo Scenter; // center servo
Servo Shead2;
Servo Shead; //head servo
boolean Headmagnetstatus;
boolean Tailmagnetstatus;
String recstring ="";
int Ptail;
int Ptail2;
int Pcenter;
int Phead2;
int Phead;
int Ctail;
int Ctail2;
int Ccenter;
int Chead2;
int Chead;
int Tailstep;
int Tail2step;
int Centerstep;
int Head2step;
int Headstep;
int maxstep=0;
int smoothdelay=60;
int smoothdelayaddr = 0;
int magnetdelay=200;
String movetype;
int pos;
void setup() {
Stail.attach(2);
Stail2.attach(3);
Scenter.attach(4);
Shead2.attach(5);
Shead.attach(6);
pinMode(Headmagnet, OUTPUT);
pinMode(Tailmagnet, OUTPUT);
Headmagnetstatus=true;
Tailmagnetstatus=true;
delay(1000);
smoothdelay = EEPROM.read(smoothdelayaddr);
if(smoothdelay>60)
{
smoothdelay=60;
}else if(smoothdelay<20)
{
smoothdelay=20;
}
digitalWrite(Headmagnet, LOW);
digitalWrite(Tailmagnet, LOW);
Ctail=35;
Ctail2=125;
Ccenter=90;
Chead2=125;
Chead=35;
Ptail=Ctail;
Ptail2=Ctail2;
Pcenter=Ccenter;
Phead2=Chead2;
Phead=Chead;
Stail.write(Ptail);
Stail2.write(Ptail2);
Scenter.write(Pcenter);
Shead2.write(Phead2);
Shead.write(Phead);
mySerial.begin(9600);
Serial.begin(9600);
}
void loop() {
recstring="";
while (mySerial.available()) {
char inChar = (char)mySerial.read();
recstring=inChar;
}
// if(recstring!="")
// {
// Serial.println(recstring);
// }
if (recstring=="F") //front move
{
movefront();
}else if (recstring=="B") //Backmove move
{
moveback();
}else if (recstring=="L") //Left
{
movetype="L";
movefrontturn();
}else if (recstring=="I") //Left front
{
movetype="LF";
movefrontturn();
}else if (recstring=="J") //Right front
{
movetype="RB";
movefrontturn();
}else if (recstring=="R") //Right
{
movetype="R";
movefrontturn();
}else if (recstring=="K") //Right Back
{
movetype="RB";
movebackturn();
}else if (recstring=="H") //Left back
{
movetype="LB";
movebackturn();
recstring="";
}else if (recstring=="D") //speed down
{
if (smoothdelay<60)
{
smoothdelay=smoothdelay+5;
EEPROM.write(smoothdelayaddr, smoothdelay);
}
}
else if (recstring=="U") //speed Up
{
if (smoothdelay>20)
{
smoothdelay=smoothdelay-5;
EEPROM.write(smoothdelayaddr, smoothdelay);
}
}
}
void movefrontturn()
{
digitalWrite(Tailmagnet, HIGH);
delay(magnetdelay);
// Ctail=45;
// smoothmove();
Ctail=80; //135
Ctail2=80;
Ccenter=90;
Chead2=80;
Chead=80;
smoothmove();
// Ctail=80;
// smoothmove();
//digitalWrite(Tailmagnet, LOW);
if (movetype=="L" ){
Ccenter=0;
}else if (movetype=="R" ){
Ccenter=180;
}else if (movetype=="LF" ){
Ccenter=45;
}else if (movetype=="RF" ){
Ccenter=135;
}
smoothmove();
digitalWrite(Tailmagnet, LOW);
delay(magnetdelay);
digitalWrite(Headmagnet, HIGH);
delay(magnetdelay);
Ccenter=90;
smoothmove();
digitalWrite(Headmagnet, LOW);
delay(magnetdelay);
digitalWrite(Tailmagnet, HIGH);
delay(magnetdelay);
// Ctail=900;
smoothmove();
Ctail=35; //35
Ctail2=125;
Ccenter=90;
Chead2=125;
Chead=35;
smoothmove();
// Ctail=35; //35
// smoothmove();
digitalWrite(Tailmagnet, LOW);
delay(magnetdelay);
}
void movebackturn()
{
digitalWrite(Headmagnet, HIGH);
delay(magnetdelay);
// Chead=45;
// smoothmove();
Ctail=80;
Ctail2=80;
Ccenter=90;
Chead2=80;
Chead=80; //135
smoothmove();
// Chead=80;
// smoothmove();
//digitalWrite(Headmagnet, LOW);
if (movetype=="LB" ){
Ccenter=45;
}else if (movetype=="RB" ){
Ccenter=135;
}
smoothmove();
digitalWrite(Headmagnet, LOW);
delay(magnetdelay);
digitalWrite(Tailmagnet, HIGH);
delay(magnetdelay);
Ccenter=90;
smoothmove();
digitalWrite(Tailmagnet, LOW);
delay(magnetdelay);
digitalWrite(Headmagnet, HIGH);
delay(magnetdelay);
// Chead=90;
// smoothmove();
Ctail=35;
Ctail2=125;
Ccenter=90;
Chead2=125;
Chead=35; //35
smoothmove();
// Chead=35; //35
// smoothmove();
digitalWrite(Headmagnet, LOW);
delay(magnetdelay);
}
void movefront()
{
digitalWrite(Headmagnet, HIGH);
delay(magnetdelay);
// Chead=45;
// smoothmove();
Ctail=135;
Ctail2=25;
Ccenter=90;
Chead2=25;
Chead=135; //135
smoothmove();
// Chead=135;
// smoothmove();
digitalWrite(Headmagnet, LOW);
digitalWrite(Tailmagnet, HIGH);
delay(magnetdelay);
// Ctail=145;
// smoothmove();
Ctail=35; //35
Ctail2=125;
Ccenter=90;
Chead2=125;
Chead=35;
smoothmove();
// Ctail=35; //35
// smoothmove();
digitalWrite(Tailmagnet, LOW);
delay(magnetdelay);
}
void moveback()
{
digitalWrite(Tailmagnet, HIGH);
delay(magnetdelay);
// Ctail=45;
// smoothmove();
Ctail=135; //135
Ctail2=25;
Ccenter=90;
Chead2=25;
Chead=135;
smoothmove();
// Ctail=135;
// smoothmove();
digitalWrite(Tailmagnet, LOW);
digitalWrite(Headmagnet, HIGH);
delay(magnetdelay);
// Chead=145;
// smoothmove();
Ctail=35;
Ctail2=125;
Ccenter=90;
Chead2=125;
Chead=35; //35
smoothmove();
// Chead=35; //35
// smoothmove();
digitalWrite(Headmagnet, LOW);
delay(magnetdelay);
}
void smoothmove()
{
maxstep =0;
if(abs(Ptail-Ctail)>maxstep)
{
maxstep=abs(Ptail-Ctail);
}
if(abs(Ptail2-Ctail2)>maxstep)
{
maxstep=abs(Ptail2-Ctail2);
}
if(abs(Pcenter-Ccenter)>maxstep)
{
maxstep=abs(Pcenter-Ccenter);
}
if(abs(Phead2-Chead2)>maxstep)
{
maxstep=abs(Phead2-Chead2);
}
if(abs(Phead-Chead)>maxstep)
{
maxstep=abs(Phead-Chead);
}
if (maxstep>0)
{
Tailstep = (Ctail-Ptail)/maxstep;
Tail2step = (Ctail2-Ptail2)/maxstep;
Centerstep = (Ccenter-Pcenter)/maxstep;
Head2step = (Chead2-Phead2)/maxstep;
Headstep = (Chead-Phead)/maxstep;
for (int i = 0; i <= maxstep; i += 1) {
Ptail=Ptail+Tailstep;
Ptail2=Ptail2+Tail2step;
Pcenter=Pcenter+Centerstep;
Phead2=Phead2+Head2step;
Phead=Phead+Headstep;
Stail.write(Ptail);
Stail2.write(Ptail2);
Scenter.write(Pcenter);
Shead2.write(Phead2);
Shead.write(Phead);
// Serial.print(Ptail);
// Serial.print("**");
// Serial.print(Ptail2);
// Serial.print("**");
// Serial.print(Pcenter);
// Serial.print("**");
// Serial.print(Phead2);
// Serial.print("**");
// Serial.println(Phead);
delay(smoothdelay);
}
}
Ptail=Ctail;
Ptail2=Ctail2;
Pcenter=Ccenter;
Phead2=Chead2;
Phead=Chead;
Stail.write(Ptail);
Stail2.write(Ptail2);
Scenter.write(Pcenter);
Shead2.write(Phead2);
Shead.write(Phead);
// Serial.print(Ptail);
// Serial.print("##");
// Serial.print(Ptail2);
// Serial.print("##");
// Serial.print(Pcenter);
// Serial.print("##");
// Serial.print(Phead2);
// Serial.print("##");
// Serial.println(Phead);
}
Ссылки
Inchworm Robot - Modular, Move Allsides With BT App
По теме
Sneaky - интерактивный змееподобный робот
Робот-червяк на базе Arduino
Гусеницеподобный робот на Arduino Nano
mOLOID - необычный робот-питомец на Arduino
Будущее за бионическими роботами?
