Забавный робот на 3 сервах


Посмотрите какого забавного ползающего робота робота можно сделать всего на трёх сервомашинках.

Код скечта для Arduino:

/*
 ATLAS HEXAPOD
 3 servo 6 leg robot control
 Cobbled together by Jim Watt
 www.clockworkrobot.com
*/

int servoPin1 = 0;     // Control pin for middle servo motor
int servoPin2 = 1;     // Control pin for servo motor
int servoPin3 = 2;     // Control pin for servo motor

int LeftFeeler = 3;     // Left Feeler
int RightFeeler = 4;     // Right Feeler

int RightLED = 8;     // Right LED
int LeftLED = 9;     // Left LED

// Servo 1, middle legs
int MinPulseS1 = 1390;   // Minimum servo position. 1400 default. 900 is absolute min
int MidPulseS1 = 1570;   // Middle servo position. 1550 default
int MaxPulseS1 = 1750;  // Maximum servo position 1700 default. 21100 is absolute max

// Servo 2 and 3, outer legs
int MinPulseS23 = 1100;   // Minimum servo position. 1100 defauls.
int MidPulseS23 = 1400;   // Middle servo position. 1400 defauls.
int MaxPulseS23 = 1700;  // Maximum servo position. 1700 defauls.

int refreshTime = 20; // the time needed in between pulses
int pulse = 1100;  // servo pulse length in Microseconds
int rate = 20;        // speed to move the servo

int Feeler = 0;        // feeler flag

void LeftPark() {
  for (int pulse=0; pulse <= 30; pulse=pulse+1){
    digitalWrite(servoPin3, HIGH);   // Turn the motor on
    delayMicroseconds(MidPulseS23);       // Length of the pulse sets the motor position
    digitalWrite(servoPin3, LOW);   // Turn the motor on
    delay(refreshTime);
  }
}

void RightPark() {
  for (int pulse=0; pulse <= 30; pulse=pulse+1){
    digitalWrite(servoPin2, HIGH);   // Turn the motor on
    delayMicroseconds(MidPulseS23);       // Length of the pulse sets the motor position
    digitalWrite(servoPin2, LOW);   // Turn the motor on
    delay(refreshTime);
  }
}

void MidPark() {
  for (int pulse=0; pulse <= 30; pulse=pulse+1){
    digitalWrite(servoPin1, HIGH);   // Turn the motor on
    delayMicroseconds(MidPulseS1);       // Length of the pulse sets the motor position
    digitalWrite(servoPin1, LOW);    // Turn the motor off
    delay(refreshTime);
  }
}

void MidLeftOut() {
  for (int pulse=MidPulseS1; pulse <= MaxPulseS1; pulse=pulse+rate){
    digitalWrite(servoPin1, HIGH);   // Turn the motor on
    delayMicroseconds(pulse);       // Length of the pulse sets the motor position
    digitalWrite(servoPin1, LOW);    // Turn the motor off
    delay(refreshTime);
  }
}

void MidLeftRet() {
  for (int pulse=MaxPulseS1; pulse >= MidPulseS1; pulse=pulse-rate){
    digitalWrite(servoPin1, HIGH);   // Turn the motor on
    delayMicroseconds(pulse);       // Length of the pulse sets the motor position
    digitalWrite(servoPin1, LOW);    // Turn the motor off
    delay(refreshTime);
  }
}

void MidRightOut() {
  for (int pulse=MidPulseS1; pulse >= MinPulseS1; pulse=pulse-rate){
    digitalWrite(servoPin1, HIGH);   // Turn the motor on
    delayMicroseconds(pulse);       // Length of the pulse sets the motor position
    digitalWrite(servoPin1, LOW);    // Turn the motor off
    delay(refreshTime);
  }
}

void MidRightRet() {
  for (int pulse=MinPulseS1; pulse <= MidPulseS1; pulse=pulse+rate){
    digitalWrite(servoPin1, HIGH);   // Turn the motor on
    delayMicroseconds(pulse);       // Length of the pulse sets the motor position
    digitalWrite(servoPin1, LOW);    // Turn the motor off
    delay(refreshTime);
  }
}

void StrideLeftOut() {
  for (int pulse=MidPulseS23+(rate/2); pulse <= MaxPulseS23; pulse=pulse+rate){
    digitalWrite(servoPin2, HIGH);   // Turn the motor on
    digitalWrite(servoPin3, HIGH);   // Turn the motor on
    delayMicroseconds(pulse);       // Length of the pulse sets the motor position
    digitalWrite(servoPin2, LOW);    // Turn the motor off
    digitalWrite(servoPin3, LOW);    // Turn the motor off
    delay(refreshTime);
  }
}

