KITtyBot – den lilla fyrbeningen

Denna lilla gästblogg handlar om den lilla fyrbenta robot som jag ägnat delar av min fritid åt under snart två år. Varför konstruerar man en robot och varför väljer man att göra som jag gjort? Ja, jag hoppas att jag kan ge en liten bakgrund här och samtidigt inspirera andra till vad man kan åstadkomma för en ganska rimlig summa pengar.

Bakgrunden

Att bygga egna robotar har blivit populärt och själv drogs jag med i trenden av en entusiastisk kollega på jobbet. Han själv var mycket duktig på bildbehandling och brann naturligtvis för den delen av robotiken. Jag själv, som den maskiningenjör jag är, lockades mer av mekaniken i form av rörliga ben med mera. När jag tittade på vad andra gör på nätet slogs jag av några saker. Det byggs få gående robotar och de som byggs är insektslika fyr-, eller ännu hellre, sexbeningar. Jag kunde även konstatera att en del försökte bygga robotar i mer däggdjurslik konfiguration, kroppen högt upp och benen mer nedåt än utåt, men att det fanns få riktigt lyckade projekt på hobby-nivå. Det gick se många lovande koncept som stupat på grund av antingen för höga eller låga ambitioner, ibland en kombination av båda. Man kan till exempel varit väldigt ambitiös med att konstruera och tillverka men inte riktigt haft klart för sig hur den skall programmeras. Man kan ibland ha fått en alldeles för tung konstruktion. En del verkar i stället ha lagt ned mycket tid på simulering men inte orkat bygga den. Det kändes som att man måste hitta en balans mellan att vara teoretisk och praktiskt kunna bygga.

Jag hade lite ambitioner med att själv bygga ett koncept som lite utmanade det klassiska sättet många bygger på och dessutom försöka undvika de värsta fällorna. Mina egna krav var när jag började:

  • Den skall gå på fyra ben
  • Varje ben har tre frihetsgrader, en dubbelledad ”lårkula” och en knäled
  • Den skall bära sin egen strömförsörjning. Ingen sladd som den släpar efter sig.
  • Benen skall peka nedåt, det vill säga mer ”däggdjur” än ”insekt”
  • Vanliga R/C-servon med styckpris en bra bit under hundralappen
Den ursprungliga roboten hösten 2015

Min första robot bestod av lite delar i akrylplast (plexiglas) och balsa. Jag hade ett speciellt styrkort, SSC-32U, som kan styra upp till 32 servon. Jag behövde bara styra tolv servon men hade lite dålig koll på vad som krävdes. Själva programmeringen gjordes på en vanlig Arduino som kommunicerade med servostyrkortet via UART (RX/TX ihopkopplade på de båda korten). Jag hade lite tryckknappar och senare en joystick som jag kunde styra roboten framåt, bakåt och svänga på stället. Under hösten 2015 löste jag de flesta problemen runt att få roboten att kunna gå på ett någorlunda stabilt sätt. Det fanns två viktiga problem man måste lösa.

Man måste för det första ha en bra teoretisk modell för hur roboten skall röra på sina leder och omsätta det till benrörelser. Det kallas inverterad kinematik, en uppsättning formler som gör att en önskad x/y/z-rörelse av en fot kan omsättas i servoutslag. Jag skrev att jag är maskiningenjör. Att lösa denna typ av ekvationer är just det ämne jag en gång tog en massa högskolepoäng inom (även om min vardag som civilingenjör inom flygindustrin mest innehåller möten). Denna teori är viktig. Jag tror att många fina projekt aldrig kommer längre än till byggstadiet eftersom man inte riktigt kan eller orkar lösa dessa problem.

Det andra är att sätta ihop denna inverterade kinematik till sekvenser för att kunna gå. Man talar oftast om gångarter (walking gaits). Människor som är hästintresserade vet vad jag pratar om när jag säger skritt, trav, galopp, passgång och så vidare. För en robot av denna sort får man, åtminstone till en början, nöja sig med en gångart som är statiskt stabil hela tiden. Det innebär att en fot flyttas i taget, roboten vilar så länge på de andra tre fötterna. För att den inte skall tippa måste tyngdpunkten ligga inom den trefot som bildas av de tre fötterna på marken. Sekvensen höger-bak, höger-fram, vänster-bak, vänster-fram och så vidare fungerar bra. Kroppen rörs för att följa med framåt och i sidled hela tiden så att tyngdpunkten ligger rätt.

