Équilibrage Instructable Robot (12 / 14 étapes)

Étape 12 : Télécharger le Code

Une fois que vous avez fait le robot enfin son temps de télécharger le code et de donner le robot une série de tests. J’ai fourni le téléchargement juste code complété il et expérience avec la constante de PID pour parvenir à un équilibrage correct.

CODE :

 #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" //#include "MPU6050.h" // not necessary if using MotionApps include file // Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation // is used in I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif MPU6050 mpu; #define OUTPUT_READABLE_YAWPITCHROLL 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 VectorInt16 aa; // [x, y, z] accel sensor measurements VectorInt16 aaReal; // [x, y, z] gravity-free accel sensor measurements VectorInt16 aaWorld; // [x, y, z] world-frame accel sensor measurements VectorFloat gravity; // [x, y, z] gravity vector float euler[3]; // [psi, theta, phi] Euler angle container float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector static int pot1Pin = A0; static int pot2Pin = A1; static int pot3Pin = A2; float Kp = 0; float Ki = 0; float Kd = 0; float targetAngle = 8.5; float currAngle = 0; float pTerm = 0; float iTerm = 0; float dTerm = 0; float integrated_error = 0; float last_error = 0; float K = 1; // ================================================================ // === INTERRUPT DETECTION ROUTINE === // ================================================================ volatile bool mpuInterrupt = false; // indicates whether MPU interrupt pin has gone high void dmpDataReady() { mpuInterrupt = true; } // ================================================================ // === INITIAL SETUP === // ================================================================ 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 Serial.begin(115200); while (!Serial); Serial.println(F("Initializing I2C devices...")); mpu.initialize(); Serial.println(F("Testing device connections...")); Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed")); Serial.println(F("Initializing DMP...")); devStatus = mpu.dmpInitialize(); mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); // 1688 factory default for my test chip if (devStatus == 0) { Serial.println(F("Enabling DMP...")); mpu.setDMPEnabled(true); Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)...")); attachInterrupt(0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus(); Serial.println(F("DMP ready! Waiting for first interrupt...")); dmpReady = true; packetSize = mpu.dmpGetFIFOPacketSize(); } else { Serial.print(F("DMP Initialization failed (code ")); Serial.print(devStatus); Serial.println(F(")")); } pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(pot3Pin, INPUT); pinMode(pot1Pin, INPUT); pinMode(pot2Pin, INPUT); pinMode(A3, OUTPUT); pinMode(12,OUTPUT); pinMode(13,OUTPUT); } // ================================================================ // === MAIN PROGRAM LOOP === // ================================================================ void loop() { if (!dmpReady) return; while (!mpuInterrupt && fifoCount < packetSize) { } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus(); fifoCount = mpu.getFIFOCount(); if ((mpuIntStatus & 0x10) || fifoCount == 1024) { mpu.resetFIFO(); Serial.println(F("FIFO overflow!")); } else if (mpuIntStatus & 0x02) { while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount(); mpu.getFIFOBytes(fifoBuffer, packetSize); fifoCount -= packetSize; #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); 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 Kp = map(analogRead(pot1Pin), 0, 1024, 0, 255); Ki = map(analogRead(pot2Pin), 0, 1024, 0, 20); Kd = map(analogRead(pot3Pin), 0, 1024, 0, 20); Serial.print("Kp: "); Serial.print(Kp); Serial.print(" Ki: "); Serial.print(Ki); Serial.print(" Kd: "); Serial.println(Kd); currAngle = (ypr[1] * 180/M_PI); Drive_Motor(updateSpeed()); Serial.print("speed: "); Serial.println(updateSpeed()); } } float updateSpeed() { float error = targetAngle - currAngle; pTerm = Kp * error; integrated_error += error; iTerm = Ki * constrain(integrated_error, -50, 50); dTerm = Kd * (error - last_error); last_error = error; return -constrain(K*(pTerm + iTerm + dTerm), -255, 255); } float Drive_Motor(float torque) { Serial.print("torque: "); Serial.println(torque); if (torque >= 0) { // drive motors forward digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(12, LOW); digitalWrite(13, HIGH); } else { // drive motors backward digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(12, HIGH); digitalWrite(13, LOW); torque = abs(torque); } analogWrite(A3,torque); } 

Si les connexions sont suivies exactement, vous obtiendrez les moteurs tournant dans au moins un sens, si elle n’est pas revenir aux étapes précédentes et vérifier les connexions de nouveau. Quand tout va bien vous obtiendrez des résultats comme le montre la vidéo de l’essai ci-dessus. Ensuite, je vais donner quelques instructions sur la façon d’obtenir des résultats décents de l’une des constantes PID.

Tuning les constantes de PID :

  1. Tout d’abord augmenter la valeur proportionnelle en tournant lentement le bouton du potentiomètre proportionnelle. Test de l’équilibrage du robot pour chaque tour du potentiomètre.
  2. Puis lorsque le robot oscille d’un côté à l’autre comme un pendule puis vous augmentez l’intégrale et dérivés potentiomètres constants.
  3. Il s’agit de la partie la plus difficile parce que seulement à certaines valeurs équilibrage efficace peut se faire dans le robot. Ma suggestion serait de modifier les valeurs et la détermination des valeurs idéales pour votre robot. Veuillez noter que ces valeurs varient d’un robot à un robot.

