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

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
62%
İlginç
20%
Eh İşte
6%
Anlamadım
3%
Kötü
2%
Berbat
7%
YAZAR HAKKINDA
Murat Duran
Murat Duran
Açık kaynak donanım ve yazılım geliştiricisiyim , mekanik ve robotik sistemler üzerinde çalışmalar yapmaktayım.Ayrıca bir start-up firması olan Proje Hocam 'ın kurucuyum.
28 YORUMLAR
  • Gerek yok
    30 Ekim 2016 at 09:27

    Bu kodları kopyala yapıştır yapınca olurmu

  • 19 Kasım 2016 at 13:22

    merhaba. hayirli islerdilerim. size. yazdiginiz. kodu. degerlendim. hata verdi. sizin sayenizde. bu robotu. deneyim. mumkunse
    hersey. icin tesekkurler. allaga emanet olun.

  • 19 Kasım 2016 at 13:26

    merhaba. bu kodu. calismasi. icin ne yapmam.gerekli. hayirli. islerdilerim.
    sizin sayenizde. cok seyler. ogrendik. allah. sizden razi olun. boll kazanclar, dilerim. allaha emanet olun.

  • 20 Kasım 2016 at 20:19

    merhaba. cevap verdigin. iicin tesekkkur ederim size. gonderdiginiz linkte kutuphaneyi. indirdim. .
    bu hatayi. verdi. not: used D:/program/arduino/libraries/bobkodlar.
    bu konudan. ne yapmam. gerekli. allaha emanet. olun. hersey. icin. tessekkurler. ederim. size. . allaha emanet olun

  • Esra Yağmur Keleş
    27 Kasım 2016 at 17:44

    Kodlarınızı PIC için Ccs’e çevirmek istiyorum acaba yardımcı olabilir misiniz?

  • Gökhan Çınar
    2 Aralık 2016 at 14:26

    Hocam ben daha arduino ile ilk defa tanışıyorum bu robotu yapmak istiyorum ürünlerin linklerini atarmısınız ?

  • Nisa GELEBEK
    2 Aralık 2016 at 23:37

    KÜTÜPHANE hatası alıyorum nette indirme linkini de bulamadım ?Yardımcı olur musunuz

  • Mehmet
    3 Aralık 2016 at 10:22

    Robotu nereden temin edeceğiz asıl soru bu ?

  • ömer kargulu
    12 Aralık 2016 at 01:22

    işletim sistemim windows 10 kütüphane hatası alıyorum ekliyorum hata veriyor acaba yanlış yere mi ekliyorum iyi günleer tesekkür ederim

  • Cihan mirel
    29 Aralık 2016 at 02:30

    Acaba robotun plastik parçalarını nerden temin edebilirim.

  • Ahmet
    5 Ocak 2017 at 18:10

    Projeyi yaptık fakat 3.7v 4 servoyu sürmekte yetersiz kalıyor. Deneyen oldu mu acaba

    • Zeynep Sağlam
      5 Şubat 2017 at 16:06

      Ben 9 voltta bile servoları düzgün çalıştıramıyorum. Bilgisayara takılı iken çalışıyor pil gücü yetersiz kalıyor.

  • cengiz çoşkun
    6 Ocak 2017 at 21:08

    serial.h satırını silin

    • serhat
      9 Şubat 2017 at 18:35

      kardeş serial h satırını sildim proğram çalışıyor ama bir sorun daha var bi süre sonra çaılşmayı durduruyor.

  • Serhat
    30 Ocak 2017 at 17:37

    Bu projeye bluetooth ile kontrol ekleyebilirmisiniz.

  • zeynep sağlam
    10 Şubat 2017 at 18:50

    ben bu projeyi yaptım, bilgisayara takılıyken usb den aldığı güçle güzel gidiyor, ancak pil taktığım zaman servolar çalışmıyor, neden olabilir, yardımcı olursanız sevinirim. Not; motorlara ayrı güç takıp denedim, uno ve nano da ikisinde de aynı sorun oldu.

  • Asir
    15 Mart 2017 at 09:57

    Benimde aynı sorunum var 9v pil ile servolar iki adım ancak atabiliyor ne yapmamız lazım kaç v luk bir batarya pil kullanmalıyız. Yardımcı olur musunuz.

  • dislocatedboy
    22 Nisan 2017 at 01:30

    Arkadaşlar daha önce bu hatayla karşılaştınız mı nasıl giderebilirim bu sorunu derleme sırasında hata veriyor
    “C:\Users\Onur\Desktop\Yürüyen robot bob4\BoB\Codes\w00dBob\w00dBob.ino:5:32: fatal error: PowerLEDController.h: No such file or directory”

  • open source
    24 Nisan 2017 at 23:15

    merhaba verdiğiniz linkteki dosyaları arduino’nun yüklü olduğu kısımdaki libraries’e atıyorum fakat “”#include “” kütüphanesi hata veriyor ne yapabilirim acaba yardımcı olabilecek varmı ?

  • Ezgi Aydoğdu
    4 Ocak 2018 at 14:14

    Merhabalar error arduino nano board hatası alıyorum. Nano kartımda mı bir sıkıntı var düzeltemiyorum.

  • emre tosun
    6 Mayıs 2018 at 00:02

    projeyi çalıştırabilirsek çok güzel olacak ancak kütüphanelerin linkinde sadece .h uzantılı dosya var ve bu kütüphaneler ne yazıkki eklenmiyor.
    kütüphanelerin yüklenmesi ile ilgili daha ayrıntılı bilgi verirseniz sevinirim.
    birde geçen yıl sipariş edip almışlar , ürünün üstteki en büyük kısmı (kafa) yere düşerek zarar görmüş. sadece onu sipariş edip alabiliyormuyuz. iyi çalışmalar…

YORUM YAP