Motoren ansteuern

Begonnen von TWART016, 29 März 2017, 09:25:25

Vorheriges Thema - Nächstes Thema

TWART016

Hallo,

ich möchte mehrere DC Motoren über FHEM ansteuern.

Einiges wurde schon in dem Thread besprochen, hier aber nochmal eine Zusammenfassung
https://forum.fhem.de/index.php/topic,37246.msg612843.html#msg612843

Ziel: Mit FHEM möchte ich mehrere DC Motoren mit verschiedenen Programmen ansteuern können. Diese Motoren sind an Zahnräder angeschlossen, die unterschiedliche Dinge antreiben (Plattform auf einer Schiene, Hub-System, ...).

Derzeit bin ich noch in Planungs bzw. Testphase. Somit kann ich noch nicht genau sagen wo es genau hin geht. Ich möchte über FHEM und weitere Teile zunächst das Fundament erstellenmit dem ich alles ansteuern kann.

Dabei möchte ich aus FHEM die verschiedenen Programme aufrufen können, z.b:
1) set Motor1 value 255;[2 Sekunden warten];set Motor1 value 0
2) set Motor1 value 255;[2 Sekunden warten];set Motor1 value 0;set Motor1 value 120;[2 Sekunden warten];set Motor2 value 255
3) set Motor1 value 255;[2 Sekunden warten];set Motor1 value 0;set Motor1 value 120;[3 Sekunden warten];set Motor2 value 255;...

Alternativ könnte ich auch den Motor mit Value 255 für 1,7 Sekunden ansteuern. Für was ich mich entscheide, oder ein Mix aus beiden mache, weiß ich noch nicht (abhängig von der Physik). Wie kann ich von FHEM in Millisekunden (denke dezimal reicht) steuern?

Mein Wunsch wäre, in FHEM ein Programm zu starten. Diese Daten werden dann an einen Mikrocontroller oder ähnliches geschickt und dort ausgeführt. Von FHEM jeden Schritt ansteuern würde ich nur ungern, da in FHEM etwas blockieren könnte und somit ungenau geschalten wird. Wie kritisch das Timing ist, kann ich derzeit noch nicht sagen.

Aktuell habe ich einen Raspberry Pi mit FHEM. Daran ist ein Arduino Uno über seriell angeschlossen. Mir Firmata und dem FRM Modul kann ich auch schon einen DC Motor ansteuern.

In der Endausbaustufe möchte ich gerne FHEM auf einem anderen Server laufen lassen (ESXi auf einem NUC). Wenn es ein Arduino wird, möchte ich mir ein Ethernet Shield o.ä. besorgen. Zudem sollte das System relativ einfach erweiterbar sein.

Da meine Programmierkenntnisse beschränkt sind, wäre es schön, wenn es bereits ein fertiges Sketch für den Arduino (oder was auch immer eingesetzt wird) gibt.

Wie würdet ihr das angehen? Mit welchen Bauteilen?


Gruß
TWART016

Thorsten Pferdekaemper

Hi,
ich halte es für sehr unwahrscheinlich, dass es dafür einen fertigen Sketch gibt. Du wirst Dir das Ding im Wesentlichen selbst schreiben müssen. Such Dir ein Protokoll aus, das Dir gefällt, also z.B. HTTP oder MQTT. Da Du das über Ethernet machen willst, scheidet so etwas wie Homebrew Wired (Homematic Wired) erstmal aus, obwohl das ansonsten meine erste Wahl wäre.
Nehmen wir mal an, Du nimmst HTTP. Dafür gibt es einige Tutorials im Internet, einfach mal suchen.
Ich würde mir dann auf dem Arduino ein paar Befehle zusammenbasteln so nach dem Motto

http://192.168.nnn.mmm/set?val=120&msec=1700

(Mit MQTT würde das etwas anders aussehen, wäre aber prinzipiell ähnlich.)
Im Arduino wird das dann umgesetzt und entsprechend geschaltet.

