Einen Feelspace Belt mit Arduino bauen und programmieren (Teil 3): GY-271 und HMC/QMC5883L

In diesem Teil beschäftigen wir uns nun mit den Daten aus dem Kompasssensor, die wir benötigen, um unsere Motoren immer gen Norden vibrieren zu lassen. Und hier lernen wir zunächst, dass es manchmal durchaus sinnvoll sein kann, lieber gleich bei namhaften Herstellern zu kaufen. Ich bestellte nämlich ursprünglich ein generisches GY-271 Breakout Board aus Hong Kong, das normalerweise mit einem HMC5883L Chip bestückt ist. Ich bekam aber auf Gedeih und Verderben mit keiner Bibliothek und keinem Code aus dem Internet Signale ausgelesen. Frustriert gab ich auf und bestellte einen generischen MPU9250 aus China. Und was geschah? Auch nicht auslesbar. Das ist das Problem mit Knockoff-Bauteilen aus China: Man kann sich selten darauf verlassen, dass auch drin ist, was draufsteht. Zwar zahlt man nur einen Bruchteil des Geldes, handelt sich aber wochenlange Wartezeiten und gelegentlich Chips ein, die einfach nicht sind, was sie vorgeben zu sein. Das Skurrilste am „MPU9250“ Board war, dass ich herausfand, dass es auch die Temperatur misst. Das war aber auch alles an Daten, was ich (absolut zuverlässig) heraus bekam.

An dieser Stelle kann es sich lohnen, einen I2C-Scan laufen zu lassen, den findet man hier bei Arduino direkt. Der ergab bei meinem angeblichen „GY-271/HMC5883L“ eine Registeradresse, 0x0D. Als ich beides zusammen googlete, beförderte ich massenweise Forenthreads von frustrierten Bastlern zutage, die mit dem bei Amazon ausgesprochen häufig verkauften China-Modul Probleme hatten. Ein User, dem mein ewiger Dank nachschleichen wird, stellte fest, dass bei einer Serie ein QMC statt ein HMC Chip verbaut wurde (eine andere Serie scheint komplett unbrauchbar zu sein). Diese hatte eben die Adresse 0x0D. Besagter User hat entsprechend eine passende Bibliothek geschrieben, an der wir uns nun orientieren werden: Hier der Link.

Das GY-271 ist ein dreiachsiges Magnetometer, es misst entsprechend Tesla (ja, genau der mit den Blitzspulen!), die magnetische Flussdichte, und zwar auf der X-, Y- und Z-Achse. Uns interessiert erst einmal nur eine einzige Achse. Welche das ist, hängt maßgeblich davon ab, wie herum ihr später den Sensor anbringt. Auf jeden Fall haben wir jetzt einen digitalen Kompass.

Hookup für meinen Knockoff-GY271 mit falschem QMC5883L ist allerdings identisch. VCC auf 5V, GND auf GND, SDA auf A4, SCL auf A5. Wir kommunizieren über das I2C-Protokoll, mit dem man mehrere Module hintereinander schalten kann. SDA ist in dem Fall der serielle Datenkanal, SCL steht für Serial Clock, denn Timing ist für die Signalübertragung nun einmal entscheidend. Um das Signal zu verbessern, schalten wir zwei Pullup-Widerstände zu 5k Ohm in diese Leitungen.

Hier dann noch der Code, um die Daten aus diesem China-Imitat auszulesen und direkt in eine Gradangabe umzuwandeln:

#include <Wire.h>
#include <MechaQMC5883.h>

MechaQMC5883 qmc;

void setup() {
 Wire.begin();
 Serial.begin(9600);
 qmc.init();
 //qmc.setMode(Mode_Continuous,ODR_200Hz,RNG_2G,OSR_256);
}

void loop() {
 int x, y, z;
 int azimuth;
 //float azimuth; //is supporting float too
 qmc.read(&x, &y, &z);
 //azimuth = qmc.azimuth(&y,&x);//you can get custom azimuth
 Serial.print("x: ");
 Serial.print(x);
 Serial.print(" y: ");
 Serial.print(y);
 Serial.print(" z: ");
 Serial.print(z);
 Serial.println();

float heading = atan2(x, y);

// Set declination angle on your location and fix heading
 // You can find your declination on: http://magnetic-declination.com/
 // (+) Positive or (-) for negative
 // For Bytom / Poland declination angle is 4'26E (positive) for Kiel +2,49°
 // Formula: (deg + (min / 60.0)) / (180 / M_PI);
 float declinationAngle = (2.0 + (49.0 / 60.0)) / (180 / M_PI);
 heading += declinationAngle;

// Correct for heading < 0deg and heading > 360deg
 if (heading < 0)
 {
 heading += 2 * PI;
 }

if (heading > 2 * PI)
 {
 heading -= 2 * PI;
 }

// Convert to degrees
 float headingDegrees = heading * 180/M_PI;

// Output
 Serial.print(" Heading = ");
 Serial.print(heading);
 Serial.print(" Degress = ");
 Serial.print(headingDegrees);
 Serial.println();

 delay(1000);
}

Ein paar Hinweise noch: Je nachdem, in welche Richtung der Chip montiert wurde, müssen natürlich die Variablen für die float heading Berechnung (x,y) eventuell durch andere ersetzt werden. Wie im Quelltext schon steht, sollte man der Präzision wegen seine magnetische Deklination in Erfahrung bringen. Das kann man unter Angabe der Stadt bei www.magnetic-declination.com, in meinem Fall ist es Kiel mit 2’49°. Der delay am Schluss ist nur auf 1000ms gesetzt, um die Beobachtung der Messergebnisse einfacher zu machen, er kann für den Betrieb deutlich herabgesetzt werden.

Was bei Beobachtung der Messergebnisse schnell auffällt, ist, dass die Gradangaben natürlich deutlich unpräziser ausfallen und schwanken, wenn das Magnetometer in eine bestimmte Richtung gekippt oder erschüttert wird. Dafür muss ich mir noch etwas einfallen lassen.

So, nun haben wir alle Einzelteile zusammen und programmiert. Im nächsten Teil basteln wir das gesamte Gerät zusammen und gehen in den Selbstversuch!

Ein Pfandsystem mit Barcodes hacken, oder: Hurra, wir drucken Geld!

Eins gleich vorab: Wer die Attacke, wie sie hier beschrieben ist, tatsächlich ausführt und sich Geld auszahlen lässt, macht sich strafbar (das gilt schon für den Versuch, es handelt sich um Computerbetrug). Daher weise ich darauf hin, dass diese Anleitung lediglich zu Informationszwecken verfasst wurde und die gravierenden Sicherheitslücken in Pfandautomaten dokumentieren soll. Außerdem gelten die Dinge, die dokumentiert sind, vielleicht nicht für alle Pfandsysteme, und dann wird man so oder so erwischt und kann sich auf einen Eintrag im Führungszeugnis freuen. Nun zum spannenden Teil!

Der Fall

Als ich neulich im Hackerspace war und das RFID-Bezahlsystem auf einem Festival reverse engineeren wollte (dazu später mehr), erzählte mir einer der Anwesenden, dass er gerade etwas ähnliches tun würde. Ihm war aufgefallen, dass die Selbstbedienungskasse einer größeren Supermarktkette sofort gesperrt wird, wenn man einen Pfandbon einlöst. Eine Kassiererin taucht auf, reißt einem das Ding aus der Hand und muss die Kasse manuell wieder freischalten. Das ließ eigentlich nur einen Schluss zu: Es war möglich, die Pfandbons mehrfach einzulesen. Dies wiederum sprach dafür, dass die Automaten nicht mit dem Warensystem der Kasse verbunden waren, sondern Wertmarken druckten, die nicht zentral gespeichert und abgeglichen wurden. Somit besteht eine eklatante Lücke im System, die ein Angreifer für sich nutzen kann, denn Pfandbons kann man deutlich leichter und billiger fälschen als 20€-Scheine, die mittlerweile die meistgefälschte Banknote sind, und ~20€ sind keine unüblichen Pfandbeträge.

Reverse Engineering für Barcodes

Wenn man genügend krimin…kreative Energie hat, kann man sich nun daran machen, das System mit einfachsten Mitteln auszutricksen. Wir beschauten also mehrere Pfandbons mit unterschiedlichen Beträgen aus zwei Automaten der selben Filiale. Zuerst stellten wir den Typ des Barcodes fest, was eine handelsübliche Scanner-App für das Handy erledigt, sonst sucht man eben über Tabelle. Dann guckt man, welche Zahlen gleich bleiben und welche Zahlen sich wie verändern. Daraus konnten wir ablesen, wofür die Zahlenreihen jeweils stehen. Ein eindimensionaler Barcode codiert mit Balken, deren Abstände und Breite vom Lesegerät gemessen werden, die Ziffern von 0-9, das ist kein Hexenwerk und kann mittlerweile wie gesagt von jeder Handycam ausgelesen und dechiffriert werden. Beim Betrachten der unterschiedlichen Ziffernreihen stellt man dann Folgendes fest:

  1. Kennzeichnung als „andere Ware oder Dienstleistung“
  2. Statische Automatennummer
  3. Dynamische und fortlaufende Pfandbonnummer
  4. Reihe auffüllender Nullen
  5. Pfandbetrag im Klartext/Cent
  6. Vermutlich Filialnummer
  7. Prüfzahl

Punkt 1, 2, 4 und 6 bringt man durch das Drucken eines üblichen Pfandbons in Erfahrung. Nummer 3 kann man sich einfach ausdenken, sofern man in der richtigen Reichweite bleibt, die man ebenfalls aus einem Pfandbon ablesen kann. Die Prüfziffer/Zahl 7 kann über einen Algorithmus, den jeder in Wikipedia nachlesen kann oder im Studium programmieren muss, leicht berechnet werden. Jetzt fehlt nur noch unser Pfandbetrag, Nummer 5: Der Fantasie sind nur Grenzen bis zur Anzahl der auffüllenden Nullen gesetzt, allerdings sollte man sich in einem realistischen, aber lohnenswerten Rahmen bewegen, irgendwas zwischen 10-20€. Obwohl ich gerne mal das Gesicht einer Kassiererin sehen würde, wenn sie 432.567,25€ auszahlen soll.

Herstellung eigener Barcodes und Pfandbons

Jeder kann Barcodes selbst erstellen, dafür gibt es zahlreiche offene Bibliotheken für alle möglichen Sprachen, hier wäre eine für Javascript. Die bringen wir im Grafikprogramm unserer Wahl nur noch auf Wunschgröße. Die restlichen grafischen Elemente kopieren wir aus einem gescanten Pfandbon. Das ganze drucken wir natürlich nicht auf einem normalen Drucker. Bons werden in der Regel von Thermodruckern beschrieben. Üblich sind Preise von 120-200€, es gibt allerdings bereits Modelle für 18.99€, das war der günstigste Preis, den ich auf die Schnelle gefunden habe. Wir schustern alles in GIMP zusammen, klicken einmal auf „Print“, und schon haben wir unsere eigene Bundesbank für Flaschensammler.

Risiken für den Angreifer

Das erste Risiko besteht darin, dass der Pfandbon als Fälschung erkannt wird. Einer Selbstbedienungskasse würde das nie auffallen, einer Kassiererin möglicherweise schon. Deshalb nutzen viele Supermärkte inzwischen Rollen mit Wasserzeichen. Deren Fälschungssicherheit gucke ich mir bei Gelegenheit mal an. An Originale zu kommen dürfte allerdings nicht so schwierig sein, aber die Anleitung dazu unterlasse ich an dieser Stelle (Hint: Die Dinger müssen ja auch gewartet werden, und wo die Rollen im Supermarkt liegen, entgeht keinem aufmerksamen Beobachter). „Unser“ Supermarkt verwendete zu allem Überfluss Blankopapier.

Das zweite Problem ist Videoüberwachung. Vermutlich kann die Uhrzeit ermittelt werden, zu der ein entsprechender Pfandbon eingelöst wurde. Dann muss man nur noch die Überwachungskameras zum entsprechenden Zeitpunkt sichten. Das kann man mehr oder weniger raffiniert schwieriger machen, unmöglich wird die Identifikation nicht.

Schutz vor dem Angriff

Der sicherste Schutz wäre es, die Pfandautomaten direkt an das Warensystem anzuschließen. Wird ein Pfandbon ausgestellt, wird dessen Ziffernreihe gespeichert und an der Kasse abgeglichen und für ungültig erklärt, bzw. überhaupt nicht angenommen, wenn die Ziffernreihe nicht hinterlegt ist.

Zudem kann die lange Reihe an Nullen auch genutzt werden, um eine Zahl zu hinterlegen, die aus den anderen Daten errechnet wird. Reverse Engineering wäre auch hier möglich, aber mit deutlich höherem Aufwand verbunden als im bestehenden System.

Was für Unsinn kann man noch mit Barcodes anstellen?

Im Zuge weiterer Recherchen stellte ich fest, dass wir natürlich nicht die Einzigen waren, die auf solche Ideen gekommen waren. Es scheint, als wären darüber hinaus unter anderem Injection und Buffer Overflow Attacken möglich. Nach Sicht dieses hochinformativen Vortrages auf der DEFCON 16 kam mir eine Idee, wie man Pfandautomaten permanent erneut lahmlegen und somit untauglich für den Betrieb machen könnte. Aber das fällt unter „sinnbefreiter Vandalismus um seiner selbst Willen“, daher dokumentiere ich das nicht. Dass es funktioniert, habe ich bereits getestet, aber anschließend den Stecker gezogen und den Automaten ohne das Sabotageelement neu gestartet, es ist also kein Schaden entstanden.

Happy Hacking und macht keinen Blödsinn!

 

 

 

Einen Feelspace Belt mit Arduino bauen und programmieren (Teil 2): Der TE669 Multiplexer

In unserem zweiten Teil gucken wir uns eines der Bauteile genauer an: den TE669 Multiplexer, den wir zur Ansteuerung der Motoren unseres Projekts benötigen. Das Breakout Board ist mit einem CD74HC4067 Analog/Digital Multiplexer Chip ausgestattet. Ein Multiplexer ermöglicht es, über Boolsche Logik kombinatorisch ein Signal über mehrere Aus/Eingänge zu leiten. Dies geschieht maximal jeweils in Potenzen von 2: Verwendet man einen Anschluss auf dem Board, kann man zwei logische Zustände erzeugen, bei jedem weiteren noch einmal zwei verketten, also 2/4/8/16. Das TE669 Board hat vier Steuerungsanschlüsse, entsprechend also 2^4=16 Ein/Ausgänge, über die das Signal geschaltet werden kann. In der Elektronik wird ein Multiplexer oft mit MUX oder Mux abgekürzt. Hier ein Schema des Boards, kurz erklärt:

C0 bis C15 auf der linken Seite sind die 16 Ein/Ausgänge, die der Multiplexer ansprechen/lesen kann. Bei uns also schlicht die Stromleitungen für die Vibrationsmotoren. SIG ist die Quelle bzw. der Eingang des Signals. S0 bis S3 sind die Steuerungspins, die über On/Off entscheiden, welcher der Kanäle auf der linken Seite gerade SIG sendet/empfängt. VCC wird über 5V angeschlossen, GND eben an GND. EN steht für „Enable“. Setzt man diesen Pin unter Strom, werden alle Signale auf „Off“ gesetzt. Weil wir keinen Schalter brauchen, wird er mit GND verbunden.

Der analoge Teil interessiert uns nicht, weil wir lediglich digital 5 Volt On/Off an Vibrationsmotoren weiterleiten wollen, die Programmierung ist aber praktisch gleich, weil analoge ebenso wie digitale Signale über den SIG-Pin weitergegeben werden. Man muss das Rad nicht neu erfinden, für das Board steht eine hervorragende Bibliothek auf Github zur Verfügung. Diese muss nur als .zip-Datei heruntergeladen und in der Arduino IDE importiert und eingebunden werden.

Um die Verlötung zu testen (und weil ich mit dem Kompassmodul massive Schwierigkeiten hatte, davon im nächsten Teil) nutzen wir das mitgelieferte Beispiel, das alle I/O einmal mit dem Signalpin anspricht:

 

#include <CD74HC4067.h>

// s0 s1 s2 s3
CD74HC4067 my_mux(4, 5, 6, 7); // create a new CD74HC4067 object with its four control pins

const int g_common_pin = 8; // select a pin to share with the 16 channels of the CD74HC4067

void setup()
{
 pinMode(g_common_pin, OUTPUT); // set the initial mode of the common pin.
 // This can be changed in loop() for for each channel.
}

void loop()
{
 digitalWrite(g_common_pin, HIGH);

for (int i = 0; i < 16; i++) {
 my_mux.channel(i);
 delay(100);
 }
}

In der ersten Zeile Code müssen die digitalen Ausgänge, die S0-S3 ansprechen, angegeben werden. Dann wählt man den Signalpin auf dem Board, in meinem Fall der digitale Pin 8. Damit ist auch schon alles erledigt, die Anschlusslogik müssen wir dank der Bibliothek nicht selbst programmieren. Anschließend wird das HIGH Signal in einer Schleife über alle Ausgänge des Multiplexers geschickt. Das sieht dann so aus (eine LED ist falsch verkabelt):

Anschließend setzen wir einfach einen Motor dran, um den Betrieb zu testen. Das läuft wunderbar. Nachdem das Signal durch den Mux gelaufen ist, trägt es nur noch 3.75 Volt, was wie mein Multimeter mir sagt, was ideal für die Motoren ist, die sonst auf Überspannung laufen würden. Achtung: Das gilt nur, solange im Multiplexermodul nicht der VCC verkabelt ist. Sobald der angeschlossen ist, werden die vollen 5V übertragen.

Das Ziel der Programmierung sollte nun klar sein: Das Kompassmodul gibt Gradwerte von 0°-359.9° aus. Entsprechend der Position im Magnetfeld muss der my_mux.channel()-Wert angepasst werden. Da es mit dem Sensor Probleme gab, simulieren wir diese Werte über einen Joystick. Entsprechend dessen Gradposition (wir nehmen 0° als Norden an) können wir dann die unterschiedlichen LEDs leuchten lassen, was auch genau der Ansteuerung der Motoren später entspricht. Hier der Code:

#include <math.h>
#include <CD74HC4067.h>

// s0 s1 s2 s3
CD74HC4067 my_mux(4, 5, 6, 7); // create a new CD74HC4067 object with its four control pins

