
Arduino Walker — очередной пример шагающего робота на базе Arduino и сервомашинок (по две на ногу).
видео работы:
chopstick_junior_1_0_6_up.pde
/***************************************************/
/////////////////////////////////////////////////////
/// Chopstick Junior 1.0 ///
/// ///
/// Code version 1.0.2 ///
/// -> forward, left turn, right turn, ///
/// -> stand up, sit down, sleep + gym ///
/// -> Infrared eye and sensor sweep ///
/// ///
/// by Lutz Michaelis, November 2011 ///
/// more about this robot and contact form: ///
/// http://letsmakerobots.com/node/29708 ///
/// powered by ///
/// http://www.roboter-selbstgebaut.com ///
/// ///
/// This code is in the public domain. ///
/// ///
/////////////////////////////////////////////////////
/*********************************************************************************************************************/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// ///
/// Ok, some words to this code. This code is working with MY robot. You are free to copy that code and you can ///
/// use it for your robot as well . If you publish it in any way again, then please keep my credits in here. ///
/// There is no guarantee that it's also working with yours since it's a quadruped and there is all about balance. ///
/// Even the slightest weight difference will bring your robot in danger of falling over. ///
/// I tried to comment as much as I could but I also know that some of you will not understand the code at all. ///
/// As I am quite busy I can not response to each question so please be patience and wait for the updated code ///
/// (hopefully with more comments and better structure ;-) ///
/// Now...please do not waste time and proceed with your project and share it on letsmakerobots.com ///
/// ///
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*********************************************************************************************************************/
#include <Servo.h>
// set the names of the servos
/*
hip1 = front right hip
knee11 = front right knee
hip2 = front left hip
knee21 = front left knee
hip3 = rear left hip
knee31 = rear left knee
hip4 = rear right hip
knee41 = rear right knee
eye = sevor for sensor
*/
Servo hip1;
Servo knee11;
Servo hip2;
Servo knee21;
Servo hip3;
Servo knee31;
Servo hip4;
Servo knee41;
Servo eye;
// set variables needed for some tasks
int b;
int x;
int w;
int up;
int up2;
int up3;
int down;
int down2;
int steps;
int rightsteps;
int leftsteps;
int back;
int pos;
int sensor = A0;
int distance;
//////////////////////////////////////
void setup()
{
pinMode(13, OUTPUT); // LED pin
// assign servos to pins and center servos
hip1.attach(5);
hip1.write(90);
knee11.attach(6);
knee11.write(90);
hip2.attach(7);
hip2.write(90);
knee21.attach(8);
knee21.write(90);
hip3.attach(9);
hip3.write(90);
knee31.attach(10);
knee31.write(90);
hip4.attach(11);
hip4.write(90);
knee41.attach(12);
knee41.write(90);
eye.attach(4);
eye.write(90);
//
//digitalRead(sensor);
Serial.begin(9600);
}
//////////////////////////////////////
void idle() // this is the delay between the steps -> walking speed
{
delay(100); // if set to a bigger number (more delay between the steps -> slower walking) you will see the walking pattern more clearly
}
//////////////////////////////////////
void test() /* just for debugging -> if need a delay between the subroutines
you can let the LED blink as an indicator that something is still running */
{
for(b = 0; b < 3; b++) // this let the LED blink 5 times
{
digitalWrite(13, HIGH); // turn the LED on
delay(300); // wait for .5 second
digitalWrite(13, LOW); // turn the LED off
delay(300);
}
}
//////////////////////////////////////
void standup()
{
up2 = 90;
up3 = 90;
hip1.write(70);
hip2.write(80);
hip3.write(120);
hip4.write(70);
for(up = 90; up < 170; up++)
{
knee11.write(up);
up2 = up2 - 1;
knee21.write(up2);
delay(20);
}
for(up = 90; up < 180; up++)
{
knee31.write(up);
up3 = up3 - 1;
knee41.write(up3);
delay(15);
}
}
//////////////////////////////////////
void sleep()
{
// hips
hip1.write(70);
hip2.write(90);
hip3.write(70);
hip4.write(90);
// knees
knee11.write(0);
knee21.write(180);
knee31.write(0);
knee41.write(180);
}
//////////////////////////////////////
void stand()
{
hip1.write(70);
knee11.write(170);
delay(20);
hip2.write(80);
knee21.write(20);
delay(20);
hip3.write(80);
knee31.write(170);
delay(20);
hip4.write(70);
knee41.write(20);
delay(20);
}
//////////////////////////////////////
void forward()
{
// lift front right knee, move front right hip forward and rear right hip backward, lower front right knee
knee31.write(140); // lower the diagonal opposite leg a bit to keep the balance
knee11.write(140);
idle();
hip1.write(45);
hip4.write(90);
idle();
knee11.write(170);
knee31.write(170); // put the diagonal opposite leg down to keep the balance
// lift rear left knee, move rear left hip forward and front right hip backward, lower rear left knee
knee11.write(140); // lower the diagonal opposite leg a bit to keep the balance
knee31.write(140);
idle();
hip3.write(120);
hip1.write(110);
idle();
knee31.write(170);
knee31.write(170); // put the diagonal opposite leg down to keep the balance
// lift front left knee, move front left hip forward and rear left hip backward, lower front left knee
knee41.write(50); // lower the diagonal opposite leg a bit to keep the balance
knee21.write(50);
idle();
hip2.write(110);
hip3.write(60);
idle();
knee21.write(20);
knee41.write(20); // put the diagonal opposite leg down to keep the balance
// lift rear right knee, move rear right hip forward and front left hip backward, lower rear right knee
knee21.write(50); // lower the diagonal opposite leg a bit to keep the balance
knee41.write(50);
idle();
hip4.write(30);
hip2.write(50);
idle();
knee41.write(20);
knee21.write(20); // put the diagonal opposite leg down to keep the balance
idle();
}
/////////////////////////////////////
void rightturn()
{
// lift front right knee, move front right hip forward and rear right hip backward, lower front right knee
knee11.write(150);
idle();
hip1.write(30);
hip4.write(90);
idle();
knee11.write(170);
// lift rear left knee, move rear left hip forward and front right hip backward, lower rear left knee
knee31.write(150);
idle();
hip3.write(130);
hip1.write(100);
idle();
knee31.write(170);
// lift front left knee, move front left hip forward and rear left hip backward, lower front left knee
knee21.write(40);
idle();
hip2.write(130);
hip3.write(50);
idle();
knee21.write(20);
// lift rear right knee, move rear right hip forward and front left hip backward, lower rear right knee
knee41.write(40);
idle();
hip4.write(70);
hip2.write(50);
idle();
knee41.write(20);
idle();
}
/////////////////////////////////////
void leftturn()
{
// lift front right knee, move front right hip forward and rear right hip backward, lower front right knee
knee11.write(150);
idle();
hip1.write(30);
hip4.write(100);
idle();
knee11.write(170);
// lift rear left knee, move rear left hip forward and front right hip backward, lower rear left knee
knee31.write(150);
idle();
hip3.write(90);
hip1.write(120);
idle();
knee31.write(170);
// lift front left knee, move front left hip forward and rear left hip backward, lower front left knee
knee21.write(40);
idle();
hip2.write(90);
hip3.write(60);
idle();
knee21.write(20);
// lift rear right knee, move rear right hip forward and front left hip backward, lower rear right knee
knee41.write(40);
idle();
hip4.write(30);
hip2.write(80);
idle();
knee41.write(20);
idle();
}
/////////////////////////////////////
void backward()
{
// lift front right knee, move front right hip backward and rear right hip forward, lower front right knee
knee11.write(150);
idle();
hip1.write(100);
hip4.write(50);
idle();
knee11.write(170);
// lift rear left knee, move rear left hip backward and front right hip forward, lower rear left knee
knee31.write(150);
idle();
hip3.write(60);
hip1.write(45);
idle();
knee31.write(170);
// lift front left knee, move front left hip backward and rear left hip forward, lower front left knee
knee21.write(40);
idle();
hip2.write(70);
hip3.write(120);
idle();
knee21.write(20);
// lift rear right knee, move rear right hip backward and front left hip forward, lower rear right knee
knee41.write(40);
idle();
hip4.write(110);
hip2.write(110);
idle();
knee41.write(20);
idle();
}
/////////////////////////////////////
void laydown() // lay down
{
hip1.write(70);
hip2.write(80);
for (down = 170; down > 90; down = down - 1){
knee11.write(down);
down2 = 190 - down;
knee21.write(down2);
delay(15);
}
delay(1000);
hip3.write(80);
hip4.write(70);
for (down = 170; down > 90; down = down - 1){
knee31.write(down);
down2 = 190 - down;
knee41.write(down2);
delay(15);
}
}
/////////////////////////////////////
void gym() // ok, this is not very serious but I needed to cheer me up a bit ;-) just see...
{
int y;
hip1.write(70);
knee31.write(130);
delay(200);
knee21.write(40);
hip2.write(110);
knee21.write(20);
delay(20);
knee11.write(60);
delay(20);
hip3.write(120);
delay(20);
hip4.write(70);
knee41.write(20);
delay(20);
}
/////////////////////////////////////
void wink()
{
for (b = 0; b < 3; b++){
for (w = 60; w < 20; w = w -1)
{
knee11.write(w);
delay(10);
}
for (w = 20; w < 60; w++)
{
knee11.write(w);
delay(10);
}
delay(200);
}
}
/////////////////////////////////////
void sweep()
{
for(pos = 20; pos < 160; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
eye.write(pos); // tell servo to go to position in variable 'pos'
delay(10); // waits 15ms for the servo to reach the position
distance = analogRead(sensor);
//Serial.print(distance);
//Serial.print(" - Position ");
//Serial.print(pos);
//Serial.println();
}
for(pos = 160; pos >= 20; pos -= 1) // goes from 180 degrees to 0 degrees
{
eye.write(pos); // tell servo to go to position in variable 'pos'
delay(10); // waits 15ms for the servo to reach the position
distance = analogRead(sensor);
//Serial.print(distance);
//Serial.print(" - Position ");
//Serial.print(pos);
//Serial.println();
}
}
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
void loop()
{
distance = analogRead(sensor);
//Serial.print(distance);
//Serial.println();
if (distance > 250 && distance < 500) // oh, there is an obstacle in my path but no need to panic it's still not in the danger zone, just steer to the left to avoid a crash
{
test();
while(back < 5){ // just a loop for 5 steps backwards since he run into an obstacle
backward();
back++;
}
test();
while(leftsteps < 5){ // just a loop for 5 steps left turn since he run into an obstacle
leftturn();
leftsteps++;
}
if (back == 5 && leftsteps == 5)
{
if (distance > 250 && distance < 500) // oh, there is an obstacle in my path but no need to panic it's still not in the danger zone, just steer to the left to avoid a crash
{
stand();
delay(1000);
gym();
delay(1000);
wink();
delay(3000);
laydown();
delay(3000);
standup();
while(back < 10){ // just a loop for 5 steps backwards since he run into an obstacle
backward();
back++;
}
back = 0;
leftsteps = 0;
}
test();
}
}
else
{
forward();
}
}
Ссылки
Arduino Walker
Chopstick Junior 1.0
По теме
Простой шагающий робот на Arduino
FOBO - двуногий робот на Arduino
Arduped - двуногий робот на Arduino Nano
Двуногий шагоход
Galatea - робот-четырёхног на Arduino!

0 комментариев на «“И снова шагающий робот на Arduino”»
Либо я после праздников никак в норму не приду, либо эта штука ползает как безголовый алкаш в конвульсиях. При всем оптимизме, с этой конструкцией что-то не то.
Прикольно, код в студию))) Передняя левая нога немного косит, плюс на концах не помешают резинки.