Wir pumpen Ikea: Wie man aus leichter Musik Big Brother macht


Einführung


Ikea ist ein merkwürdiger Laden. Selbst wenn Sie mit der Absicht dazu gekommen sind, eine bestimmte Sache zu kaufen und sich nicht vom Rest des Mülls ablenken zu lassen, werden Sie dreimal mehr als nötig kaufen. Für uns Hacker zeigt sich dieser Effekt besonders in der Ikea-Abteilung mit Stromkabeln oder Batterien.

Für mich ist der letzte Fall eines solchen Wahnsinns in den Niederlanden aufgetreten. Ich war auf einer geplanten Reise und hatte vor, nur ein paar Wochen auf dem Land zu verbringen. Dies war jedoch Anfang 2020 und die Katastrophe mit COVID-19 ... Ich musste mich viel länger von meinem Labor fernhalten.

Und als ich die elektronische Produktlinie von Frekevens bei Ikea sah , konnte ich nicht anders und kaufte alles.

Für diejenigen, die es nicht wissen: Die Ikea Frekvens-Linie sollte ein modernes Analogon zum HiFi-Set der alten Schule und zum sechseckigen Musikset werden, das sich in den Häusern der Hälfte der Teenager der 90er Jahre zu befinden scheint. In diesem Fall besteht die Reihe der miteinander verbundenen Geräte aus einem Bluetooth-Lautsprecher für die Tonausgabe und einem LED-Projektor (ergänzt durch verschiedene Düsen), die im Takt der Musik flackern, sowie einer LED-Würfelanzeige, die Animationen anzeigen kann, die sich auch zur Musik bewegen. Ikea rühmt sich, dass diese Linie in Zusammenarbeit mit Teenage Engineering entwickelt wurde, das für seine Pocket Operator-Serie tragbarer „Spielzeug“ -Synthesizer bekannt ist.


Wie im Ikea- Werbevideo gezeigt , sollte der fertige Kauf von Dutzenden von Geräten wie ein unerträglicher flackernder Karneval aussehen, den mein innerer 15-jähriger Teenager gerne in seinem Zimmer arrangieren würde.

Das LED-Würfel-Display hat mich besonders interessiert: Es ist ein hochwertiges integriertes Gerät, das am Netz arbeitet. Auf der Vorderseite befindet sich eine Matrix aus 16 Zeilen und 16 Spalten mit sehr hellen weißen LEDs, dh insgesamt 256 LEDs. Die in das Gerät eingebauten Animationen waren ziemlich einfach, aber sie führten mich zu der Idee, dass Eisen tatsächlich jede LED einzeln steuern kann. Aus diesem Grund war die kleine Schachtel jedoch ziemlich teuer: Meine Tasche war um etwa 40 Euro leer. Für diesen Betrag erhalten Sie eine Box mit LEDs und einem Stromkabel. Da davon ausgegangen wird, dass Sie dieses Produkt zusammen mit anderen Frekvens-Produkten kaufen müssen, erhalten Sie auch zusätzliche Verbindungselemente: ein Verlängerungskabel für die durchgehende Stromversorgung vom Stromnetz zu anderen Boxen,sowie einen Satz Schrauben und Kunststoffkissen, mit denen Sie das Gehäuse mechanisch aneinander befestigen können.

Sobald ich nach Hause kam, schloss ich das Gerät an und ... um ehrlich zu sein, war ich ein wenig enttäuscht von dem, was sie mit dem Bügeleisen gemacht haben. Das Gerät verfügte über mehrere Animationen, die durch Drücken einer Taste auf der Rückseite des Gehäuses ausgewählt werden konnten. Im Gehäuse ist ein kleines Mikrofon installiert. Jedes Mal, wenn Rauschen erkannt wird, ändert sich der Rahmen der Animation. Animationen sind nicht sehr interessant: Sie bestehen nur aus vier bis fünf Bildern, und die Bilder selbst sind nur schwarz und weiß ohne Graustufen. Wenn Sie neugierig sind, habe ich ein kurzes Video mit allen Animationen aufgenommen.

Offensichtlich passte das nicht zu mir. Lassen Sie uns das Gerät hacken - lassen Sie uns sehen, wie es funktioniert und ob es möglich ist, sein Verhalten etwas interessanter zu gestalten.

Autopsie


Zum Zerlegen von Frekvens reichen ein Schraubendreher für einen kreuzförmigen Schlitz und möglicherweise ein Messer aus. Sie benötigen auch einen soliden Anteil an Ausdauer, da das Gerät nicht leicht zu zerlegen ist: Das Design ist kompliziert und einige Elemente sind mit Silikon gefüllt, wahrscheinlich um Vibrationen zu beseitigen und die Herstellung zu vereinfachen.