Auf FHEM-Seite kann man das dann z.B. mit einer der Funktionen in HTTPUtils ansteuern. Die ruft man dann z.B. aus einem notify heraus auf, welches z.B. auf irgendwelche Events eines Dummy triggert. Das kann man mit verschiedenen Readings oder einfach mit verschiedenen Werten machen, je nach Geschmack.

...so jetzt warten wir mal auf Rince mit der MQTT-Version.

Gruß,
    Thorsten   
FUIP

Rince

 ;D ;D ;D ;D ;D
Danke Thorsten, du hast mich echt zum lachen gebracht :)

Ok:
My 2 Cent (ich hoffe, ich nerve nicht?)
Wenn die "Programme", (wollen wir sie vielleicht Steuersequenzen nennen?) überwiegend fest stehen, dann würde ich diese fest in Topics verdrahten:

Es reicht ein Topic,
meineMotoren/Fertige_Sequenzen
und als Payload Sequenz_1 oder Sequenz_2, spielt keine Rolle wie viele und wie du sie nennst.

Der Vorteil ist, dass man das dann alles auf dem Arduino behält. Sobald die Sequenz losgetreten ist, läuft sie auf dem Arduino völlig autark ab.
Dein Arduino Code müsste dann also beim Erkennen der entsprechenden Steuersequenz die verschiedenen Motoren entsprechend lange drehen lassen.

Der Nachteil ist, du kannst in dem Fall die Sequenzen nur abändern, wenn du eine neue Sequenz im Arduino Code einbaust:

So könnte sowas aussehen:

if (INPUTTOPIC == "Sequenz_1") {
   hier ein Befehle; //z.B. Motor 1 für 1.7 sec laufen lassen
   und noch ein Befehl; //z.B. 2 Sekunden warten
   und noch mehr Befehle; //z.B. Motor 2 für 4 Sekunden laufen lassen
   client.publish("RueckmeldeTopic","Sequenz_1 wurde abgearbeitet");
   INPUTTOPIC = ""; 
}


Die andere Variante lässt sich mit MQTT ebenfalls umsetzen:

meineMotoren/Motor_1/Dauer
meineMotoren/Motor_2/Dauer
meineMotoren/Motor_3/Dauer
meineMotoren/Motor_4/Dauer

Als Payload dann eben eine Zeit angeben, die du entsprechend weiter benutzt

Was das mit dem Value aus deinem FHEM Befehl betrifft, das ist dir völlig frei gestellt. Du kannst letztlich auch beides gleichzeitig machen.
Ich würde dafür in MQTT ein weiteres Topic aufmachen:
meineMotoren/Motor_1/Stellwert
meineMotoren/Motor_2/Stellwert
meineMotoren/Motor_3/Stellwert
meineMotoren/Motor_4/Stellwert


Die Frage ist, wie steuerst du die Motoren denn im Arduino Code an. Mit einer Library? Welche nimmst du her? Mit welcher Hardware hängen die Motoren am Arduino? (die bringen meist passende Libraries mit, die man verwenden sollte)


Ein Problem sehe ich aber durchaus:
Du solltest nicht wirklich mit Delays arbeiten auf dem Arduino.

Ich kenne ja immer noch nicht den Sinn deiner Motoren;

Jetzt stellst du fest, dass etwas in die Hose geht. In der Regel gibt es dann immer eine Art Not-Knopf.
Wenn du diese Funktion in deinen Arduino Code einbaust, wird, solange irgendwo ein Delay aktiv ist, dieser Not-Knopf völlig ohne Funktion sein!


Ich bitte darum zu berücksichtigen, dass ich von Motorsteuerung (und Arduinoprogrammierung) auch nicht viel Ahnung habe!

So ein selbst gebauter Arduino Code kann ganz schnell komplex werden, wenn man auf das exakte Timing angewiesen ist! Was passiert z.B., wenn eine Sequenz abläuft und während dessen eine weitere Sequenzanforderung kommt???

Wie bringt man im Fehlerfall die Motoren wieder in einen definierten Zustand?
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

dev0