void StrideLeftRet() {
  for (int pulse=MaxPulseS23; pulse >= MidPulseS23+(rate/2); pulse=pulse-rate){
    digitalWrite(servoPin2, HIGH);   // Turn the motor on
    digitalWrite(servoPin3, HIGH);   // Turn the motor on
    delayMicroseconds(pulse);       // Length of the pulse sets the motor position
    digitalWrite(servoPin2, LOW);    // Turn the motor off
    digitalWrite(servoPin3, LOW);    // Turn the motor off
    delay(refreshTime);
  }
}

void StrideRightOut() {
  for (int pulse=MidPulseS23-(rate/2); pulse >= MinPulseS23; pulse=pulse-rate){
    digitalWrite(servoPin2, HIGH);   // Turn the motor on
    digitalWrite(servoPin3, HIGH);   // Turn the motor on
    delayMicroseconds(pulse);       // Length of the pulse sets the motor position
    digitalWrite(servoPin2, LOW);    // Turn the motor off
    digitalWrite(servoPin3, LOW);    // Turn the motor off
    delay(refreshTime);
  }
}

void StrideRightRet() {
  for (int pulse=MinPulseS23; pulse <= MidPulseS23-(rate/2); pulse=pulse+rate){
    digitalWrite(servoPin2, HIGH);   // Turn the motor on
    digitalWrite(servoPin3, HIGH);   // Turn the motor on
    delayMicroseconds(pulse);       // Length of the pulse sets the motor position
    digitalWrite(servoPin2, LOW);    // Turn the motor off
    digitalWrite(servoPin3, LOW);    // Turn the motor off
    delay(refreshTime);
  }
}

void TurnForwardOut() {
  for (int pulse=MidPulseS23-(rate/2); pulse >= MinPulseS23; pulse=pulse-rate){
    digitalWrite(servoPin2, HIGH);   // Turn the motor on
    digitalWrite(servoPin3, HIGH);   // Turn the motor on
    delayMicroseconds(pulse);       // Length of the pulse sets the motor position
    digitalWrite(servoPin2, LOW);    // Turn the motor off
    delayMicroseconds(2800-pulse-pulse);       // Length of the pulse sets the motor position
    digitalWrite(servoPin3, LOW);    // Turn the motor off
    delay(refreshTime);
  }
}

void TurnForwardRet() {
  for (int pulse=MinPulseS23; pulse <= MidPulseS23-(rate/2); pulse=pulse+rate){
    digitalWrite(servoPin2, HIGH);   // Turn the motor on
    digitalWrite(servoPin3, HIGH);   // Turn the motor on
    delayMicroseconds(pulse);       // Length of the pulse sets the motor position
    digitalWrite(servoPin2, LOW);    // Turn the motor off
    delayMicroseconds(2800-pulse-pulse);       // Length of the pulse sets the motor position
    digitalWrite(servoPin3, LOW);    // Turn the motor off
    delay(refreshTime);
  }
}

void TurnBackOut() {
  for (int pulse=MidPulseS23-(rate/2); pulse >= MinPulseS23; pulse=pulse-rate){
    digitalWrite(servoPin3, HIGH);   // Turn the motor on
    digitalWrite(servoPin2, HIGH);   // Turn the motor on
    delayMicroseconds(pulse);       // Length of the pulse sets the motor position
    digitalWrite(servoPin3, LOW);    // Turn the motor off
    delayMicroseconds(2800-pulse-pulse);       // Length of the pulse sets the motor position
    digitalWrite(servoPin2, LOW);    // Turn the motor off
    delay(refreshTime);
  }
}

void TurnBackRet() {
  for (int pulse=MinPulseS23; pulse <= MidPulseS23-(rate/2); pulse=pulse+rate){
    digitalWrite(servoPin3, HIGH);   // Turn the motor on
    digitalWrite(servoPin2, HIGH);   // Turn the motor on
    delayMicroseconds(pulse);       // Length of the pulse sets the motor position
    digitalWrite(servoPin3, LOW);    // Turn the motor off
    delayMicroseconds(2800-pulse-pulse);       // Length of the pulse sets the motor position
    digitalWrite(servoPin2, LOW);    // Turn the motor off
    delay(refreshTime);
  }
}

void Init() {
  digitalWrite(LeftLED, HIGH);   // Turn on left led
  digitalWrite(RightLED, LOW);   // Turn off right led
  MidPark();
  digitalWrite(LeftLED, LOW);   // Turn off left led
  digitalWrite(RightLED, HIGH);   // Turn on right led
  MidLeftOut();
  digitalWrite(LeftLED, HIGH);   // Turn on left led
  digitalWrite(RightLED, LOW);   // Turn off right led
  LeftPark();
  digitalWrite(LeftLED, LOW);   // Turn off left led
  digitalWrite(RightLED, HIGH);   // Turn on right led
  MidLeftRet();
  digitalWrite(LeftLED, HIGH);   // Turn on left led
  digitalWrite(RightLED, LOW);   // Turn off right led
  MidRightOut();
  digitalWrite(LeftLED, LOW);   // Turn off left led
  digitalWrite(RightLED, HIGH);   // Turn on right led
  RightPark();
  digitalWrite(LeftLED, HIGH);   // Turn on left led
  digitalWrite(RightLED, LOW);   // Turn off right led
  MidRightRet();
}

