Rasket med meg en BBC Micro:Bit hjem fra jobb. Dette er en liten datamaskin, som blir delt ut til alle 11-12-åringer i England. Det sitter en nRF51822 (ARM Cortex M0) fra Nordic Semiconductor på den. Den har magnetometer og akselerometer. Man har knapper og leds. Det er en høyst hackbar sak, og ungene kan programmere den i JavaScript, Python, eller i Microsoft sin Block Editor. Hvis du kobler Micro:Bit til en datamaskin via USB, så vil den dukke opp som en ekstern disk. Man slipper ganske enkelt den kompilerte hex-fila ned på denne disken og så er den programmert. Du kan også programmere den via blåtann fra telefonen, hvilket er en genistrek m.t.p. å senke terskler m.h.t. programmering, for ungene.

Siden jeg er hønngammal – og liker litt eldre språk, så valgte jeg å istedet sette opp Micro:Bit som target i mBed sin online-kompilator. Jeg kan da leke meg med den i et språk jeg er komfortabel med – d.v.s. C++. Jeg har ikke brukt denne verktøykjeden siden jeg fikk min første (og frem til nå – eneste) mBed i 2010, så jeg kniste litt når jeg så at mBed/Twitter-prosjektet mitt fremdeles lå i skya når jeg logget på.

Anyways, dette er en høyst hackbar sak,  den er lett å programmere, og den er liten. nRF51822 har nok oomph til å gjøre ganske mye, så jeg fant ut at en balanserobot kunne være en ok utfordring.

Micro:Bit har en edge-connector, som man kan putte inn i et eksperimentkort, som har breakoutpinner og breadboard. Jeg fant ut at jeg bare var to stenger, et par motorer og litt plast unna noe som lignet en robot, så jeg designet noen smådeler i Fusion 360 for å holde ting sammen. Printingen var unnagjort på et par kvelder.

Siden kortet ikke har gyro, så hektet jeg på en LSM9DS1 fra Sparkfun (også rappet fra jobben). Denne har akselerometer, gyro og magnetometer. Du kan kommunisere med dette via SPI eller I2C. Som motorer, så valgte jeg et par 1,7A Nema17, som jeg hadde liggende. Disse blir drevet av hver sin DRV8825 stepperkontroller. Alt dette kan kontrolleres fra Micro:Bit via 6 ledninger (2 stk for I2C og 4 stk for STEP/DIR-tilkoblingene på stepperkontrollene)

Siden motorene trives best på ganske høy spenning, så har jeg en småfeit batteripakke i toppen av roboten. En LD1117V33 regulerer batterispenninga ned til 3,3V.

Jeg bannet initielt litt over I2C-kommunikasjonen, men har nå fin (og rask) datastrøm fra sensorene. Det hjelper alltid å skrive sin egen kode – istedet for å bruke forvirrende biblioteker, som insisterer på å abstrahere hver eneste beskrevne bit i databladet. Stepperne er relativt greie å styre via de analoge pinnene på Micro:Bit. Ved å skrive en verdi til en analog pinne, så har man gratis PWM-output fra denne. Den analoge verdien er i intervallet 0 – 1023. “0” == 0% duty cycle og 1023 == 100% duty cycle. Man kan så bestemme frekvensen ved å sette perioden på den analoge pinnen.

Stepperkontrollerne tolker en høy/lav-puls på STEP-pinnen som step-signal, så her PWM-kontroll ideelt m.t.p. eksempelvis PID-kontroll av motorhastighet fra observert feil i balansevinkel.

Jeg har nå en mekanisk og elektrisk fungerende plattform for balanserobot. Jeg lurer litt på om jeg skal booste spenninga på stepperne opp til 24V ved å bruke 14650 LiIon-celler istedet for NiMH. Dette for å øke momentet og makshastigheten på motorene. Ellers, så ser ting ut til å virke rimelig bra.

Nå kommer den vanskelige biten, d.v.s. å integrere sensorinput fra flere kilder i kontroll-loopen. Modige sjeler kan google “sensor fusion / kalman filter” for å danne seg et inntrykk av hva som nå står for døra.

Når alt funker og er stabilt, så publiserer jeg kode, skjema, komponentliste og STEP-filer på GitHub. Koden er såpass generisk at den bør fungere på det meste av mikrokontrollere man kan utvikle for i C++. Det eneste Micro:Bit-spesifikke er to kall for å lese/skrive data over I2C og to kall for å sette PWM duty cycle og frekvens på pinnene til stepper-kontrolleren.

img_3271

img_3269