Arduino
OKUDUĞUNUZ KONU
Bob İki Ayaklı Yürüyen 3D Robot
25

Bob İki Ayaklı Yürüyen 3D Robot

Yazar : Murat Duran22 Ağustos 2016
Projeyi Satın Al
Bu projeyi kurulu çalışır halde yada isterseniz demonte halde satın alabilirsiniz.Proje ile birlikle yapım aşaması resimleri bağlantı şemaları ve kodları açık kaynak olarak gönderilir. "Satın Almak İçin Yukarıda Butona Basınız"

3D yazıcı ile hazırlanan robotlar son yıllarda çokça kullanılmaya başlandı.Bunlarda biriside BOB isimli bu sevimli robot uzun zaman önce gördüğüm ve paylaşmak istediğim bir robottu nasip bu güneymiş.Robotun hemen hemen her parçası 3D yazıcı ile çıkartılmakta geriye sadece motorlar ve elektronik devre kalmaktadır.

Robotta kullanılan malzemeler arduino ile çalışan arkadaşların kutularında bulabilecekleri parçalardan oluşuyor.Buda robotun yapımı için bir neden daha.Robotun baskı parçalarını isterseniz marketimizden temin edebilirsiniz.Yada hazır kurulu halde satın alabilirsiniz.

Malzemeler

  • Arduino Nano
  • Ultrasonik Sensör HC-SR04
  • Servo motor 4 tane (Mavi küçük servolardan)
  • Batarya
  • Açma kapama düğmesi
  • Civatalar

bobbiped (1)

Projenin 3D baskı için STL dosyalarını buradan indirebilirsiniz. (%30 doluluk oranı ile baskı tavsiye edilir)

Robotun plastik parçalarını temin ettikten sonra kuruluma geçiyoruz.Öncelikle yakaların montajını yapmalısınız.

Servoları monte ettikten sonra Kafa kısmının elektronik düzeneğini hazırlayın ve bağlantıları aşağıdaki gibi yapın.

bobsema
Resimlerde ping sensör kullanıldı ancak piyasada ping sensör çok pahalı olduğu için devre şeması ve kodlar hcsr04 e göre düzenlenmiştir.

Projenin tüm kütüphanesini ve kodlarını buradan indirebilirsiniz.


#include "PowerLEDController.h"
#include "types.h"
#include <Servo.h>
#include <NewPing.h>
#include <Serial.h>
#include <String.h>

#define TRIGGER_PIN 2
#define ECHO_PIN 3
#define LED_PIN 4
#define MAX_DISTANCE 200
//#define IRPin 8

// 4 servos
Servo leftFootServo;
Servo leftHipServo;
Servo rightFootServo;
Servo rightHipServo;

const int offset = 20; //how many degrees we want to move the servos

// Servo positions
// Left foot servo
const int leftFootC = 92; // centered
const int leftFootD = leftFootC+offset; // foot down
const int leftFootU = leftFootC-offset-6; // foot up

// Left hip servo
const int leftHipC = 107; // centered
const int leftHipL = leftHipC+offset; // hip left
const int leftHipR = leftHipC-offset; // hip right

// Right foot servo
const int rightFootC = 98;
const int rightFootD = rightFootC-offset;
const int rightFootU = rightFootC+offset;

// Right hip servo
const int rightHipC = 82;
const int rightHipL = rightHipC-offset;
const int rightHipR = rightHipC+offset+8;

// Servo positions we want the servo to move to (in small steps)
float leftFootPos;
float leftHipPos;
float rightFootPos;
float rightHipPos;

// Servo postions written to the servos
float leftFootPosInt = leftFootC;
float leftHipPosInt = leftHipC;
float rightFootPosInt = rightFootC;
float rightHipPosInt = rightHipC;

// Calculated values for moving servos in small steps (position we want to move to - current servo position / steps)
float leftFootStep;
float leftHipStep;
float rightFootStep;
float rightHipStep;

const int steps = 20; // divide every servo move in 20 steps
byte speed = 30; // time between steps
unsigned long SuperTurboTimer;
byte SuperTurboStep = 1;
unsigned long SuperTurboMillis;
unsigned long timer;
byte direction = 1;
byte legInStep = 1;

byte isTurning = 0;
Turning turning;
unsigned long turningStarted;
unsigned long turningDuration;

byte isMovingBackwards = 0;
int movingBackwardsDuration = 10000;
unsigned long movingBackwardsStarted;

unsigned int previousDist;
unsigned long startWander;
unsigned long nextWander;