Jag ägnade hösten 2015 åt att lösa mycket av detta med min första robot. Roboten bar på sin egen strömförsörjning ett 6V (5×1,2V) NiMh-batteri som matade styrkort och servon. Arduinon som gav styrimpulser fick vara ”fjärrkontroll” och ha tre sladdar till roboten för kommunikation. Jag ersatte rentav de tre sladdarna med blåtandskoppling, servostyrkortet hade xBee-anslutning.

Nu kändes det som att jag kunde ha en robot utan navelsträng även om hela konceptet med servostyrkort, separat Arduino och två kort för Blåtand var lite dyrt och komplicerat. Dessutom tappade den sin trådlösa kommunikation (verkar typenligt för BT, hur många gånger har man inte tappat handsfree-kopplingen till telefonen i bilen). Jag hade löst alla problem men var kanske inte helnöjd. Ville man köra roboten var det enklast att behålla sladden mellan handkontroll och robot.

KITtyBot-konceptet tar form

Någon gång vid jul frågade jag lite kollegor på mitt dåvarande jobb efter ett förslag på roligt namn på mitt projekt. Någon sade att den rörde sig som en drogad kattunge och direkt kom det olika kattinspirerade namn. Namnet jag fastnade för var just KITtyBot; med ordet KIT i versaler. Detta fick blir namnet som jag använde när jag lade ut Youtube-filmer eller skrev på olika robotforum.

Roboten vilade lite under 2016 samtidigt som jag fortfarande intresserat följde vad andra gjorde inom området. Man kan säga att det fortfarande inte var så vanligt med däggdjurslika robotar men det fanns inspiration att få hur man gör något billigt och effektivt. En liten söt robot som jag gärna framhåller som inspiration är Tote, http://tote.readthedocs.io/en/latest/. Det är, som så ofta, en insektslik fyrbening men jag gillade det minimalistiska konceptet, allt byggt runt ett kretskort och med servonas egna horn som ben.

Robot byggd på bara breadboard och servohorn

Någon gång sommaren 2016 var jag igång med nästa robot, kallad KITtyBot Mini. Denna var byggd på ett breadboard och en Arduino Pro Mini. Arduinon kan maximalt styra tolv servon och jag fick plats med kontakter för tolv servon runt mitt Pro Mini-kort på en vanlig breadboard. Från början var tanken att bygga allt utan extra material alls. Benen skulle bestå av servohorn och breadboardets självhäftande undersida tillsammans med lite dubbelhäftande tejp höll ihop allting. Men denna konstruktion blev för vek så projektet växte. Jag hade tillgång till en 3D-skrivare på Makerspace så jag gjorde en del delar där.

Benen 3D-printade, all elektronik på ett breadboard

När det gäller styrning såg jag att en del, bland annat Tote, använt en vanlig fjärrkontroll med IR-mottagare. Jag tyckte det verkade svårt men när jag tittade bland sortimentet hos m.nu såg jag att en liten NEC-fjärr fanns. Fjärrkontroll och IR-mottagare gick att få för totalt under hundringen. Och färdiga bibliotek för att få det att funka fanns också. Dessutom tog det bara en I/O-pinne i mitt nu ganska hårt utnyttjade Pro Mini-kort. Det fick bli styrsättet.

Jag tvingades göra 3D-printade delar till min KITtyBot Mini. När jag ändå tvingats bort från mitt ursprungliga minimalist-koncept kunde jag lika gärna göra roboten lite större för att inte blir för begränsad. Konceptet med Arduino Pro Mini och IR-stryning fick vara kvar. Robotens yttermått återgick till ungefär de som den första roboten haft. Plats på scen för KITtyBot 2.

KITtyBot2, den ”slutliga” roboten

KITtyBot 2 känns för mig personligen som en relativt ”mogen” konstruktion. Andra ”makers” skulle med hjälp av 3D-filer och en bra beskrivning kunna tillverka samma robot. Jag kommer nog att lägga ut den på någon internet-sida i stil med thingiverse.com men jag har helt enkelt inte mäktat med det ännu.

Hårdvara

Följande komponenter har använts till min robot:

Allt utom batteriet finns i sortimentet hos m.nu. En vanlig LiPo-ack går att köpa hos välsorterade hobby-affärer för modellflyg och kostar typiskt en knapp hundring. Den jag använde köpte jag för 99 kronor på Teknikmagasinet. Summerar man detta till allt annat i listan för man en totalkostnad på 800 kronor. Då tillkommer 3D-skrivna delar och material för att koppla ihop elektroniken (breadboard eller ett mönsterkort med mera). Allt landar runt tusenlappen beroende på hur man löser resten.

