Å forsøke seg på noe man ikke kan, er makerens mantra, samt en ypperlig kilde til læring (gitt at man da ikke ender opp med en Darwin Award i prosessen). En god læringskurve krever et minimum av surfe-skills, samt et Dirk Dale soundtrack.

Å gjøre noe som involverer flere ting man ikke kan – minner mer om å surfe på bølger, pisket opp av Dirac. Jo større fart du har inn i ting som ser ut som delta-funksjoner, jo vondere gjør det når du treffer.

Newton…

Jeg startet med det jeg kunne, dvs å source deler, samt 3D-printe det strukturelle “limet”, som holdt alle dele sammen. Deretter var det bare å rappe noen strategiske kodefragmenter fra the interwebs, og så hadde man funky balansebot. Right… ?

Well…

Å skru sammen en bot, samt koble sammen noen stepper-drivere, en mikrokontroller og en IMU viste seg å være ganske grei skuring. Etter å ha bannet litt over databladet til IMU’en, så hadde jeg kommunikasjon med denne via I2C. Hjul snurret og jeg klarte å måle akselerasjon og gyrorater.

Nå var det kun litt tafsing på parametrene til PID-regulatoren, så kom botten til å stå som en påle. Right… ?

Not so.

Akselerometeret gir deg målinger i G på tre akser. Du kan da regne ut vinkelen til botten. Akseleromteteret har en del støy og det er helsikes følsomt for vibrasjoner, men du kan stole på lavfrekvenskomponenten i målingene.

Gyroen gir deg en rate ut, ikke en vinkel. Hvis du kjenner dt, så kan du regne om gyroraten til en delta vinkel. Den drifter over tid, men du kan stole på høyfrekvenskomponenten i målingene.

Du kan kombinere disse målingene på flere måter. Man kan gå for et komplementærfilter, et Kalmanfilter, eller ta den helt ut og også dra inn magnetometer-komponenten i noe litt mer hårete, som f.eks Madgwicks AHRS-algoritme.

Sensor fusion er et løst problem, selv om Kalmanfilter, eller Madgwick-algoritmen gir meg vondt i hodet når jeg forsøker å se under panseret. Jeg liker å adressere litt mer praktiske problemstillinger. Som f.eks. å krangle med fysiske lover.

Newtons 3. lov viste seg heldigvis å fremdeles være i effekt, da den slo inn med full kraft fra første step. Bokstavelig talt.

Motorene har ganske mye masse, og når du sender dem et step-signal, så gjør de akkurat det de er designet for å gjøre. De flytter rotoren nøyaktig 1/200 rotasjon, mens statoren står helt stille. Right… ?

Not so.

Jeg gikk for minste motstands vei i det mekaniske designet, så alt er veldig godt boltet sammen. En liten vibrasjon i bånn vil forplante seg helt opp i toppen av botten, og gjerne forsterkes litt på veien også. Hvilket i sin tur gjør at MEMS-sensorene i IMUen går haywire. Dette danner så en fin liten feedback-loop, som gjør ethvert forsøk på PID-tuning komplett meningsløst.

Jeg hadde tidligere, implisitt antatt at botten kunne håndtere momentan aksellerasjon, da jeg hadde foret kontroll-outputen fra PID-algoritmen rett inn i en funksjon av typen n/control == PWM-frekvens. Dette ville ha fungert utmerket i en verden der Newtons første lov ikke hadde vært i effekt.

Jeg hadde nå en bot, som var fundamentalt uenig med Newton på to punkter. Og jeg endte som vanlig opp med å være megler.

For å komme vibrasjonene til livs, så endte jeg i kveld opp med en step-algoritme som er noe smidigere. Jeg bruker fremdeles n/control fra PID-regulatoren, men nå for å signalisere ønsket PWM-frekvens. Deretter er det en opp til en interrupt-drevet step-funksjon å akselerere så smooth som overhodet mulig opp til denne, før neste signal kommer fra PID-kontrolleren.  PID-oppdateringer skjer nå på 200Hz og step-funksjonen kjører på 7 kHz. Hvis dette ikke drar ned sensorstøyen, så får jeg finne opp en inertia damper, evt surre fast murstein på botten. Stay tuned.