Balansera Instructable Robot (12 / 14 steg)

Steg 12: Ladda upp koden

När du har gjort roboten slutligen dess tid att ladda upp koden och ge roboten en provkörning. Jag har lämnat den ifyllda koden bara ladda upp det och experiment med PID konstant att uppnå rätt balans.

KOD:

#include "I2Cdev.h"

#include "MPU6050_6Axis_MotionApps20.h"
#include "MPU6050.h" / / inte nödvändigt om du använder MotionApps include-filen

Arduino tråd bibliotek krävs om I2Cdev I2CDEV_ARDUINO_WIRE genomförande
används i I2Cdev.h
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#endif

MPU6050 mpu;
#define OUTPUT_READABLE_YAWPITCHROLL

bool dmpReady = false; Ange sant om DMP init var framgångsrik
uint8_t mpuIntStatus; innehar faktiska interrupt status byte från MPU
uint8_t devStatus; returstatus efter varje enhet operation (0 = framgång,! 0 = fel)
uint16_t packetSize; förväntat DMP paketstorlek (standard är 42 bytes)
uint16_t fifoCount; räkning av alla byte i FIFO
uint8_t fifoBuffer [64]; FIFO lagring buffert

läggning/rörelse vars
Quaternion q; [w, x, y, z] quaternion behållare
VectorInt16 aa; [x, y, z] accel sensor mätningar
VectorInt16 aaReal; [x, y, z] gravity-fri accel sensor mätningar
VectorInt16 aaWorld; [x, y, z] världen-frame accel sensor mätningar
VectorFloat allvar; [x, y, z] gravity vektor
flyta euler [3]. [psi, theta, phi] Euler vinkel behållare
float ypr [3]. [yaw, pitch, rulla] gir/pitch/rulle behållare och allvar vektor

statisk int pot1Pin = A0;
statisk int pot2Pin = A1;
statisk int pot3Pin = A2;
flyta Kp = 0;
flyta Ki = 0;
flyta Kd = 0;
flyta targetAngle = 8,5;
flyta currAngle = 0;
flyta pTerm = 0;
flyta iTerm = 0;
flyta dTerm = 0;
flyta integrated_error = 0;
flyta last_error = 0;
float K = 1;
// ================================================================
=== AVBROTT UPPTÄCKT RUTIN ===
// ================================================================

flyktiga bool mpuInterrupt = false; Anger om MPU avbryta pin har gått hög
void dmpDataReady() {
mpuInterrupt = sant;
}

// ================================================================
=== INITIAL SETUP ===
// ================================================================

void setup() {
gå med I2C bussen (I2Cdev bibliotek inte gör detta automatiskt)
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
Wire.BEGIN();
TWBR = 24. 400kHz I2C klocka (200kHz om CPU är 8MHz)
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
Fastwire::Setup (400, true);
#endif

Serial.BEGIN(115200);
tag (!. Seriell);
Serial.println F ("initierar I2C enheter...").
MPU.Initialize();
Serial.println F ("Testing enhetsanslutningar...").
Serial.println(MPU.testConnection()? F("MPU6050 Connection successful"): F ("MPU6050 anslutning misslyckades"));
Serial.println F ("initierar DMP...").
devStatus = mpu.dmpInitialize();
mpu.setXGyroOffset(220);
mpu.setYGyroOffset(76);
mpu.setZGyroOffset(-85);
mpu.setZAccelOffset(1788); 1688 fabriksinställningarna för mitt test chip
om (devStatus == 0) {
Serial.println F ("Aktivera DMP...").
mpu.setDMPEnabled(true);
Serial.println (F ("Aktivera avbryta upptäckt (Arduino externa avbrott 0)..."));
attachInterrupt (0, dmpDataReady, RISING);
mpuIntStatus = mpu.getIntStatus();
Serial.println (F "(DMP redo! Väntar på första avbrott..."));
dmpReady = sant;
packetSize = mpu.dmpGetFIFOPacketSize();
} annat {
Serial.Print (F ("DMP initialisering misslyckades (kod"));
Serial.Print(devStatus);
Serial.println(F(")"));
}
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (pot3Pin, ingång);
pinMode (pot1Pin, ingång);
pinMode (pot2Pin, ingång);
pinMode (A3, OUTPUT);
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
}

// ================================================================
=== MAIN PROGRAM LOOP ===
// ================================================================

void loop() {
om (! dmpReady) återvända;
medan (! mpuInterrupt & & fifoCount < packetSize) {
}
mpuInterrupt = false;
mpuIntStatus = mpu.getIntStatus();
fifoCount = mpu.getFIFOCount();
om ((mpuIntStatus & 0x10) || fifoCount == 1024) {
mpu.resetFIFO();
Serial.println F ("FIFO overflow!").
} else om (mpuIntStatus & 0x02) {
medan (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();
mpu.getFIFOBytes (fifoBuffer, packetSize);
fifoCount-= packetSize;

#ifdef OUTPUT_READABLE_YAWPITCHROLL
mpu.dmpGetQuaternion (& q, fifoBuffer);
mpu.dmpGetGravity (& gravitation, & q);
mpu.dmpGetYawPitchRoll (ypr, & q & gravitation);
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 ("hastighet:");
Serial.println(updateSpeed());
}
}

float updateSpeed() {
flyta fel = targetAngle - currAngle;
pTerm = Kp * fel;
integrated_error += fel;
iTerm = Ki * begränsa (integrated_error, -50, 50);
dTerm = Kd * (fel - last_error);
last_error = fel;
återvända - begränsa (K * (pTerm + iTerm + dTerm),-255, 255);
}

Drive_Motor(float torque) {float
Serial.Print ("vridmoment:");
Serial.println(torque);
om (vridmoment > = 0) {/ / drivmotorer fram
digitalWrite (3, låg).
digitalWrite (4, hög).
digitalWrite 12, låg.
digitalWrite 13, hög.
} annat {/ / drivmotorer bakåt
digitalWrite (3, hög).
digitalWrite (4, låg).
digitalWrite 12, hög.
digitalWrite 13, låg.
vridmoment = abs(torque);
}
analogWrite(A3,torque);
}

Om anslutningarna följs exakt får du motorerna förvandlas i minst en riktning, om den inte gå tillbaka till föregående steg och kontrollera anslutningarna igen. När allt går bra kommer du få resultat som visas i testet videon ovan. Sedan kommer jag ge några instruktioner på hur till få anständigt resultat från PID konstanterna.

Tuning PID konstanter:

  1. För det första öka proportionellt värdet genom att långsamt vrida reglaget proportionell potentiometer. Testa balanseringen av roboten för varje tur potentiometerns.
  2. Sedan när roboten svänger från sida till sida som en pendel öka sedan du Integral och derivat konstant potentiometrar.
  3. Detta är den svåraste delen eftersom endast vid vissa värden kan effektivt balansera uppnås i roboten. Mitt förslag är att variera värdena och bestämma de idealiska värdena för din robot. Observera att dessa värden variera från robot till robot.

____________________________________________

Observera att detta är min första framgångsrika balanserande robot. Så jag har fått roboten balansering men det säkert finns utrymme för förbättringar. I framtiden vill jag göra en mer exakt PID kontrollerade balanserande robot med ytterligare funktioner kanske i framtiden.

Se Steg
Relaterade Ämnen

Ständiga Instructables Robot låda

Detta Instructable kommer att lära dig hur du skapar en stående Instructables Robot låda!Tänk på att inte missa steg #16-18 speciellt om du är community manager granska detta Instructable för min framtid själv kommer in dem i tävlingar! hehe: o)Denna...

Instructable Robot Pie

pajer är vår familj favorit. Jag har redan publicerat en paj och här är min andra ätbara Robot paj. Med 10 timmars arbetar varje dag har jag väldigt lite tid som är endast helger. Fortfarande försöker jag mitt bästa att bidra lite tid på denna webbpl...

Instructables Robot klockan

Detta är en awesome Instructables Robot klockan som är perfekt för alla skrivbord, natt stannande, fönsterbrädan, Soffbord, etc... Den är liten och trådlösa, vilket gör det perfekt för resor. Att aktivera det bara trycka roboten och titta på honom ly...

2D tecknad Animation av Instructable Robot

Den bekant instructable robot som vi alla har vuxit till kärlek har nu modelleras i Synfig Studios fantastiska 2D-animation programvara och publiceras på dessa sidor för alla att använda. Fullt fungerande robot modellfilen ingår och allt är gratis. D...

Virkade fyrkantig hatt - Instructable Robot, Sponge Bob & WALL-E

En av de projekt som har simmat runt i mitt huvud var denna "fyrkantig" stil hatt, även kallad en jester hatt. Jag kunde inte motstå att ange Instructable Robot tävlingen så detta Instructable är en produkt av två.Medan jag var att skapa robot h...

Cross-Stitched Instructables Robot

Jag postat en begäran om detta forum ämne för Instructables robot tävling! Om jag inte fick något svar men jag var verkligen förvånad och upprörd när en såg har att Instructables äntligen lanserat "Instructables robot tävling"!Eftersom jag har b...

Kartong Instructables Robot hjälm

Jag vann nyligen ett pris från Instructables. Och så som tack och beröm, jag tillbringade en eftermiddag, beväpnad med en sax, lite lim, lite färg och en pensel, bygga ett Instructables robot hjälm från extra kartonger jag hittade ligga runt huset.St...

Gör en Instructable Robot kostym

detta kommer att visa mina instruktioner om hur jag blev en Instructable Robot för Halloween.Steg 1: Samla material jag använde ca 1,5 varv av gula och orange tyg för att göra kroppen. Jag använde också röd, grå och svart filt för att göra detaljerna...

Amigurumi Instructable Robot... Kär!

i detta, min allra första Instructable, jag visar dig hur man virka din egen Instructable Robot och hans kärlek-Bot!Du behöver följande:3mm virknålKamgarn vikt garn i följande färger (guld/gul, svart, rött, rosa och grå). Du behöver inte så mycket, o...

Hett lim gjutning: Instructables Robot {LED bakgrundsbelyst}

detta Instructables handlar inte bara om Instructables Logo - The Robot, men det också om Varmt lim gjutning! ... Den visar dig hur du kan göra din alldeles egna Instructables Robot modell!... Som också kan dubbla upp som en cool nattlampa!...Efter a...

En sittande Instructables Robot

Jag har varit upptagen ta hand om 3 små pojkar hela vintern. Jag skulle bli upphetsad över ett Instructables projekt och jag hade aldrig har tid eller energi att få projektet gjort. Jag har velat göra denna söta Instructables Robot för ganska länge,...

Snowboard - Instructable Robot Stomp Pad

Få bort liften kan vara knepig på ibland om du är en snowboardåkare. Ahh det är därför det kallas en skidlift!Förhindra de otäcka faller genom att följa denna kompatibel och 3D skriva ut dig själv en Stomp Pad.Stomp pad är 84 millimeter (3,3 tum) i d...

DIY Cookie Cutter för en Instructables Robot

Detta instructables är baserat på hur du skapar en cookie cutter för en anpassad design. Detta är första gången jag lägger något i kolumnen hantverk. Samtidigt baka cookies jag alltid velat ha några former som ibland är svåra att hitta i butikerna. D...

Instructables Robot Cupcake

detta Instructable förklarar hur man gör en Instructables Robot cupcake.Du kan göra med din favorit cupcake recept. Jag använde en enkel låda kaka mix. Jag använde många tuggtabletter godis för funktionerna (ögon, armar, ben, etc.) för att hålla dett...

DIY Instructables Robot iPhone Case

I denna tutorial jag ska visa dig mönstrad hur man gör en trendig tyg iPhone fall med några samtida chevron tyg, en vanlig iPhone fall och en instructables pris lapp. Visa upp din Instructables ande genom att göra och bifoga detta fashionabla tillbeh...

Instructable Robot Suncatcher

Detta instructable är hur man gör en fantastisk instructable robot suncatcher.Njut!Steg 1: material 1. en instructable robot bild att spåra (se nästa steg)2. krympande plast3. permanenta märkpennor eller färgpennor4. sax5. folie6. en ugn7. string8. e...

Instructables Robot statiska fönster Cling

Jag undrar vad blir min nästa instructable och jag kom med en statisk fönster cling Instructables roboten. Tar fasta på statiska fönster är självhäftande gratis. De håller sig till släta och platta glasytan av deras statiska egenskapen.Så, vetenskape...

Instructables robot powerbank

Jag har haft denna tanke i mitt sinne ett tag nu och har aldrig riktigt blivit av att göra detta.Och ja, jag vet, The Instructables robotens kropp bör roteras mer och jag har aldrig fast som. Så, Instructables robot, om du läser detta, snälla inte sp...

Instructables Robot simma Shorts

Detta instructable kom eftersom jag ville gå in i Instructables Robot tävlingen. Sedan såg jag att badkläder tävlingen inte hade många poster och därmed gnistan som antändes. Jag tror att de är ett trevligt par bad shorts och kunde uppskattas av alla...