Tillverkade detaljer

Roboten består av relativt enkla delar. De har konstruerats i Fusion 360 och sedan bearbetats i Cura för att skrivas ut i en Ultimaker 2 3D-skrivare. Med tanke på delarnas utformning kan nog en relativt enkel 3D-skrivare ge fullgod kvalitet på delarna för en fungerande robot.

Roboten ritad i Fusion 360

I ben och kropp kan hornen som följer med servona limmas in med vanligt snabblim. Delarna kan skruvas ihop med de skruvar som medföljer servona och i tillägg till detta behövs lite dubbelhäftande tejp. Det är de två servona och liten plastbit som utgör ”lårkulan” som monteras ihop på detta sätt. Man kan även här limma ihop med snabblim men vill man byta ut ett trasigt servo, eller återanvända servona till ett annat projekt, går det med milt våld demontera om man använt dubbelhäftande tejp. Använder man monteringstejp av lite kvalitet så håller det ihop. Batteriet skall vara löstagbart men även kanske kunna flyttas lite för att reglera robotens tyngdpunkt. För detta används självhäftande kardborreband.

Elektronik går montera på ett breadboard så som gjordes på KITtyBot Mini. Utrymmet mitt uppe på kroppen har plats för det. Det finns plana ytor som tillåter att det monteras med den självhäftande baksidan. Men vid detta lag hade jag börjat experimentera med programmet Fritzing för att göra eget mönsterkort (PCB). Jag gjorde en konstruktion i Fritzing och använde mig av deras tjänst för att få dem tillverkade i deras partner aisler.net i Tyskland. Detta är återigen ett exempel där leverans från Kina är billigare men kan ta längre tid. Priset för tre kort inklusive frakt från Tyskland ligger på strax under 300 kronor.

Egenkonstruerat mönsterkort för Pro Mini och 12 servon

Det egenkonstruerade mönsterkortet har plats för Pro Mini mitt på kortet. Man kan löda fast det men ännu elegantare är att montera det i fastlödd hylslist (female header). Det finns plats att montera spänningsregulator och två resistorer för spänningsmätning. Det finns lite hål i kortet för att ansluta andra saker, IR-mottagaren är särskilt markerad och anpassad för benen på den. Lämpligen sätter man hyslister även där för att det skall gå smidigt att koppla i och koppla ur det man vill. Servokontakterna består av stiftlister (male header) som monteras i grupper av 3×3 stift i varje hörn (en liten grupp för varje ben). Dessa monteras lämpligen så att kontakterna är på undersidan.

Spänningsmatning

När det gäller Arduino, servon och batterier så känns det nästan som att hela världen konspirerat för att göra tillvaron omöjlig för den som vill göra en robot. Servona som sådana är konstruerade för 4,8-6,0 V spänningsmatning. De förbrukar dessutom rejält med ström, ett litet 9g servo kan dra över 500 mA när det ”stallar”. För mina tolv servon skulle det då krävas 6 A. Nu är det inte riktigt så illa att alla tolv servon går på max samtidigt men räkna med 2-3 A för att allt skall funka. Det finns inte så många spänningsregulatorer som klarar det.

UBEC för att mata 5V till servona

En vanlig 5V Arduino kräver å andra sidan minst 6 V, helst 7 V, för att fungera bra. Redan här finns det ett glapp mellan vad man maximalt vill mata servona med och minst vill ha till Arduino. Ett alternativ skulle kunna vara att köra med 3,3 V Arduino (det finns en variant av Pro Mini som har den spänningsmatningen) och sedan köra med fyra vanliga batterier eller NiMh-celler. Nu ville jag använda en vanlig 5V Pro Mini och dessutom ha LiPo-batterier som är på 7,4 V. Spänningen till servona måste regleras ned till 5V. Nu råkar m.nu ha en liten nätt spänningsregulator på 5 V och 3 A. Denna är hämtad från R/C-världen (radiostyrd hobby, byggd för att driva just servon med 5V) och är något som kallas UBEC.

