Mijn DIY DEF CON-choker heeft een scherm

Ik wist ongeveer hoe ik wilde dat mijn choker eruit zou zien. Er moest een scherm in het midden zitten en LED-strips aan de zijkanten. Het moest er strak uitzien: de randen (bezels) moesten klein zijn, het apparaat zelf dun en relatief compact. Bovendien moest het visueel aantrekkelijk zijn.

Dat laatste is noteworthy, want esthetiek is meestal niet iets waar ik op optimaliseer bij de start van een project. Natuurlijk wil ik niet dat mijn apparaten lelijk zijn en idealiter moeten ze er semi-professioneel uitzien, maar daarbuiten ben ik niet zo kieskeurig. Iets maken dat er echt goed uitziet, zou een leuke — en andere! — uitdaging zijn.

Ik besloot te beginnen met het selecteren van een scherm.

Het selecteren van een scherm

Ik gebruik vaak schermen in mijn projecten, maar meestal zijn ze puur functioneel. Als gevolg daarvan gebruik ik gewoon wat het goedkoopst is, zolang het maar werkt. In dit geval wilde ik echter iets dat er mooi uitzag. Een goedkoop TFT-paneel of een monochroom OLED-scherm zou niet voldoen; ik wilde een scherm met een hoge kwaliteit en minimale randen.

Een van mijn vrienden raadde me aan om naar Panelook te kijken. Daar was ik nog niet eerder van gehoord, maar het is een gigantische marktplaats voor elk niche-scherm dat je je kunt voorstellen. Het is een wat vreemde website — je moet betalen voor de datasheets — dus zodra ik een scherm had gevonden, omzeilde ik hen en ging ik rechtstreeks naar de fabrikant.

Uiteindelijk koos ik voor de Hello Lighting HL020E21-02. Het heeft de perfecte maat, is vierkant met afgeronde hoeken en heeft superkleine randen. De beeldkwaliteit is op papier ook goed: AMOLED en 480x480 pixels. Het is bovendien een touchscreen; dat had ik niet per se nodig, maar het is een leuke extra.

Bijschrift: Low-fidelity prototyping om te controleren of de schermgrootte goed zou staan. Vergelijking met een hartvormige choker die ik al bezat.

Geloof het of niet, voor dit prachtige scherm kregen we slechts een offerte van $12 per stuk! Het addertje onder het gras was dat er vrijwel geen documentatie bij zat. Ik vond dit een beetje ontmoedigend, maar besloot toch de bestelling te plaatsen. De verzendkosten waren de grootste kostenpost, dus ik kocht er vijf. Daarnaast kocht ik vijf exemplaren van de Hello Lighting HL017T03-01, voor het geval ik iets 작ers wilde.

Het duurde een paar weken voordat de displays uit China arriveerden. Toen ik ze ging passen, besefte ik direct hoe blij ik met ze was. Ik had dit vooraf niet helemaal gerealiseerd, maar ze waren ontzettend dun: het glas zelf was minder dan een millimeter dik, en op het dikste punt (bij de connector) ongeveer 2,3 mm.

Het ontwerpen van de printplaat

Nu het display was gekozen, was het ontwerp van de printplaat (PCB) aanzienlijk beperkter — en dat is een goed ding. In ieder geval moest de plaat achter het scherm passen en over de juiste randapparatuur beschikken om het display aan te sturen. Ook moest het de batterijspanning kunnen reguleren (inclusief het opladen van de batterij).

Ik heb gekozen voor de RP2350 als microcontroller. De PIO (Programmable I/O) zou me in staat stellen het display aan te sturen, en hij heeft meer RAM dan de RP2040. Toch zou het krap worden; met 16-bit kleur is één enkele framebuffer al 450 KiB.

Omdat ik eigenlijk nog niet wist wat de choker precies moest doen, dacht ik dat het slim zou zijn om ook een micro SD-kaart toe te voegen. Hier heb ik weinig over nagedacht; ik vond wat schema's voor het verbinden van de RP2350 met de SD-kaart en kopieerde deze. De software zou ik later wel uitwerken. Zoals ik later zal bespreken, had ik hier iets meer moeite in moeten steken.

