Marelleo: Een voorleesbox die ik voor mijn kinderen heb gebouwd
De aanleiding: Een irritatie tijdens de vakantie
Afgelopen zomer, tijdens een vakantie met vrienden en een kleine troep kinderen, kwam ik de Toniebox tegen. Eerlijk gezegd vond ik het geweldig. Het kind plaatst een figuurtje op de box, het verhaal begint. Ze halen het eraf, het stopt. Geen scherm, geen menu, geen ouder die moet komen helpen. Een tweejarige begrijpt het binnen een seconde, wat waarschijnlijk het hoogste niveau van bruikbaarheid is dat iemand kan bereiken.
De handeling is perfect, maar het businessmodel veel minder. Al deze boxen werken op dezelfde manier: het object wordt voor een redelijke prijs verkocht, en het geld wordt daarna verdiend met de content. Of het nu gaat om de Lunii met zijn gesloten catalogus, de Yoto met zijn kaartpakketten, of de Toniebox met zijn figuurtjes; elk nieuw verhaal is een aankoop uit een catalogus waar ik niet voor kies, op een object waar ik geen controle over heb. Je koopt geen speler, je koopt een abonnement vermomd als houten speelgoed. En dat irriteerde me matig.
Tegelijkertijd zei ik mezelf al jaren dat ik elektronica wilde gaan doen. Niet als een hobbyist, maar om het echt te begrijpen. Alleen wist ik er niets van. Ik bezit een soldeerbout die eens in de drie jaar tevoorschijn komt om een koptelefoondraad vast te zetten, maar nooit om iets te bouwen. Ik ben het type persoon dat weet wat een weerstand is, zonder ooit een specifieke weerstand te hebben hoeven kiezen.
Deze twee impulsen kwamen samen in de auto op de weg terug naar huis. Dat zou mijn project worden: een RFID-lezer, een tag en een box die een audiofragment afspeelt afhankelijk van wat je erop plaatst. Niet om een product te maken, maar gewoon voor mijn kinderen en om te leren.
De eerste ontdekkingen (v0)
Het breadboard: Het recht om fouten te maken
Ik wist al wat ik niet wilde. Een Raspberry Pi is een volledige computer om slechts een MP3 af te spelen: te groot, verbruikt te veel stroom en doet er twintig seconden over om op te starten. Een kind dat een figuurtje neerzet, wacht geen twintig seconden; ze lopen weg en gaan spelen. Aan de andere kant zijn de echt low-level chips, die je in C programmeert met een datasheet van 400 pagina's, veel te complex voor een beginner die dezelfde avond nog een verhaal wil horen.
Tijdens het lezen kwam ik twee dingen tegen die het project mogelijk maakten. Ten eerste het ESP32-ontwikkelingsbord: een microcontroller met ingebouwde WiFi, krachtig genoeg om MP3's te decoderen, eenvoudig genoeg om te programmeren zoals een Arduino, en verkocht voor een paar euro. Ten tweede het breadboard, die geperforeerde plaat waar je componenten in duwt zonder iets te hoeven solderen.
Het klinkt als een detail, maar het is het cruciale punt van het project. Op een breadboard kost een fout niets: je trekt iets los, begint opnieuw en er gaat niets kapot. Wanneer je leert, is dat precies de eigenschap die je nodig hebt.
Dus las ik documentatie, besprak ik het met Claude en tekende ik bedradingsschema's in een notitieblok. Al heel snel — eigenlijk te snel om het verdiend te laten voelen — had ik een circuit dat een audiofragment afspeelde wanneer je een tag plaatste. Het was lelijk, een plaat koperen spaghetti, met de luidspreker onbeschermd op tafel. Maar het werkte. Binnen een paar uur had ik iets dat verhalen vertelde. Ik denk niet dat ik sinds mijn kindertijd zo tevreden ben geweest met iets dat ik met mijn eigen handen had gemaakt.
Bijschrift: Het eerste circuit. Een ESP32 op het breadboard, de NFC-lezer aan het einde van een paar draden, en een rode LED die aangeeft dat hij actief is. Geen enkele soldeerverbinding.
Wanneer het in brand vloeg: Potentiometers en batterijen
Wat daarna kwam was minder glorieus. Om het volume in te stellen, voegde ik een potentiometer toe, die kleine draaiknop die niets anders is dan een variabele weerstand. Behalve dat hij, wanneer hij verkeerd is aangesloten, helemaal niets meer instelt: hij wordt een simpele draad tussen plus en min. Dat heeft een naam, het heet kortsluiting, en het warmt angstaanjagend snel op.
Het rookte. En het gaf een heel specifieke geur af, die ik een tijdje niet kon plaatsen voordat het me ineens overkwam: skivet. Brandende wax. Ik herken het nu direct, en het is nooit goed nieuws.
De batterij was het andere onderdeel waar ik over moest nadenken. Je sluit een lithiumcel niet zomaar aan op twee draden en gaat dan verder. Je hebt een laadregelaar nodig, een specifieke chip die bepaalt wanneer en hoe hij wordt opgeladen, die op het juiste moment stopt en uitschakelt voordat er iets stoms gebeurt. Ook moet je hem goed vastzetten, want een lithiumbatterij die rammelt in een behuizing en bekneld raakt, is precies het scenario in die video's die niemand wil bekijken.
Bijschrift: 3000 mAh, 3.7 V. Plat, licht, en absoluut niet ongevaarlijk. Bijschrift: De laadkaart, met een witte connector die niet overeenkwam met de mijne.
En dan een stom detail: de connector van mijn batterij paste niet op die van de laadkaart. Twee kleine witte stekkers die op elkaar lijken, maar twee verschillende pitches hebben, waardoor ze incompatibel zijn. Dus deed ik wat je doet om elf uur 's avonds op een dinsdag als je er bijna bent: ik knipte de connector eraf en soldeerde de batterij direct vast.
Het directe gevolg, dat ik niet had voorzien: geen connector meer, dus geen manier om iets los te koppelen, en geen schakelaar in het circuit. De box stond permanent aan. Vierentwintig uur per dag. Een lithiumcel die haastig is vastgesoldeerd in een object dat nooit uitgaat, in een kinderkamer. Zo opgeschreven heeft het geen commentaar nodig.
Dat was het moment waarop ik stopte dit lichtvoetig te behandelen. Niet uit angst, maar omdat ik begreep dat ik niet langer knutselde met een gadget op de hoek van een tafel: ik plaatste een elektrisch object in het dagelijks leven van mijn kinderen. Alles wat daarna volgde in het project vloeit voort uit dat besef.
Werkplaatsnotities v1: Van breadboard naar perfboard
Het eerste gevolg was het verlaten van het breadboard, en dat was niet alleen vanwege de veiligheid. Een breadboard houdt verbindingen vast door wrijving. Elke draad wordt vastgehouden door een klein veertje, wat geweldig is voor experimenten maar rampzalig voor duurzaamheid. Verplaats het circuit en een contact wordt verloren, en de fout die volgt is veel erger dan een volledige uitval: hij is intermittent. Je zoekt anderhalf uur naar een bug in je code, leest dezelfde functie twintig keer na, en het blijkt een draad te zijn die geen contact meer maakt.
Bijschrift: Hetzelfde circuit als op het breadboard, maar gesoldeerd. Hij overleeft het nu om over de tafel te worden verplaatst, wat al veel is.
De volgende stap is het perfboard: hetzelfde raster van gaten, maar op een printplaat, waarbij elk component is vastgesoldeerd. Je verliest het recht om fouten te maken, maar je wint een circuit dat bij elkaar blijft. Dat is waar ik echt heb leren solderen, en vooral waar ik begreep dat mijn "reparatie-solderen" niets te maken had met "productie-solderen". Repareren is het herstellen van een verbinding die al bestond. Bouwen is het maken van honderden verbindingen op rij, allemaal schoon en identiek, wetende dat de honderden-en-éénste de verbinding is die zal falen.
De behuizing
Voor de behuizing heb ik veel geluk gehad: François Lagunas leende me zijn 3D-printer en hielp me bij de eerste pogingen. Zonder hem zou ik nu nog steeds met een liniaal karton aan het snijden zijn. Ik tekende mijn modellen in Fusion 360 met de gratis hobbylicentie en printte ze.
Bijschrift: De behuizing in Fusion 360. De cirkel bovenop markeert waar het figuurtje komt, het gat ernaast is voor de knop, en de gleuf aan de zijkant is voor de USB-C kabel.
De eerste versie was te groot en te fragiel. En de kwaliteitscontrole kwam sneller dan verwacht, in de vorm van drie kinderen van 21 maanden, 5 en 7 jaar oud. Ze braken de knop door hem als dieren te draaien. De volumeknop bleef maar draaien zonder stop, en terwijl hij draaide, wikkelde hij de draden om zichzelf heen totdat hij ze er allemaal af trok. Ik opende de box en vond een klein nest van gedraaid koper. Dat is waar ik de belangrijkste regel van het hele project leerde: een vijfjarige draait niet aan een knop, die schroeft hem los. En ze stoppen niet wanneer er weerstand is. Ze stoppen wanneer het toegeeft.
Bijschrift: De potentiometer en zijn vijf tabs: drie voor het volume, twee voor de schakelaar die de box uitschakelt aan het einde van de slag. Dit zijn de draden die om elkaar heen wikkelden.
Dus begon ik opnieuw. Ik nam elke maat opnieuw op met een schuifmaat, component per component, zodat elk gat precies op de juiste plek zou landen en elk onderdeel door plastic werd vastgehouden in plaats van door zijn draden. Ik maakte de wanden dikker, voegde pockets toe en verlaagde de hoogte. Versie na versie stopte het object eruit te zien als een prototype en begon het eruit te zien als een product.
Om te voorkomen dat er iets zou kunnen wijken, stapte ik ook af van zelfborende schroeven. Direct in geprint plastic schroeven houdt één of twee keer, maar bij de derde keer splijt het materiaal langs de lagen: het gat houdt niets meer vast en het onderdeel moet opnieuw geprint worden. De echte oplossing heet een messing insert. Je plaatst hem op het gat, drukt met de punt van de soldeerbout erop, het messing wordt heet, smelt het plastic eromheen en zakt erin. Terwijl het afkoelt, heb je een metalen schroefdraad in het onderdeel, die je honderd keer kunt in- en losschroeven.
Bijschrift: De messing inserts die met de soldeerbout zijn ingezet. Vier minuten werk, en schroeven die je zo vaak kunt losschroeven als je wilt.
En toen kwam de enige test die geen enkel technisch argument kan verslaan: mijn vrouw vond de box mooi. Niet op een beleefde manier; ze zette hem op de plank in de woonkamer, tussen de objecten die je niet opruimt wanneer er iemand aanbelt. Dat bevestigde ook de kubusvorm, waar ik niet zeker over was. Een object voor kinderen dat je niet hoeft te verstoppen, is een object dat uiteindelijk wordt gebruikt.
In de openingsfoto is dit alles nog zichtbaar: een cirkel gegraveerd op de bovenkant (die aangeeft waar het figuurtje moet staan omdat de antenne er direct onder zit), de volumeknop ernaast, de afspeelknop, en de naam in reliëf op de voorwand. De figuurtjes zijn geschilderde houten poppetjes met een NFC-sticker onder hun voeten. Elk object zou werken: een speelgoedauto, een fiche, een platte kiezelsteen. Het kind bepaalt wat wat vertelt, en dat is precies wat ik wilde.
De printplaat v2
Op dat punt had ik een versie die vrij goed werkte. Maar een bedraad circuit is, hoe goed het ook gesoldeerd is, nog steeds een bedraad circuit. Er is altijd een kabel die aan een verbinding trekt, een module die aan zijn pootjes hangt, een connector die losraakt als je hem schudt. En ik had zojuist een paar weken lang empirisch gemeten hoeveel mijn kinderen dingen schudden.
Dus veranderde ik van categorie en begon ik met het ontwerpen van een Printed Circuit Board (PCB). Alles wat verspreid was, werd samengebracht op één bord: de voeding, de lader, de versterker, de SD-kaartlezer, de connectoren. Elk onderdeel op zijn plek, niets dat bewoog, niets dat uitstak.
Ik gebruikte Claude om van mijn bedrade circuit naar een schoon schema te gaan, en dat is waar de taakverdeling interessant werd. Het leest een datasheet zeer goed, ziet dat een pin een pull-up nodig heeft, berekent een waarde en haalt een footprint uit de bibliotheek in plaats van deze uit het hoofd te kopiëren. Maar het kan niet routen. Routing — het fysiek tekenen van het pad van elke koperen baan tussen componenten zonder ooit een andere te kruisen — deed ik met de hand in KiCad. 491 banen. Hele avonden besteed aan het verschuiven van lijnen met een tiende van een millimeter om een verbinding tussen twee pads van acht tiende millimeter uit elkaar te persen.
Bijschrift: Het routing-bestand. Elke rode lijn is een koperen baan die met de hand is geplaatst. Bovenaan, het gearceerde gebied onder de antenne van de WiFi-module: daar is geen koper toegestaan, anders stort het bereik in.
Dat bestand moet met een vergrootglas worden gecontroleerd voordat je het verstuurt, om een zeer concrete reden: je bestelt niet één bord. Het minimum is vijf, in één keer gefabriceerd en geassembleerd. Eén fout is dan geen kwestie van een klein herstel, maar betekent vijf borden voor de prullenbak en een volledige factuur.
Ik liet het schema dus regel voor regel opnieuw lezen. Er werden drie dingen gevonden die ik nooit had gezien, en elk daarvan zou de bestelling hebben geruïneerd.
De drie fouten die vóór de bestelling werden ontdekt
- De weerstand die alles zou hebben gedood: Om de 3.3 V te produceren die de processor nodig heeft, gebruik ik een step-down converter, en ik had er twee weerstanden omheen geplaatst die een spander vormden. Dat is de normale manier om de uitgangsspanning in te stellen. Behalve dat de chip die ik had gekozen in twee families komt: een verstelbare en een met vaste output. Ik had de vaste gekozen. Met mijn spander zou de regulering een spanning hebben gelezen die veel lager was dan de realiteit, concluderen dat de output te zwak was, en gaan pushen. De berekening geeft 13.7 V op een lijn die bedoeld is voor 3.3 V. De WiFi-module, de SD-kaart, de NFC-lezer: allemaal binnen een seconde na het inschakelen dood.
- De diode die verkeerd om stond: In KiCad is pin nummer 1 van een diode de kathode, en mijn bestand plaatste hem verkeerd om. Een omgekeerde diode op die plek betekent dat de 5 V er niet uit komt, dus de 3.3 V bestaat niet, waardoor het bord helemaal niet start. Vijf stomme borden in één keer, zonder dat je het kunt merken zonder ze te laten maken.
- De checker die niets controleerde: KiCad verifieert automatisch of banen de minimale tussenruimte respecteren. De mijne was geconfigureerd met een minimale tussenruimte van nul. Hij draaide, rapporteerde nul fouten, en keurde absoluut alles stilzwijgend goed. Dat is het ergste soort bug: het gereedschap dat je geruststelt.
Eenmaal draaiden de rollen om en gaf dat me een enorm genoegen: ik was degene die opmerkte dat twee componenten in mijn materiaallijst niet op voorraad waren, voordat de AI dat deed. We maakten daar een klein programma van dat de catalogus van de fabrikant bevraagt en de voorraad en prijs van elk onderdeelnummer teruggeeft, zodat dit nooit meer blind gebeurt. Een onderdeelnummer is geen gegeven: je controleert het op de dag van de bestelling, niet de dag ervoor.
Levering
Ik bestelde bij JLCPCB, die het bord fabriceren en bestukken. Voor 160 euro kreeg ik er vijf, al gemonteerd, genoeg om er één te houden en de rest aan neven en vrienden te geven. Het openen van dat pakket was een van de hoogtepunten van het project. Groene borden, strak, componenten perfect uitgelijnd, mijn naam erop geschreven, uit een bestand dat ik op mijn bank had getekend.
Bijschrift: Het bord zoals ontvangen van JLCPCB, componenten geplaatst. Mijn naam in silkscreen, en 491 handgetekende banen eronder.
Eerste contact met het gefabriceerde object: ik kan de USB niet insteken. De fabriek had een klein strookje materiaal onder de socket toegevoegd, een breakaway tab die wordt gebruikt om het bord tijdens de assemblage vast te houden, en die je bij aankomst eraf moet breken. Ik moest mijn moed verzamelen om dit met de hand te doen op een bord van dertig euro. Dat kostte me een goede tien minuten contemplatie.
Dan plug ik hem in en test ik. En er gebeurt niets. De LED van de NFC-lezer knippert, maar er wordt geen figuurtje herkend, er wordt niets afgespeeld, er verschijnt niets op het netwerk. Niets.
Ik bracht een kwartier door met mezelf vertellen dat ik een oude dwaas was die zojuist 160 euro had verbrand aan nutteloze borden, en dat ik het verdiende. Een echt slecht moment. Daarna ging ik methodisch op zoek en trok ik de kabelbomen één voor één los.
De schuldige bleek twee draden te zijn. Ik had de twee middelste geleiders op het lint van de NFC-lezer omgewisseld, de draden die de seriële link dragen. Die link kruist altijd: wat de één verzendt, moet de ander kunnen horen. Bij een directe bedrading praten beide uiteinden tegelijk en luistert niemand. De module start op, zijn LED knippert tevreden, maar hij antwoordt nooit. Het is het soort fout dat er ernstig uitziet, maar simpelweg onoplettendheid is.
En het beste komt als laatste. Ik had de kabel hersteld, en het werkte nog steeds niet. Om twee gestapelde redenen: ten eerste vraagt het programma de lezer slechts één keer, bij het opstarten, dus tot je herstart is de reparatie onzichtbaar. Ten tweede schakelt de aan/uit-knop helemaal niets uit terwijl USB is aangesloten, omdat hij werkt op de transistor van de batterij en USB het bord via een ander pad voedt. Dus besteedde ik mijn tijd aan het "herstarten" van een bord dat niet herstartte, om een reparatie te testen die al was voltooid.
Kabel uiteindelijk losgekoppeld en weer ingeplugd, waarna de langverwachte regel op de console verscheen: consolePN532 pret bibliotheque : 4 figurine(s) volume : 3 [3-21]
En dertig seconden lang dacht ik dat het nog steeds kapot was, omdat ik niets hoorde. De volumeknop stond aan het begin van zijn slag, op minimum. Er zit een poëtische rechtvaardigheid in het beëindigen van een dag debuggen met een volumeprobleem.
Maar verder: het bord werkte in één keer, zonder enige aanpassing. Geen enkele vliegende draad, geen baan om weg te schrapen, geen weerstand om te vervangen. Voor een eerste bord ontworpen door iemand die drie maanden eerder niet wist wat een footprint was, had ik dat echt niet verwacht. Al wat overbleef was om alles in de behuizing te monteren, ditmaal definitief.
Bijschrift: De definitieve assemblage, met open klep. Bijschrift: Het bord op zijn inserts. Niets hangt er meer los.
De software
"Pap, die hebben we al gehoord."
Die opmerking was het startsein voor de gehele softwarekant, en brengt ons terug naar het beginpunt. Een box met een bevroren catalogus, zelfs een catalogus van mijzelf, wordt precies het probleem dat ik wilde vermijden. De inhoud moest van ons zijn, en deze moest kunnen veranderen zonder gereedschap, zonder kabel en zonder mijn hulp.
Een webpagina als interface
Omdat er geen scherm is, serveert de box zijn eigen webpagina. Je typt het adres in een browser, vanaf een telefoon of computer, en je ziet de figuurtjes, de verhalen die op de SD-kaart staan en wat er op dit moment wordt afgespeeld. Niets te installeren, niets te updaten, geen account.
Bij de allereerste opstart opent hij zijn eigen WiFi-netwerk. Een telefoon die hiermee verbindt, opent automatisch de instellingenpagina, precies zoals in een hotel: de box beantwoordt elke vraag over domeinnamen met zijn eigen adres, waardoor de telefoon de pagina opent zonder dat erom gevraagd wordt. Je kiest je netwerk uit een lijst, typt het wachtwoord, hij voegt zich bij het huisnetwerk en sluit zijn eigen netwerk daarna af.
De eerste versie deed dit via Bluetooth. Dat werkte, maar het vereiste een specifieke app, wat onhoudbaar is voor een object dat je weg wilt geven, en de Bluetooth-stack nam 300 KB aan geheugen in beslag (negen procent van alles wat de chip heeft) om exact één keer in het leven van de box gebruikt te worden. Ik heb het zonder spijt weggegooid.
Je eigen MP3's en webradio
Je verzendt bestanden via de pagina, ze landen op de SD-kaart en je associeert ze met een figuurtje. Een figuurtje kan zoveel tracks bevatten als je wilt, in whatever volgorde, en ze spelen door tot de laatste zonder te loopen. Dat opent alle mogelijkheden: je eigen stem opnemen om de kinderen een verhaal te vertellen als je weg bent, liedjes die ze vragen herhaaldelijk afspelen, of wat je online vindt toevoegen. MP3 en M4A, de twee formaten die uit een telefoon of Mac komen zonder dat er conversie nodig is.
Bovendien kan een track ook een webadres zijn. Je kunt een figuurtje een URL geven, waarna de box verbinding maakt en de stream afspeelt terwijl deze binnenkomt, zonder iets op te slaan. Hij opent de verbinding, ontvangt de audio in kleine stukjes, decodeert ze en stuurt ze naar de versterker, terwijl hij altijd een paar seconden in reserve houdt om netukhikken op te vangen. Als de verbinding wegvalt, probeert hij het meerdere keren voordat hij opgeeft, want een thuis-WiFi heeft gaten en een tweejarige hoeft niet te begrijpen waarom de muziek stopte.
Mijn kinderen hebben dus radiostations die eruitzien als kleine houten poppetjes, en ik vind dat erg bevredigend.
Automatische updates via WiFi (OTA)
Dit is het deel waar ik het trotstste op ben, omdat het een probleem oplost dat specifiek is voor afgewerkte objecten. De box is dichtgeschroefd, gemonteerd en staat in de woonkamer. Als ik iets wil repareren, ga ik hem niet elke twee weken uit elkaar halen. Daarom haalt hij zijn nieuwe versies zelf op.
Hij raadpleegt een vast adres, dat in het programma is geschreven en bewust onmogelijk te wijzigen is via het netwerk. Dat is een veiligheidskeuze: een box die zou accepteren dat hem verteld wordt waar hij zijn software moet zoeken, zou accepteren dat hij alles installeert, en iemand op hetzelfde WiFi-netwerk zou dat kunnen misbruiken.
Als er een nieuwere versie bestaat, verschijnt er een knop op de pagina. Hij downloadt deze naar een tweede geheugengebied (dat niet actief is), controleert de vingerafdruk van het ontvangen bestand, en schakelt pas over als alles intact is. Een stroomuitval midden in een overdracht laat hem dus nooit stilvallen: in het ergste geval start hij opnieuw op de oude versie, alsof er niets is gebeurd.
Het veiligheidsnet
Dat laat de nachtmerrie van een gesloten object over: een versie die correct start, maar waarvan de netwerking is defect. Hij is geldig, de box schakelt over, en er is geen manier meer om het te repareren. Daarom is er een proefperiode: een vers geïnstalleerde versie moet bewijzen dat hij kan verbinden. Drie keer opstarten zonder ooit het netwerk te zien, en de box gaat vanzelf terug naar de vorige versie, nog voordat hij zijn radio echt inschakelt.
Dit heeft zich al bewezen. Een versie die ik had gepubliceerd, opende zijn setup-portaal terwijl hij het huisnetwerk perfect kende: hij las zijn opgeslagen inloggegevens te vroeg, voordat de radio was gestart, en concludeerde dat hij geen had. Ik hoefde niets te doen. Na drie keer opstarten ging hij uit zichzelf terug naar de vorige versie, en ik kon hem op mijn gemak repareren.
Een soortgelijke fout, maar grappiger: elke box opent een netwerk met de laatste vier cijfers van zijn hardware-adres, zodat twee boxen in hetzelfde huis onderscheidbaar blijven. Behalve dat ik dat adres las voordat de radio startte, waarop hij zes nullen antwoordde. Elke box in de wereld zou Marelleo-0000 hebben geheten.
En één keer had het veiligheidsnet niets kunnen doen. Mijn publicatiescript compileerde slechts één van de twee hardware-varianten, het prototype. De geprinte printplaat zou de image van de andere variant hebben ontvangen: audio- en SD-kaart pinnen omgewisseld, geheugen gezocht op de verkeerde bus, en een header die 16 MB geheugen aankondigde op een chip die er 8 heeft. Het ergste is dat de proefperiode dit niet eens zou hebben opgevangen, aangezien de WiFi zelf perfect zou hebben gewerkt. Hij zou doof en blind zijn geworden terwijl hij geloofde dat hij in goede gezondheid verkeerde. We ontdekten dit net voordat we op de knop drukten.
Nog één anekdote voor wie details amuseert. Op een dag begon de update te mislukken zonder enige foutmelding: de overdracht startte, maakte voortgang, en de box startte plotseling in stilte opnieuw op. Een stille fout zegt veel. Geen foutmelding betekent dat het programma geen tijd had om er een te schrijven, dus het stopte niet, het werd onderbroken. De downloadtaak had 8 KB stack, en ik had er een buffer van 4 KB in gezet. Er was niets over voor de versleutelde handshake van de beveiligde verbinding. De stilte zelf was de aanwijzing.
Het resultaat: Drie kinderen, drie verschillende gebruiksmanieren
Dit is het beste moment van het project, en het stond in geen enkele specificatie. Elk van hen maakte de box eigen, en geen van de drie manieren is de manier die ik had voorgesteld.
- 7 jaar: Haar muziekplaylists op één figuurtje, haar verhalen op een ander, en podcasts over insecten. Ze kiest zelf, vraagt om toevoegingen en beheert haar eigen catalogus.
- 5 jaar: Verhalen. Veel verhalen, geketend op een enkel figuurtje tot de laatste track, en herhaald tot ik ze uit mijn hoofd ken.
- 21 maanden: Haar slaapliedjes en haar peuter-podcasts. Dank aan France Inter en Radio Pomme d'Api.
Eén figuurtje, één handeling, en elk van hen heeft hun eigen box binnen dezelfde box. Dat is precies waar ik in het begin naar op zoek was, en het is bereikt via software in plaats van via een catalogus. Het verschil past in één zin: niemand verkoopt me de inhoud, en niemand kan het afnemen.
Bijkomstige schade: Een eigen werkplaats
Er is één gevolg dat ik niet had voorzien, en dat gaat niet over de box. Ik begon de vriendelijkheid van François serieus te misbruiken, aangezien zijn printer al mijn behuizingen had geproduceerd. En bovenal genoot ik er veel te veel van: de avonden, de weekenden, volstrekt onverdedigbare uren besteed aan obsessies over een fillet van twee millimeter of de diepte van een pocket. Ik besloot dat dit niet mijn laatste elektronica-project zou zijn, omdat ik er oprecht van hou. Dus kocht ik een Bambu Lab A1.
Ik vertelde mezelf dat het een nuttige aankoop was: reserveonderdelen die je niet meer hoeft te kopen, speelgoed dat je repareert in plaats van weggooit, op maat gemaakte opbergers. Dat is allemaal waar. Maar het was niet de reden.
En ik installeerde hem in de woonkamer. Een machine van een halve meter breed, die blaast, vibreert, veertien uur achter elkaar draait en ruikt naar heet plastic, midden in de kamer waar Marceau leert lopen. Op dat moment leek het volkomen redelijk. Ik werd op zeer duidelijke wijze de deur gewezen, en terecht: je installeert geen productie-eenheid in een woonkamer.
Kijken naar een printer die werkt is een valstrik: je gaat vijf minuten zitten en verliest een uur. Dus trok ik een netwerkkabel over de hoofdleidingen naar de kelder en richtte daar een printstation in. En het is eerlijk gezegd beter dan ik had gedacht: ik start een print vanaf de bank, hij draait in het donker twee verdiepingen lager, en ik ga de volgende ochtend naar beneden om het onderdeel op te halen. Geen lawaai en geen geur van heet plastic meer boven, en een woonkamer die een woonkamer blijft. De vijfde versie van de behuizing kwam daar uit. Dat is de versie op de openingsfoto.
Alles is online
Als je er zelf een wilt bouwen, heb ik alles wat je nodig hebt in een publieke repository geplaatst: github.com/Zebra-Rodeo/marelleo.
De drie behuizingsonderdelen om te printen, de fabricagebestanden van het bord klaar om in JLCPCB te droppen samen met de materiaallijst en componentposities, de broncode van de firmware, en documentatie die vanaf nul begint: wat te kopen en voor hoeveel, in welke volgorde je te werk moet gaan, de pinout van de moduleversie en de vallen die mij avonden hebben gekost. Alles onder de MIT-licentie, dus doe ermee wat je wilt.
Je kunt beginnen met de breadboard-versie, zonder één keer te solderen, en het bord pas bestellen als je het "bug-virus" hebt opgelopen. Dat is het pad dat ik heb bewandeld en dat ik zou aanbevelen: het breadboard is de plek waar fouten niets kosten.
Er zijn twee manieren om het te gebruiken. Bouw het precies na zoals in de bestanden en krijg dezelfde box als mijn kinderen. Of gebruik het als startpunt: een andere behuizing, een andere luidspreker, andere knoppen, de code aangepast naar jouw smaak. Alleen één ding om te weten, en dat staat met grote letters in de repository: de firmware is geschreven voor exact deze assemblage, de pinout zit in de code, en een verplaatste draad betekent een regel code die moet worden aangepast. Ik heb dit gemarkeerd omdat het precies het soort detail is waardoor je een hele avond naar een fout zoekt.
Als je er een bouwt, zou ik het heel graag willen zien.
De naam: Marelleo
De naam komt van marelle, het Franse woord voor hinkelen, het spel waarbij je vooruit beweegt door een voet op een vakje te zetten. Maar vooral van Marceau, Ella en Léonie, aan wie de box toebehoort.
Bedankt aan François Lagunas voor de printer, het advies en het geduld. En aan mijn vrouw, die maandenlang heeft geleefd met dit project dat zich uitstrekte over avonden en weekenden, en die "ja" zei tegen de printer voordat ik één argument kon formuleren.
Arnaud Aubry Founder, building and sharing what I learn
Groetjes,