Elektronischer Zauberwuerfel (Touch-Steuerung)

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Elektronischer Zauberwuerfel (Touch-Steuerung)

CyCubeTouch

Als Kind der 70er Jahre war ich natürlich begeisterter Rubik-Cube Fan. Auch wenn ich das nie so wirklich perfekt beherrscht habe, fand ich die Mechanik dahinter sehr interessant, doch hat es mich später in die Elektronik verschlagen. Und als ich vor ein paar Jahre die Cypress Mikrocontroller (PSoC) mit den Touch-Möglichkeiten kennen gelernt habe, und später dann auch die 3D-Drucktechnologie bei mir zuhause Einzug gehalten hat, wurden alte Erinnerungen wach, die neu umgesetzt werden sollten: CyCUbeTouch - die Idee war geboren!

Für alle, die nur am Ergebnis interessiert sind: CyCubeTouch auf Youtube - I_WzKdnybyU (Leider kann man hier wohl keine Youtube-Links mehr einfügen?!

Alle, die etwas über das Innere erfahren möchten, und oder vielleicht Interesse haben, das Projekt weiter fortzuführen - da gäbe es noch einigen Spielraum - lesen bitte weiter:

Anforderungen

  • Keine bewegliche Mechanik -> Touch Steuerung
  • Optisch identisch zum Original -> LED Beleuchtung
  • Keine externen Kabel -> Batterie-Betrieb

Einführung

Touch-Technologie

Zunächst machte ich erste versuche mit dem PSoC, der es erlaubt, nahezu jeden GPIO auch als sogenannten CapSense Eingang zu verwenden. Wie sich herausstellte war die Nutzung bzw. die Programmierung für diese Touch-Technology sehr einfach und verlangt nur wenig Grundwissen.

Erster Test der CapSense Technologie von Cypress

Ausser einer kleinen Touch-Fläche (z.B. 1 Cent Münze) verbunden mit einem beliebigen GPIO und einer Referenz-Kapazität (CMOD) bedarf es keiner weiteren externen Beschaltung des PSoC. Und mit praktisch nur 4 Codezeilen konnte ich eine LED mit meinem Finger Ein bzw. Aus schalten:

CapSense_Start(); for(;;)

  if(0u == CapSense_IsBusy())
  {
     if ((CapSense_CheckIsWidgetActive(CapSense_BUTTON0__BTN))
     {
        LED_Write(1);   // Switch LED on    
     }
     else            
     {
        LED_Write(0);   // Switch LED off
     }
                                            // Initiate next CapSense scan
     CapSense_UpdateEnabledBaselines();     // Update all baselines
     CapSense_ScanEnabledWidgets();  // Start scanning all enabled sensor
  } // if(0u == CapSense_IsBusy())

} // for(;;)

Eine integrierte Selbst-Kalibrierung bzw. sogenanntes Auto-Tuning übernehmen die Touch-Auswertung. Für besondere Oberflächen, Elektrodenformen und/oder Umgebungssituationen gibt es eine Vielzahl von Parametern, die sich manuelle einstellen lassen, ich (zum Glück) aber nicht benutzen musste.

Mechanik

Touch-Flächen

Nachdem die erste Hürde genommen wurde, ging es darum sich Gedanken zur konstruktiven Umsetzung zu machen, bevorzugt mit 3D-Druck, lichtdurchlässige Touchflächen aufzubauen. Nach einigen Versuchen, stellte sich folgende Bauform als 'gut' heraus, die eine weitestgehend gleichmäßige Beleuchtung der Fläche durch eine LED ermöglicht, und das Drahtkreuz genügend kapazitive Touch-Fläche für die Elektronik bietet, ohne optisch zu stark 'negativ' aufzufallen:

Transparente 3D-Druck Touch-Flächen

3D-Würfel

Wie bekannt müssen 9 Flächen auf eine Seite, und 6 Seiten bilden einen Würfel. Nach etwas Probieren (hinsichtlich Abstand 'Touch-Fläche/Fenster' und LED war das Gitter schnell erstellt und (etas langsamer) gedruckt:

Eine Würfel-Seite - Platz für 9 Touch-Fenster

Da die Seitenteile entsprechend designt sind, können sie später einfach aneinander gesetzt werden, und es entsteht ein Würfel, ohne das ein zusätzliches Gerüst benötigt wird.

Batteriefach

Im Innern des Würfels ist weiterhin genügend Platz für ein ebenfalls gedrucktes Batterie-Pack, und da auch das würfel-mäßige Ausmaße hat, passt gleich die 4-fache sder eigentlich für 5V benötigten Menge rein, nun, die LEDs ziehen auch einiges an Strom, sodaß eine Reserve sicher nicht verkehrt ist.

Baterriefach - etwas übertrieben, aber es muß ja kubisch sein ;-)

Elektronik

Nachdem der optische und mechansiche Aufbau steht, und die grundlegende Elektronik getestet ist, bedarf es nun einer Platine, genauer 6 Platinen, die aber vom Layout identisch sind, und nur als Bestückungsvariante zwischen einer Master-Seite und 5 Slave-Seiten unterscheiden.

Das Blockdigram veranschautlicht Master und Slave Funktionen
Slave: Lesen der 9 Touch-Fenster und Weitergabe per I2C
Master: Lesen der eigenen 9 Touch-Fenster, Lesen der Touch-Informationen der Seiten per I2C und Ansteuerung aller 54 LEDs

Der ausgewählte PSoC4000S erlaubt es über eine serielle Komponennte die 6x9=54 LEDs vom Typ WS2812B anzusteuern, und per I2C die Touch Informationen zwischen den Seiten auszutauschen, um entsprechend 'Touch-Bewegungen' zu detektieren. Doch dazu mehr im Software Abschnitt.

Zusammenbau

Alle Hardwareteile sind nun zum Zusammenbau bereit:

Die gesamte Hardware: 3D-Druck und Elektronik - fertig zum Zusammenbau

Software

Der PSoC Creator von Cypress ist die kostenlose IDE für die PSoC Mikrocontroller. Das schöne daran, bereits grafisch wird das System bzw. die verwendeten Peripherien als eine Art Schaltplan zusammengestellt. Wie bereits für die Elektronik erklärt, gibt es entsprechend zwei Projekte für Master und Slave:

PSoC Creator TopDesign für den Master
PSoC Creator TopDesign für den Slave

Darauf basierend generiert die IDE eine Bibliothek, die dann in der Software per API auf die Funktionen zugreift. Das Slave-Projekt ähnelt sehr dem eingangs erwähnten CapSense Beispiel, es müssen ja lediglich 9 Touch-Felder eingelesen und die Information per I2C-Slave bereit gestellt werden. Das Master-Projekt hingegen, muss alle Slave-Informationen per I2C-Master einholen, die 54 WS2812B-LEDs ansteuern (serieller Datenstrom per SPI generiert) und ... besitzt die gesamte Intelligenz. Hierzu bekommt jede LED und jede Touch-Fläche eine entsprechende ID, um sie zu adressieren.

Eindeutige IDs für LEDs und Touch-Fläche

Intelligenz

Die eigentlich Herausvorderung besteht nun daran, zu unterscheiden, welcher Touch denn nun gewollt (= Bewegung) ist, und welche Berührung lediglich durch das Halten des Würfels ausgelöst wurde. Hierzu wurde für jede einzelne Touch-Fläche eine kleine State-Machine aufgesetzt. Nur wenn innerhalb einer gewissen Zeit über drei nebeneinander liegenden Felder mit dem Finger gestrichen wird, gilt dies als eine 'gültige' Bewegung. Es gibt somit prinzipiell 18 Bewegungsmöglichkeiten, wie eben auch beim echten Rubik-Cube - logisch ;-) Und ebenso wie beim Original, kann auch nur dann eine Ebende gedreht werden, wenn sie nicht durch andere Finger an anderer Stelle früher:festgehalten - heute:berührt wird. All dies ist Aufgabe der Logik innerhalb der kleinen State-Machines, die quasi zeitgleich für alle 54 Flächen ablaufen muss. Hier ein Beispiel:

Intelligenz jeder einzelner Touch-Fläche (State-Machine)

Da keine Bewegung mit dem Mittlerem-Fenster beginnt, kann dieses Feld für Sonderfunktionen verwendet werden. Zum einen lässt sich die Helligkeit steuern und der Würfel ausschalten (2x Click) bzw. der Würfel gemischt und der Schwierigkeitsgrad festgelegt werden (3x Click)

Der fertige Würfel

Der fertige Würfel ... fertig zum Einschalten
Er funktioniert :-)

Youtube

CyCubeTouch auf Youtube - I_WzKdnybyU (Leider kann man hier wohl keine Youtube-Links mehr einfügen?!

Probleme

(Fast) kein Projekt ist von Anfang an perfekt, woraus man auch lernen kann und so sind zumindest zwei mehr oder weniger gravierende Verbesserungen notwendig:

  • Leider haben die WS2812B keinen Standby-mode, und auch selbst wenn sie 'ausgeschaltet' sind, ziehen sie noch ca. 1-2mA Strom, was bei 54 LEDs schon beachtlich ist und keinen Software Stand-By. In der nächsten PCB Version müssten die LEDs eine eigenen Stromkreis bekommen, der über einen MOSFET per Software abgeschaltet werden kann. Damit könnte der Würfel in einen echten Sleep-Mode versetzt.
  • Der Mechanische Zusammenbau erscheint einfach, und die 6 Seiten werden über die 2.54 Pfostenleisten gehalten. Nicht bedacht habe ich, dass insbesondere die letzte Seite, natürlich mehr oder weniger im Dunkeln aufgesetzt wird, und da die Pfosten/Buchsen keinerlei mechanische Führung haben, ist das schon ein wenig tricky bis dann mal alles sitzt. Irgenwie müsste das Stecksystem verbessert werden, eventuell eine Führung am Batteriekasten oder so.

Verwendete Tools

Mechanik, 3D-Zeichnungen FreeCad Mechanik, 3D-Slicer Cura Mechanik, 3D-Drucker Anet-A8 Elektronik, Layout KiCad Elektronik, PCB Asiler Software, IDE PSoC Creator Software, Project Firmware Datei:CyCubeTouch v20210208 minimized.zip

Statistik

Für die, die es genau wissen wollen, hier noch ein paar Zahlen: Ca. 110 Meter Filament, oder 320 Gramm, oder 28 Stunden Druckzeit. Je nach Einkaufsquelle ca.100 € Gesamtskosten (Filament 10€, Touch/Draht 8€, PCB 60€, LEDs 10€, diverses 10€) Ca 5000 Code Zeilen, und 31 KByte Code für den Master.

ENDE

Vielen Dank wenn ihr euch bis hierhin für das Projekt interessiert habt! :-) Likes auf Youtube wären dann auch gerne willkommen - Danke auch dafür! Anregungen nehme ich gerne entgegen, und Frage versuche ich zeitnah zu beantworten. Danke, Euer MicRoller