Arduino İle Kendini Dengeleyen Robot Yapımı
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…
potansiyometreleri nasıl takıp kodlayabiliyoruz
Merhaba iyi günler,”Fifo overflow” hatası alıyorum yardım edebilir misiniz.1 haftadır uğraşıyorum kütüphane değiştirdim, denemediğim kod kalmadı ama işe yaramadı. Yardım ederseniz sevinirim.
1.65 sürümü yükledim. Kütüphane dosyalarını tekrar yükledim. Hatasız derleyip karta sorunsuz aktardım.
Robot yine çalışmadı. Sürekli aynı yöne dönüyor. Tek umudum gyro nun arızalı olduğu. Değiştirip tekrar deneyecegim
Gyro sensörü değiştirdim. Robot çalıştı gercekten. İnce ayarlamalar la stabil olacak. Emeği geçenlere teşekkür ederim
benim robot çok titriyor. çalışıyor fakat ileri geri çok gidiyor ve titriyor potlardan ayar mı yapmam gerekiyor…
Dostum bende de aynı sıkıntı var yeniden alıcam galiba
mpu6050 kütüphane hatası alıyorum gerekli olan kütüphaneleri ekledim
n file included from C:\Users\pc\Desktop\arduino_denge_robot\arduino_denge_robot.ino:5:0:
C:\Users\pc\Documents\Arduino\libraries\MPU6050/MPU6050_6Axis_MotionApps20.h: In member function ‘uint8_t MPU6050::dmpGetAccel(int32_t*, const uint8_t*)’:
C:\Users\pc\Documents\Arduino\libraries\MPU6050/MPU6050_6Axis_MotionApps20.h:580:31: warning: left shift count >= width of type
data[0] = ((packet[28] << 24) + (packet[29] << 16) + (packet[30] <= width of type
data[0] = ((packet[28] << 24) + (packet[29] << 16) + (packet[30] <= width of type
data[1] = ((packet[32] << 24) + (packet[33] << 16) + (packet[34] <= width of type
data[1] = ((packet[32] << 24) + (packet[33] << 16) + (packet[34] <= width of type
data[2] = ((packet[36] << 24) + (packet[37] << 16) + (packet[38] <= width of type
data[2] = ((packet[36] << 24) + (packet[37] << 16) + (packet[38] <= width of type
data[0] = ((packet[0] << 24) + (packet[1] << 16) + (packet[2] <= width of type
data[0] = ((packet[0] << 24) + (packet[1] << 16) + (packet[2] <= width of type
data[1] = ((packet[4] << 24) + (packet[5] << 16) + (packet[6] <= width of type
data[1] = ((packet[4] << 24) + (packet[5] << 16) + (packet[6] <= width of type
data[2] = ((packet[8] << 24) + (packet[9] << 16) + (packet[10] <= width of type
data[2] = ((packet[8] << 24) + (packet[9] << 16) + (packet[10] <= width of type
data[3] = ((packet[12] << 24) + (packet[13] << 16) + (packet[14] <= width of type
data[3] = ((packet[12] << 24) + (packet[13] << 16) + (packet[14] <= width of type
data[0] = ((packet[16] << 24) + (packet[17] << 16) + (packet[18] <= width of type
data[0] = ((packet[16] << 24) + (packet[17] << 16) + (packet[18] <= width of type
data[1] = ((packet[20] << 24) + (packet[21] << 16) + (packet[22] <= width of type
data[1] = ((packet[20] << 24) + (packet[21] << 16) + (packet[22] <= width of type
data[2] = ((packet[24] << 24) + (packet[25] << 16) + (packet[26] <= width of type
data[2] = ((packet[24] << 24) + (packet[25] << 16) + (packet[26] << 8) + packet[27]);
^
Çalışmanız programın 16554 bayt (51 %) saklama alanını kullandı. Maksimum 32256 bayt.
Global değişkenler belleğin 642 byte kadarını (31%) kullanıyor. Yerel değişkenler için 1406 byte yer kalıyor. En fazla 2048 byte kullanılabilir.
aynı hatayı bende alıyorum ama sonunda yükleme tamamlandı diyor. robot çalışmıyor sorun ne olabilir
merhaba LMotorControllr kütüphanesini bir türlü ekleyemedim yardımcı olursanız sevinirim
Merhaba iyi günler, her şey iyi hoşta projenin yapım aşaması çok az anlatmışsınız.Potansiyometreyi arduinoyaya nasıl bağladınız bir şeması var mı acaba?
yazılım kısmı nasıl oluyor tam olarak anlayamadım nereye atıcam
hocam 9v 2tane paralel bağlı pil kullanıyorum herşey çalişiyor ama tekerler dönmüyor motorları nasıl çaliştircaz başka bir pilmi bağlıyacağım? sürücüde 12v ve gnd ye bağladim pilleri motorlar diğer 4çıkışa bağladım ama v gelmiyor ölçtüğümde ne yapmam lazim
hocam ben herşeyi ayarladim yaptım sorunsuz çaliştirinca arduinoda ışıklar yanıyor ama hiçbir aktivite olmuyor bu neyi yapamamamdan kaynaklanıyordur acaba?
Birde programı yüklediğimde MPU6050 hatası alıyorum arduino sürümümde güncel.Lütfen yardım eder misiniz ?
İyi günler.Bu devre Arduino Nano ile yapılabilir mi ?
Hocam benim araç birkaç sn titreyip sonra tam gaz dönüyor sürekli neden olabilir
hocam tüm bağlantıları yaptım kütüphaneleri indirdim ancak robotun tekerleri dönerken aç kapa yaptığımız anda dönmeyi kesiyor bunun sebebi nedir
kapatıp açtığınızda kodu yeniden başlatacağı için motorlar durur tekrar döner.
Hocam şekildeki gibi herşeyi yaptım ama tekerler sürekli aynı yönde dönüyor aorun nerdedir acaba yardımcı olabilirmisiniz
Merhaba burda gösterilenlerin hepsini yapyık ama çalışmıyor güc verince motor kartından ses geliyor ama tekerler dönmüyor
Potansiyometreler icin tek 5v ve tek gnd girisi var ucunu birden nasil beslicem?
Sizdeki potansiyometre iki bacaklı mı sinyal pini yoksa o farklı bir komponenttir.
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)
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.
Hocam o bostaki gnd bacaklarini bitlestirip gnd ye +5v bacaklari birlestirip +5v pinine mi baglancak yardimci olursaniz sevinirim
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
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.
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
İvme sensörünü yatay şekilde konumlandır. Bir de devre bağlantıları tekrar kontrol et.
Merhaba hocam benim aklima takilan sey potansetre ile yapilmak istenen ne yani potansetre nicin kullanildida jiroskop neden kullanilmadi
Potansiyometreler PID değerlerini ayarlamak için kullanıldı. Ayrıca ivme ve gyro ölçer de var sistemde .
Hocam kolay gelsin l293d motor sürü kartı ile bu proje gerçekleşir mi bunu soracaktım saygılar
l293d kullanabilirsin fakat desteklediği akım 600 – 1200 mah olduğundan bu değerlere uygun motor kullanman sağlıklı olacaktır.
sezgin bey merhaba atmış olduğunuz devre şemasının daha detaylısı var mı acaba
merhaba hocam yüklerken hata oluştu verdiğiniz dosyayı indirdim yine aynı sorunla karşılaştım
kütüphaneleri eklemediğin için hata vermiştir
hocam kütüphane yükledim onda sorun yok
Bu kütüphaneyi de ekleyin >> http://www.robimek.com/wp-content/uploads/I2Cdev-1.rar
hocam teşekkürler sorunu çözdüm bide hocam bu potları nereye bağlayacagız resimde gözükmüyo ama
Analog 0, 1 ve 2 numaralı pinlere takacaksın.
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?
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?
how am i supposed to make it move around with a remote control ……. please help
merhaba, lipo bataryaların nası bağlanması gerektiği hakkında bilgi verebilir misiniz?
motor sürücünün enerji pin girişlerine direk takıp bağlantıyı yapabilirsiniz.
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..
üstteki cevabıma bakın motorların hızlarını eşitleyin.
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
7.4 v. 1050 mah olması zorunlu mu 450 mah olur mu?
450 mah de zorlama akımını karşılamayacağı için yeterli değildir.
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]);
Mpu6050 kütüphane hatası vermiş. Ya birden fazla kütüphane var ya da kütüphaneyi eklememişsin.
teşekkür ederim dediğine baktım ama yine devam ediyor
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)
^
arduino program sürümünden kaynaklı olabilir. Bazı kütüphaneler kabul etmiyor. Güncel sürüm kullanmıyorsan güncelle.
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
tamam 1.6.5 i yükledim onunla hatasız derledi. sistemi de kurdum çalışmıyor. denge yok
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.
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
arduino üzerinde tx ışığının yanması gerekmiyor mu ya yanmıyor o
Hocam sensörün yatay konulması önemli imiş şimdi çalıştı biz alta dik takmışız
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.
sezgin hocam yaptık ama sürekli öne gidiyor pot la dengede kalması için denedik ama potun hiç bir etkisi olmadı
Arduinonun 1 adet 5v cikis pini var
yani 3 potun beslemesini o pindendemi almaliyim
evet hepsini 5v a bağla
Potun beslemelerini nereden verdiniz
arduinodan besledim.
bağlantıları neye göre yapıyoruz resimlerde anlaşılmıyor,pot lar hangi pinlere bağlanıyor vs.
potların sinyalleri Analog 0,1,2 pinlerine bağlı
hi very nice robot i want to ask you did you use kalman filter or complementary filter in your project ???
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.
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.
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?
You need to add the PID_v1.h library
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 ?
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.
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
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.
surekli aynı yonde donuyor tekerlerin ikiside
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.
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
where do the other two legs of the potentiometers get connected to?
it does not matter . You can dock it wherever you want
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
potansiyometreler pid değerlerini ayarlıyor. 3 potansiyometreyi takıp uygun şekilde ayarla dengeye gelmesini bekle.
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.
kütüphaneyi buradan indir ekle sorun çözülecektir http://www.robimek.com/wp-content/uploads/I2Cdev.rar
program çalıştı sağ ol Allah a emanet…
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
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.
Thankyou!
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
O şekilde pwm olarak okuyamassın.step motor yerine servo motor kullanmanı öneririm buradan bakabilirsin >> http://www.robimek.com/ivmeolcer-ile-bluetooth-uzerinden-servo-kontrol/
Tesekkürler ayni devre ye bu baglantilari koda ekledigimde sorunsuz calisir yani?
hemen bluetoth ekleyip deneyim.sonucu yazarim.
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.
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
merhaba hocam robotu yaptım fakat derlemede hata veriyor kütüphanelerde sıkıntı olabilir mi acaba?
merhaba, ne hatası alıyorsunuz ?
Tamamdır hocam eksikmiş kütüphane tamamladım sağolun iyi çalışmalar.
Hocam bide ayni sekilde bu robota kamera baglayip buletooth modeliyle goruntuyu canlı bi sekilde telefona nasil alabiliriz ?
bluetooth uzerinden görüntü aktarımı sıkıntılı olur yani çok donma yapar ip camera kullanabilirsin
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 🙂
burdaki projeye bakınız >> http://www.robimek.com/android-kontrollu-dengede-duran-robot-yapimi/
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.
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
sonunda yaptim,
youtube.com/watch?v=7Du47AIa_hc
acaba bir bakarmisiniz, calismasi normalmi?
bagladigim potansiyemetrelerin debgelemede hic bir faktörü olmuyor acaba neden olabilir??
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 .
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/
çalıştıramadım hocam new_pid yeri diğer kodda en alt satırdaki pot yerimi oluyor
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.
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
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
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?
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
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!!
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
potosiyelmetreleri saga sola ceviriyorum hic bir funksiyonu yok.
yani hic bir islem yapmiyor.Tuhaf!!
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.
potansiyometrelerle pid ayarı yapacaksın. uygun setpoint notasına ayarladığında robot dengede duracaktır. Yani denemeyle denge noktasını bulman gerek
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.
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.
Potonsiyemetrelerin baglanti sekli nasil olmali?
Potansiyemetrelerde 3 er bacak var bunlar nerelere baglanacak?
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
Merhaba benim kullandığım motorlar epey hızlı, bunu kod üzerinde nereden kontrol edebilirim acaba?
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.
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?
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.
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ı.
1.6.5 sürümde hatasız derliyor
mpu nun ınterrupt pinini interrupta bağlamak gerekiyor
mpu nun ınterrupt hangi bacağa bağlamak gerekiyor
Arduinonun kesme pini olan 2.dijital pine bağlamalısın.
Hocam denge robotunda mpu6050 değerleri nasıl hesaplanıyor ..mekanik akşamı yaptıktan sonrami hesaplaniyor
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.
merhaba potansiyometrelerin değeri nedir, lipo pil motorları sürmek için değil mi ? kaç volt kaç amper pil gerekiyor
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
GÖKHAN gyro sensör kütüphanesindeki örnek kodların birini yükle serialden verilere bakarsın
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
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
merhaba
mpu nun ınterrupt pinini interrupta bağlamak gerekiyor 🙂
Bazı modüllerde gerekiyor. Kesme yaparak tetiklemesini sağlıyor. Sorun çözülmüştür o zaman 🙂
Hocam skype adresinizi alabilirmiyim mümkünse
skype kullanmıyorum facebooktan ulaşın facebook.com/sezgin.gul.08
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
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.
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…
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 ?
burada kalıyor ve motorlar ters yönde doğru son hız dönüyorlar
merhaba,
potansiyometre bağlantılarını tarif edebilir misiniz?
teşekkür ederim
Potansiyometrelerin sinyal pinleri Analog 0,1,2 pinlerine takın
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.
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
Merhaba Nadircan, hatanın nedeni I2Cdev.h kütüphanesinin yüklü olmamasıdır. Kütüphaneyi yüklersen hata ortadan kalkar.
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ı?
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.
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..
Yazılımın altında dosya mevcut indirebilirsiniz.
teşekkürler..