void Forward() {
  digitalWrite(LeftLED, HIGH);   // Turn on left led
  digitalWrite(RightLED, HIGH);   // Turn on right led
  StrideLeftOut();
  MidRightRet();
  MidLeftOut();
  StrideLeftRet();
  StrideRightOut();
  MidLeftRet();
  MidRightOut();
  StrideRightRet();
}

void Back() {
  StrideLeftOut();
  MidLeftRet();
  digitalWrite(LeftLED, LOW);   // Turn on left led
  digitalWrite(RightLED, LOW);   // Turn on right led
  MidRightOut();
  StrideLeftRet();
  StrideRightOut();
  MidRightRet();
  digitalWrite(LeftLED, HIGH);   // Turn on left led
  digitalWrite(RightLED, HIGH);   // Turn on right led
  MidLeftOut();
  StrideRightRet();
}

void TurnRight() {
  TurnBackOut();
  MidLeftRet();
  digitalWrite(LeftLED, LOW);   // Turn on left led
  digitalWrite(RightLED, LOW);   // Turn on right led
  MidRightOut();
  TurnBackRet();
  TurnForwardOut();
  MidRightRet();
  digitalWrite(RightLED, HIGH);   // Turn on right led
  MidLeftOut();
  TurnForwardRet();
}

void TurnLeft() {
  TurnForwardOut();
  MidLeftRet();
  digitalWrite(LeftLED, LOW);   // Turn on left led
  digitalWrite(RightLED, LOW);   // Turn on right led
  MidRightOut();
  TurnForwardRet();
  TurnBackOut();
  MidRightRet();
  digitalWrite(LeftLED, HIGH);   // Turn on left led
  MidLeftOut();
  TurnBackRet();
}

void setup() {

  pinMode(servoPin1, OUTPUT);  // Set servo pin 1 as an output pin for the middle legs
  pinMode(servoPin2, OUTPUT);  // Set servo pin 2 as an output pin for the back right leg
  pinMode(servoPin3, OUTPUT);  // Set servo pin 3 as an output pin for the back left leg

  pinMode(LeftFeeler, INPUT);  // Left Feeler
  pinMode(RightFeeler, INPUT);  // Right Feeler

  //  LeftFeeler = HIGH ;
  //  RightFeeler = HIGH ;

  pinMode(LeftLED, OUTPUT);  // Left LED
  pinMode(RightLED, OUTPUT);  // Right LED  

  // Servo Callibration Mode is activated if both front feelers are activated on boot-up.
  if (digitalRead (LeftFeeler) == LOW)  { 
    if (digitalRead (RightFeeler) == LOW)  {
      do
      {
        LeftPark();
        digitalWrite(LeftLED, LOW);   // Turn off left led
        digitalWrite(RightLED, HIGH);   // Turn on right led
        RightPark();
        digitalWrite(LeftLED, HIGH);   // Turn on left led
        digitalWrite(RightLED, LOW);   // Turn off right led
        MidPark();
      }
      while (millis() < 100000);   //Setup Mode Mode timeout in 100 seconds

    }

  }
  Init();  //Set roboot legs to start position

  delay(3000); // wait 3 seconds.

}

//  ************************************************************
//  ******************** Atlas Hexapod Loop ********************
//  ************************************************************

void loop() {

  MidRightOut();

  do
  {    
    Forward();
    Feeler=0;
    if (digitalRead (LeftFeeler) == LOW) (Feeler=1) ;
    if (digitalRead (RightFeeler) == LOW) (Feeler=(Feeler + 2)) ;
  }
  while (Feeler == 0) ;

  MidRightRet();
  MidLeftOut();

  if (Feeler == 3) {

    Back();
    Back();
    Back();
    Back();
    Back();
    TurnLeft();
    TurnLeft();
    TurnLeft();
    TurnLeft();
    TurnLeft();
  }  

  if (Feeler == 2) {

    Back();
    Back();
    Back();
    Back();
    TurnLeft();
    TurnLeft();
    TurnLeft();

  }

  if (Feeler == 1) {

    Back();
    Back();
    Back();
    Back();
    TurnRight();
    TurnRight();
    TurnRight();

  }

  MidLeftRet();

}

Ссылки
hexapod

По теме
Ультразвуковой датчик измерения расстояния HC-SR04
FOBO - двуногий робот на Arduino
Arduped - двуногий робот на Arduino Nano
Двуногий шагоход
шагающий робот на Arduino
Galatea - робот-четырёхног на Arduino!


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

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
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение