I videon kan man se att roboten håller sig på någorlunda samma ställe på golvet och klarar av att ta emot lättare stötar. För att uppnå detta kaskadkopplade jag två PID-regulatorer och la till lågpassfilter på både hjulens rotationshastighet och robotens lutning.
Mikroprocessorer
Eftersom en Arduino inte har väldigt mycket processorkraft valde jag att använda totalt 3 mikroprocessorer:
- En standalone Arduino Uno tar pulser från varvtalsmätaren på varje hjul och omvandlar detta till en hastighet. Hastigheten skickas till huvuddatorn.
- En till standalone Arduino Uno för att visa och justera parametrar. Driver också displayen. Parametrarna skickas till huvuddatorn.
- Arduino Leonardo är huvuddatorn. Den tar emot information från konsolen och motorhastighetsmätaren via I2C.
Reglerteknik
Två kaskadkopplade PID-regulatorer. Den första har hastighet som setpoint (alltid 0 i det här fallet) och lutning som output. Om roboten rullar framåt kommer regulatorn att få ett positivt är-värde och skicka ut en negativt utsignal. Detta innebär att roboten kommer att vilja luta bakåt för att bromsa upp hastigheten.
PID-regulatorn nummer 2 tar hand om robotens vinkel relativt golvet. Börvärdet är utsignal från den tidigare PID-regulatorn. Normalt kommer börvärdet att variera från -3 till 3. Noll motsvarar att roboten ska stå helt rakt upp. Utsignalen kopplas till motorstyrningen och varierar från -100 till 100. -100 motsvarar full spänning till motorerna i bakåtriktning.
För att få renare insignaler används FIR-filter på både vinkel och hjulens hastighet. Lågpassfilter gör att snabba förändringar (exempelvis sensorbrus) inte släpps igenom.
Till vinkeln relativt golvet används en IMU med accelerometer och gyro. Ett komplementärfilter kombinerar signalerna från dessa och ger en utsignal som går att använda.
Källkod
Jag hade som mål att all kod till detta projekt ska vara öppen och finnas att hämta på github. I readme finns länkar till bibliotek jag använt.
Förbättringar som skulle kunna göras
- Bättre parametrar till FIR-filter. Mycket skulle nog kunna göras på hjulhastigheten för att inte få en lika hackig gång.
- On-the-fly-programmering över luften med Xbee. Detta gör att man kan skicka helt ny kod till roboten utan usb-kabel. Gör programmeringen smidigare.
- Radiostyrning vore kul.
Foton
- Building the arduino for sending speed from encoders via I2C
- Motor speed arduino in place
- Arduino Leonardo with motor shield
- IMU with 6 degrees of freedom
- Console for configuring parameters
Komponenter
- 3 plattor i karbonat.
- 2 gängade stänger, muttrar och brickor
- Arduino Leonardo
- 2 st standalone Arduino Uno
- Breadboard 830 punkter
- Breadboard 400 punkter
- Pololu 12V, 29:1 Gear Motor w / Encoder
- Pololu Wheel 90 x 10mm Black (Pair)
- Pololu Universal Aluminum 6mm Mounting Hub (4-40)
- Pololu 37D mm Metal Gearmotor Bracket (Pair)
- 6 Degrees of Freedom ±2000° / sec ±16g IMU – ITG3200 / ADXL345
- Arduino Motor Shield rev 3
- BAT-01 batteripack NiMH 12V 1600mAH
- Nokia 5110 display
- + kablar, knappar, motstånd och annat smått
Lägger också upp cad och ritningar.