Die Demontage des Frekvens-Gehäuses beginnt von hinten. Das Gehäuse hat an allen Seiten Schraubenlöcher, mit Ausnahme der Vorderseite; Dank der Schrauben und Abdeckungen aus dem Gerätekit kann es an andere Frekvens-Geräte angeschlossen werden. Die hinteren Löcher für die Schrauben sind jedoch etwas tiefer und darunter befinden sich Schrauben, die das Gehäuse sichern.


Nachdem wir die hintere Abdeckung entfernt haben, sehen wir, dass alle Schraubenlöcher Gewindeeinsätze haben, in die die Schrauben eingeschraubt werden können. Beeindruckend! Dies sollte den Löchern einen ausreichenden Sicherheitsspielraum bieten. Es ist möglich, dass dies die Herstellung oder Demontage erheblich erschwert. Letzteres wird durch die Tatsache erschwert, dass wir zuerst die Tropfen der gehärteten Silikonverbindung schneiden müssen.


Die Einsätze werden tatsächlich mit anderen Kunststoffeinsätzen befestigt; Sie müssen zuerst entfernt werden.

Ich habe keine weiteren Fotos vom Demontageprozess, aber nach dieser Phase sehen Sie vier Schrauben, die gelöst werden müssen, und dann wird der Prozess wie zuvor fortgesetzt. Verstehen Sie, welches Kunststoffobjekt den Rest zusammenhält, schneiden Sie die Silikonverbindung ab und entfernen Sie die Kunststoffbefestigungen. Fahren Sie fort, bis Sie die Leiterplatte herausziehen können.


Hier ist es: die Rückseite der Leiterplatte. Wie sich herausstellte, besteht es aus zwei Leiterplatten: Die weiße hat zwei Seiten - auf der Rückseite befinden sich alle LED-Treiber (und eine weitere Leiterplatte ist daran angebracht) und auf der Vorderseite die LEDs selbst.

Die weiße Leiterplatte ist recht gut gestaltet: Anstelle einer LED-Matrix gibt es 16 SCT2024- LED-TreiberArbeiten mit Gleichstrom. Diese LED-Treiber haben 16 Kanäle, dh jede LED wird direkt gesteuert. LED-Treiber können die LEDs nur vollständig ein- oder ausschalten. Die Treiber selbst haben keine native Graustufenunterstützung. Tatsächlich führen sie eine Registerverschiebung unter Verwendung stromgesteuerter Ausgänge durch, und sie schalten alle nacheinander; Die grüne PCB-Verbindungsschnittstelle besteht aus dem Synchronisationsbus und den Daten, einer Snap-Enable-Leitung, einer Ausgangs-, Masse- und Power-Enable-Leitung.

Auf dieser grünen Tafel befindet sich das winzige Gehirn des Geräts: ein Mikrocontroller, dessen Artikel bei Google nicht zu finden ist, und ein Operationsverstärker für das Mikrofon. Interessanterweise gibt es Hinweise darauf, dass das Gerät mehr Funktionen haben sollte: Es gibt vermutlich Platz für das I2C EEPROM 24Cxx und einen Hinweis darauf, dass sich im ursprünglichen Projekt ein IR-Empfänger auf der Vorderseite befand. Vielleicht wurde angenommen, dass das Gerät mit einer Fernbedienung geliefert wird, mit der Sie Ihre eigenen Muster erstellen können? Dies könnte erklären, dass die vorhandenen Animationen so langweilig aussehen.


Auf der Vorderseite der weißen Tafel befinden sich alle LEDs. Ein winziges flaches Mikrofon ist ebenfalls daran angelötet. Zuerst dachte ich, dass es auf die grüne Tafel gelötet ist und durch das Loch in der weißen Tafel herausragt, aber tatsächlich ist es nur flach.


Alle anderen elektronischen Geräte befinden sich auf der Rückseite der Platine. Dort reicht es nicht aus: Nur ein Netzteil der Marke Ikea mit 4 V. Unter dem Netzteil befindet sich eine kleine Leiterplatte, auf der sich zwei Tastschalter für Tasten auf der Rückseite des Gehäuses befinden.

Wenn wir also das Design „optimieren“ möchten, haben wir eine offensichtliche Schwäche: Es ist besser, eine kleine Green Card durch einen Prozessor durch etwas Stärkeres zu ersetzen.

Wir modifizieren Eisen


