Arduino İle Kendini Dengeleyen Robot Yapımı

145 474

Kendi Robotunu Yap projelerimizin bu bölümünde arduino ile dengede duran robot yapımını anlatacağım.Önceki projelerimizde android kontrollü olan versiyonu anlatmıştık.Bu projemizde ise bizim kontrolümüzle hareket etmeyecek.Kendini Dengeleyen Robot projemize geçelim ve yapımına başlayalım.

Malzemeler:

  • Arduino Uno veya Mega
  • L298N Motor Sürücü Kartı
  • Mpu 6050 6 eksen Gyro-İvmeölçer
  • 3 Adet potansiyometre
  • Mekanik için pleksi levha veya sert plastik kaplardan kesebilirsiniz.
  • 4 Adet yaklaşık 20 cm uzunluğunda vida çubuklar
  • 24 Adet Somun
  • 2 Adet 6v 250 rpm dc motor (tekerlekleri ile birlikte olanlardan alın)
  • Lipo pil

Mekanik Kısım:

20×8 cm ebatında üç adet pleksi levha keselim.Farklı ebatlarda da kesebilirsiniz.Kestikten sonra her levhanın köşelerine çubuk vidanın çapı kadar delik açalım.Her levha iki somun arasında kalacak şekilde çubuk vidaları ve somunları monte edelim.Levhaların birbirleri arasındaki boşluğun eşit olmasına dikkat edelim.Ardından motorlarımızı en altta bulunan levhanın sağ ve sol kenarına tam merkezde olacak şekilde demir telle bağlayıp silikonlayalım.Mekanik kısım bu kadar.

Elektronik Kısım:

Devre şeması:

Kullandığımız motor sürücü kendi kütüphanesi ile motorları senkronize bir şekilde çalıştırıyor.Bu sayede de tam verimle motorların çalışıp sistemde hata olmamasını en aza indirgemiş oluyor.

Motor sürücü üzerinde 12v enerji girişine lipo pilin artı kısmını takıyoruz.Gnd girişine de eksi ucunu takıyoruz.

Devreye ek olarak 3 tane potansiyometreyi analog 0,1 ve 2 numaralı pinlere bağlıyoruz.Potansiyometrelerin burdaki görevi kp, kd ve ki değerlerini manual olarak ayarlayarak robotun en uygun denge noktasını bulmamızı sağlayacaktır.Mpu6050 gyro sensörü yatay şekilde en alt levhaya sabitleyelim.

Yazılım Kısmı:

Kütüphaneleri buradan indirelim >> Denge Robot Kütüphaneler

Arduino Yazılımı:

#include <PID_v1.h>
#include <LMotorController.h>
#include "I2Cdev.h"

#include "MPU6050_6Axis_MotionApps20.h"

#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
 #include "Wire.h"
#endif


#define LOG_INPUT 0
#define MANUAL_TUNING 0
#define LOG_PID_CONSTANTS 0 //MANUAL_TUNING must be 1
#define MOVE_BACK_FORTH 0

#define MIN_ABS_SPEED 30

//MPU


MPU6050 mpu;

// MPU control/status vars
bool dmpReady = false; // set true if DMP init was successful
uint8_t mpuIntStatus; // holds actual interrupt status byte from MPU
uint8_t devStatus; // return status after each device operation (0 = success, !0 = error)
uint16_t packetSize; // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount; // count of all bytes currently in FIFO
uint8_t fifoBuffer[64]; // FIFO storage buffer

// orientation/motion vars
Quaternion q; // [w, x, y, z] quaternion container
VectorFloat gravity; // [x, y, z] gravity vector
float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector


//PID


#if MANUAL_TUNING
 double kp , ki, kd;
 double prevKp, prevKi, prevKd;
#endif
double originalSetpoint = 174.29;
double setpoint = originalSetpoint;
double movingAngleOffset = 0.3;
double input, output;
int moveState=0; //0 = balance; 1 = back; 2 = forth

#if MANUAL_TUNING
 PID pid(&input, &output, &setpoint, 0, 0, 0, DIRECT);
#else
 PID pid(&input, &output, &setpoint, 70, 240, 1.9, DIRECT);
#endif


//MOTOR CONTROLLER


int ENA = 9;
int IN1 = 11;
int IN2 = 10;
int IN3 = 5;
int IN4 = 4;
int ENB = 3;


LMotorController motorController(ENA, IN1, IN2, ENB, IN3, IN4, 0.6, 1);


//timers


long time1Hz = 0;
long time5Hz = 0;


volatile bool mpuInterrupt = false; // indicates whether MPU interrupt pin has gone high
void dmpDataReady()
{
 mpuInterrupt = true;
}


void setup()
{
 // join I2C bus (I2Cdev library doesn't do this automatically)
 #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
 Wire.begin();
 TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz)
 #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
 Fastwire::setup(400, true);
 #endif

 // initialize serial communication
 // (115200 chosen because it is required for Teapot Demo output, but it's
 // really up to you depending on your project)
 Serial.begin(115200);
 while (!Serial); // wait for Leonardo enumeration, others continue immediately

 // initialize device
 Serial.println(F("Initializing I2C devices..."));
 mpu.initialize();

 // verify connection
 Serial.println(F("Testing device connections..."));
 Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));

 // load and configure the DMP
 Serial.println(F("Initializing DMP..."));
 devStatus = mpu.dmpInitialize();

 // supply your own gyro offsets here, scaled for min sensitivity
 mpu.setXGyroOffset(220);
 mpu.setYGyroOffset(76);
 mpu.setZGyroOffset(-85);
 mpu.setZAccelOffset(1788); // 1688 factory default for my test chip

 // make sure it worked (returns 0 if so)
 if (devStatus == 0)
 {
 // turn on the DMP, now that it's ready
 Serial.println(F("Enabling DMP..."));
 mpu.setDMPEnabled(true);

 // enable Arduino interrupt detection
 Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));
 attachInterrupt(0, dmpDataReady, RISING);
 mpuIntStatus = mpu.getIntStatus();

 // set our DMP Ready flag so the main loop() function knows it's okay to use it
 Serial.println(F("DMP ready! Waiting for first interrupt..."));
 dmpReady = true;

 // get expected DMP packet size for later comparison
 packetSize = mpu.dmpGetFIFOPacketSize();
 
 //setup PID
 
 pid.SetMode(AUTOMATIC);
 pid.SetSampleTime(10);
 pid.SetOutputLimits(-255, 255); 
 }
 else
 {
 // ERROR!
 // 1 = initial memory load failed
 // 2 = DMP configuration updates failed
 // (if it's going to break, usually the code will be 1)
 Serial.print(F("DMP Initialization failed (code "));
 Serial.print(devStatus);
 Serial.println(F(")"));
 }
}