Zitat von: Rince am 29 März 2017, 11:30:01
Jetzt stellst du fest, dass etwas in die Hose geht. In der Regel gibt es dann immer eine Art Not-Knopf.
Wenn du diese Funktion in deinen Arduino Code einbaust, wird, solange irgendwo ein Delay aktiv ist, dieser Not-Knopf völlig ohne Funktion sein!

Kurz gesagt: Timer statt blockierender Delays verwenden: siehe zB. hier: http://playground.arduino.cc/Code/Timer
Statt das Rad neu zu erfinden könnte man auch auf vorhandene Frameworks aufsetzen oder sich dort Inspirationen holen...

Beta-User

Zitat von: dev0 am 29 März 2017, 11:42:43
Statt das Rad neu zu erfinden könnte man auch auf vorhandene Frameworks aufsetzen oder sich dort Inspirationen holen...
+1
Und MQTT macht m.E. nur Sinn, wenn Du die Infrastruktur schon hast, dann lieber die direkte HTTP-Variante, da schient man ja auch Variablen versenden zu können...

Ansonsten nenne ich nochmal das Stichwort MySensors, da habe ich in dem anderen Thread bereits Beispiele verlinkt, wie man das vergleichbar zu Rince's MQTT-Vorschlag mit diesem Protokoll macht.

Es gibt sicher noch andere Wege, um das umzusetzen, aber es läuft auf eigenen Code raus ;).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TWART016

Hallo,

danke schon mal für die hilfreichen Ideen.

Zitat von: Beta-User am 29 März 2017, 12:17:30
Und MQTT macht m.E. nur Sinn, wenn Du die Infrastruktur schon hast, dann lieber die direkte HTTP-Variante, da schient man ja auch Variablen versenden zu können...
Dann würde ich wohl die HTTP Variante nehmen.

http://192.168.nnn.mmm/set?val=120&msec=1700
Verstehe ich es richtig, dass der Arduino einen Wert von FHEM holt, und in eine Variable schreibt?


Zitat von: Rince am 29 März 2017, 11:30:01
Es reicht ein Topic,
meineMotoren/Fertige_Sequenzen
und als Payload Sequenz_1 oder Sequenz_2, spielt keine Rolle wie viele und wie du sie nennst.

Der Vorteil ist, dass man das dann alles auf dem Arduino behält. Sobald die Sequenz losgetreten ist, läuft sie auf dem Arduino völlig autark ab.
Dein Arduino Code müsste dann also beim Erkennen der entsprechenden Steuersequenz die verschiedenen Motoren entsprechend lange drehen lassen.

So könnte sowas aussehen:

if (INPUTTOPIC == "Sequenz_1") {
   hier ein Befehle; //z.B. Motor 1 für 1.7 sec laufen lassen
   und noch ein Befehl; //z.B. 2 Sekunden warten
   und noch mehr Befehle; //z.B. Motor 2 für 4 Sekunden laufen lassen
   client.publish("RueckmeldeTopic","Sequenz_1 wurde abgearbeitet");
   INPUTTOPIC = ""; 
}

Dann habe wir im Endeffekt z.B. 5 Sequenzen. Wie kann ich die dann von FHEM heraus aufrufen?

Thorsten Pferdekaemper

Zitat von: TWART016 am 03 April 2017, 21:19:59http://192.168.nnn.mmm/set?val=120&msec=1700
Verstehe ich es richtig, dass der Arduino einen Wert von FHEM holt, und in eine Variable schreibt?
Nicht ganz. Der Arduino wäre der Server und FHEM der Client. D.h. FHEM würde das an den Arduino schicken. Der Arduino würde das dann aber tatsächlich in eine Variable schreiben.
Gruß,
   Thorsten
FUIP

Rince

Zitat
Dann habe wir im Endeffekt z.B. 5 Sequenzen. Wie kann ich die dann von FHEM heraus aufrufen?
Indem du auf das von dir im Arduino definierte Topic die ebenfalls dort definierte Payload schickst.
set motoren Sequenz1
So in etwa z.B.
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

TWART016

