In diesem Projekt wollte ich eine analoge Anzeige realisieren, die Daten aus dem Internet anzeigen kann. Ich wollte mich auch auf dem Gebiet des 3D-Zeichnens etwas weiterbilden und bin auf die Software Fusion 360 von Autodesk gestossen, die für den Hobbybereich kostenlos ist. Fusion 360 ist wirklich zu empfehlen. Ist sehr einfach zu bedienen und es gibt sehr viel Youtube Filme über die Software. Der erste Prototyp den ich auf unserem Laser geschnitten habe passte perfekt. Anschliessend habe ich noch einige Optimierungen am Gehäuse vorgenommen. Da ich das Gehäuse in 3D gezeichnet habe, konnte ich meine Optimierungen schnell in der Zeichnung umsetzen.

Probleme die zu lösen waren
Schrittmotor mit Referenzfahrt referenzieren über Endschalter
Mit dem Schrittmotor gab es zuerst das Problem zu lösen, dass nach dem Einschalten des ESP8266 die Position nicht bekannt ist. Damit man die Position bestimmen, kann muss mit dem Schrittmotor auf eine bekannte Position gefahren werden, z.B. auf einen Endschalter. Als Endschalter habe ich bei meinem Stimmungsbarometer einen Hall-Sensor eingesetzt. Ein Hall-Sensor reagiert auf ein Magnetfeld. Deshalb habe ich beim Zeiger des Stimmungsbarometers einen runden Neodym Magneten eingebaut, der beim Referenzieren des Schrittmotors über den Hallsensor fährt und den Zeiger da auf null Stellen kann. Ich hätte auch eine kleine Lichtschranke oder einen mechanischen Endschalter nehmen können, jedoch ist es schöner und einfach einen Magneten auf dem Zeiger zu befestigen. Da das Magnetfeld des Neodym Magneten durch das Sperrholz hindurchgeht, kann der Hall- Sensor hinter der Holzfront montiert werden.
Hall Sensor 44E938:
Schrittmotor 28BYJ-28 Stromverbrauch bei Stillstand Strom reduzieren
Beim Schrittmotor wird auch beim Stillstand zum Bestromen der Wicklungen ca. 250mA Strom verbraucht. Dies hat zur Folge, dass der Motor durch den ständigen Stromverbrauch Wärme erzeugt. In einem ersten Versuch habe ich nach dem Positionieren immer die Ausgänge auf dem Schrittmotor auf 0 gestellt (Kein Strom mehr auf den Wicklungen). Nachteil war hier im dauertest, dass der Motor Schritte verloren hat. Wenn ein Schrittmotor schritte verliert, driftet die Position weg. Das heisst, der Zeiger steht einmal nicht mehr auf der gewollten 0°-Position, sondern auf 8° oder mehr.
Nach einigen Versuchen und Dauerläufen habe ich eine Lösung gefunden wie ich den Motor ausschalten kann, ohne Schritte zu verlieren. Damit ich keine Änderungen in der Library vornehmen musste, habe ich eine kleine Funktion zum Abschalten und Einschalten des Schrittmotors geschrieben. Sobald der Motor positioniert hatte, rufe ich die Funktion zum Abschalten auf, die zuerst die Zustände des Schrittmotor-Outputs speichert. Anschließend wird noch etwas gewartet bis die Ausgänge zum Ansteuern des Schrittmotors Treiber ULN2003 auf Low geschaltet werden. Kommt eine neue Positionierung des Schrittmotors, werden zuerst die zuletzt gesetzten Signale auf dem ULN2003 gesetzt, etwas gewartet, erst dann die neue Position angefahren. Mit diesem einfachen Workaround kann ich den Motor bei Stillstand auf der Position halten ohne Schritte zu verlieren.
Schrittmotor 28BYJ-48:
Ansteuerung über Thingspeak oder Blynk
Zum Ansteuern des Stimmungsbarometers wollte ich eine einfache Lösung mit dem Handy realisieren. Zuerst habe ich die Positionswerte mit dem ESP8266 von einem Thingspeak abgefragt und immer den Zeiger auf diese Position positioniert. Das hat super funktioniert. Jedoch ergab sich mit dem gratis Thingspeak Account das Problem, dass du Werte nur alle 15 Sekunden ändern kannst. Wegen dieser Zeitverzögerung ist Thingspeak für das Stimmungsbarometer nicht geeignet. Ich denke Thingspeak könnte Interessant sein, wenn wir einen Temperaturwert auf einem umgebauten Stimmungsbarometer mit Analoger Skala anzeigen möchten.
Als alternative habe ich mich für Blynk entschieden, was folgende Vorteile mit sich bringt:
- Handy APP kann in wenigen Minuten erstellt werden
- Kein aufwändiges programmieren notwendig
- Einfache Bedienung
- Erstellte APP kann mit Freunden geteilt werden
- Schnelle Reaktionszeiten von einigen ms
- Eingeschränkte Gratis Version
- App für Apple und Android vorhanden
Mehr Infos zu Blynk findet ihr unter folgendem Link:
http://www.blynk.cc/
Die Android APP könnt ihr unter folgendem Link Herunterladen:
https://play.google.com/store/apps/details?id=cc.blynk
Hier meine Fertige Android APP zum Ansteuern des Stimmungsbarometer mit Blynk:
Damit Ihr ein bisschen mit meinen Stimmungsbarometer spielen könnt, gebe ich euch meinen QR Code zum Ansteuern einfach mit. Mit Blink APP QR Code Scannen:
Eigenbau Holz Gehäuse
Hier zeige ich euch in einigen Bildern, die Entstehung des Holzgehäuses, dass ich für dieses Arduino Projekt erstellt habe.
Download Link für Konstruktion des Gehäuse in Fusion 360
Die komplette Konstruktion könnt ihr euch unter folgendem Link herunterladen
Fusion 360 Zeichnen des Holz Gehäuses für Laser Cutter
Das Gehäuse habe ich im 3D Zeichnungsprogramm Fusion 360 von Autodesk gezeichnet. Anschliessend müssen die Daten für den Laser Cutter als DXF auf dem Fusion 360 exportiert werden. Zum Exportieren ins DXF Format für den Laser, gibt es bereits ein Zusatzmodul "DXF4Laser", mit dem auch die Strahldicke des Lasers kompensiert werden kann. Dies ist wichtig ansonsten halten die Holzverzahnungen (Fingerzinken) nicht richtig ineinander. Wichtig war für mich auch, dass ich das Gehäuse auf der Rückseite des Stimmungsbarometers einfach demontieren kann. Dies ist wichtig um an der verbauten Elektronik Änderungen vorzunehmen oder wenn man ein anderes Arduino Programm auf den ESP8266 übertragen will. Daher ist die Rückseite mit demontierbaren Holzkeilen an die Frontseite montiert:
Konstruktionsansicht in Fusion 360:
Stimmungsbarometer fertig konstruiert und gerendert mit Fusion 360:
Stimmungsbarometer fertig konstruiert und gerendert mit Fusion 360:
Infos zu Fusion 360 findet ihr unter folgendem Link:
http://www.autodesk.de/products/fusion-360/overview
Produktion des Holzgehäuses auf unserem 40W Laser Cutter
Nachdem die DXF Files erzeugt waren, konnte es ans schneiden der Holzbretter gehen. Ich verwendete hier ein 4mm Sperrholz aus dem Bauhaus. Ihr könnt natürlich das Gehäuse auch per Hand ausschneiden oder uns Anfragen wir können auch Gehäuse nach deinen Wünschen herstellen.
Deckel für Rückseite vom Stimmungsbarometer:
Sperrholz Front für Stimmungsbarometer:
Sperrholz Rückseite zusammengestellt:
Hier das komplette Arduino Code Beispiel von diesem Projekt
Als Mikrocontroller habe ich für das Stimmungsbarometer einen ESP8266 verwendet den ich mit der Arduino IDE programmiert habe. Da wir wenige Pins brauchen eignet sich der WeMos D1 mini perfekt:
/******************************************************************************************* ******************************************************************************************* ** www.bastelgarage.ch ** ** Der Onlineshop mit Videoanleitungen und kompletten Bausätzen für Anfänger und Profis! ** ******************************************************************************************* ******************************************************************************************* ** In diesem Projekt wollte ich eine Analoge Anzeige realisieren die Daten aus dem ** ** Internet anzeigen kann. Zum Positionieren des Zeigers verwende ich einen Schrittmotor ** ** mit Getriebe den 28BYJ-48. Als Treiber setze ich den ULN2003 ein der auch sehr einfach** ** in der Handhabung ist. Damit der Zeiger beim einschalten referenziert werden kann habe** ** ich auf dem Zeiger einen Neodym Magneten montiert. Fährt der Zeiger also über den ** ** verbauten Hall Sensor wird die Home Position neu gesetzt. Als Mikrokontroller verwende** ** ich einen WeMos D1 mini ESP8266 NodeMcu Lua Board der sich einfach mit dem Internet ** ** verbinden kann. ** ** ** ** Verwendete Libraries: ** ** BlynkSimpleEsp8266: https://github.com/blynkkk/blynk-library ** ** Stepper: https://github.com/rydepier/Arduino-and-ULN2003-Stepper-Motor-Driver ** ** Autor: Philippe Keller ** ** Datum: Januar 2017 ** ** Version: 1.0 ** ******************************************************************************************* */ /************************( Importieren der genutzten Bibliotheken )************************/ #include <StepperMotor.h> #include <ESP8266WiFi.h> #define BLYNK_PRINT Serial #include <BlynkSimpleEsp8266.h> /********************( Definieren der Globale Variablen und Konstanten)********************/ //Blynk Key wird einem per Mail geschickt beim Eröffnen eines neuen Projektes: char auth[] = "41ae0128734c43b395f2ce39850d441c"; int PosIndexBlynk = 0; // Variable zum Speichern der Anzufahrenden Position 1 bis 5 int myPos[] = {36, 108, 180, 252, 324}; // Zeiger Positionen in ° // Schrittmotor Geschwindigkeit je höher die Zahl desto Langsamer fährt der Motor 1=Schnell int motorSpeed = 2; int motorSteps = 4096; // Motorschritte für 360° int AktuellePos = 0; // Hilfsvariable zum Speichern der Aktuellen Position int SollPos = 0; // Hilfsvariable zum Speichern der Soll Position // Hilfsvariablen zum Abspeichern der bestromten Wicklungen beim Ausschalten unsigned char IN1 = 0; unsigned char IN2 = 0; unsigned char IN3 = 0; unsigned char IN4 = 0; /************************************(Wifi Einstellungen)**********************************/ char ssid[] = "xxxx"; // Deine Wlan SSID (Name) char pass[] = "xxxx"; // Dein Wlan Passwort /***********************( Definieren der Objekte und initialisieren )***********************/ //Schrittmotor Anschlüsse GPIO Nummer für IN1, IN2, IN3, IN4 StepperMotor motor(14, 12, 13, 15); /*****************************************( Setup )****************************************/ void setup() { //Pin D2 GPIO4 als Input definieren für Hall Sensor dient zum Referenzieren pinMode(D2, INPUT); // Blynk starten Falls keine Verbindung aufgebaut wir bleibt das Programm hier hängen! Blynk.begin(auth, ssid, pass); motor.setStepDuration(3); // Geschwindigkeit zum referenzieren reduzieren // Befindet sich der Magnet bereits auf dem Hallsensor wird hier zuerst weggefahren if (digitalRead(D2) == false) { while (digitalRead(D2) == false) { motor.step(-10); } motor.step(-100); } // Solange der Hallsensor keinen Magneten sieht wird der Zeiger gedreht while (digitalRead(D2) == true) { motor.step(10); } // Hier den Offset eintragen wieviel ° der Zeiger weg von der Position 0° ist AktuellePos = 9; // Die Funktion CheckPos vergleicht die Soll mit der Aktuellen Position und fährt sie an CheckPos(); } /******************************( Blynk Funktion für Steuerung )****************************/ BLYNK_WRITE(V0) { // Angewählte Stimmung PosIndexBlynk = param.asInt(); // Speichern des empfangenen Wertes von Blynk V0 //1= Super Happy //2= Gut drauf //3= Geht so //4= Bääh! //5= Zornig } /*************************************(Hauptprogramm)**************************************/ void loop() { Blynk.run(); // Überprüfen ob ein gültiger Wert der mit den Positionen übereinstimmt vorhanden ist if (myPos[PosIndexBlynk - 1] <= 360) { SollPos = myPos[PosIndexBlynk - 1]; // Wenn gültiger Wert neue SollPosition setzen } else { SollPos = myPos[0]; // Wenn ungültiger Wert SollPosition 0° } CheckPos(); // Funktion zum Anfahren der Position aufrufen } /*************************(Funktion zum Prüfen neuer Positonen)****************************/ void CheckPos() { if (AktuellePos != SollPos) //Überprüfen ob neue Position { StepperOn(); motor.setStepDuration(motorSpeed); //Geschwindigkeit Schrittmotor setzen int PosDiff = (SollPos - AktuellePos) * -1; //Ausrechnen wie viel ° gefahren werden muss motor.step(map(PosDiff, 0, 360, 0, motorSteps)); //Grad in Schritte umwandeln und Anfahren AktuellePos = SollPos; // Neue Aktuelle Position speichern StepperOff(); //Schrittmotor ausschalten } } /*************************(Funktion zum auschalten des Motores)****************************/ // Wenn der Schrittmotor nicht ausgeschalten wird verbraucht er zum bestromen // der Wicklungen bis zu 250mA dies generiert sonst unnötige Wärme void StepperOff() { delay(100); //Warten damit der Zeiger nicht die Position überschiesst StepperSave(); //Motor zustand Speichern digitalWrite(12, LOW); //Motorwicklungen ausschalten digitalWrite(13, LOW); digitalWrite(14, LOW); digitalWrite(15, LOW); } /************************(Funktion zum einschalten des Motores)****************************/ void StepperOn() { digitalWrite(12, IN1); //Motorwicklungen letzter Zustand wiederherstellen digitalWrite(13, IN2); digitalWrite(14, IN3); digitalWrite(15, IN4); delay(100 ); } /*************(Funktion zum Speichern der bestromten Wicklungen des Motores)***************/ void StepperSave() { IN1 = digitalRead(12); //Zustand Lesen und Speichern IN2 = digitalRead(13); IN3 = digitalRead(14); IN4 = digitalRead(15); }