____________________________________________

Veuillez noter que c’est mon premier robot équilibre réussi. Donc j’ai eu le robot d’équilibrage, mais il est certainement perfectible. À l’avenir, je veux faire un robot plus précis d’équilibrage contrôlé PID avec des fonctionnalités supplémentaires peut-être dans l’avenir.

Articles Liés

Stitched Instructables Robot

Stitched Instructables Robot

J'ai posté une demande sur ce sujet sur le forum pour le concours de robot Instructables ! Bien que je n'ai pas de réponse, mais j'ai été vraiment surpris et excité lorsqu'une scie cette Instructables a finalement lancé « Concours de robot Instructab
Faire un trousseau de Instructables Robot !

Faire un trousseau de Instructables Robot !

Au cours de mon dernier jour en tant qu'artiste en résidence à Instructables, j'étais déterminé à obtenir certaines utilisation de dernière minute hors les outils génial j'ai eu disponible avant que je devais dire au revoir.  Pendant mon séjour, j'ai
Instructables Robot photo plateau

Instructables Robot photo plateau

Faire le Robot utile au lieu de juste traîner. Faire cette étagère knicknack maniable avec une image du Instructables Robot.Mettre de la porte d'entrée pour déposer les clés ou l'utiliser comme une base de recharge pour vos appareils électroniques. E
Instructables Robot tricot torchon

Instructables Robot tricot torchon

J'ai récemment découvert la joie de torchons à tricoter. J'ai déjà publié comment faire un torchon tricot très basique et maintenant je veux partager avec vous le modèle de Instructables Robot que j'ai fait. C'est seulement ma deuxième conception ori
Instructables Robot--Modèle en papier

Instructables Robot--Modèle en papier

c'est une instructable vous montrant comment vous pouvez faire votre propre modèle de Instructables RobotJ'ai utilisé photoshop éléments pour créer le net pour le modèle coloriez-le et ajouter des détails, dans l'ensemble cela m'a pris environ une jo
USB alimenté Instructables Robot lampe de nuit

USB alimenté Instructables Robot lampe de nuit

une couple de jours, je surfais sur internet et découvert que nous pouvions alimenter n'importe quel gadget avec une alimentation de 5V et 100mA (500mA sur certaines conditions spéciales) en le connectant à un port USB, alors j'ai pensé que je ferais
Instructable Robot Pie

Instructable Robot Pie

tartes sont notre favori de la famille. J'ai déjà publié une tarte et voici ma deuxième comestibles Robot Pie. Avec 10 heures de travail chaque jour, j'ai très peu de temps qui est seulement le week-end. J'ai toujours essayer de mon mieux pour contri
Maillot de Hockey Instructables Robot

Maillot de Hockey Instructables Robot

Ibles d'équipe. Téléchargez maintenant le palet outta ici.Ce qui est plus Fn manlier que se prêt pour un jeu de hockey... ou pas ? Il n'y a aucun responsables de patate de canapé. Eh bien, vous avez besoin d'un maillot de l'équipe authentique pour vo
Instructables Robot distributeur de T.P.

Instructables Robot distributeur de T.P.

si vous êtes inexpérimenté dans la broderie, un moyen simple mais amusant d'apprendre certains des points de suture base est l'utilisation de toile plastique.  Il peut être coupé et décoré et fouetté ensemble pour créer des objets 3D. Les points de b
Toile en plastique Instructables Robot !

Toile en plastique Instructables Robot !

Voici une toile en plastique de couture j'ai fait du Instructables Robot !La tête n'est pas terrible, mais c'est toujours cool pour moi. :-)Il ressemble à la Instructables Patch. Sauf plus grand.J'ai utilisé de filTête / bras / jambes : Fil jaune fon
Permanent de Instructables Robot boîte

Permanent de Instructables Robot boîte

Ce Instructable va vous apprendre comment créer un permanent boîte de Instructables Robot !Ne manquez ne pas étapes #16-18, surtout si vous êtes le community manager examine ce Instructable pour les concours en que mon moi futur entrera ! hehe: o)Vou
Instructables Robot porte-papier WC

Instructables Robot porte-papier WC

ceux d'entre vous assez chanceux pour avoir l'atelier de menuiserie dans votre premier cycle du secondaire ont pu faire un ensemble de horsie serre-livres. Un premier projet très basique qui consiste juste à quelques coupures, colle, peut-être de clo
Carte animée de Instructables Robot !

Carte animée de Instructables Robot !

je l'aime, on l'aime, nous aimons tous le Instructables Robot !Je voulais faire une carte pop-up Instructable dans l'appréciation de tous les travailleurs et ' iblers qui rendent ce site possible ! Quoi de mieux pour cela qu'afin de faire un pop-up d
Astuce Windows 7 - changer l’icône du dossier & ont le Instructables Robot comme votre icône pour votre dossier de Instructables !

Astuce Windows 7 - changer l’icône du dossier & ont le Instructables Robot comme votre icône pour votre dossier de Instructables !

Alors, vous avez été à traîner lire des tonnes de ' ibles et ont épargné PDF et captures d'écran pour les projets que vous souhaitez essayer un de ces jours et maintenant vous avez besoin d'un dossier sur votre bureau ou dans votre dossier documents