SvenskaEnglish

Den självbalanserande roboten fungerar ganska bra

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:

  1. En standalone Arduino Uno tar pulser från varvtalsmätaren på varje hjul och omvandlar detta till en hastighet. Hastigheten skickas till huvuddatorn.
  2. En till standalone Arduino Uno för att visa och justera parametrar. Driver också displayen. Parametrarna skickas till huvuddatorn.
  3. 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

Komponenter

Lägger också upp cad och ritningar.

Taggad med: , ,
Kategori: Självbalanserande robot
18 Comments »Den självbalanserande roboten fungerar ganska bra
  1. Lukas skriver:

    Riktigt kul att se. Bra jobbat

  2. Magnus skriver:

    Kul!
    Tror du att det skulle bli lättare att få roboten att balansera ”stabilare” om stängerna inte flexade så mkt… fler hyllplan?

    • sebnil skriver:

      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.

  3. chay skriver:

    !!!

    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.

    • sebnil skriver:

      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.

  4. geejay skriver:

    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?

    • sebnil skriver:

      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.

  5. geejay skriver:

    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.

  6. Rick Bonart skriver:

    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?

    • sebnil skriver:

      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.

      • Rick Bonart skriver:

        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.

        • sebnil skriver:

          > 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.

          • Rick Bonart skriver:

            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.

  7. Rick Bonart skriver:

    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?

    • sebnil skriver:

      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.

  8. shoaib skriver:

    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

Kommentera

E-postadressen publiceras inte. Obligatoriska fält är märkta *

*

Följande HTML-taggar och attribut är tillåtna: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>