const int g_common_pin = 8; // select a pin to share with the 16 channels of the CD74HC4067



int range = 500; // output range of X or Y movement
int responseDelay = 5; // response delay of the mouse, in ms
int threshold = 10; // resting threshold
int center = range / 2; // resting position value



void setup() {
 // put your setup code here, to run once:
Serial.begin(9600);
 pinMode(g_common_pin, OUTPUT);
}

void loop() {
int xReading = readAxis(A0);
int yReading = readAxis(A1);

Serial.println("X Value: "+String(xReading)+" Y Value: "+String(yReading));

double degree = findDegree(xReading,yReading);

Serial.println("Degree: "+String(degree));

delay(50);

int northMux = defineMuxFromDegree(degree);

my_mux.channel(northMux);
digitalWrite(g_common_pin, HIGH);

Serial.println("Mux Channel: "+String(northMux));

}

int readAxis(int thisAxis) {
// read the analog input:
int reading = analogRead(thisAxis);

// map the reading from the analog input range to the output range:
reading = map(reading, 0, 1023, 0, range);

// if the output reading is outside from the rest position threshold, use it:
int distance = reading - center;

if (abs(distance) < threshold) {
distance = 0;
}

return distance;
}

 

double findDegree(double x, double y){
double value = (atan2(x, y) / M_PI) * 180;
if(value < 0) value += 360;
return value;
}

int defineMuxFromDegree(float muxdegree){
if (muxdegree<=11.24||muxdegree>=347.75) {return 0;}
if (muxdegree>=11.25&&muxdegree<=33.74) {return 1;}
if (muxdegree>=33.75&&muxdegree<=56.24) {return 2;}
if (muxdegree>=56.25&&muxdegree<=78.74) {return 3;}
if (muxdegree>=78.75&&muxdegree<=101.24) {return 4;}
if (muxdegree>=101.25&&muxdegree<=123.74) {return 5;}
if (muxdegree>=123.75&&muxdegree<=146.24) {return 6;}
if (muxdegree>=146.25&&muxdegree<=168.74) {return 7;}
if (muxdegree>=168.75&&muxdegree<=191.24) {return 8;}
if (muxdegree>=191.25&&muxdegree<=213.74) {return 9;}
if (muxdegree>=213.75&&muxdegree<=236.24) {return 10;}
if (muxdegree>=236.25&&muxdegree<=258.74) {return 11;}
if (muxdegree>=258.75&&muxdegree<=281.24) {return 12;}
if (muxdegree>=281.25&&muxdegree<=303.74) {return 13;}
if (muxdegree>=303.75&&muxdegree<=325.24) {return 14;}
if (muxdegree>=325.25&&muxdegree<=347.74) {return 15;}
}

Läuft alles, und wenn wir den Joystick nun einmal im Kreis drehen, leuchtet unsere LED-Reihe einmal der Reihe nach auf. Jetzt müssen da nur noch Motoren statt LEDs ran und die Daten aus dem Kompass/Gyroskop-Sensor kommen. Davon im nächsten Teil!

Wir basteln uns einen sechsten Sinn: Einen Feelspace Belt mit Arduino bauen und programmieren (Teil 1)

Wer kennt das nicht? Mal wieder zu viele Comics gelesen, da träumt man davon, Superkräfte zu haben. Zum Beispiel Spider-Mans Spinnensinn oder das Supergehör von Daredevil. Noch besser wären natürlich telepathische Fähigkeiten wie Professor X, aber begnügen wir uns doch erst einmal mit dem, was machbar ist: Ein sechster Sinn für 30€. Klingt gut? Folgt mir ins Labor!

Vibrier mir das Lied vom Wal, Baby!

Vor über zehn Jahren stolperte ich im Internet über ein Paper, in dem Wissenschaftler den Feelspace Belt vorstellten. Das Konzept war simpel, die Ergebnisse erstaunlich. Das Gerät wurde, wie der Name schon sagt, wie ein Gürtel getragen und enthielt mehrere Vibratoren, die immer dort vibrierten, wo sich gerade Norden befand. Spannenderweise berichteten Probanden, dass sich ihre Orientierungsfähigkeit in fremdem Gelände durch das Tragen des Gürtels deutlich verbesserte. Nach einigen Wochen konnten sie auch ohne das Tragen des Gürtels zuverlässig sagen, in welche Richtung gerade Norden liegt.

Neulich erinnerte ich mich daran und dachte mir: „So ein sechster Sinn für das Erdmagnetfeld, das ist schon praktisch, dann kann ich bald wie ein Wal stranden.“ Das ursprüngliche Paper habe ich nicht wieder gefunden, allerdings scheint der Feelspace Belt bald auch kommerziell vertrieben zu werden, mit allerlei Zusatzfunktionen, z.B. zur Navigation: www.feelspace.de

