3D Printing

Home/3D Printing

December 2016

Stumbler – part III (more cowbell)

By |December 26th, 2016|3D Printing, Electronics, Robotics|

PID-kontrolleren fungerte. Lavpassfilteret for aksellerometerdata fungerte. Det samme gjorde kalmanfilteret. Det hjalp likevel så inderlig lite når aksellerometeret støyet så mye, og i tillegg var så følsomt for vibrasjoner at enhver motorrespons resulterte i spinnville data. Stumbler ville ikke stå på egne hjul.

Derfor byttet jeg ut IMUen i noe mer beefy. Jeg gikk for BNO055 fra BOSCH. Dette er mer et SoC enn en sensor, da den gjør sensor fusion for deg. Den snakker i likhet med LSM9DS1 I2C, men har et mye enklere oppsett. Du kan bruke den i forskjellige modus. Enten som en tradisjonell IMU, eller som en 9DOF sensor med fusion-algoritme som snurrer i bakgrunnen. Ut får du ferdigtygde data, i form av quaternions, Eulervinkler, rotasjonsvektor, lineær aksellerasjon, gravitasjon og heading. Det finnes nok enda bedre sensorer der ute, men denne kostet rett under 40 USD og var svært enkel å bruke. Se BNO055.cpp for bare bones implementasjonseksempel, inklusive kalibrering.

Jeg har kranglet med LSM9DS1 i ukesvis, men bare et par timer etter å ha byttet IMU, så hadde jeg tegn til virk. Den balanserte nå såpass bra at den tålte å krasje i vegger, samt å få en dytt. Den tok seg nå inn igjen.

PID-parametrene kan nok fremdeles forbedres, iom at den er litt “tense” (Vi har hatt noen spektakulære krasj på steingulvet her). Under, så ser du en av de første prøveturene med BNO055 – med ukalibrert sensor (kan jo ikke kaste bort tiden med å lese spesifikasjon…)

Den var fremdeles litt vill av seg, så jeg myste litt i databladet. Det viste seg at BNO055’en har en autokalibreringsalgoritme. Man kan lese ut kalibreringsdata fra kalibrerningsstatusregisteret. Ved å vifte litt rundt i lufta med botten, inntil man leser ut “1” for bit 6 & 7, så oppførte ting seg enda bedre etterpå.

Under, så balanserer den helt fint på sofaen. Relativt stram pute, og absolutt ikke et flatt underlag.

Må kanskje presisere at den ikke akkurat er fjellstø ennå. Den tryner ofte med pannebrasken ned i flisgulvet, og forsøker av og til å stikke av – i ganske voldsom fart. Signalet fra PID-kontrolleren er vel å betrakte som non-insane i tiltintervallet [-3, 3] grader elns – foreløpig.

Jeg har ihvertfall nok virk til å kunne bygge en 2.0 versjon av botten med større batteripakke, samt litt mer optimal plassering av sensoren. Plata, som alt er montert på nå, er litt wobbly, og stepperne kunne gjerne hatt enda litt mer kraft. Vurderer også å kanskje lage et lite PCB med stepperkontrollere og IMU integrert.

Repo med modellfiler og (prototyp)kode finnes her: https://github.com/hansj66/Stumbler

October 2016

Scaling up

By |October 31st, 2016|3D Printing, Götterdämmerung|

Jeg fikk mail i dag. Fra Nederland. Med takk for å ha lastet opp Götterdämmerung-designet på GitHub. Avsenderen hadde vært på utkikk etter et CoreXY gantry-design basert på 4040-profiler og linear rails, og var på nippet til å begynne å designe sitt eget, da et Google-søk ledet han til repositoriet mitt på GitHub.

Ikke bare har han bygget en printer, basert på designet. Han har bygget en printer, som er betraktelig større en min, som allerede var på størrelse med en gjennomsnittlig vaskemaskin. Vi snakker takhøyde her :)

Han har også forbedret Z-akse-designet betraktelig. Dette er også den delen av det opprinnelig designet, som jeg er minst fornøyd med, og som krever mest arbeid å installere.

Toolkjeden han benytter er som følger (sitert fra email):

“The Z- Axis uses 3 motors and 3 stepper drivers. I use a RADDS board for electronics with RAPS128 drivers. They are able to give more then enough current to the motors for the torque. The 32bit board also allows for 300mm/s movement with1/32 stepping 0.9deg motors and quick and easy motorized bed leveling. It was a mother*bleep* to setup but now i only put in the SD card and never have to worry about leveling again.  Also, no noticeable z banding”

Printeren kan også printe stort. Rakettmodellen på bildet er 70cm høy!

Etter å selv ha benyttet meg av open source software og hardware i så og si alt jeg har hatt av prosjekter, så er det utrolig moro å kunne gi noe tilbake til miljøet. Det er også svært tilfredsstillende å se at et et design kommer til nytte for andre.

Maker: Max Nijpels.

Photo credits: Max Nijpels.

Stumbler – part II (a few iterations later)