Ich dachte, es könnte möglich sein, das Gerät durch eine ESP-Cam zu ersetzen. Dies ist eine sehr günstige Karte (ca. 10 Euro) mit einem ESP32-WLAN / BT-Chip, mehreren Megabyte PSRAM und einem Kameramodul. Ich interessiere mich nicht sehr für Unterhaltungsmusik, ich wollte, dass das Gerät auf etwas Visuelles reagiert. Da im Frontend bereits ein Loch für den Empfänger vorhanden war, dachte ich, ich könnte es unter der Kamera verwenden. Ich muss auch ein Loch in die weiße Tafel bohren, wo sich das Mikrofon befindet. Glücklicherweise wird neben diesen jetzt unbrauchbaren Mikrofonspuren nur eine Spur der LED zerstört. Ich bohrte ein Loch und restaurierte die Strecke. Ich setzte die Platine vorübergehend wieder ein und schaltete den Würfel ein. Ich stellte sicher, dass alle LEDs noch funktionieren.


Jetzt hatte ich ein Board mit einem Bohrloch und konnte nur die ESP-Cam verbinden und mechanisch verbinden. Die Designer gaben freundlicherweise den Zweck aller Pads auf dem Siebdruck der grünen Tafel an, so dass ich fast nichts erraten musste. Da das Netzteil nur 4 V liefert, habe ich es direkt an den 3,3 V-Eingang des ESP-CAM-Chips angeschlossen. Ich musste dies tun, weil der Chip beim Anschließen an den Vin 5V-Pin nicht starten wollte ... Höchstwahrscheinlich hat der LDO-Regler einen leicht hohen Spannungsabfall. Ich denke jetzt, dass es sich gelohnt hat, die Diode in Reihe mit einer 4-V-Quelle zu schalten, um 3,3-3,4 V zu erhalten, aber meine Lösung hat funktioniert. ESP32 ist ziemlich unprätentiös.


Nachdem ich alle Stecker gelötet hatte, musste ich mich sowieso um die Mechanik kümmern. Es war ein „schnelles und schmutziges“ Projekt, und ich hatte bereits zuvor die ESP-Cam-Anschlüsse gelötet. Um die Kamera auf das Loch auszurichten, konnte man mehrere Dichtungen und viel Epoxidharz verwenden.


Nach dieser Operation blieb das letzte Problem bestehen: Die LEDs neben der Kamera leuchteten in ihrem Rahmenfenster und verursachten alle möglichen seltsamen Artefakte. Um sie zu beseitigen, habe ich zunächst eine kleine Lünette aus einem Aluminiumband geschnitten, um die Kamera vor direktem Licht zu schützen.


Der zweite Schritt war das Auftragen von Acrylfarbe. Dies ist ein Kunststoffeinsatz, auf dem sich alle Diffusoren befinden, durch den die LEDs leuchten. Ich habe das Loch, in dem sich das Mikrofon befand, bereits vergrößert, um ein breiteres Rahmenfenster für die Kamera zu schaffen. Dies führte jedoch zu einem weiteren Problem: Das Loch war zu auffällig und es fiel zu viel diffuses Licht auf die Kamera. Ein Fleck schwarzer Acrylfarbe war in beiden Punkten ziemlich gut; Die Kamera erhielt immer noch viel Licht von den LEDs, aber jetzt wurde sie nicht vollständig überflutet.

Damit ist die Gehirntransplantation abgeschlossen und der Körper ist bereit für die Montage. Sie können die Software starten.

Software


Fahren wir mit der Software fort. Zunächst müssen wir die Kontrolle über die LED-Treiber erlangen. Dies ist nicht schwierig: Die Treibersignale stimmen fast direkt mit der SPI-Peripherieschnittstelle des ESP32-Chips überein: Das CLK-Pad auf der Karte ist mit der SPI-Peripherie-CLK-Schnittstelle verbunden, das DA-Pad auf der Karte ist mit dem MOSI des SPI-Signals verbunden. Auf diese Weise können Sie 256 Bit mit einer Kette von LED-Treibern synchronisieren: Jedes synchronisierte Bit steuert das Ein- oder Ausschalten der entsprechenden LED. Darüber hinaus gibt es einen LAK-Eingang. Wenn das Signal niedrig ist, behält die LED ihren vorherigen Wert bei, unabhängig davon, was in die Schieberegister übertragen wurde. Wenn das Signal hoch ist, wechseln alle gleichzeitig zu den Werten, die sich derzeit im Schieberegister befinden. Schließlich gibt es einen EN-Eingang, der alle LEDs ein- oder ausschaltet.Ich habe es nicht an GPIO angeschlossen und nur die LEDs programmgesteuert eingeschaltet.

