14 september 2024
Vandaag liep ik langs de Albert Heijn en zag in de etalage de Dierenkaartjes-actie. Daarbij viel mijn oog op een kleine reader, waarmee de dierenkaartjes door middel van een swipe tot leven worden gewekt, en dat voor nog geen € 4. Dat trok mijn aandacht. Het apparaat heeft een compacte behuizing, is voorzien van een speaker, accu, USB-C-oplader en een mechanisme om de kaartjes te herkennen. Meteen voelde ik de uitdaging om het swipen van de kaartjes met een microprocessor te simuleren.
Ik heb direct drie van deze readers gekocht. Na het openen van de verpakking viel me meteen op dat de reader is ingebouwd in een bamboe behuizing, voorzien van een batchnummer en een solide indruk maakt. Met behulp van een hamer en een kleine beitel lukte het me de behuizing te openen en de printplaat, speaker en lipo-accu werkend te demonteren. Op de printplaat ontdekte ik een SZY55F2-chip (vermoedelijk de processor) en een T25S128 (waarschijnlijk het geheugen voor geluidssamples), een 128 Mbit SPI Flash-geheugenchip.
Al snel werd duidelijk hoe de reader van de kaartjes werkt. Geen magneetstrip of NFC, maar een barcode optisch uit te lezen met behulp van een infrarooddetector. Toen ik de behuizing had verwijderd, zag ik dat de IR-detector vier aansluitingen heeft. Met behulp van de multimeter en oscilloscoop kwam ik er snel achter dat ik te maken had met afwijkende spanningen: 1,4 volt in rust en 2,1 volt bij een hoog signaal. De voorbeeld-barcode die ik had, liet zien dat een “0” een korte puls is, gevolgd door twee kleine tijdframes, en een “1” een lange puls, gevolgd door één klein tijdframe. Om te kunnen schakelen tussen 1,4V en 2,1V heb ik gekozen voor de Arduino R4 Wifi. Deze heeft een DAC (digital-analog converter) aan boord, waarmee ik eenvoudig op de juiste momenten de juiste spanningen op de aansluitingen van de IR-detector kan zetten en zo het swipen van een kaart kan simuleren.
Op internet vond ik een beschrijving van iemand die eerder het barcodesysteem had ontcijferd. Na wat puzzelen lukte het me om dit in Python om te zetten en een reeks geldige barcodes te genereren. De binaire beschrijvingen van de barcodes gebruik ik om op het juiste moment de correcte spanningen via de DAC op de IR-detector te zetten. Na het fine-tunen van de pulslengtes en het vaststellen van de juiste vertragingen, kreeg ik de dierenkaartjesreader werkend. Automatisch worden alle dierengeluiden afgespeeld en heb ik volledige controle over welk geluid op welk moment werd afgespeeld.
Dit opent mogelijkheden voor de toekomst. De processorchip zorgt voor de afhandeling van alle I/O-interacties met de drukknop, de IR-detector en de speaker. Op de print zit een ingebouwde lader voor de lipo-accu, en een multicolor LED geeft aan wanneer de reader leeg is, aan het opladen is, of wanneer de oplaadcyclus voltooid is. De 128 Mbit-chip is interessant; deze bevat alle geluidssamples en is in theorie aan te passen met eigen samples. Het uitlezen van de chip zou inzicht kunnen geven in de samplelengtes en de opslagstructuur. Door een Arduino, ESP32 of Raspberry Pi te koppelen, is het mogelijk om een multifunctionele sound sampler te maken die zowel optisch als geautomatiseerd vooraf opgenomen samples kan afspelen.
Een leuk project en een uitdaging aan mezelf om te onderzoeken welke technieken zijn gebruikt om een dergelijke reader te maken. De bouwkwaliteit is prima. De speaker is functioneel genoeg voor deze toepassing en de lipo-oplader zorgt met 3,7V en 150mAh voor een acceptabele speelduur. Reverse engineering is leuk en uitdagend om te doen. Het achterhalen van gebruikte technieken en encrypties, en vervolgens de techniek naar eigen hand zetten, blijft me fascineren en uitdagen.