Da ich allerdings wenig Lust hatte, über 800€ für ein Gerät zu bezahlen, das ich für um die 30€ selbst zusammen bauen und programmieren kann, habe ich damit jetzt einfach einmal angefangen. Mir ist mein innerer Daniel Düsentrieb tatsächlich wertvoller als eine schwarze American Express.

Die Hardware

 

Als Hauptplatine verwende ich zunächst einen Elegoo Uno R3. Absolut baugleich zum Arduino, aber deutlich günstiger. Genau genommen ist ein Elegoo Uno R3 auch nicht die günstigste Alternative: Deutlich leistungsstärker, kleiner und mit WLAN (das wir nicht brauchen) ausgestattet wäre ein ESP8266 NodeMCU TE689. Den würde ich auch empfehlen und auf den werde ich den Code und die Schaltung auch portieren. Ich habe ihn für ungefähr 3,50€ bei Amazon im Mehrpack bekommen. Da der TE689 erst recht absolut Overkill ist, gucke ich irgendwann mal nach der minimalsten Hardware, auf der man die Schaltung und Programmierung realisieren kann. Der Uno R3 wird erst einmal für den Prototypen verwendet, um einfacher stecken zu können und da die meisten einen Arduino Uno R3 zuhause haben. Außerdem habe ich für den TE689 momentan kein passendes Breadboard zum Prototypenbau.

Möchte man mehrere Motoren unabhängig voneinander ansteuern können, bekommt man bald ein Anschlussproblem. Hierfür gibt es eine einfache Lösung: ein 4auf16-Multiplexer Breakout Board. Bekommt man ab 1,50€ bei eBay, dann kommen aber die Versandkosten hinzu, habe im Mehrpack 2,22€ bezahlt. Ein Multiplexer ermöglicht einem, mehrere Ausgänge über die selben Anschlüsse auf dem Board anzusteuern. Die Wahl fiel auf das CD74HC4067 TE669 Modul. Hat keine Gründe – hat ein Freund ausgesucht.

Die Daten, die wir brauchen, werden natürlich über einen geeigneten Sensor erfasst. Ich danke der metaphysischen Entität Ihrer Wahl für Hong Kong, China und die praktische Alles-Bestellbarkeit jedes noch so speziellen Elektronikbauteils, wobei sich Kompass/Gyroskopmodule natürlich durch die hohe Nachfrage für Mobiltelefone und Robotik erklären lassen. Für läppische 3,42€ habe ich also ein GY-271 HMC5883L Kompassmodul bestellt.

Nun war nur noch die Frage nach den Motoren zu klären. Vibrationsmotoren für Handys bekommt man in jeder Größe, Form und Stärke nachgeschmissen, trotzdem sind sie aufgrund der Stückzahl der größte Kostenfaktor in der ganzen Geschichte. Also 20 Micromotoren mit 10mm Durchmesser bestellt, 5 Stück zu 3,40€. Verbaut werden 16 (maximale Anzahl der Multiplexerausgänge), ich denke, die sensorische Auflösung in 16 Felder dürfte reichen. Die Dinger, die ich bestellt habe, sind auf 3,3 Volt schon recht kräftig, auf 5 Volt vibriert der Tisch mit. Warm werden sie auf 5 Volt, eventuell wird Intervallbetrieb nötig, da sie auf 4,5V ausgelegt sind, aber ich habe keine Lust, die Schaltung unnötig kompliziert zu machen. Wie sie sich in der Praxis bewähren, muss man sehen. Da sie auch mit einer Klebefläche versehen sind, macht das die Montage auch einfacher. Dann braucht man keine Heißklebepistole. Obwohl ich Heißklebepistolen liebe.

In der Gesamtschau also:

1 x NodeMCU ESP8266 TE689: 4,99€
1 x CD74HC4067 TE669 Multiplexer: 2,22€
1 x GY-271 HMC5883L Kompassmodul: 3,42€
16 x Microvibrationsmotoren: 0.68 x 16 = 10,88€

Summe: 21.51€

Von mir aus rechnen wir noch einen billigen Gürtel, Draht und Lötzinn dazu, dann kommen wir auf maximal 30€. Sollte die sensorische Auflösung in 16 Felder nicht reichen, müsste man ggf. noch einmal mit einem weiteren Multiplexer nachrüsten und den Code umbauen. Das kann ich mir aber ehrlich gesagt kaum vorstellen. Mir hätten schon 12 gereicht.

Über die Stromversorgung beim Tragen mache ich mir Gedanken, wenn der Prototyp fertig ist, aber auch daran wird der 9V-Block das Teuerste sein. Aufgrund der WiFi-Anbindung des ESP8266 ergeben sich viele Möglichkeiten, ein Board mit Bluetooth könnte auch bequem an Mobiltelefone verbunden werden, um wie bei der kommerziellen Version beispielsweise Navigation zu ermöglichen.

