EnglishSvenska

Bättre filtrering gör all skillnad på självbalanserande robot

Jag programmerade ett enkelt filter med glidande medelvärde. Detta lågpassfiltrerar bort snabba förändringar vilket gjorde roboten lugnare och med färre översvängningar.

Som man ser i videon klarar den nu av större stötar än tidigare.

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: , ,

Tidigt test av självbalanserande robot


Jag kommer behöva justera PID för att få den självbalanserande. Det är för stora översvängningar och den beter sig väldigt oroligt. Uppdaterar när jag får bättre stabilitet.

Taggad med: , ,

Hittade ett användningsområde för Raspberry Pi!

Vid busshållplatser finns det ofta en monitor som visar tid till nästa buss. Min tanke var att en sådan vore användbar även hemma för att veta när man behöver gå ut. Såhär blev det:

Monitorn står på en garderob i kontoret väl synlig även från hallen. Nu kan man slå ett öga på busstiderna när man klär på sig. Allt för ofta har jag sprungit ner till en buss och ändå missat den. Kanske ändrar detta på saken.

Tekniska detaljer

  • Raspberry Pi (liten linux-dator)
  • Strömförsörjning via micro-usb.
  • Hdmi-kabel med dvi-adapter till en gammal lcd-monitor.
  • Vanlig nätverkskabel.
  • Usb-tangentbord.

Jag programmerade en egen webbplats för att visa busstider. Den som finns på Västtrafiks webbplats är för plottrig. Efter att jag publicerat webbplatsen på min server var det bara att öppna webbläsaren i Raspberry Pi och skriva in adressen. Var 5:e sekund uppdaterat sidan sig själv vilket borde vara mer än tillräckligt. Allt ligger på https://sebastiannilsson.com/vasttrafik-widget/. Testa exempelvis att söka från brunnsparken till chalmers.

Taggad med: ,

Andra steget till en självbalanserande robot

Jag har nu fått tillräckligt många delar för att börja montera roboten.

Jag blev tvungen att borra upp hålen något för att få dem att passa M3.

Accellerometern sätts så nära motoraxeln som möjligt.

Smart grej för att dra åt alla muttrar är att ta en skruvdragare, en bit tejp och därefter snurra den gängade stången. Håll fast muttern med fingrarna och låt borrmaskinen göra jobbet. Annars tar det ett bra tag att få dit alla 24 muttrar.

Såhär ser den ut just nu:

Taggad med:

Ytmonterad Arduino Uno med TQFP32 adapter

Jag ville testa att löda ytmonterat och köpte mig därför adapter från TQFP32 till vanlig dip att sätta i breadboard.

Skaffa adapter från TQFP32 till dip. Chip att löda fast är i det här fallet en Atmega328P-AUR.

Tänk på att det är lättare att löda med flux:

Såhär ser det ut när man alla ben och headers sitter på plats:

Montera på breadboard och bränn in Arduino Uno bootloader:

Klart. Atmega328P-AUR på en breadboard med Arduino Uno bootloader:

Förbättrad hårdvara för att styra Roomba

Förbättrade nyligen hårdvaran för att fjärrstyra min dammsugare över internet. Tidigare använde jag ett helt Arduino Uno-kort vilket är overkill. Bättre och snyggare blir det att göra det direkt på en breadboard. Video när det fungerar (med lite annan hårdvara).

1. Koppla upp Atmega328 på breadboard för att få en Arduino Uno.

2. Dra kablar från varje knapp på fjärrkontrollen.

3. Sätt dit ett gäng transistorer. En för varje knapp du vill fjärrstyra. Kom ihåg att kombinera jord för breadboard och fjärrkontrollen. Jag satte också dit några lysdioder för att lättare se vilket kommando som skickas.

4. Tejpa kablarna så att de sitter på plats.

5. Tejpa fast breadboard på fjärrkontrollen. Detta gör den mer intakt och risken för att kablar lossnar minskar.

6. Koppla in till datorn och konfigurera eventghost till att styra roomba.

Taggad med: , ,

Första steget till en självbalanserande robot

Nu ikväll gjorde jag cad och beställde delar till att göra en egen självbalanserande robot. Kommer att använda Arduino som mikroprocessor och en liten 6 degrees of freedom som tilt-sensor.

Cadden på bilderna är inte helt klar men jag tror att de flesta delar är på sin rätta plats.

Uppdatterar med nya blogginlägg allt eftersom framsteg blir gjorda.

[Uppdatering 2012-06-12] Skruvförband på plats

La till skruvförband till motorfäste, hjul och de stängerna. Uppdaterade bilder:

Taggad med:

Standalone Arduino med en Atmega328

Att sätta ihop sin egen Arduino på en labbplatta är ingen större konst. Visar här några illustrationer som förklarar hur man gör. Du kan köpa ett arduino-kit från mät.se för att få allt du behöver.

Enklaste konfigurationen som kräver en ftdi-kabel:

Vill man kunna mata denna koppling med ström från ett batteri lägger man bara till en några få komponenter. Finns att köpa här.

Istället för en ftdi-kabel kan man sätta dit en usb-modul såhär. Länk till usb-modul.

Klistermärken till Atmega328P-PU, Atmega328P-PN

För att snabbare se vilka portar som är vilka. Skriv ut arket nedan:
Klistermärke Arduino Atmega328

Komponenter finns här:

Du kan också köpa Atmega med Arduino bootloader och klisterlapp:

För att göra detta själv så är det bara att klippa ut och klistra på:

Taggad med: ,