Eerlijk gezegd zat het grootste deel van het ontwerpwerk in het uitzoeken van het display. Er was geen bestaande KiCad-footprint voor (en ik kon er ook geen in andere EDA-software vinden). De specificaties van de connector, een 31-pins FPC, waren bovendien onvolledig. In plaats van de afmetingen van de connector te vermelden, gaven ze een obscuur modelnummer van een compatibele FPC. Dit leverde bijna geen resultaten op, wat het ontwerpen van een footprint erg pijnlijk maakte.

Later ben ik erin geslaagd een equivalent FPC te vinden die veel populairder en beter gedocumenteerd was. Dit ontdekte ik echter pas nadat ik mijn printplaat had besteld.

Het uiteindelijke ontwerp was vrij eenvoudig — zeker eenvoudiger dan sommige van mijn andere projecten. Een uitdaging was om alles passend te krijgen; de componenten namen niet veel ruimte in beslag, maar de sporen (traces) wel! Ik heb gekozen voor een dual-layer board, puur als uitdaging. Tegenwoordig zijn four-layer boards eigenlijk niet veel duurder.

Deze printplaat is ontworpen om net iets kleiner te zijn dan het scherm. Hij zou daarachter verdwijnen, geflankeerd door de lithiumbatterij die ik aan de achterkant zou monteren.

Nadat ik de printplaat had besteld, besloot ik dat de behuizing het volgende project was.

De behuizing

Om het samen te vatten: ik wilde de kleinste, dunste behuizing, vrijwel zonder extra randen. Dit is een groot contrast met wat ik normaal gesproken ontwerp!

Tijdens dit project ben ik behoorlijk goed geworden in FreeCAD. Een paar jaar geleden was het vreselijk om te gebruiken, maar recente versies zijn veel beter (hoewel zeker niet perfect). Gelukkig leerde een vriend me enkele geavanceerde technieken, zoals VarSets. Dit maakte het project veel draaglijker.

Ik ben ook een behoorlijk konijnenhol in gegaan met het lasersnijden van een perfect stuk acryl om voor het scherm te plaatsen. Dit zou wat extra breedte toevoegen, maar omdat het display zo dun was, was ik er zeker van dat er een vorm van bescherming bedoeld was. Pas na een volle week werken aan dit onderdeel herinnerde ik me dat het een touchscreen was. Natuurlijk wilden ze niet dat ik er iets vóór zou plaatsen!

Dit is het behuizingsontwerp waar ik uiteindelijk op uitkwam. Het scherm rust op een klein randje dat nauwelijks zichtbaar is, maar wel voor zeer goede structurele ondersteuning zorgt. De printplaat zit daar direct onder. Er zijn handgrepen waar het leer wordt bevestigd en vierkante gaten om draden naar de LED-strips te leiden. Uiteraard zijn er ook gaten voor alle connectoren, zoals de mini-USB (mijn favoriet), de debug-connector, de micro SD-kaart en de aan/uit-schakelaar.

Ik besloot de batterij te verplaatsen. Toen ik nadacht over de dikte, was ik vergeten rekening te houden met de eigenlijke componenten op de printplaat. Hierdoor zou het apparaat dikker worden dan ik wilde, en een testfit liet zien dat het net iets te veel op mijn nek drukte om comfortabel te zijn. Ook lag het gewicht teveel aan de voorkant en was de batterijcapaciteit vrij klein. Ik wilde dat mijn choker de hele dag zou meegaan.

Ik koos voor een 18650-batterij die aan de achterkant van de choker werd bevestigd. Dit was niet bepaald veilig — de beveiligingscircuits zaten in de behuizing, dus de batterij was verbonden met lange, onbeschermde draden — maar ik denk dat ik erger heb gedaan dan rondlopen met een kleine bom om mijn nek.

Nu de behuizing af was, ging ik over naar de software.

De software

Iets waar ik veel over nadenk, is dat video een van de laatste dingen is die relatief veel rekenkracht vereist. Een website serveren? Dat is vrij eenvoudig, het is gewoon wat bytes heen en weer sturen. Mijn M68k kan dat waarschijnlijk wel. Zelfs audio-streaming verbruikt relatief weinig rekenkracht per stream.