Die Schaltung

Man nagele mich bitte noch nicht darauf fest, ich muss sehen, inwiefern das in der Programmierung so hinhaut, wie ich es mir vorstelle. Hier aber vorab der mit Fritzing erstellte Bauplan, der sich natürlich nach Prototypenbau noch deutlich verändern wird.

Bitte keine Kritik an der Hässlichkeit, ich habe leider keinen Bachelor in Schaltplandesign. Der Aufbau sollte aber klar werden: Die 16 Motoren bekommen 5V über den Multiplexer zugeschaltet und vibrieren dann, alle müssen natürlich auch über GND an einen Minuspol angeschlossen sein. Der Multiplexer wird über vier Signale gesteuert, macht qua Kombinatorik die 16 Ausgänge. Das Kompassmodul wird ganz normal an VCC und GND angeschlossen, zwei Pins liefern über analogen Anschluss gyroskopische Daten.

Mit den Bauteilen im Einzelnen und der Programmierung beschäftigen wir uns im nächsten Teil.

Robert Anton Wilsons „Prometheus Rising“, oder: Der Fluch des sekundären Werks.

Es gibt Schriftsteller, die von einem bestimmten Fluch getroffen werden, der zunächst wie ein Segen erscheint: Man kennt sie für ein Buch. Und jetzt lesen wir diesen Satz noch einmal mit der richtigen Betonung: Man kennt sie für ein Buch. Es scheint völlig egal, wie riesig ihr restlicher Textkorpus ist, ob sie es in anderen Medien und Feldern weit gebracht haben. Nur dieses eine Werk ist für immer mit ihrem Namen verknüpft, das sekundäre Werk, sozusagen, bleibt ungesehen. Aldous Huxley kennt man für „Brave New World“, selten kennt noch jemand „The Doors of Perception“ (nach dem sich übrigens die Band „The Doors“ benannte). Dass er Unmengen anderer Bücher geschrieben hat, unter anderem über die Philosophia Perennis, und eine der meiner Meinung nach schönsten Liebesgeschichten („Das Genie und die Göttin“), wen interessiert das schon? Ernst Jünger ist auch ein harter Fall. Für „In Stahlgewittern“ ewig als Ewig Gestriger verurteilt, finden seine anderen Bücher, in denen er eine sehr eigene, anarchische (nicht „anarchistische“) Philosophie entwickelte, kaum Beachtung. Auch unbekannt ist, dass er auf dem Gebiet der Entomologie, der Insektenkunde, sehr umtriebig war.

Noch viel schlimmer finde ich es eigentlich, wenn man Autorennamen nennt, doch die Leute kennen den Autoren nicht einmal mehr. Aber sie sagen sofort „Ah, selbstverständlich!“, sobald man runterrattert, welche Verfilmungen auf ihren Büchern basieren. Kaum jemand kennt noch Robert A. Heinlein, aber jeder kann etwas mit „Starship Troopers“ anfangen. Am schlimmsten ist es wohl mit Philip K. Dick (Matrix, Blade Runner, A Scanner Darkly, zum Beispiel).

Robert Anton Wilson ist für genau ein Buch berühmt. Nun ist das Spannende, dass sogar das Buch kaum jemand noch kennt, aber jeder die Theorie, die es in die Welt setzte. Hat euch schon einmal jemand davon überzeugen wollen, dass die Illuminaten das gesamte Weltgeschehen kontrollieren? Hat er zu allem Überfluss die Zahl 23 damit in Verbindung gebracht? Obwohl der Illuminatenorden tatsächlich existierte, ist diese Verschwörungstheorie vor allem durch Robert Anton Wilsons „Illuminatus!“-Trilogie popularisiert worden. Ich kann nicht einmal behaupten, das Buch sonderlich zu mögen. Trotzdem ist Robert Anton Wilson für mich ein entscheidender historisch-kultureller Nexus. Nachdem ich mir neulich noch einmal „Prometheus“ vor „Alien Covenant“ ansah, war ich sehr beeindruckt von Mr. Weylands fiktivem Versuch, die Menschheit durch interstellare Raumfahrt mit ihrem Schöpfer in Kontakt zu bringen. Bei Gelegenheit erkläre ich gerne, warum, aber interstellare Siedlung halte ich für das letzte lohnenswerte Unterfangen der Menschheit auf diesem Planeten, ich teile also Mr. Weylands Wunsch. Dabei fiel mir ein, dass ich Robert Anton Wilsons „Prometheus Rising“ noch rumflattern hatte, und wunderte mich, inwiefern dieser sich auf den Gott berief, welcher der Menschheit das Feuer brachte.