By |October 11th, 2016|3D Printing, Electronics, Rants, Robotics|

Å 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.

September 2016

Stumbler – part I (Code name “Karma”)

By |September 25th, 2016|3D Printing, Electronics, Robotics|

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

April 2016

Mobile Beer Platform – mk I

By |April 5th, 2016|3D Printing, City Beest, Götterdämmerung, Robotics|

Sånn går det når man glemmer å slå av 3D-printeren sin i løpet av påskeuka. Før man vet ordet av det, så har robotene i kjelleren formert seg. Hils på skjelettet til MBP – mk I. Foreløpig totalt utestet. What could possibly go wrong…?

Mobile Beer Platform

Mobile Beer Platform

Charge indicator

Charge indicator

Motor cowling

Motor cowling

Power button

Power button

August 2015

Siste testprint før Maker Faire

By |August 11th, 2015|3D Printing, Maker Faire|

Jeg har bestilt meg 3 kvadratmeter bordplass i Hackheim sitt telt på Maker Faire. GD II, GDIII og CityBeest skal få lov til å være med i år. Jeg skal også ta med noen eksempelprint, som “Dante” og “ATST”. I tillegg til “Margo’s Dog” fra Bold Machines, som ble ferdig i dag.

Man kan si mye om Bre Pettis, men en ting skal han ha. Han har ansatt noen fantastisk bra designere for å lage modeller hos Bold Machines. Svært gjennomtenkt oppdeling av modellen og veldig bra passform på delene.

Modellen er ca 25x20x14 cm stor.

dog0_final

Nailed it !

By |August 5th, 2015|3D Printing, Götterdämmerung|

Jeg har benyttet de siste 72 timene til å forbanne gudene, mens jeg har feilsøkt årsaken til pitch-avhengige artefakter langs z-aksen på prints fra Götterdämmerung III.

Jeg la merke til dette under testprinting av ATST’en. Uavhengig av laghøyde, så hadde jeg riller med en periode på 1,25 mm, hvilket stemmer overens med pitchen til M8-stengene som jeg benyttet som drivskruer for z-aksen. Ringene var konsentriske og ikke eksentriske, så Z-wobble var utelukket. De var også uavhengig av laghøyde. Jeg redesignet så Z-opphenget, slik at jeg minimaliserte eventuell låsing av drivskruen pga ujevn belastning, med samme resultat. Jeg eksperimenterte med å gå ned fra 1/16 mikrostepping. Jeg forsøkte å skifte stepperdriver. Jeg byttet ut flex-koblingen mellom drivskrue og stepper-aksling. Jeg byttet stepper (stepperne har 5% nøyaktighet på stepvinkel). Jeg begynte å regne på effekten av avrundingsfeil ved beregning av steps for gitte laghøyder og testet kompromisser mht dimensjonsnøyaktighet. Ingenting hjalp.

I går, så bestemte jeg meg for å redesigne drivverket for z-aksen for tredje gang, og denne gangen ble det gjort skikkelig. Jeg benyttet T8 lead screws (som har en ganske brutal stigning på 8mm pr rotasjon mot M8 sin 1,25 mm pr rotasjon). Opphenget til plattformen ble balansert, slik at lead screw-mutterne garantert var jevnt belastet, og kun i Z). Jeg innførte også en ekstra sikring mot at flexkoblingen skulle kunne innføre løft i Z under rotasjon.

Og dette er resultatet (Z-ribber til venstre, med gammel løsning. Relativt pent resultat til høyre med nytt design for Z-aksen). Jeg er nå rimelig trygg på at vi har en vinner.

July 2015

Götterdämmerung III

By |July 31st, 2015|3D Printing, Götterdämmerung|

Ferdigstilte GD III et par dager etter at vi kom hjem fra Golfe Juan. Linear rails ser ut til å være rent gull. Det er null vibrasjoner i hotend.  Z-aksen er fremdeles litt kilen å få kalibrert riktig, men siden dette er en engangsoperasjon, så kan jeg leve med det. Mangler fremdeles å skrive et par sider på wikien, samt å renskrive de sidene, som allerede har innhold. Deretter tenker jeg jeg sier meg ferdig med prosjektet. Alle designfiler og all dokumentasjon for printeren er tilgjengelig på GitHub.

De som er nysgjerrige på printeren, anbefales å stikke innom Trondheim Maker Faire en av dagene, 28-29 august. I tillegg til CityBeest, så vil du finne GD II og GD III, samt et par modeller printet på disse maskinene i teltet til Hackheim.

ATST

ATST. Fremdeles litt weathering og finpuss igjen.

June 2015

Walking the Walk

By |June 25th, 2015|3D Printing, City Beest|

Bra man har bakgrunn i IT-bransjen. Jeg har lært meg at det meste som kan gå galt gjør det, men som regel kun i demonstrasjonssammenheng.