unsigned long startCurrentState;
unsigned long currentStateDuration;

State state;

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

char* directions[]={"", "Forward", "Backward", "Left", "Right"};

LED led(LED_PIN);
PowerLEDController powerLEDController(LED_PIN);

void setup()
{
//Serial.begin(9600);
randomSeed(analogRead(0));

leftHipServo.attach(9);
rightHipServo.attach(10);
leftFootServo.attach(11);
rightFootServo.attach(12);

leftHipServo.write(leftHipC);
rightHipServo.write(rightHipC);
leftFootServo.write(leftFootC);
rightFootServo.write(rightFootC);

turning.Avoiding = 3000;
turning.Wandering = 1250;

led.on();
delay(250);
led.off();
delay(250);
led.on();
delay(250);
led.off();
delay(250);
led.on();
delay(250);
led.off();

wakeUp();
}

void loop()
{
switch(state)
{
case Walking:
updateDirection();
powerLEDController.update();
break;
case Sleeping:
if (millis() - startCurrentState > 2000)
{
delay(10000);
}
break;
}

updateCurrentState();
led.update();
walk();
}

void updateCurrentState()
{
if (millis() > startCurrentState + currentStateDuration)
{
startCurrentState = millis();
switch(state)
{
case Walking:
sleep();
break;
case Sleeping:
wakeUp();
break;
}

led.flash();
}


}

void updateDirection()
{
unsigned int dist;

updateWandering();

switch(direction)
{
case 1: // forward
dist = moveForward();
updateWandering();
break;
case 2: // backward
led.flash();
moveBackwards();
break;
case 3: // left
case 4: // right
led.flash();
makeTurn();
break;
}

previousDist = dist;
}

unsigned int moveForward()
{
unsigned int dist = readDistance();

if (dist < 7 && previousDist < 7)
{
nextWander = movingBackwardsDuration + getNextWander();
direction = 2;
}
else if (dist < 15 && previousDist < 15)
{
nextWander = turning.Avoiding + getNextWander();
makeRandomTurn(turning.Avoiding);
}

return dist;
}

void makeRandomTurn(unsigned int duration)
{
turningDuration = duration;
if (nextWander % 2) // oneven...
{
direction = 3;
}
else // even..
{
direction = 4;
}
}

void makeTurn()
{
if (isTurning)
{
if (millis() - turningStarted > turningDuration)
{
isTurning = false;
direction = 1;
previousDist = 9999;
}
}
else
{
isTurning = true;
turningStarted = millis();
}
}

void moveBackwards()
{
if (isMovingBackwards)
{
if(millis() - movingBackwardsStarted > movingBackwardsDuration)
{
isMovingBackwards = false;
if(random(2) == 0)
{
direction = 4;
}
else
{
direction = 3;
}
}
}
else
{
isMovingBackwards = true;
movingBackwardsStarted = millis();
}
}