Eigentlich hatte ich das Buch in meinen Besitz gebracht, weil das Vorwort von Israel Regardie ist. Regardie war zwar selbst ein bedeutender Okkultist und hat die wohl kompetenteste Einführung in die Kabbala geschrieben („The Tree of Life“). Bekannt ist er aber vor allem, weil er für einige Zeit der Sekretär Aleister Crowleys war, dem berühmtesten Okkultisten des letzten Jahrhunderts (für das Aha-Moment: das ist dieser „Mr. Crowley“, von dem Ozzy Osbourne singt, der auch eine der Personen auf dem Cover von „Sgt. Pepper’s Lonely Hearts Club Band“ der Beatles ist und dessen Haus Jimmy Page von Led Zeppelin kaufte).

Daher dachte ich mir, ich gebe seinen philosophischen Schriften mal eine Chance. „Prometheus Rising“ fing eigentlich als geplante Dissertation an. Beworben als eine Gebrauchsanweisung für das menschliche Gehirn und eine hypothetische kollektive Intelligenz hatte ich mir viel davon versprochen – und wurde enttäuscht. Nicht einmal, weil es ein schlechtes Buch ist, das will ich nicht behaupten. Vermutlich hat es eher damit zu tun, dass ich mich mit den Themen, Theorien und Autoren, die darin vorkommen, schon ausgiebig beschäftigt hatte und entsprechend nichts Neues darin entdecken konnte. Das ist nicht Wilsons Schuld, sondern liegt wohl daran, dass wir ähnliche Interessen hatten und das Buch älter als ich ist und auf diesen Gebieten inzwischen schlicht umfangreichere und wissenschaftlichere Forschung und Literatur vorliegt als zu Wilsons Zeiten. Und im selben Atemzug muss ich dann auch noch erwähnen, dass es nahezu unheimlich ist, wie korrekt Wilson bestimmte Menschheitsentwicklungen 1983 vorhergesagt hat. Damals hat es sich also mit Sicherheit um ein sehr wertvolles Buch gehandelt.

Der Aufbau ist zugleich Schönheit und Makel des Werkes. Eng an den Bewusstseinstheorien Timothy Learys orientiert wird man von den niedrigsten „Schaltkreisen“ zu den höchsten geführt, jedes Mal mit viel Witz und reichlich Anekdoten anschaulich erklärt. Aber ich habe ein Problem mit Timothy Leary. Der „Papst des LSDs“, der Albert Hofmanns Unfallerfindung unter anderem zu Zwecken der Psychotherapie popularisierte, gehörte noch zu einer Generation von Psychologen, die dieses Mal aber auch ganz bestimmt das richtige Modell der Funktionsweise der menschlichen Psyche meinte gefunden zu haben. Während ich diese Vorgehensweise teilweise für weit sinnvoller und aufschlussreicher erachte als das menschliche Gehirn zu einer Blackbox zu erklären, um anschließend aus Elektroenzephalogrammen und bildgebenden Verfahren und/oder absurd geringen Fallzahlen die Statistik zu foltern, bis man signifikante Ergebnisse hat, wie dies leider häufig in der heutigen Psychologie der Fall ist, mag ich Learys Modell schlicht nicht. Mit der Ätiologie der Freud’schen Psychoanalyse gehe ich teilweise nicht konform, und jene in Learys Modell in „Neuro-Logic“ finde ich hanebüchen. Erstens haben manche Geisteskrankheiten nicht von der Hand zu weisende organische Ursachen, zweitens wird man sich wohl noch eine Weile damit abfinden müssen, dass wir trotz beachtlicher Fortschritte, was die bildgebenden Verfahren angeht, noch herzlich wenig über das menschliche Hirn wissen (und oft denke ich mir, dass das vermutlich sogar gut so ist und ich nicht die Zeiten erleben will, in denen sich das geändert hat).

Auch punktet Wilson mit seinen detaillierten Übungsanleitungen am Ende jedes Kapitels, mit denen alle Leser, die seine Aussagen prüfen oder selbst erleben möchten, diese erfahrbar machen können. Wer aber schon einmal meditiert oder Raja Yoga praktiziert hat, mit aller Gewalt über seine eigenen Überzeugungen gewalzt ist, aus Spaßvergnügen Perspektiven und Paradigmen gewechselt hat, um sich vor Augen zu führen, wie biegsam und erschütterbar das, was wir Realität nennen und unsere Erklärungen dafür sind, wird wenig Neues finden. Allen anderen, und das werden wohl deutlich mehr sein, kann ich das Buch und die Übungen darin nur empfehlen.

Mein Fazit ist also erneut: Ein Blick in das „sekundäre Werk“ lohnt sich.