void loop()
{
 // if programming failed, don't try to do anything
 if (!dmpReady) return;

 // wait for MPU interrupt or extra packet(s) available
 while (!mpuInterrupt && fifoCount < packetSize)
 {
 //no mpu data - performing PID calculations and output to motors
 
 pid.Compute();
 motorController.move(output, MIN_ABS_SPEED);
 
 unsigned long currentMillis = millis();

 if (currentMillis - time1Hz >= 1000)
 {
 loopAt1Hz();
 time1Hz = currentMillis;
 }
 
 if (currentMillis - time5Hz >= 5000)
 {
 loopAt5Hz();
 time5Hz = currentMillis;
 }
 }

 // reset interrupt flag and get INT_STATUS byte
 mpuInterrupt = false;
 mpuIntStatus = mpu.getIntStatus();

 // get current FIFO count
 fifoCount = mpu.getFIFOCount();

 // check for overflow (this should never happen unless our code is too inefficient)
 if ((mpuIntStatus & 0x10) || fifoCount == 1024)
 {
 // reset so we can continue cleanly
 mpu.resetFIFO();
 Serial.println(F("FIFO overflow!"));

 // otherwise, check for DMP data ready interrupt (this should happen frequently)
 }
 else if (mpuIntStatus & 0x02)
 {
 // wait for correct available data length, should be a VERY short wait
 while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();

 // read a packet from FIFO
 mpu.getFIFOBytes(fifoBuffer, packetSize);
 
 // track FIFO count here in case there is > 1 packet available
 // (this lets us immediately read more without waiting for an interrupt)
 fifoCount -= packetSize;

 mpu.dmpGetQuaternion(&q, fifoBuffer);
 mpu.dmpGetGravity(&gravity, &q);
 mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
 #if LOG_INPUT
 Serial.print("ypr\t");
 Serial.print(ypr[0] * 180/M_PI);
 Serial.print("\t");
 Serial.print(ypr[1] * 180/M_PI);
 Serial.print("\t");
 Serial.println(ypr[2] * 180/M_PI);
 #endif
 input = ypr[1] * 180/M_PI + 180;
 }
}


void loopAt1Hz()
{
#if MANUAL_TUNING
 setPIDTuningValues();
#endif
}


void loopAt5Hz()
{
 #if MOVE_BACK_FORTH
 moveBackForth();
 #endif
}


//move back and forth


void moveBackForth()
{
 moveState++;
 if (moveState > 2) moveState = 0;
 
 if (moveState == 0)
 setpoint = originalSetpoint;
 else if (moveState == 1)
 setpoint = originalSetpoint - movingAngleOffset;
 else
 setpoint = originalSetpoint + movingAngleOffset;
}


//PID Tuning (3 potentiometers)

#if MANUAL_TUNING
void setPIDTuningValues()
{
 readPIDTuningValues();
 
 if (kp != prevKp || ki != prevKi || kd != prevKd)
 {
#if LOG_PID_CONSTANTS
 Serial.print(kp);Serial.print(", ");Serial.print(ki);Serial.print(", ");Serial.println(kd);
#endif

 pid.SetTunings(kp, ki, kd);
 prevKp = kp; prevKi = ki; prevKd = kd;
 }
}


void readPIDTuningValues()
{
 int potKp = analogRead(A0);
 int potKi = analogRead(A1);
 int potKd = analogRead(A2);
 
 kp = map(potKp, 0, 1023, 0, 25000) / 100.0; //0 - 250
 ki = map(potKi, 0, 1023, 0, 100000) / 100.0; //0 - 1000
 kd = map(potKd, 0, 1023, 0, 500) / 100.0; //0 - 5
}
#endif

Yazılımı yükleyip gerekli bağlantıları tamamlıyoruz. Robotumuzu çalıştırdıktan sonra dik konumda serbest bırakalım.Robotun dengede durmasında sıkıntı varsa potansiyometrelerle kp, ki ve kd değerlerini değiştiriyoruz.

Yukarıdaki kodu kopyalıp almışsanız muhtemelen derlemede hata alacaksınız. Bundan dolayı Arduino Yazılım dosyasını buradan indirebilirsiniz.>> kendini dengeleyen Robot

Kendi Robotunu Yap projelerimizin bu bölümünde arduino ile dengede duran robotumuzu tamamladık.Bir sonraki kendi robotunu yap projemizde görüşmek üzere.. iyi çalışmalar…

Bunları da beğenebilirsin Yazarın diğer yazıları