So kann ich jetzt einzelne LEDs ein- und ausschalten und ein Schwarzweiß-Display erhalten. Ich brauche jedoch noch etwas anderes. Bei ausreichender Rechenleistung sollte das Display auch Graustufen anzeigen können - dazu müssen Sie die LEDs nur schneller ein- und ausschalten, als das Auge sieht.

Um dies mit einer einzelnen LED zu implementieren, verwende ich normalerweise PWM, aber im Fall von 256 LEDs nimmt dies einen erheblichen Teil des ESP32-Prozessors ein. Also entschied ich mich stattdessen für die binäre Codemodulation (auch Bitwinkelmodulation genannt). Dies ist eine Technik, mit der Sie Graustufen mit weniger CPU-Leistung erzielen können. Ich habe es bereits erfolgreich in anderen Projekten verwendet , daher war ich mir sicher, dass es funktionieren würde.


Und es hat funktioniert. Ich habe auch eine Nachschlagetabelle hinzugefügt, um die CIE-Helligkeit in PWM umzuwandeln , da das Auge im Wesentlichen nicht linear auf die Helligkeit der LEDs reagiert. Nachschlagetabelle behebt dieses Problem. Am Ende gelang es mir, eine ausreichende Anzahl von Graustufen und eine lineare Skalierung der optischen Helligkeit gemäß dem von mir festgelegten Pixelwert zu erreichen.

Die Implementierung des Kameraprojekts war nicht schwierig: Es gibt eine ESP-IDF-Komponente, die dem Projekt hinzugefügt werden kann. Er kümmert sich um das Einrichten der Kamera und den Datenaustausch mit ihr. Sie müssen nur die gewünschten Parameter angeben und dann die Bitmap anfordern, die die Kamera sieht. Das einzige, was ich in der Standardeinstellung nicht verwenden konnte, war, dass die automatische Ausrichtung und die automatische Belichtung standardmäßig aktiviert waren. Dies beeinträchtigte meine Steuerung der LEDs erheblich: Je nachdem, in welchem ​​Teil der Binärcode-Modulationssequenz das Bild erstellt wurde, Die Kamera erhöhte oder verringerte die Ausrichtung und Belichtung eher zufällig. Ich habe das Problem behoben, indem ich die Kamera auf manuelle Ausrichtung und Verschlusszeit umgestellt habe. Der Code selbst untersucht das Bild und bestimmt, ob diese Parameter kompensiert werden müssen.Dank dieser manuellen Verarbeitung konnte ich auch Pixel ausschließen, die direkt auf die LEDs blickten, um sie vollständig aus der Gleichung zu entfernen. Dies trug auch sehr dazu bei, ein stabiles Bild zu erhalten.

Jetzt habe ich eine Kamera und eine 16x16 Leinwand in Grautönen. Was soll ich mit ihnen machen? Ich hatte eine Idee: Zur Zeit der ersten Macintosh-Computer gab es eine beliebte Erweiterung, die der Menüleiste nur ein paar Comic-Augen hinzufügte. Diese Augen folgten einfach dem Cursor. (Eine Variation dieses Themas für Linux / Unix namens "xeyes" existiert noch.) Was ist, wenn ich versuche, es im wirklichen Leben zu wiederholen?


Für den Anfang brauchte ich ein paar Bilder der Augen. Ich dachte nicht, dass ich etwas Wertvolles zeichnen könnte, also beschloss ich stattdessen, meine eigenen Augen als Grundbilder zu verwenden; Sehen Sie sich ein kurzes Video an, in dem ich in alle Richtungen schaue und blinzele. Es ist zu bedenken, dass ich aufgrund der aktuellen Situation nur sehr wenige professionelle Werkzeuge hatte: Ich liege auf dem Boden, um die Beleuchtung der Deckenleuchtstofflampen zu maximieren und ein lesbares Bild zu erhalten. Das gesamte Video wurde auf dem Smartphone aufgenommen, das ich in meinen Händen halte.

Da die anfänglichen Daten ziemlich schlampig waren, musste ich hart an der Nachbearbeitung arbeiten. Ich begann damit, ein Fragment auszuschneiden, das ungefähr um mein rechtes Auge lag. Dann habe ich jedes Bild des Videos in ein Bild konvertiert und alle redundanten Bilder gelöscht. Am Ende hatte ich eine gute Auswahl an Bildern von mir, die in verschiedene Richtungen blickten, sowie ein paar Bilder mit einem Blinzeln. Da ich jedoch ein Mobiltelefon für die Aufnahme verwendet habe, stellte sich heraus, dass das Video etwas wackelig war und die Bilder übersprungen wurden. Um dies zu beheben, habe ich eine Reihe von Bildern durch das Hugin - Bildkleberprogramm geleitetdie normalerweise für Panoramen und HDR-Bilder verwendet wird; Am Ausgang bekam ich Bilder, die idealerweise auf diesem Teil meines Gesichts zentriert waren. Jetzt konnte ich nur noch markieren, in welche Richtung ich schaute und ob ich blinzelte. Dazu habe ich zuerst alle Bilder in Graustufen konvertiert und sie dann auf Gimp hochgeladen . In jedem Bild habe ich einen roten Punkt verwendet, um die Position der Pupillenmitte anzuzeigen, sowie einen roten Punkt in der linken oder rechten Ecke, um anzuzeigen, ob ich blinke, und wenn ich blinke, ist mein Auge halb offen oder geschlossen.