Låter det bekant med telefoner och hoverboards som brinner? Det brukar vara just LiPo-batterier som kortsluts eller överbelastas. Jag behöver bygga in någon slags skydd, brandrisken är kanske inte så stor men cellerna blir förstörda om de laddas ur för fort eller går ned för lågt i spänning. Strömuttaget är inget problem, UBEC:en begränsar detta, så länge jag inte råkar kortsluta vid batteripolerna men att råka djupurladda är inte bra. Man behöver mäta spänningen på en av Arduinons analoga ingångar. Nu råkar 5V vara max och jag behöver mäta upp till 8,4 V (7,4 V-batteriet har fullt laddat en volt till). Att dela spänningen över två resistorer är lösningen. Jag använde 2,2 kΩ och 1 kΩ. Plats finns på mitt PCB för detta. I koden övervakas sedan spänningen och roboten går i viloläge om den går under 7,0 V.

Programmering

Jag gjorde en liten ”sketch” med Arduino IDE. Grunden i det hela är servo-biblioteket som finns med Arduino. Man kan ansluta upp till tolv servon med detta, vilket ju råkade vara precis vad jag behövde. Sedan har jag den lilla IR-mottagaren med tillhörande bibliotek från Adafruit.

Grunden i den kod jag skrivit berörde jag lite tidigare. En fotrörelse i tre dimensioner går att räkna om i vinkelutslag, det som kallas för inverterad kinematik (IK). Dessa skrivs som funktioner i koden som sedan i sin tur blir byggstenar i andra funktioner. I själva grundprogrammet finns det egentligen bara fyra olika funktioner som aktiveras av fyra knappar på fjärren – framåt, bakåt, vänster och höger. Med detta kan man få roboten att röra sig i princip dit man vill. Med jämna mellanrum läser den sedan av batterispänningen och kollar att den inte blivit för låg. Så sätter sig roboten ner och vägrar göra något mer.

Denna kod använder de fyra pilknapparna på fjärrkontrollen. Vill man sedan kan man bygga ut programmet till att göra andra saker när andra knappar trycks in. Den till exempel dansa en liten sekvens om en knapp trycks in, ”sitta vackert” om en annan trycks in och så vidare. Det är egentligen bara fantasin, och det faktum att man har ungefär 30 kB tillgängligt, som sätter gränsen.

Länkar

Jag har under åren publicerat lite om min robot på andra forum. På hemsidan letsmakerobots.com har jag lagt upp mina robotar. En länk för att läsa om KITtyBot2 är:

http://robotshop.com/letsmakerobots/kittybot-2

Jag har som användare ”Staffan” lagt upp även mina tidigare robotar på denna hemsida.

Jag har även gjort filmer på Youtube. Min senaste, som jag betraktar som ett litet avslut på KITtyBot2-projektet, hittar man på:

Även här kan ni hitta fler filmer jag gjort på mina tidigare projekt.

Vidareutveckling

Just nu slits jag mellan att ordentligt dokumentera roboten så långt jag kommit och lägga ut för andra intresserade byggare eller att fortsätta vidareutveckla. Som jag tidigare skrev så är roboten just nu i ett sådant skick att jag skulle kunna publicera filer och byggbeskrivning för flera att bygga.

Samtidigt kliar det i fingrarna att vidareutveckla. Nästa version är just nu under framtagande. Till den har jag tagit fram ett PCB med ett ATmega 328P-chip i stället för Pro Mini. 328P är ju hjärtat i Arduino Uno och dess varianter (till exempel Pro Mini). I praktiken kan man säga att jag gjort ett eget Arduino-kompatibelt kort som jag kan ladda med kod från Arduino IDE. Till denna kopplar jag en ultraljudssensor och programmerar roboten för att bli autonom. Jag skriver ett litet program för hur roboten skall kunna undvika hinder när ultraljudssensorn upptäcker ett sådant.

Någonstans här börjar jag få slut på minne och I/O på mitt 328P-chip. Jag behöver fler eller kraftfullare processor(er). Att byta till en Arduino Mega hade kanske varit naturligt men jag tänker i ställer koppla på en till Arduino som kommunicerar med den första. Med detta utmanar jag mig själv att lära mig lite om serie-kommunikation mellan två enheter. Tanken är att den första CPU:n är helt och hållet dedikerad till att sköta gåendet medan den andra sköter de större besluten. Man kan tänka sig att man i den andra CPU:n lägger in fler och mer avancerade sensorer och valmöjlighet mellan fjärrstyrning och autonomt uppträdande. Till en början är det bara ytterligare en Arduino men på sikt kan den ersättas med något med mer datakraft, till exempel Raspberry Pi.

Kommentera