Simplicity is the ultimate sophistication. I den förra versionen av den självbalanserande roboten använde jag totalt 3 mikroprocessorer men har nu designat och programmerat om den på en större ARM mikroprocessor. Med mer kräm i processorn ges en mängd fördelar:
- Färre komponenter
- Enklare kretsschema
- Robust mekanisk design på grund av färre kablar
- Ingen kommunikation mellan processorer är nödvändig vilket ger en mycket enklare kod
- Ett litet RTOS sköter trådhanteringen (vilket inte gick på AVR)
Så bygger man en likadan (eller bättre)
Komponenter
- 3 plattor i karbonat. (Se CAD och ritningar)
- 2 gängade stänger, muttrar och brickor
- Arduino DUE (men jag använder en Taijiuino Due)
- Arduino Mega empty shield att montera komponenter på
- 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 or 9 Degrees of Freedom IMU (Jag använder en 9DOF med ITG3200 och ADXL345)
- Dual H bridge L298N motor controller (Jag köpte en från ebay)
- Ett batteri (Jag använder BAT-01 batteripack NiMH 12V 1600mAH)
- Dupont connectors
- Kardborre för att montera komponenter på plattorna
- + kablar, knappar, motstånd och annat smått
Mekanisk design
Läs de äldsta inläggen på projektsidan för att se foton från hur man bygger ihop den. Det enda som behöver tillverkas är de tre plattorna för vilka det finns CAD och ritningar.
Kretsschema
Många har frågat om kretsschema så jag gjorde ett i Altium Designer.
Mjukvara
All kod ligger på Github.
Reglerteknik
Kort använder jag kaskadåterkopplade PID-regulatorer. Den yttre loopen reglerar hastigheten på roboten vilket mäts på tachometrar på motorerna. Den intre loopen reglerar robotens vinkel vilket mäts med en IMU. Den yttre loopen har långsam dynamik och den intre loopen är mycket snabbare. Rent teoretiskt ska det gå att göra en självbalanserande robot med endast den inre loopen men man får väldigt lätt ett beteende av att roboten långsamt rör sig framåt eller bakåt över golvet eftersom återkopplingen från hjulens hastighet saknas.
För att få ytterliggare bättre prestanda används gain scheduling på den inre loopen vilket innebär att regulatorparamterarna ändras beroende på robotens vinkel. En liten vinkel nära jämviksläget innebär konservativa regulatorparametrar där endast små justeringar görs för att hålla roboten stående. Är vinkeln stor är roboten nära att ramla och de aggressiva paramterinställningarna aktiveras med syfte att göra allt för att återfå stabilitet.
Ändra parametrar
Troligtvis kommer alla parametrar inte fungera utan att de justeras något. I koden finns en struct som kan sättas i setConfiguration(). Smartare är dock är att använda en seriell terminal för att ändra parametrar samtidigt som koden körs. På så sätt behöver man inte programmera om processorn varje gång man vill ändra en parameter. Öppna Serial Monitor i Arduino. Testa att skriva "print configuration" till Arduinon. Om allt fungerar som det ska kommer den svara med att skriva ut alla parametrar. Alla variabler i structen Configuration kan sättas från terminalen. Skriv bara "set" följt av variabelnamn och värde. Exempelvis "set speedPIDKp 1.5". För att aktivera debug skriver du "set debugLevel 2". Om du vill debugga IMU skriver du därefter "set angleRawDebug 1". För att stänga av en debug-variabel skiver du exempelvis "set angleRawDebug 0".
Att hitta rätt regulatorparametrar
Använd en realtidsplotter när du ställer in dina regulatorparametrar så går det enklare.