Zitat von: Thorsten Pferdekaemper am 03 April 2017, 23:10:28
Nicht ganz. Der Arduino wäre der Server und FHEM der Client. D.h. FHEM würde das an den Arduino schicken. Der Arduino würde das dann aber tatsächlich in eine Variable schreiben.
Nur wie kann ich die Daten an den Arduino schicken? Wie muss der Sketch dazu aussehen, dass bestimmte Sequenzen gestartet oder Variablen darüber definiert werden?

Ich habe leider keine gescheite Anleitung im Internet gefunden bzw. weiß nicht genau wo nach ich suchen muss.

Beta-User

Zitat von: TWART016 am 04 April 2017, 11:07:24
Ich habe leider keine gescheite Anleitung im Internet gefunden bzw. weiß nicht genau wo nach ich suchen muss.
Wie wäre es mit den Stichworten, die Du bereits hast?

Hier wäre z.B. aus Thorstens Beitrag "http" "server" und "arduino" naheliegend. Damit kommt z.B. mit etwas Raten: https://www.arduino.cc/en/Tutorial/Bridge.

Das angepasst auf Deine Hardware und gekoppelt mit den Beispielen, auf die Du von mehreren Seiten bereits hingestupst worden bist wäre ein Anfang ;).

Die eigentliche Arbeit wirst Du dann aber schon selber machen müssen...

Meine Empfehlung dazu wäre, die einzelnen Bruchstücke dann gesondert auszutesten (z.B. Sendebefehl mit Zuweisung einer Variable: Ausgeben an der Seriellen Konsole, oder: Motorfahrt-"Makro" erst mal über die Serielle Konsole staren und beobachten, ob das klappt. Dann erst kombinieren.

Viel Erfolg!
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Thorsten Pferdekaemper

Hi,
ich halte das hier für ein bisschen geeigneter:
https://www.arduino.cc/en/Tutorial/WebServer
Auf FHEM-Seite müsste das dann mit HTTPMOD bzw. den Funktionen in HttpUtils gehen.
Gruß,
   Thorsten
FUIP

TWART016

Ich habe derzeit noch kein Yun oder Shield. Ist das auch mit einem Pi und seriell zu Arduino möglich?


Thorsten Pferdekaemper

Zitat von: TWART016 am 04 April 2017, 14:44:01
Ich habe derzeit noch kein Yun oder Shield. Ist das auch mit einem Pi und seriell zu Arduino möglich?
Klar, das geht auch. Arduino per USB an den RasPi anschließen. Es empfiehlt sich aber, das dann über einen USB-Hub zu machen, der seine eigene Stromversorgung hat.
...oder die Luxus-Variante: Homebrew Wired.
Gruß,
   Thorsten
FUIP

Beta-User

Sorry für den Yun, vergiß den wieder, es sollte ein einfacher Arduino reichen...

@Thorsten: Wie dann aber den Arduino aus FHEM raus ansteuern?

Ginge das mit HTTP-Techniken?
In dem Bereich der direkten Anbindung des Arduinos ohne großen Overhead habe ich keine eigene Erfahrung, keyValueProtokoll geht leider nicht in Senderichtung.

Was neben HM-Wired ginge, wäre den Arduino als MySensors-GW (ohne Sender-Anschluß) zu mißbrauchen, dann wäre der Arduino gleichzeitig eine Node und Du könntest die von mir bereits benannten Beispiele etwas ummodeln.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TWART016

Zitat von: Thorsten Pferdekaemper am 04 April 2017, 15:02:13
Klar, das geht auch. Arduino per USB an den RasPi anschließen. Es empfiehlt sich aber, das dann über einen USB-Hub zu machen, der seine eigene Stromversorgung hat.
...oder die Luxus-Variante: Homebrew Wired.
Dann muss nur die IP des Pi angegeben werden und dieser leitet die Anfragen automatisch weiter? Oder muss im Sketch noch etwas konfiguriert werden?

Weshalb einen USB Hub? Um den USB Port des Pi zu schützen? USB vom Pi zum Hub und USB vom Hub zum Arduino?