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.

