Hallo Philippe,
ich versuche gerade deinen Code und Aufbau für mein Projekt umzusetzen.
Ich möchte im Grunde "nur" mit blynk einen (später zwei)
einfache 28byj Stepper per WLAN eine gewisse Distanz drehen lassen um ein kleines Modellbau Rolltor zu öffnen bzw zu schließen.
Momentan läufts ganz einfach per Arduino und Tastendruck (1 Taster für auf, einer für zu).
Mein neuer NodeMcu springt an, aber ich komme bei der Zuordnung des Steppers auf keinen grünen Zweig.
meinst du, du könntest mir eventuell ein paar Tipps geben?
gerne auch per Mail.
Viele liebe Grüße
Christian

Kann man bei euch vielleicht das Holzgehäuses bestellen?

Ein tolles Projekt, vielen Dank!
Unter welcher Lizenz steht der Code? Ich möchte gerne Teile daraus für ein eigenes Projekt verwenden (Pan-Tilt-Aufsatz für ein Videostativ) und würde gerne meinen geänderten Code wieder veröffentlichen. Darf ich das?

Du kannst den Code frei verwenden. Wir würden uns natürlich freuen wenn du auf www.bastelgrage.ch verweisen würdest. Falls du fragen hast schreib mir einfach nochmal.
Gruess Philippe

Sehr cooles Projekt, kannst Du bitte noch die Belegung der Pins zur Verfügung stellen wie du die Geräte verkabelt hast. Woher bekommt man die StepperMotor.h. Danke

Ich bin mir nicht mehr sicher, ist schon eine Zeit her aber ich habe folgende Library verwendet: http://www.instructables.com/id/Arduino-Library-for-28BYJ-48-Stepper-Motor-and-ULN/ Die Verkabelung siehst du auch auf dem Bild oben. Ich werde versuchen noch ein Schema im Fritzing zu Zeichnen. Gruess Philippe