Maar video is anders. Er zijn veel ongecomprimeerde audioformaten, maar ongecomprimeerde video is veel zeldzamer — het neemt simpelweg te veel ruimte in beslag en verbruikt te veel bandbreedte. In de praktijk comprimeren we onze video's. Maar dan heb je genoeg rekenkracht nodig om de video in real-time te decompresseren!

Met een 480x480 display kwam ik in een gebied waar prestaties echt belangrijk werden. Zoals eerder vermeld, is één frame bij 16 bpp (bits per pixel) 450 KiB. Dit betekende dat ik in het RAM niet eens genoeg ruimte had voor double buffering. Bij 60 FPS zou ik meer dan 26 MiB/s aan data moeten overdragen (of meer dan 210 Mib/s). Dat is bijna het maximum van wat de flash-bus van de RP2350 kan ondersteunen!

Ik merkte al snel dat de enkele SPI-lane van de SD-kaart die ik had aangesloten niet nuttig zou zijn — deze kon slechts ongeveer 3 MiB/s aan. Dat is niet het einde van de wereld; ik kan de video gewoon 'on the fly' genereren.

Zoals gewoonlijk heb ik voor dit project embedded Rust gebruikt. Ik praat hier vaak over, dus ik zeg alleen maar dat het simpelweg heerlijk is. Ik heb Embassy gebruikt, een framework waar ik nog nieuw in ben, maar waar ik erg enthousiast over ben.

Het kostte me een paar dagen om het scherm daadwerkelijk iets te laten weergeven. Eén complicatie is dat de bus van het scherm alleen-schrijvend (write-only) is. Dit maakt het erg moeilijk om precies aan te wijzen waar een probleem zit. Uiteindelijk kreeg ik het werkend met een single-lane SPI-driver, en schreef daarna een PIO-programma zodat ik het op maximale snelheid via de quad-bus kon aansturen.

De touch-controller vereiste ook wat debugging; deze was nog slechter gedocumenteerd dan de display-controller. Gelukkig kon ik de onderdelen ervan tenminste individueel debuggen.

Dit is de animatie waar ik uiteindelijk op uitkwam: Het is vrij eenvoudig. Toch, bij het tekenen van alle vier de afbeeldingen op een kleurveranderende achtergrond, zakt de framerate op de hardware naar 30 FPS. Dit is een combinatie van hoog busgebruik en hoog CPU-gebruik. Als ik twee frames tegelijk in het RAM zou kunnen passen, zou het triviaal zijn om de prestaties te verbeteren. De dips naar 30 FPS waren echter niet merkbaar, dus besloot ik me er niet teveel zorgen over te maken.

Ik heb ervoor gekozen om mensen op het scherm te laten tekenen door met hun vinger te slepen. Daarnaast kan het touchscreen worden gebruikt om een menu te openen voor het regelen van de LED-strip en de helderheid van het display.

Het leer

Ik ben in een behoorlijk konijnenhol gegaan bij het zoeken naar leer. Er zijn miljoenen soorten leer. Sommige zijn rekbaar, andere zacht, sommige kunnen lasersnijden en andere niet. Ik heb dit een paar weken lang af en toe onderzocht om te beslissen wat ik wilde. Een van mijn vrienden, die ervaring heeft met leerbewerken, suggereerde dat het zelfs de moeite waard zou zijn om twee verschillende soorten leer te gebruiken: een zacht leer aan de binnenkant voor comfort en iets stijvers aan de buitenkant zodat het niet te veel zou doorhangen.

Uiteindelijk besefte ik dat ik gewoon een choker op AliExpress kon kopen en het leer daarvan kon hergebruiken. Dit was veruit de eenvoudigste optie en ook aanzienlijk goedkoper dan het kleinste stuk leer dat ik los kon kopen. Ik vind het een beetje gênant dat ik hier niet eerder aan had gedacht, hoewel ik veel over leer heb geleerd en er dus geen spijt van heb.

Ik ging iets te ver en kocht een heleboel verschillende types chokers. Ook kocht ik meerdere exemplaren van elk type als reserve. Ik denk niet dat dit kritisch was, maar DEF CON kwam dichtbij en ik zou geen tijd hebben voor een tweede bestelling.

Assemblage