Riktigt kul att se. Bra jobbat
Tack!
Kul!
Tror du att det skulle bli lättare att få roboten att balansera ”stabilare” om stängerna inte flexade så mkt… fler hyllplan?
Stängerna är någorlunda stabila även om det kanske inte syns i videon. Det jag tror skulle göra störst skillnad just nu är bättre filtrering på insignalen från hjulens hastighet. Bättre lågpassfiltrering skulle nog göra gången mycket behagligare.
!!!
Du skrev:
–>
Börvärdet är utsignalen från den föregående PID-regulatorn. Normalt, börvärdet kommer att variera mellan -3 och 3 där 0 motsvarar roboten att stå helt rakt upp.
<–
Jag förstår inte OCH eller Dar och en Google-sökning har inte hjälpt. Jag undrar vad dessa termer betyder. Någon chans att du skulle kunna peka mig till en referens eller ge mig en kort förklaring?
Stora projektet. Tack för att dela.
Det är en dålig automatisk översättning. Ska vara ”Normalt börvärde kommer att variera mellan -3 and 3 där 0 motsvarar roboten stå helt rak.”. Så att utsignalen från den första PID kommer att vara en vinkel mellan -3 and +3 ochklar.
1. Arduino för läsning accelerometer och gyro, konvertera dem till vinklar i grader sänder sedan till Leonardo
2. annan Arduino för att bara läsa motorns hastighet och riktning, sedan skicka den till Leonardo
3. Leonardo läste sedan PID parametrar för hjulet och vinkel, sedan styra motorer? är det så det fungerar? eller så kan du vidareutveckla?
Nej, men ganska nära.
1. Arduino för att läsa motorns hastighet och riktning.
2. En Arduino för konsollen. Driver LCD-skärmen och knapparna.
3. Arduino Leonardo med motorshield som hjärnan. Kommunicerar med 1 och 2 via I2C. Läser vinkel från IMU (även via I2C). Hanterar PID och utgångar spänning till motorerna.
Nej, men ganska nära.
1. Arduino för att läsa motorns hastighet och riktning.
2. En Arduino för konsollen. Driver LCD-skärmen och knapparna.
3. Arduino Leonardo med motorshield som hjärnan. Kommunicerar med 1 och 2 via I2C. Läser vinkel från IMU (även via I2C). Hanterar PID och utgångar spänning till motorerna.
——-
Om så är fallet, Jag kan bara använda två Arduino om jag kommer att använda potentiometrar för att ställa in PID-värden och ingen LCD-display.
Alla PID har finns i Leonardo och även läsning av vinkeln från IMU endast motorerna har ägnat MCU för tolkning av hjulet kodarna..
I dina källkoder, vilket är för 1: a Arduino, 2nd Arduino och Leonardo? tack.
Ja du kan hoppa över lcd om du vill.
Jag har lagt till koden för hjulet kodarna att github. En mapp för varje Arduino. https://github.com/sebnil/Selfbalancing-robot
Jag undrar om du kan hjälpa mig. Jag har framgångsrikt använt min Arduino och en 5DOF analog IMU att exakt få min robotar lutning med en gratis filter.
Min svårighet är att göra saken balansen. Mitt första försök var att enkel användning kartfunktionen input från IMU till 0 till 255 och skickat den till ett Sabertooth motorstyrning. Det slags arbeten men var mycket skakis.
Då jag vidare till PID-biblioteket. Men mycket svårt att ställa. Den driver. Jag kan skicka min kod och bearbetning diagram. Några tips?
Har du någon feedback från hastigheten av roboten? Mine drev en hel del och det är därför jag har två kaskadkopplade PID istället för bara en. Här är en video utan feedback från hjulhastighet http://www.youtube.com/watch?v=gl07a232G98
Du kan se att det driver en hel.
Jag har förmågan att få kodare position och men inte implimented ännu. Jag har en hel del svårigheter med grundläggande balansering. Om jag kunde göra mitt saldo som ditt i videolänken med drift skulle jag anser mig mycket välbeställda.
Jag använde PID biblioteket utvecklats av Brett men kan inte få det att fungera.
Vad gjorde du för inmatning, börvärde och tuning.
Jag använde en en mappad mängd från IMU för inmatning: input = karta( compAngle, 57,117,0,255);
Det är 8 bitars upplösning till ett justerat Vertikal vinkel 87degrees. Jag använde 127 som börvärde.
Problemet är PID-utsignalen är noll vid Vertikal och skala för en riktning lutning till 255 men kommer inte att gå under noll i oposite riktning.
> Vad du använder för inmatning, börvärde och tuning.
Inmatning är vinkeln. 0 innebär att det står rakt.
Börvärde 0.
För stämningar se https://github.com/sebnil/Selfbalancing-robot/blob/master/selfbalancingrobot/configurations.txt
> Problemet är PID utgången är noll vid Vertikal och skala för en riktning lutning till 255 men kommer inte att gå under noll i oposite riktning.
Detta är ett problem. Du kommer inte få det att fungera utan en input fel som antingen är negativ eller positiv beroende på vinkeln. Försök att rotera Dof för att se om det löser problemet.
OK jag försökte igen med råa vinkeln som indata och ändra börvärdet till noll (vertikal). Ingången fel som jag tips robot sida till sida har både positiva och negativa värden. Men produktionen ökar i värde som robot tips till en sida men när jag når börvärdet noll och tips till andra sidan produktionen inte kommer att ändras.
Det är definitivt problemet, men det är PID. Eller minst det är vad behandlingen grafen visar. Och korrelerar till den dokumentation som produktionen blir 0 till 255. Jag är bara fastnat på hur man gör noll graders lutning lika 127 utgång. Som skulle balanseras för motorerna.
Problemet är löst. Jag behövde bara använda SetOutputLimit funktionen. Nu utgången skalas.
Får jag fråga hur fick du ställa in PID?
Bra att höra! Jag stämde den med konsolen på toppen försöker bara nya värden. Jag tänkte att jag behövde ganska stora värden att hålla det stabilt. Perhaphs Jag kommer att göra en ordentlig matematisk modell i framtiden men troligen inte.
kan u berätta namnet mikrokontroller gyrometer och accelerometer och PID används i den… så att jag köper lätt THM från marknaden.. thanx