145 Yorumlar

  1. Kazım

    Hocam şekildeki gibi herşeyi yaptım ama tekerler sürekli aynı yönde dönüyor aorun nerdedir acaba yardımcı olabilirmisiniz

  2. Ali

    Merhaba burda gösterilenlerin hepsini yapyık ama çalışmıyor güc verince motor kartından ses geliyor ama tekerler dönmüyor

  3. Taner

    Potansiyometreler icin tek 5v ve tek gnd girisi var ucunu birden nasil beslicem?

    1. Sezgin GÜL
      Sezgin GÜL

      Sizdeki potansiyometre iki bacaklı mı sinyal pini yoksa o farklı bir komponenttir.

      1. Taner

        Yok hocam 3 bacakli, orta bacaklar a0, a1, a2 tamamda. Geri 2 bacak kaliyor (toplamda 6) bunlarida gnd ve 5 volta nasil baglicam. (4 bacak bos)

        1. Sezgin GÜL
          Sezgin GÜL

          iki bacağın biri gnd diğeri de 5v’tur arduinonun gnd ve 5v pinlerine bağlayacaksın. potansiyometre datasheet olarak ara hangi bacağın gnd hangisinin vcc olduğunu görürsün.

  4. cem koç

    merhaba yukarıda anlatılanları yaptım ama motorlarda hiç çalışmadı ve seri pport ekranına balınca böyle bir hata veriyor Initializing I2C devices…
    Testing devicInitializing I2C devices…
    Testing device connections…
    MPU6050 connection failed
    Initializing DMP…
    DMP Initialization failed (code 1)

    sebebi nedir acaba

    1. Sezgin GÜL
      Sezgin GÜL

      Hata şundan kaynaklı : ivme ölçere kesme göndererek sensörün tetiklenmesi gerekiyor. siz muhtemelen kesme pini yani int yazan pini arduinonun dijital 2 pinine bağlamadığınız için hata vermiş. Bağlamış iseniz de ivmeölçerde sorun olabilir.

  5. efe

    merhaba sezgin bey ben aynı işlemleri yaptım tek motor surekli aynı yöne dönüyor ve ivme sensörünün de bi etkisi yok

    1. Sezgin GÜL
      Sezgin GÜL

      İvme sensörünü yatay şekilde konumlandır. Bir de devre bağlantıları tekrar kontrol et.

  6. Muammer

    Merhaba hocam benim aklima takilan sey potansetre ile yapilmak istenen ne yani potansetre nicin kullanildida jiroskop neden kullanilmadi

    1. Sezgin GÜL
      Sezgin GÜL

      Potansiyometreler PID değerlerini ayarlamak için kullanıldı. Ayrıca ivme ve gyro ölçer de var sistemde .

  7. Seyfi

    Hocam kolay gelsin l293d motor sürü kartı ile bu proje gerçekleşir mi bunu soracaktım saygılar

    1. Sezgin GÜL
      Sezgin GÜL

      l293d kullanabilirsin fakat desteklediği akım 600 – 1200 mah olduğundan bu değerlere uygun motor kullanman sağlıklı olacaktır.

  8. efe

    sezgin bey merhaba atmış olduğunuz devre şemasının daha detaylısı var mı acaba

  9. ahmet

    merhaba hocam yüklerken hata oluştu verdiğiniz dosyayı indirdim yine aynı sorunla karşılaştım

      1. ahmet

        hocam kütüphane yükledim onda sorun yok

          1. ahmet

            hocam teşekkürler sorunu çözdüm bide hocam bu potları nereye bağlayacagız resimde gözükmüyo ama

          2. Sezgin GÜL
            Sezgin GÜL

            Analog 0, 1 ve 2 numaralı pinlere takacaksın.

  10. Robotikçi

    Merhabalar. Acaba İTÜRO’ya uygun yani 2. level’i de tamamlayan yani A noktasından B noktasına, sonra da B noktasından A noktasına gidebilen bir kod da var mı bunun içinde? Eğer yoksa yazabilir misiniz/verebilir misiniz/bulabilir misiniz lütfen?

  11. Josephine

    hi so i’ve replicated the robot however regardless when the power is turned on the wheels spin non-stop. however when tested the out puts of the arduino to the motor stepper are working fine and react to the position of the gyro. any thoughts?

  12. ahad

    how am i supposed to make it move around with a remote control ……. please help

  13. eynm

    merhaba, lipo bataryaların nası bağlanması gerektiği hakkında bilgi verebilir misiniz?

    1. Sezgin GÜL
      Sezgin GÜL

      motor sürücünün enerji pin girişlerine direk takıp bağlantıyı yapabilirsiniz.

  14. Sercan ER

    Merhabe Sezgin Bey;
    Robotu tam olarak yaptım, dengeye gelmek için ik- üç saniye kadar titreme hareketi yapıyor ve ardından dengeye gelince motorlara giden enerji kesiliyor ve düşüyor. Sebebi ne olabilir acaba?.
    Teşekkürler..

    1. Sezgin GÜL
      Sezgin GÜL

      üstteki cevabıma bakın motorların hızlarını eşitleyin.

  15. mehmet y.

    motor hızlarının farklı olmasının sebebi LMotorController motorController(ENA, IN1, IN2, ENB, IN3, IN4, 0.6, 1);
    satırındaki 0.6 dır. onu 1 yapmak gerekiyor

  16. mehmet y.

    7.4 v. 1050 mah olması zorunlu mu 450 mah olur mu?

    1. Sezgin GÜL
      Sezgin GÜL

      450 mah de zorlama akımını karşılamayacağı için yeterli değildir.

  17. mehmet y.

    Merhaba ,

    bende de bu şekilde bi beş altı satır hata veriyor.
    nasıl çözeriz

    :\Program Files (x86)\Arduino\libraries\MPU6050/MPU6050_6Axis_MotionApps20.h:639:52: warning: left shift count >= width of type [enabled by default]

    data[2] = ((packet[24] << 24) + (packet[25] << 16) + (packet[26] << 8) + packet[27]);

    1. Sezgin GÜL
      Sezgin GÜL

      Mpu6050 kütüphane hatası vermiş. Ya birden fazla kütüphane var ya da kütüphaneyi eklememişsin.

      1. mehmet y.

        teşekkür ederim dediğine baktım ama yine devam ediyor

      2. mehmet y.

        C:\Program Files (x86)\Arduino\libraries\MPU6050/MPU6050_6Axis_MotionApps20.h: In member function ‘uint8_t MPU6050::dmpGetAccel(int32_t*, const uint8_t*)’:

        C:\Program Files (x86)\Arduino\libraries\MPU6050/MPU6050_6Axis_MotionApps20.h:580:31: warning: left shift count >= width of type [enabled by default]

        data[0] = ((packet[28] << 24) + (packet[29] << 16) + (packet[30] <= width of type [enabled by default]

        data[0] = ((packet[28] << 24) + (packet[29] << 16) + (packet[30] <= width of type [enabled by default]

        data[1] = ((packet[32] << 24) + (packet[33] << 16) + (packet[34] <= width of type [enabled by default]

        data[1] = ((packet[32] << 24) + (packet[33] << 16) + (packet[34] <= width of type [enabled by default]

        data[2] = ((packet[36] << 24) + (packet[37] << 16) + (packet[38] <= width of type [enabled by default]

        data[2] = ((packet[36] << 24) + (packet[37] << 16) + (packet[38] <= width of type [enabled by default]

        data[0] = ((packet[0] << 24) + (packet[1] << 16) + (packet[2] <= width of type [enabled by default]

        data[0] = ((packet[0] << 24) + (packet[1] << 16) + (packet[2] <= width of type [enabled by default]

        data[1] = ((packet[4] << 24) + (packet[5] << 16) + (packet[6] <= width of type [enabled by default]

        data[1] = ((packet[4] << 24) + (packet[5] << 16) + (packet[6] <= width of type [enabled by default]

        data[2] = ((packet[8] << 24) + (packet[9] << 16) + (packet[10] <= width of type [enabled by default]

        data[2] = ((packet[8] << 24) + (packet[9] << 16) + (packet[10] <= width of type [enabled by default]

        data[3] = ((packet[12] << 24) + (packet[13] << 16) + (packet[14] <= width of type [enabled by default]

        data[3] = ((packet[12] << 24) + (packet[13] << 16) + (packet[14] <= width of type [enabled by default]

        data[0] = ((packet[16] << 24) + (packet[17] << 16) + (packet[18] <= width of type [enabled by default]

        data[0] = ((packet[16] << 24) + (packet[17] << 16) + (packet[18] <= width of type [enabled by default]

        data[1] = ((packet[20] << 24) + (packet[21] << 16) + (packet[22] <= width of type [enabled by default]

        data[1] = ((packet[20] << 24) + (packet[21] << 16) + (packet[22] <= width of type [enabled by default]

        data[2] = ((packet[24] << 24) + (packet[25] << 16) + (packet[26] <= width of type [enabled by default]

        data[2] = ((packet[24] << 24) + (packet[25] << 16) + (packet[26] << 8) + packet[27]);

        ^

        C:\Program Files (x86)\Arduino\libraries\I2Cdev\I2Cdev.cpp:64:14: warning: #warning Using current Arduino IDE with Wire library is functionally limiting. [-Wcpp]

        #warning Using current Arduino IDE with Wire library is functionally limiting.

        ^

        C:\Program Files (x86)\Arduino\libraries\I2Cdev\I2Cdev.cpp:65:14: warning: #warning Arduino IDE v1.0.1+ with I2CDEV_BUILTIN_FASTWIRE implementation is recommended. [-Wcpp]

        #warning Arduino IDE v1.0.1+ with I2CDEV_BUILTIN_FASTWIRE implementation is recommended.

        ^

        C:\Program Files (x86)\Arduino\libraries\I2Cdev\I2Cdev.cpp:66:14: warning: #warning This I2Cdev implementation does not support: [-Wcpp]

        #warning This I2Cdev implementation does not support:

        ^

        C:\Program Files (x86)\Arduino\libraries\I2Cdev\I2Cdev.cpp:67:14: warning: #warning – Timeout detection (some Wire requests block forever) [-Wcpp]

        #warning – Timeout detection (some Wire requests block forever)

        ^

        1. Sezgin GÜL
          Sezgin GÜL

          arduino program sürümünden kaynaklı olabilir. Bazı kütüphaneler kabul etmiyor. Güncel sürüm kullanmıyorsan güncelle.

          1. mehmet y.

            bu şekildeyken yükledim. motorlardan biri hızlı çalışıyor. denge potlarla oynamama rağmen olmuyor. bi ara oldu gibi oldu ama sonra yine bozuldu. bi tahminin var mı kodlardan mıdır

          2. mehmet y.

            tamam 1.6.5 i yükledim onunla hatasız derledi. sistemi de kurdum çalışmıyor. denge yok

          3. Sezgin GÜL
            Sezgin GÜL

            gyro sensörün int pinini dijital 2 pinine takıp dene. Bütün devre bağlantılarının doğru olduğundan emin ol.

          4. mehmet y.

            imunun hareketine göre tekerlek yön değiştiriyor. imuda sıkıntı yok gibi. potlar işe yaramıyor gibi geliyor. neyse aklına başka sorun gelmiyorsa uğraşayım

          5. mehmet y.

            arduino üzerinde tx ışığının yanması gerekmiyor mu ya yanmıyor o

  18. Ahmet

    Hocam sensörün yatay konulması önemli imiş şimdi çalıştı biz alta dik takmışız

  19. Ahmet

    Hocam robotun tekerleri sürekli ileri doğru hızlı bir şekilde döndüğünden dengede durmuyor pot ile ayar yaptık ama hiç bir etkisi olmadı robotu boşta denediğimizde ise motorların hızı ve dönüşü değişmekte
    problem nedir hocam sizce ne yapmamızı önerirsiniz.

  20. mehmet

    sezgin hocam yaptık ama sürekli öne gidiyor pot la dengede kalması için denedik ama potun hiç bir etkisi olmadı

  21. Kerem

    Arduinonun 1 adet 5v cikis pini var
    yani 3 potun beslemesini o pindendemi almaliyim

  22. Kerem

    Potun beslemelerini nereden verdiniz

  23. kerem

    bağlantıları neye göre yapıyoruz resimlerde anlaşılmıyor,pot lar hangi pinlere bağlanıyor vs.

  24. ahmed

    hi very nice robot i want to ask you did you use kalman filter or complementary filter in your project ???

  25. Ata

    Merhaba Sezgin,yukarıda anlatılanlar gibi bağlantıları gerçekleştirdim fakat bir türlü dengeyi sağlayamadım.Gyro sensörünü tekerleklerin hizasına sabitledim.Tekerlekler ileri ve geri şeklinde son hızda hareket ettiler bazen de tekerlekler titreme hareketi yaparak durdular bu sırada potansiyometrelerle de oynadım fakat bir türlü dengede tutamadım.Senin bana önerilerin ne olur nerede hata yapıyorum.Önerilerin paylaşırsan çok sevinirim.Şimdiden teşekkür ederim.

    1. Sezgin GÜL
      Sezgin GÜL

      Titremeler olduğu zaman denge anı oluyor yani motorların yönleri sürekli değişerek dengeyi korumak istedikleri için o titremeler meydana gelir. Potansiyometreler ile ayarlama yapman lazım. Gyronun çalıştığından emin ol konum alıyor mu bak. Bir de gyronun int pinini 2. dijital pine takıp öyle dene.

  26. Josephine

    Im having trouble compiling the code;

    C:\Users\Josie\AppData\Local\Temp\arduino_5b5031d099ad2a33b5785c7c529e2241\sketch_mar07a.ino:2:20: fatal error: PID_v1.h: No such file or directory

    #include

    ^

    compilation terminated.

    exit status 1
    Error compiling.
    What do i do?

  27. robot adam

    motorların gücü iyi motorlarda sıkıntı yok eminim sizin videoda kullandıgınız tekerlerin aynısı birde mekanik kısımda sizin yaptıgınız ile aynı 3 kat levha levha ların uzerine malzemeler oyle yani potlara gelince baya ugrastım ayarlamak icin lakin bişe değişmiyo lütfen yardımcı olur musunuz ?

    1. Sezgin GÜL
      Sezgin GÜL

      ivmeölçeri doğru konumlandırmanız gerekir. Motorların yön değiştirdiği noktada robot yere dik olmalıdır. Onuda potansiyometreler ile ayarlamanız gerekir. Özellikle kp değeri dedengeye büyük oranda etki sağlar bunun için analog sıfır pinine bağlı olan potansiyometreyi ayarlayın.

  28. robot adam

    hocam sensoru kendi elimle hareket ettirdiğim zaman tekerlerin yonu değişiyor fakat robot dengede durmuyor potansiyometre sanki hiç değişiklik yapmıyor potansiyometreyi cevirsem bile aynı ne yapmalıyım

    1. Sezgin GÜL
      Sezgin GÜL

      motorların torku yetmiyor olabilir veya potansiyometreleri tam ayarlama yapmadığınız için kaynaklanıyor. Bir de mekanik kısım da dengeyi etkileyebilir.

  29. robot adam

    surekli aynı yonde donuyor tekerlerin ikiside

    1. Sezgin GÜL
      Sezgin GÜL

      Potları balayıp ayarladın mı ? gyro sensörün çalıştığından emin ol projedeki indirme bağlantısındaki dosyayı indir onu yükle. gyro sensör çalışmaz ise int pinini 2. dijital pine tak.

  30. robot adam

    hocam bende yaptım fakat tekerler aynı yonde surekli dönüyor sensoru sabitledim yine aynı sensoru çıkarıp kendim hareket ettiriyorum bir türlü olmuyor dengede durmuyor ne yapmalıyım

  31. Josephine

    where do the other two legs of the potentiometers get connected to?

  32. Burak

    hocam sistemi kurduk enerji verince son sürat hareket ediyor
    sabit bir sekilde gyo sensörünü montaladım
    nasıl düzeltecegim bana yardımcı olabilirmisin birde bu potansiyo metreleri ne işe yarıyor

    1. Sezgin GÜL
      Sezgin GÜL

      potansiyometreler pid değerlerini ayarlıyor. 3 potansiyometreyi takıp uygun şekilde ayarla dengeye gelmesini bekle.

  33. burak

    Merhaba,
    bu hatayı alıyorum kütüphaneyi bulamadım
    nasıl yapacagımı anlatırmısın

    In file included from C:\Program Files (x86)\Arduino\arduino_denge_robot\arduino_denge_robot.ino:5:0:

    C:\Program Files (x86)\Arduino\libraries\MPU6050/MPU6050_6Axis_MotionApps20.h:36:20: fatal error: I2Cdev.h: No such file or directory

    #include “I2Cdev.h”

    ^

    compilation terminated.

    exit status 1
    Derleme sırasında hata oluştu.
    bu kütüphane nasıl bulacagım yardımcı olabilirmisin.

      1. burak

        program çalıştı sağ ol Allah a emanet…

  34. Josephine

    hello!
    where do you place and connect the 3 piece potentiometer? (in detail please!)
    what voltage is the lipo battery?
    if you add weight to the top of the robot will it try to balance is out?

    thankyou

    1. Sezgin GÜL
      Sezgin GÜL

      hello,

      the 3 piece potentiometer are signal pins Analog 0 , Analog 1, Analog 2 wear. Lipo battery use 7.2 v 1050 mah . The engine can put weight enough to meet the torque.

      1. Josephine

        Thankyou!

  35. ahmet

    merhaba
    2 step motorlu nasıl yapabiliriz. ben kameralar için dengede tutan mekanizma yapmak istiyorum. ardunosuz direk •Mpu 6050 6 eksen Gyro-İvmeölçer çıkışlarını pulse üretecek şekilde step motor sürücüsüne bağlayamazmıyız. saygılarımla

  36. MUSA

    Tesekkürler ayni devre ye bu baglantilari koda ekledigimde sorunsuz calisir yani?
    hemen bluetoth ekleyip deneyim.sonucu yazarim.

  37. MUSA

    Simdi MPU yu en alt kisma aldim denge dahada saglamlasti gayet iyi su an.
    Birde su asagidaki linkdeki bluetoth ile yapilmis kodlari aynen bu uygulamaya yüklesem calisirmi?
    http://www.robimek.com/android-kontrollu-dengede-duran-robot-yapimi/
    Sundan dolayi soruyorum bu linkdeki yugulamda L293D Motor Sürücü kullanilmis dolaysiyla, sizin burdaki uygulamanizda ise L298N Motor Sürücü Kartı kullanmissiniz
    Yani burdaki sizin uygulaminizda pin baglantilari söyle:
    //MOTOR CONTROLLER
    int ENA = 3;
    int IN1 = 4;
    int IN2 = 8;
    int IN3 = 5;
    int IN4 = 7;
    int ENB = 6;

    diger linkdekinde ise böyle pin baglantilari yok kod icinde.Yani Bu bluetoth uygulamali hali sizin birdaki kdolara nasil uyarlayabiliriz ki , devrede birsey yapmadan calissin.Cünkü devredeki pin baglantilarini lehimledim.

    1. Sezgin GÜL
      Sezgin GÜL

      Android kontrolde motor pin kısmı bu koddaki pinlere kaşılığı aşağıda yazdım
      #define MOTOR_A_DIR 5 >> IN1
      #define MOTOR_A_BRAKE 8 >> IN2
      #define MOTOR_B_DIR 6 >> IN3
      #define MOTOR_B_BRAKE 12 >> >> IN4
      #define MOTOR_A_PWM 9 >> ENA
      #define MOTOR_B_PWM 10 >> ENB

  38. devkan

    merhaba hocam robotu yaptım fakat derlemede hata veriyor kütüphanelerde sıkıntı olabilir mi acaba?

      1. Devkan

        Tamamdır hocam eksikmiş kütüphane tamamladım sağolun iyi çalışmalar.

  39. Emre

    Hocam bide ayni sekilde bu robota kamera baglayip buletooth modeliyle goruntuyu canlı bi sekilde telefona nasil alabiliriz ?

    1. Sezgin GÜL
      Sezgin GÜL

      bluetooth uzerinden görüntü aktarımı sıkıntılı olur yani çok donma yapar ip camera kullanabilirsin

  40. Emre

    Hocam ben bu robotu HC-06 Bluetooth modülüyle kontrol etmek istiyorum yani ileri geri saga sola şeklinde. Bunu nasil yapabilirim bilgi veririseniz cok sevinicem şimdiden teşekkür ederim 🙂

  41. MUSA

    Sorunum sU:
    cok titreme oluyor ve dengeyi sagladiktan sonra robat hep bir yönde Dogru hizla gitemye basliyor ve sonra denge bozulup düsüyor.

    1. Sezgin GÜL
      Sezgin GÜL

      video da gayet iyi dengeliyor. titremelerin nedeni dengeyi ayarlamada pid değer faktörüdür. gyro sensörü üste değil de alta ve plakanın ortasına koy

  42. MUSA

    sonunda yaptim,
    youtube.com/watch?v=7Du47AIa_hc

    acaba bir bakarmisiniz, calismasi normalmi?
    bagladigim potansiyemetrelerin debgelemede hic bir faktörü olmuyor acaba neden olabilir??

  43. Süleyman

    Sezgin Bey öncelikle paylaşımınız için teşekkür ederim.Sormak istediğim potlarda PID değerlerini ayarlıyoruz ama bluetooth modulünü olarak yaptığımızda ileri ,geri ,sağa, sola hareketlerde PID değerlerin sürekli olarak değişmesi gerekiyor eğer yanlış bilmiyorsam bunu bu sistem sağlıya bilecek mi sabit pot değerleri bağlı iken .

    1. Sezgin GÜL
      Sezgin GÜL

      Süleyman bey PID katsayı değerleri hatasal oranlama hesaplar. Robotun düzlemle eğimini referans alıp bu eğimi yok etmek yani robotu düzlemle dik açı yaptırmak için motorların hızını bu oranla arttırır. Kısacası yön fonksiyonları kullanırken PID katsayı değerleri sabit kalır. Android telefon ile kontrolü için buradaki projeye bakabilirsin http://www.robimek.com/android-kontrollu-dengede-duran-robot-yapimi/

  44. GökhN

    çalıştıramadım hocam new_pid yeri diğer kodda en alt satırdaki pot yerimi oluyor

    1. Sezgin GÜL
      Sezgin GÜL

      change pid kısmı robotun pid hesabı ve hareket fonksiyonu. Şöyle yap bir de blue.available kısmını Serial.available yap yani onun serial iletişimini kullanma standart ileşimi kullan. Bt car control uygulamasıyla kontrol etmen daha kolaydır. F B R L karakterleri gönderiyor.

  45. GökhN

    Hocam diğer android kontrollü robotu çalıştıramadık.Bu robota bluetoth yazılımını eklemeye uğraştım amaolmadı..ben bu programda denge robotunu çalıştırdım..üzerine bluetooth nasıl ekleriz yardımcı olurmusunuz

    1. Sezgin GÜL
      Sezgin GÜL

      Diğer programdaki hareket kodlarını alıp buna entegre et ve kullanacağın android uygulamasındaki gönderilen veriye göre kodu düzenleyip çalıştırabilirsin

  46. MUSA

    DC Motor istenen standartlada (6v 250rpm) bulamiyorum.
    Kücük oyuncak arabalardaki DC motorlardan olurmu?
    Yada cevremde hangi cihazlardaki DC motorlar olur?
    Eski CD Rom v.s?

    1. Sezgin GÜL
      Sezgin GÜL

      250 den düşüklerde sıkıntı yaşarsınız sistemi taşımaz . 250 den büyük olsun sorun olmaz 500 rpm de olur

  47. MUSA

    Sanirim benim kullandigim servolarin hizindan kaynaklaniyor.Ben normal iki servo motoru hacking yaptim. simdi aynen DC Motor gibi + ve – ile 360 derece tam devir dönüyorlar.Ama hizlari tabiki yavas.
    Nette arastirdim normal servo motorlar 60 rmp hizina sahipmis.
    MPU 6050 calisiyor, asagi yukari yaptigimda motorlarin devir yönü degisiyor.Fakat MPU yu Robot üzerine monta ettigimde bir türlü dengede duracak setpoint ayarini yapamiyorum.
    Neyse DC Motor bulursam onlarla deneyim birde!!

    1. Sezgin GÜL
      Sezgin GÜL

      servoların 1.5ms olarak belirlenmiş bir duruş pozisyonu vardır yani hızı default olarak sabit olacaktır. o nedenle yavaş hareket edeceğinden sorun yaşarsınız. Siz normal dc motor ile deneyin. Setpoint noktasını bu şekilde rahat bularak dengeyi sağlarsınız

  48. MUSA

    potosiyelmetreleri saga sola ceviriyorum hic bir funksiyonu yok.
    yani hic bir islem yapmiyor.Tuhaf!!

  49. musa

    iste ben dengeyi nasil saglayacagim?
    mpu 6050 yi elimde düz tutup yukari asagi yaptigimda motorlarin yönü degisiyor.
    mpu’yu Robot üzerinde yere parelel selkilde sabitledigimde Uygun dengeyi bulamiyorum.
    motorlar devamli dönüyor , robotu kendim egdigimde belirli noktada tekerler ters yöne dönüyor ama devamli dönüyor.
    ben dengeyi nasil saglayacagim? Kod icinde degistirmem gereken bir islem varmi?
    kullandigim motorlar servo, tabiki dveir sayilari normal dc ye göre düsük sanirim.

    1. Sezgin GÜL
      Sezgin GÜL

      potansiyometrelerle pid ayarı yapacaksın. uygun setpoint notasına ayarladığında robot dengede duracaktır. Yani denemeyle denge noktasını bulman gerek

  50. musa

    Teekkürler,
    ben 2 adet servo Motor MG 996R icindeki potonsiyelmetreleri kestim ve motorlarin DC Motor gibi calismasini sagladim.
    devreyi ve mekanigi kurdum.
    hersey güzel calisiyor, mpu ‘yu asagi yukari yaptigimda motorlarin yönü degisiyor.
    fakat motorlar ivmelerde hemen diger yöne gecmeyi gec yapiyor.
    sanairim sizin verdiginiz kodda PID 250 RPM’e göre ayarlanmis.
    ben simdi bu kullandigim servomotorlara göre PID’i nasil hesaplayabilirim?
    Nasil yapmaliyim?
    3 adet bahsettiginiz potansielmetreleride taktim yine ayni.Elle mpu yu asagi yukari yaptigimda motorlarin yönü degisiyor fakat Robot üstünde mooprlar devamli dönüyor.

    1. Sezgin GÜL
      Sezgin GÜL

      motor hareketi buradaki satırda gerçekleşiyor =>> motorController.move(output, MIN_ABS_SPEED);
      output pid çıktısı MIN_ABS_SPEED ise hız değeridir. #define MIN_ABS_SPEED 30 burdaki 30 değerini değiştirirseniz hızını değiştirirsiniz. Fakat uygun dengeyi ayarlamanız gerekir aksi halde dengeyi sağlayamassınız.

  51. musa

    Potonsiyemetrelerin baglanti sekli nasil olmali?
    Potansiyemetrelerde 3 er bacak var bunlar nerelere baglanacak?

    1. Sezgin GÜL
      Sezgin GÜL

      orta bacak sinyal bu pinler A0 A1 ve A2 pinlerine takılacak. diğer iki bacağın biri 5 v diğeride gnd ye takılacak

  52. Kemal

    Merhaba benim kullandığım motorlar epey hızlı, bunu kod üzerinde nereden kontrol edebilirim acaba?

    1. Sezgin GÜL
      Sezgin GÜL

      Motorların çok hızlı olması dengeyi bozmaz ama sorun olursa da pid.SetOutputLimits(-255, 255); buradaki değerleri değiştir veya akımı az pil kullan.

  53. İbrahim

    Merhaba, verilen kodu arduinoya yükledim sadece sensör bağlantısını yaparak seri porttan okumayı deniyorum ancak sürekli fifo overflow yazıyor. Bütün girişleri doğru bağladım. Hata nerede olabilir?

    1. Sezgin GÜL
      Sezgin GÜL

      merhaba ibrahim, yazılımda bir fonksiyon pasif durumda olduğundan onu gösteriyor. O kısım aktif edildi yazılım güncellendi tekrar dene.

      1. İbrahim

        Kodun yeni halini denedim ancak derlemede birçok syntax hatası aldım. Syntax hatalarını düzelttiğimi düşünürken bu seferde kütüphaneler ile ilgili hata aldım. Kodun ilk halinde problem olmamıştı.

  54. GökhN

    mpu nun ınterrupt pinini interrupta bağlamak gerekiyor

    mpu nun ınterrupt hangi bacağa bağlamak gerekiyor

  55. Gokhan

    Hocam denge robotunda mpu6050 değerleri nasıl hesaplanıyor ..mekanik akşamı yaptıktan sonrami hesaplaniyor

    1. Sezgin GÜL
      Sezgin GÜL

      Mekanik aksama yata konumda yerleştirin. Eksenel harekete göre ivmelenme analizi yaparak bu değerler pid ile hesaplanarak motorların hız ve yön değerleri motorlara aktarılarak motorların hareketi sağlanır.

  56. cem

    merhaba potansiyometrelerin değeri nedir, lipo pil motorları sürmek için değil mi ? kaç volt kaç amper pil gerekiyor

    1. Sezgin GÜL
      Sezgin GÜL

      Potların değeri 10k. lipo pil motorları beslemek için kullan. Gyro ve potların beslemesini arduino üzerinden ayrı pille besle Lipo pil 7.2 volt 1050 mah yeterlidir

  57. Sezgin GÜL
    Sezgin GÜL

    GÖKHAN gyro sensör kütüphanesindeki örnek kodların birini yükle serialden verilere bakarsın

    1. gökhan odabaşı

      ok sensörden veri geliyor, başlaması biraz zaman alıyor ama sonra geliyor

      ancak bizim yazılımda şimdi fifo overflow diyor , motorlar yine tam gaz, potansşyometre ve gyro hareketi motorlarda değişiklik yapmıyor

      1. Sezgin GÜL
        Sezgin GÜL

        Okuma işlemine geçmiyor demek. Kodu attıktan sonra sistemin enerjisini kesip tekrar taktınız mı ? Örnek kodda veriler gecikmeyle geliyorsa sensörde sorun olabilir

        1. gökhan odabaşı

          merhaba

          mpu nun ınterrupt pinini interrupta bağlamak gerekiyor 🙂

          1. Sezgin GÜL
            Sezgin GÜL

            Bazı modüllerde gerekiyor. Kesme yaparak tetiklemesini sağlıyor. Sorun çözülmüştür o zaman 🙂

  58. NADİCAN

    Hocam skype adresinizi alabilirmiyim mümkünse

    1. Sezgin GÜL
      Sezgin GÜL

      skype kullanmıyorum facebooktan ulaşın facebook.com/sezgin.gul.08

  59. NADİCAN

    Hocam tekrar merhaba,
    Devreyi verdiğin şekilde kurdum programıda derleyerek içersine attım fakat hiçbir tepki yok.
    Motor beslemesini 5vdan yaptıgım zaman ince bi ses geliyor motorlardan fakat 12v ile beslediğimde herhangi bi tepki yok motorlar hareket etmiyor yani.
    Sorun neyden kaynaklanıyor olabilir

    1. Sezgin GÜL
      Sezgin GÜL

      Kullandığınız pilin değeri 6v dan fazla olmalıdır ki 12v girişinden enerji alabilsin. Ayrıca devrenizi tekrar kontrol edin. Büyük ihtimalle enerji yetersizdir.

  60. gökhan odabaşı

    merhaba,

    Paylaşım için teşekkürler

    Bir sorunum var

    burada kalıyor

    Initializing I2C devices…
    Testing device connections…
    MPU6050 connection successful
    Initializing DMP…
    Enabling DMP…
    Enabling interrupt detection (Arduino external interrupt 0)…
    DMP ready! Waiting for first interrupt…

    1. Sezgin GÜL
      Sezgin GÜL

      Merhaba Gökhan, bu mesajda gyro sensör okuma işlemini başlatmış yani bağlantı başarılı. Sorun nedir ? motorlar mı hareket etmiyor ?

      1. gökhan odabaşı

        burada kalıyor ve motorlar ters yönde doğru son hız dönüyorlar

        1. gökhan odabaşı

          merhaba,

          potansiyometre bağlantılarını tarif edebilir misiniz?
          teşekkür ederim

          1. Sezgin GÜL
            Sezgin GÜL

            Potansiyometrelerin sinyal pinleri Analog 0,1,2 pinlerine takın

        2. Sezgin GÜL
          Sezgin GÜL

          Gyro sensörden veri alınmadığından motorlar kontrol edilmiyordur. Sistemin enerjisini kesip tekrar deneyin. Ayrıca motorların dönme yönleri aynı yönde olmalıdır. Ve sistemi robotun üzerinde deneyin Çünkü gyro sensör serbest olmalı ki eğilme yönüne göre motorları kontrol etsin.Sabit ise motorlar sürekli dönecektir.

          1. gökhan odabaşı

            gyro sensorden veri gelmiyor gibi, sensörü hareket ettirdiğim halde motor hızları hiç değişmiyor
            sensörden veri gelip gelmediğini yazılıma serial print ekleyerek monitörden nasıl görebilirim,

            teşekkürler

  61. NADİCAN

    Merhaba,
    Derleme sırasında şöyle bir hata alıyorum

    In file included from C:\Program Files (x86)\Arduino\arduino_denge_robot\arduino_denge_robot.ino:5:0:

    C:\Program Files (x86)\Arduino\libraries\MPU6050/MPU6050_6Axis_MotionApps20.h:36:20: fatal error: I2Cdev.h: No such file or directory

    #include “I2Cdev.h”

    ^

    compilation terminated.

    exit status 1
    Derleme sırasında hata oluştu.

    Neden olduğunu söyleyebilirmisin

    1. Sezgin GÜL
      Sezgin GÜL

      Merhaba Nadircan, hatanın nedeni I2Cdev.h kütüphanesinin yüklü olmamasıdır. Kütüphaneyi yüklersen hata ortadan kalkar.

  62. Günışık

    arduino nano kullanarak robotu kurdum yazılımı attım ama tekerler sureklı son hızda calısıyo baglantılar dogru farklı yazılım attıgımda motorlar ıstedıgım hızda calısıyor.Yazılım üzeride yapmam gereken bir degişiklik varmı?

    1. Sezgin GÜL
      Sezgin GÜL

      Bunları yapın tekrar deneyin.
      Yazılımı attıktan sonra arduinonun enerjisini kesip tekrar takın. Gyro sensör aktif olması için.
      Bir de yazılımı robotun üzerinde mi denediniz .Eğer gyro sabit yerdeyse yani robotla hareket halinde değilse motorlar gyronun konumunu düzeltmeye çalışacağından sürekli dönmeye devam ederler.
      Son olarak bütün bağlantıları tekrar kontrol edip deneyin.

  63. nadican

    merhabalar.Lipo pil ve potansiyometre değerlerini yazarmısınız.

    1. Sezgin GÜL
      Sezgin GÜL

      merhaba Nadircan, potansiyometre değeri 10k, lipo ise 7.2v 1050 mah kullanıldı.

  64. André Donizete

    Hello, good morning. Am technical school student , I’m 16 years old , have a scientific design of an inverted pendulum for people users of the wheelchair . I am in the assembly of the prototype , and I’m using almost all its components , such as the one Arduino , I’m using MPU6050 , and the bridge h L298d , however this bridge h is not the keyes , does this code will function normally ?? I am very grateful to be can answer me and give me some tips for I am a little confused in this part ! Thanks for attention.

    1. Sezgin GÜL
      Sezgin GÜL

      The project needs to use the motor drive card.Pins are shown in Figure

  65. mustafa

    merhabalar.Currentmillisde hata veriyor arduino kod neden acaba?

  66. ulusoyab

    Merhaba yukarıdaki dosyada değişik yazım biçimleri var.
    PID pid(&input, &output, &setpoint,
    gibi.
    normal dosya olarak indirebileceğimiz bir yere koyabilirmisin..

      1. abdurrahman ulusoy

        teşekkürler..

Cevap bırakın

E-posta hesabınız yayımlanmayacak.