void walk()
{
SuperTurboMillis = millis();

if (SuperTurboMillis >= timer){
timer = timer+speed;

legInStep = legInStep + 1;
if (legInStep == steps + 1){
legInStep = 1;
}
if (legInStep == 1)
{
leftFootStep = (leftFootPos - leftFootPosInt) / steps;
leftHipStep = (leftHipPos - leftHipPosInt) / steps;
rightFootStep = (rightFootPos - rightFootPosInt) / steps;
rightHipStep = (rightHipPos - rightHipPosInt) / steps;
}

leftFootPosInt = leftFootPosInt + leftFootStep;
leftHipPosInt = leftHipPosInt + leftHipStep;
rightFootPosInt = rightFootPosInt + rightFootStep;
rightHipPosInt = rightHipPosInt + rightHipStep;
}

if (SuperTurboMillis >= SuperTurboTimer){
SuperTurboTimer = SuperTurboTimer+(steps*speed);
SuperTurboStep = SuperTurboStep +1;
if (SuperTurboStep == 7){
SuperTurboStep = 1;
}
}

if (direction == 0) // stop, both feet on the ground
{
leftFootPos = leftFootC;
leftHipPos = leftHipC;
rightFootPos = rightFootC;
rightHipPos = rightHipC;
}

if (direction == 1) // forward walking gait
{
if (SuperTurboStep == 1)
{
leftFootPos = leftFootU;
rightFootPos = rightFootD;
}
if (SuperTurboStep == 2)
{
leftHipPos = leftHipL;
rightHipPos = rightHipR;
}
if (SuperTurboStep == 3)
{
leftFootPos = leftFootC;
rightFootPos = rightFootC;
}
if (SuperTurboStep == 4)
{
leftFootPos = leftFootD;
rightFootPos = rightFootU;
}

if (SuperTurboStep == 5)
{
leftHipPos = leftHipR;
rightHipPos = rightHipL;
}
if (SuperTurboStep == 6)
{
leftFootPos = leftFootC;
rightFootPos = rightFootC;
}
}

if (direction == 2) // backward walking gait
{
if (SuperTurboStep == 1)
{
leftFootPos = leftFootU;
rightFootPos = rightFootD;
}

if (SuperTurboStep == 2)
{
leftHipPos = leftHipR;
rightHipPos = rightHipL;
}

if (SuperTurboStep == 3)
{
leftFootPos = leftFootC;
rightFootPos = rightFootC;
}

if (SuperTurboStep == 4)
{
leftFootPos = leftFootD;
rightFootPos = rightFootU;
}

if (SuperTurboStep == 5)
{
leftHipPos = leftHipL;
rightHipPos = rightHipR;
}

if (SuperTurboStep == 6)
{
leftFootPos = leftFootC;
rightFootPos = rightFootC;

}
}

if (direction == 3) // left walking gait
{
if (SuperTurboStep == 1)
{
leftFootPos = leftFootU;
rightFootPos = rightFootD;
}
if (SuperTurboStep == 2)
{
leftHipPos = leftHipL;
rightHipPos = rightHipL;
}
if (SuperTurboStep == 3)
{
leftFootPos = leftFootC;
rightFootPos = rightFootC;
}
if (SuperTurboStep == 4)
{
leftFootPos = leftFootD;
rightFootPos = rightFootU;
}

if (SuperTurboStep == 5)
{
leftHipPos = leftHipR;
rightHipPos = rightHipR;
}
if (SuperTurboStep == 6)
{
leftFootPos = leftFootC;
rightFootPos = rightFootC;
}
}

if (direction == 4) // right walking gait
{
if (SuperTurboStep == 1)
{
leftFootPos = leftFootU;
rightFootPos = rightFootD;
}
if (SuperTurboStep == 2)
{
leftHipPos = leftHipR;
rightHipPos = rightHipR;
}
if (SuperTurboStep == 3)
{
leftFootPos = leftFootC;
rightFootPos = rightFootC;
}
if (SuperTurboStep == 4)
{
leftFootPos = leftFootD;
rightFootPos = rightFootU;
}

if (SuperTurboStep == 5)
{
leftHipPos = leftHipL;
rightHipPos = rightHipL;
}
if (SuperTurboStep == 6)
{
leftFootPos = leftFootC;
rightFootPos = rightFootC;
}

}
leftFootServo.write(leftFootPosInt);
leftHipServo.write(leftHipPosInt);
rightFootServo.write(rightFootPosInt);
rightHipServo.write(rightHipPosInt);
}

int readDistance()
{
int uS = sonar.ping();
int uScm = uS / US_ROUNDTRIP_CM;
if (uScm == 0)
{
uScm = 9999;
}

return uScm;
}

unsigned long getNextWander()
{
return random(15000, 30000) * ((30 / (float)speed));
}

void updateWandering()
{
if (millis() > startWander + nextWander)
{
makeRandomTurn(turning.Wandering);
startWander = millis();
nextWander = getNextWander();
led.flash();
}
}

void sleep()
{
state = Sleeping;
direction = 0;
currentStateDuration = random(60000, 5 * 60000);
}

void wakeUp()
{
startWander = millis();
nextWander = getNextWander();
state = Walking;
currentStateDuration = random(40000, 120000);
speed = random(20, 40);
timer = millis();
direction = 1;
led.flash();
}

SİZCE NASIL OLMUŞ?
Beğendim
58%
İlginç
25%
Eh İşte
9%
Anlamadım
0%
Kötü
3%
Berbat
5%
YAZAR HAKKINDA
Murat Duran
Uzun zamandır internetle uğraşıyorum bu internet bilgimi gerçek mesleğimle bütünleştirip yararlı olacağını düşündüğüm Proje Hocam sitesini hayata geçirdim.Hep kendimi geliştirmeyi seven bir yapıya sahip oldum bir şeyi ezberlemektense o şeyi anlamayı tercih ediyorum.Mekanik ve elektronik hep ilgimi çekti bu internet sitesindede bu konularla ve diğer konularla ilgili projeler paylaşıyorum.Şu an Atatürk Üniversitesinde Makine Mühendisliği öğrencisiyim.
25 YORUMLAR

YORUM YAP