De assemblage was niet te moeilijk. Het proces ging als volgt:

  1. Soldeer de display-connector op de PCB. Dit was zeer nauwkeurig werk en ik heb veel tijd besteed aan het herstellen van slechte verbindingen. Ik had een stencil moeten kopen.
  2. Soldeer aan elke kant van de PCB drie draden voor de LED-strips. Voeg lijmpistool-lijm toe voor trekontlasting.
  3. Lijm de printplaat in de plastic behuizing, waarbij de LED-draden door hun respectievelijke gaten gaan. Dit was lastig; het was een krappe passing en ik moest de draden in vreemde hoeken buigen.
  4. Verwijder het leer van een AliExpress-choker.
  5. Bevestig het leer aan elke zijde van het centrale stuk van de choker.
  6. Bevestig de 18650-batterij aan het leer.
  7. Bevestig de LED-strips aan het leer. Ze waren voorzien van lijm, maar ik voegde superlijm toe voor extra stevigheid.
  8. Sluit het scherm aan en lijm het vast.

De draden tussen de batterij en de behuizing waren lang en ik besloot ze aan het leer te lijmen. Normaal gesproken gebruik ik een lijmpistool, maar ik was door mijn voorraad heen en gebruikte superlijm. Ik maakte dit af op maandagavond (mijn vlucht naar DEF CON stond gepland voor woensdag). Ik dacht dat ik de lijm zou laten drogen en ging slapen.

Dinsdag, na het werk, controleerde ik de choker. Tot mijn grote schrik had de superlijm de isolatie weggevreten, waardoor het blanke koper bloot kwam te liggen! Vanuit een veiligheidsperspectief is dit zeer slecht en zou het me beletten mijn choker te gebruiken.

Ik knipte de aangetaste secties van de draad weg en verving deze. Gelukkig was er genoeg draad over om af te strippen en te solderen — hoewel het nipt was!

Nadat dit last-minute drama was opgelost, was ik eindelijk klaar voor DEF CON.

Ontvangst

Ik droeg mijn choker en kattenoren op vrijdag, zaterdag en zondag tijdens DEF CON. Ik wou dat ik ze ook op donderdag had gedragen, maar ik wilde eerst de sfeer proeven.

Kortom: mensen vonden het fantastisch. Ik kreeg het hele weekend complimenten en het was erg leuk om mensen uit te nodigen om op mijn nek te tekenen. Eén foutmodus waar ik niet op had gerekend, was dat veel mensen dachten dat het een gekocht product was; ik moest dit vaak corrigeren (en mensen werden over het algemeen veel enthousiaster als ze hoorden dat het DIY was!).

De batterijduur was uitstekend. Om eerlijk te zijn weet ik niet hoe lang hij precies meegaat, want na een dag van 16 uur was de batterijspanning nog steeds solide op 3,7V. Het is lastig om de capaciteit van een lithiumbatterij af te leiden uit de spanning vanwege de vlakke curve. Ik heb nog niet geprobeerd hem langer te laten lopen.

Wat de batterij betreft: het was erg leuk om rond te draaien om mensen de 18650 te laten zien die aan mijn nek was bevestigd. De reacties waren over het algemeen een combinatie van geamuseerd en gehorrificeerd. Maar ik ben het hele weekend niet ontploft!

Het weekend daarna was HOPE (Hackers On Planet Earth) en ik besloot daar dezelfde outfit te dragen. Opnieuw waren de reacties extreem positief. Ik denk dat dit vanaf nu mijn standaardkleding is voor conventies en conferenties.

Zo blijkt nu, werkt het touchscreen niet geweldig als het niet gekoppeld is aan de omgeving. Het werkte prima als het bijvoorbeeld was aangesloten op mijn computer, maar standalone was het bijna nutteloos. Ik ontdekte dat ik het capacitief kon koppelen aan mijn lichaam via de 18650, wat de zaak verbeterde, maar het was nog steeds niet fantastisch. In de toekomst wil ik dit verbeteren.

Zoals gebruikelijk voor mij, zijn de hardware en firmware open source. De repository-namen zijn een beetje misleidend; oorspronkelijk zou de software erg generiek zijn en frames/LED-stripcommando's van de micro SD-kaart lezen. Omdat ik nu alles in real-time genereer, vereist het wijzigen van de video aanpassingen in de code. Ik denk niet dat dit een groot probleem is, maar het is iets dat verbeterd kan worden, en het maakt de code zeker specifiek voor mij.