Huhu... die Version 0.0.2 ist da
Ein guter alter Kumpel von mir ist Schuld das ich eine zweite HSM (HeadSetMouse) bauen musste.
Da dachte ich mir, "Machste gleich eine Tutorial draus... für Jederman"
Mein Anspruch ist es das jeder mit etwas Grundkenntnissen in der Programmierung und handwerklichen Geschick in die Lage versetzt wird, an Hand dieser Anleitung eine funktionstüchtige HSM zu bauen.
Ich würde mir freuen wenn die Leute die diese Anleitung nutzen auch Feedback geben könnten, wo es trotz der Anleitung "klemmte".
Hier entsteht jetzt eine Schritt für Schritt Anleitung mit Bildern und Tips plus dem zugehörigen Code.
Am Ende werde ich noch ein paar Sachen/Überlegungen/Verbesserungen aufführen die mir im Betrieb oder dem Aufbau aufgefallen sind und Ansätze wie man sie umsetzten könnte.
Vorbereitung für die Hardware
- CD-Maker
- Lötfett
- Lötzinn
- Kabel in vorzugsweise in 5 verschieden Farben
- Taster
- Lochrasterplatine
- Arduino + Stiftleisten (12 Einheiten)
- MPU6050 + Stiftleisten (8 Einheiten)
- kleinen Maden-Schraubendreher
- kleine Seitenschneider
- Lupe
Hilfreich
- weiche Unterlage (Tuch)
- kleine Zange
- feine Feile
- grober Pinsel
- Entlötpumpe
- Entlölitze
- Dremel mit Trennscheibe oder kleine Metallsäge (z.B. Puksäge)
- Multimeter
Stiftleisen und Taster auf der Lochplatine befestigen
Die Stiftleisten einfach mit dem kurzen Beinen durch die Platine stecken und an einer Stelle anlötend damit sie nicht mehr rausfallen.
Anschließend habe ich mit dem kleinen Schreibendreher das Lötfett auf die Beine sehr dünn aufgetragen.
Ein weiches Tuch als Unterlage verhinder das wegrutschen der Platine beim löten ganz gut.
Achtet beim festlöten darauf das die Stiftleiste auf der Platine direkt aufliegt.
Die Kupferaugen können sich sehrleicht lösen wenn man später von der Oberseite Druck ausübt.
Achtet beim löten darauf das ihr die Stellen nicht zu sehr erhitzt.
Tip:
Ich halte meißt das Zinn auf die eine Seite und den Lötkolben auf die andere Seite von dem Punkt den ich löten möchte.
Dann setzte ich den Lötkolben an den Pin oben an und fahre damit langsam runter Richtung Platine bis auf das Kupferauge.
So erhitzt sich die Lötstelle gleichmässig.
Dann von links das Lötzinn kurz ranhalten und das Zinn sollte sich schön gleichmäßig verteilen.
Es ist etwas Übung nötig aber das wird schon.
Das Ergebniss sollte in etwa so aussehen.
Leider habe ich für den nächsten Einzelschritt vergessen Bilder zu machen aber das Prinzip sollte aber klar sein.
Nun kommt Stiftleiste für den MPU6050.
Sie hat 8 Stifte und kann direkt an die schon festgelöteten Stiftleisten für den Arduino angesetzt werden, so das sich eine Linie ergibt.
Ersatzbild:
Der schwarze Stich markiert den Übergang von links nach rechts: Arduino | MPU6050 | Taster
Prüft vor dem Löten ob der Arduino und der MPU6050 anschliessend auch spannungsfrei auf den Leisten aneinander anliegen können.
Ich habe mit eine feinen Feile den Arduino und MPU eh etwas entgratet, da noch Grate (Ecken und Kanten) vorhanden waren.
In der Regel sollte es aber passen.
Der Taster
Ganz nach dem Motto: "Passt nicht, gibs nicht."
Mein Taster, den ich in meiner Grabbelkiste gefunden hatte, passte aufgrund des Lochabstandes nicht in die Platine. Besser gesagt immer nur 1 Beinchen.
Also kurzer mit dem Multimeter durchgemessen, wie der Taster aufgebaut ist, und welches Bein ich amputieren kann.
In userem Fall ist es egal wie wir ihn verwenden (Öffner/Schließer), da wie im Code selbst festlegen können welchen Zustand wir erwarten um darauf zu regagieren.
Wichtig ist nur das ihr den Eingang nicht erwischt.
Erklärung:
Ein Taster hat meist 1 "Eingang" (mitte) und 2 Ausgänge (oben, unten).
So hat man die Möglichkeit die Taster als "Öffner" oder "Schließer" zu nutzen.
Nun wird der Taste mit etwas Abstand zum MPU6050 auf die Platine gesteckt und markiert wo die Pin´s rauskommen.
Dazu musste ich allerding die Löcher etwas aufweiten da die Beinchen minimal breiter waren.
Ich habe dafür ein kleinen Kreuzschraubendreher genutzt.
Da ich die Kabel gerne zwischen der Platine und dem Aufbau (Arduino und MPU) haben wollte musste ich vor dem löten noch die Kabel für den Taster anbringen.
Da ich das vergessen hatte musste ich später den Taster nochmal ablöten.
Beim Punkt "Das verkabeln" wird es verständlicher.
Bevor es nun an das verkabel geht werden nochmal alle Teile aufgesteckt und geschaut das sie möglichst ohne Spannung sitzen.
Das verkabeln.
Das ist das fummligste.
Wo was hin hinkommt kann man auf der Übersicht gut entnehmen.
Hier bietet es sich natürlich an für jedes Kabel eine andere Farbe zu nutzen um so besser ihre Funktion besser auseinander halten zu können
-
rot 5V [Plus]
- Arduino Pin (VCC) --> MPU6050 Pin (VCC)
-
schwarz [Minus]
- Arduino Pin (GND) --> MPU6050 Pin (GND)
-
weiß ["Datenleitung"]
- Arduino Pin (3) --> MPU6050 Pin (SCL)
-
gelb["Datenleitung"]
- Arduino Pin (2) --> MPU6050 Pin (SDA)
- TASTER:
-
schwarz [Minus]
- Taster Pin (egal ("richtiger" den Eingang)) --> Pin irgendein GND von Arduino oder MPU6050
-
rosa [getastete Ader]
- Arduino Pin (9) --> Taster Pin (egal ("richtiger" den Ausgang bzw.Schließer))
Ich habe erstmal nur eine Seite der Adern auf der Arduinoseite bzw. Taster-Seite gelötet um es besser darzustellen.
Dazu habe ich das Kabel etwa 3-5mm abgesetzt (Isolierung entfernt) und von oben durch die Platine gesteckt.
Anschließend habe ich mit einer kleinen Zange oder einem kleinen Maden-Schraubendreher die Ader in Richtung des Pin´s gebogen mit der sie verbunden werden soll.
Dann wieder mit etwas Lötfett bestreichen und zusammen löten.
Eventuelle Überstände werden später noch abgeschnitten.
Nun kommt die andere Seite der Ader dran. Achtet darauf wo was hinkommt (Schaltplan).
Teilweise kann sich die Isolierung der Adern beim löten zurückziehen.
Achtet darauf das keine blanken Stellen sich nicht berühren.
Hier kann man nach dem Durchmessen auf Fehler gerne mit Heißkleber für zusätzliche Sicherheit sorgen.
Überstände entfernen und auf Fehler prüfen
Einfach mit dem Seitenschneider alles weg was länger als ca. 2mm ist.
Anschliesend habe ich alle Lötstellen nocheinmal erwärmt bis das Zinn flüssig war, um schafe Kanten zu entfernen.
Dann mit einem groben Pinsel Reste und überschüssiges Lötfett wegbürsten.
Mit einem Multimeter prüfen wir nun ob auch nur die Stellen miteinander verbunden sind die es auch sollen.
Dazu stellen wir auf dem Messgerät auf "Durchgangsprüfung". Das sollte da sein wo man Widerstände misst.
Die meisten Geräte piepen auch wenn man die Messspitzen zusammen hält.
Die Punkte die durch eine Linie verbunden sind dürfen piepen, die anderen eben nicht.
Wenn alles ohne Fehler ist kann man nun die Platine auf die Größe anpassen die man möchte.
Ich habe dafür einen Dremel mit Trennscheibe benutzt, es geht aber auch mit einer Puksäge.
Jetzt nochmal alle scharfen Kanten abfeilen und mit dem groben Pinsel säubern.
Nun kann auch der Heißkleber zum stabilisieren drauf. Nur nicht zu dick.
Jetzt noch den Arduino und den MPU6050 auf die Stiftleisten und verlötet und die Hardware ist geschafft.
Da ich das Teil (HeadSetMouse(HSM)) auf meinem Headset festmachen möchte, habe ich mir noch ein kleines "Softcase" gebastelt.
So wird verhindert das die Lötstellen den Headset-Bügel zerkratzen und es liegt besser auf da die Rundung des Bügels ausgeglichen werden.
Da nix an der HSM heiß wird passiert da auch nichts
Der Code
Hier der überarbeitete Code mit Kommentaren zur freien Verwendung.
Wie ihr das nun auf den Arduino bekommt erläutere ich hier später wenn gewünscht.
Aber Google sollte da eigentlich schon reichen
- /* HeadSetMouse
- * EldaRion
- */
- #include <Wire.h> // https://www.arduino.cc/en/Reference/Wire
- #include <I2Cdev.h> // https://platformio.org/lib/show/107/I2Cdevlib-MPU6050
- #include <MPU6050.h> // https://playground.arduino.cc/Main/MPU-6050
- #include <Mouse.h> // https://www.arduino.cc/reference/en/language/functions/usb/mouse/
- MPU6050 mpu; // MPU6050 initialisieren
- int16_t ax, ay, az, gx, gy, gz; // Variablen fuer die X-; Y-; Z-; Achse initialisieren
- int vx, vy, vz;
- const int Button_OnOff = 9; // Pin am Arduino (Taster (LOW = gedrückt))
- const int LedOnBord = 17; // Pin am Arduino (linke/untere (TX) LED (LOW = an))
- bool headMouseAktive = false; // HeadMous aktive/inaktiv
- // Funktion wird nur 1x beim 'einschalten' oder 'Reset' des Arduinos ausgefuehrt
- void setup() {
- pinMode(Button_OnOff, INPUT_PULLUP); // Anschluss (9) als Eingang definieren und Pull Up Widerstand aktivieren
- pinMode(LedOnBord, OUTPUT); // Anschluss (17) als Ausgang definieren
- //Serial.begin(9600); // Serielle Uebertragung oeffnen
- Wire.begin(); // IC2-kommunikation aktivieren
- }
- //##### Hilfsfunktionen #####
- void LED_on() { // Funktion zum EIN-schalten der LED
- digitalWrite(LedOnBord, LOW); // LED an
- }
- void LED_off() { // Funktion zum AUS-schalten der LED
- digitalWrite(LedOnBord, HIGH); // LED aus
- }
- bool check_Button_OnOff() { // Funktion zum pruefen ob der Taster gedrueckt wurde
- if (digitalRead(Button_OnOff) == LOW) {
- // Button geschlossen
- return true;
- } else {
- // Button offen
- return false;
- }
- }
- void headMouse_onOff() { // Funktion zum pruefen ob headSetMouse aktiv ist
- Serial.begin(9600); // Serielle Uebertragung oeffnen
- if (digitalRead(Button_OnOff) == LOW) {
- // Button gedrückt
- LED_on(); // LedOnBoard EIN-schalten
- if (Serial1) { // pruefen ob eine serielle Verbindung besteht
- Serial.println("LED: on"); // Ausgabe auf dem seriellen Monitor
- }
- } else {
- // Button offen
- LED_off(); // LedOnBoard AUS-schalten
- if (Serial1) { // pruefen ob eine serielle Verbindung besteht
- Serial.println("LED: off"); // Ausgabe auf dem seriellen Monitor
- }
- }
- Serial.end(); // Serielle Uebertragung schliessen
- }
- void toggle_HeadSetMouse_OnOff() {
- Serial.begin(9600); // Serielle Uebertragung oeffnen
- if (headMouseAktive == true) {
- headMouseAktive = false;
- LED_off(); // LedOnBoard AUS-schalten
- if (Serial1) { // pruefen ob eine serielle Verbindung besteht
- Serial.println("LED: off"); // Ausgabe auf dem seriellen Monitor
- }
- } else {
- headMouseAktive = true;
- LED_on(); // LedOnBoard EIN-schalten
- if (Serial1) { // pruefen ob eine serielle Verbindung besteht
- Serial.println("LED: on"); // Ausgabe auf dem seriellen Monitor
- }
- }
- Serial.end(); // Serielle Uebertragung schliessen
- delay(1000); // warte 1000 Millisekunden (verhindert das zu schnelle umschalten zwische ein-/aus durch den Taster)
- }
- //##### Endlosschleife fuer das eigentliche 'Programm' #####
- void loop() {
- if (check_Button_OnOff()) { // wurde der Taster gedrueckt
- toggle_HeadSetMouse_OnOff(); // HeadSetMouse umschalten
- }
- if (headMouseAktive == HIGH) { // ist die HeadSetMouse aktiv
- mpu.initialize(); // initialisiere mpu
- if (!mpu.testConnection()) {
- while (1); // prueft ob MPU6050 Daten liefert; sonst warten
- }
- mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); // MPU alle 3 Beschleunigungens-Werte (X-,Y-,Z-, /-Achse) holen
- /* Erklaerung
- ##### vx = (gx + 300) / 150; #####
- - vx = Variable
- - gx = Wert aus dem Gyro
- - '+300' zum kalibrieren der Achse in "Ruhestellung"
- - '/ 150' Multiplikator für die Bewegegung der Maus (Geschwindigkeit/Empfindlichkeit)
- */
- //vx = (gx + 300) / 150; // (nicht benoetigt) vor-zurueck ("+150") zum kalibrieren der X-Achse
- vy = -((gy - 675) / 200) * -1; // links-rechts ("-675") zum kalibrieren der Y-Achse
- vz = ((gz + 165) / 200) * -1; // hoch-runter ("+165") zum kalibrieren der Z-Achse
- if (Serial1) {
- // Ausgabe auf dem seriellen Monitor
- Serial.println("HeadSetMouse: aktiv");
- // X-Achse
- //Serial.print("gx = ");
- //Serial.print(gx);
- //Serial.print(" | X = ");
- //Serial.println(vx);
- // Y-Achse
- Serial.print("gy = ");
- Serial.print(gy);
- Serial.print(" | Y = ");
- Serial.println(vy);
- // Z-Achse
- Serial.print("gz = ");
- Serial.print(gz);
- Serial.print(" | Z = ");
- Serial.println(vz);
- // Ausgabe auf dem seriellen Monitor ENDE
- Mouse.move(vz, vy); // Maus um die uebergebenen Werte bewegen
- } else {
- if (Serial1) {
- Serial.println("HeadMouse: aus");
- }
- }
- delay(20);
- }
- }
Sachen die mir noch aufgefallen sind, Verbesserungen die ich noch machen möchte und weiterführende Ideen werde ich ein anderes mal hier aufführen.
Ich hoffe das ich die Anleitung so gestaltet habe, das es nun jedem möglich ist eine HSM zu bauen.
Viel Spaß