Nachdem jedes Bild auf diese Weise markiert wurde, war es sehr einfach, ein Skript zu schreiben, um den Standort der Pupille sowie den Blinkzustand zu ermitteln. Das Skript skalierte die Bilder auch auf 16 x 16 und speicherte sie als binäre Rohdaten, die zum Schreiben in die Firmware des ESP-CAM-Moduls bereit waren. Am Ende bekam ich eine Reihe von Bildern und einen Index darüber, wo sich die Pupille befindet und in welchem ​​Zustand das Auge blinkt.

Die ESP-Cam verfügt über eine recht einfach zu verwendende Kamerabibliothekskomponente für die ESP-IDF, sodass das Abrufen von Bildern einfach war. Ich habe das Aufnehmen von 120x160-Bildern in Graustufen eingerichtet, da diese am einfachsten zu verarbeiten sind und ich nicht viel Auflösung benötigte, da das Endergebnis auf einem 16x16-Bildschirm angezeigt werden sollte. Ich hatte jedoch immer noch ein Hardwareproblem: Die Kamera befindet sich immer noch zu nahe an den LEDs.


Zuerst habe ich versucht, es durch Kalibrierung zu lösen: Wenn das Gerät startet, werden zwei Bilder aufgenommen: eines mit einer LED in der Nähe des Kameraobjektivs und eines nur mit einer LED, die sich weit von der Kamera entfernt befindet. Wenn Sie ein Bild von einem anderen subtrahieren, können Sie verstehen, welche Pixel von LEDs betroffen sind. Diese Pixel werden in der Maske gespeichert. In der Maske markierte Pixel werden anschließend ignoriert. Das Bild oben zeigt zwei Aufnahmen und eine Maske.

Mit einem saubereren Bild könnte ich zur Bewegungserkennung übergehen. Ich habe es implementiert, indem ich ein Bild von der Kamera abgerufen und das vorherige Bild davon subtrahiert habe. Dann konnte ich die Bewegungsmenge berechnen, indem ich alle resultierenden Pixel addierte. Ferner war es möglich, den Ort der Bewegungskonzentration zu berechnen, indem der Durchschnitt der Koordinaten aller Pixel genommen wurde, gewichtet mit der Differenz der Bilder in diesem Pixel. Am Ende wird die Filtermagie ausgeführt, damit das Gerät nicht wie ein Jack Russell Terrier mit ADHS herumgerissen aussieht: Um seine Aufmerksamkeit zu erregen, müssen sich Objekte entweder gleichmäßiger oder weit genug bewegen.

Es gab nur ein Problem: Wenn es sehr dunkel war, arbeitete der Bewegungserkennungsalgorithmus manchmal an der Reflexion von LEDs an glänzenden Objekten im Raum: Wenn das Auge blinzelte, achten Sie auf seine eigene Reflexion. Dies ist nicht ganz das, was ich wollte, also habe ich dieses Problem umgangen, indem ich den Bewegungserkennungsalgorithmus beim Ändern des Bildes auf den LEDs „blind“ gemacht habe. Also habe ich dieses Verhalten gestoppt. Darüber hinaus ist es auch etwas realistischer: Wenn Sie blinken, können Sie nicht sehen.

Die Firmware verfügt über mehrere Debugging-Modi, die den gesamten Prozess demonstrieren. Hier ist ein kurzes Video, das dies veranschaulicht:


Fazit


Jetzt habe ich also ein Gerät, das mir folgt ... nicht wirklich nützlich, da stimme ich zu. Aber es war interessant für mich, es zu erstellen, und wenn ich jemals etwas Nützlicheres finde, das auf einem 16x16-LED-Bildschirm implementiert werden kann, kann ich es tun, weil ich bereits einen Steuercode habe. Apropos Code: Sie können mein Rohergebnis hier kostenlos herunterladen . Hoffe es hat euch gefallen und passt auf euch auf.


All Articles