Med dette i bakhodet, så sa jeg meg enig i at promo-videoen for Trondheim Maker Faire kunne filmes på Sirkus Shopping i Trondheim. Et par dager før, så hadde jeg integrert ultralyd-sensorer i den, slik at den kunne snu hvis det skulle dukke opp blokkeringer i fartsretningen. Av frykt for å møte på Murphy, så hadde jeg gjort tilstandsmaskina i firmwaren e k s t r e m t enkel.

Det er også ganske stor forskjell på å lage noe som virker på en god dag og å lage noe som er stabilt og robust under et bredt spekter av forhold. (Under testingen i forkant, så hadde jeg oppdaget alt fra ledningsbrudd pga manglende strekk-avlastning til skruer som måtte stabiliseres med lock-tite for at de ikke skulle ramle av under kjøring)

Med alt dette i bakhodet, så kjørte vi inn til Sirkus. Fotografen rigget til kamerautstyr og jeg nappet i power bryteren.

Roboten begynte å vibrere.

Heldigvis, så hadde jeg kildekoden til firmwaren i hodet, slik at det var rimelig enkelt å analysere seg fram til problemet. Det var åpenbart at begge ultralydsensorene trodde de var blokkert. Dette, selv om det var 10+ meter klaring på begge sider. Den eneste forklaringen jeg kunne tenke på var at dette var et miljø med mye mer bakgrunnsstøy enn testmiljøet hjemme. Alt tydet på at sensorene hadde alt for dårlig diskriminering mot bakgrunnsstøy og at de mottok falske ekko pga høyfrekvent støy utenfor hørbart område (eksempelvis fra monitorer, lys, alarmer++).

Jeg hentet så avbitertanga og klippet av begge synsnervene til roboten. Jeg nappet så i powerbryteren igjen og CityBeest la ut på sin vandring gjennom Sirkus.

Det er en relativt tørst robot vi har  med å gjøre. Motorene trekker gjerne 10+ Amp under belastning, og hver motor har kun 2000 mAH å dra på. Etter å ha kjørt tre runder a 3-5 minutter, så hadde vi blåst tom 56 celler.

Jeg tror nok kanskje den er litt høyt giret og at dette kan resultere i litt voldsomt strømforbruk. Har i kveld printet reduksjonsgir i Alloy910. Dette vil resultere i litt saktere gange, men sannsynligvis lengere kjøretid. Dette kan kompenseres noe med å øke antall celler pr motor. Jeg tror også at jeg skal ha en løsning klar med livlinje til et litt heftig lab power på Maker Faire.

May 2015

Götterdämmerung II – Zooming in

By |May 13th, 2015|3D Printing, Götterdämmerung|

En henvendelse fra en NTNU-student ga meg det indirekte sparket i hekken, som jeg trengte for å registrere printerne mine på 3DHubs. Det aner meg at det er en viss fare for at dette kan vise seg å være en komplett idiotisk ide, men man lever bare en gang. Jeg åpner nå, med vitende og vilje, slusene for potensielt ulidelige mengder med spam i innboksen, krangling med villt fremmede mennesker på trappa, samt at man nesten er garantert en del useriøse henvendelser. Men…, på den annen side, så får jeg kanskje inn GDII i lista over printervalg for de som skal sette opp hub. Cunning, eh ?

Jeg vet nå at Götterdämmerung II kan printe stort, men kan den printe smått ? Jeg har faktisk aldri forsøkt – før nå.

For å bli registrert på 3DHubs, så krever de at du printer en testmodell ved navn “Marvin” innen en viss tid, slik at de kan verifisere at du faktisk klarer Z-presisjonen, som du påberopte deg når du registrerte printeren din. “Marvin” er en liten nøkkelringfigur på 16x17x26mm. D.v.s. på størrelse med noe man kunne forvente å finne i et kinderegg.

Å printe en slik med 0.8-1.2mm dyse og 300 mikrometer laghøyde blir omtrent som å fargelegge innenfor strekene i en malebok, med slangen fra en sementbil.

Jeg fyrte opp to testprints på den gamle Thing-O-Maticen min og skrudde deretter inn en 0.35mm dyse i GD. Deretter trykket jeg “PRINT”. Først en gang med en Z-oppløsning på 200 mikrometer. Deretter en gang til – med en Z-oppløsning på 100 mikrometer.

Resultatet var overraskende – bra. Jeg hadde forventet en fuzzy graut av plast, i.o.m at dette er en printer designet for store prototyper. Repeterbarhet m.h.t. posisjoneringsnøyaktighet har vært viktig, men oppløsning har jeg ikke hatt særlig fokus på. Det viser seg nå at Götterdämmerung er kapabel til å printe med bedre presisjon enn den gamle makerbotten min.

Bildeteksten er litt liten, men line-up’en er som følger (fra venstre mot høyre). 1. GD2 (100 mikrometer), GD2 (200 mikrometer), ToM (200 mikrometer), ToM (Mislykket forsøk på 100 mikrometer). Det er likevel noe banding langs Z-aksen på GD. Dette skyldes høyst sannsynlig skyldes upresise LM12UU-lager. Med Linear rails på GD III neste år, så tror jeg vi er inne i proffprinterland – med en delekost godt under 10K. Yay !