Hallo,
ich möchte einen Heizungsregler mit einem Schrittmotor steuern. Ich habe dazu den Schrittmotor mit einem Treiber an einen Arduino angeschlossen und als FRM_STEPPER über Configurable Firmata in FHEM definiert.
Hier ein List vom FIRMATA:
Internals:
CONNECTS 6
DEF 3030 global
DRIVER_VERSION 0.64
DeviceName 3030
FD 6
FUUID 5db9d5f4-f33f-4bb4-7805-02cbbb8b4741ac06
NAME FIRMATA
NOTIFYDEV global
NR 525
NTFY_ORDER 50-FIRMATA
PORT 3030
STATE Initialized
TYPE FRM
analog_pins 54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69
analog_resolutions 54:10,55:10,56:10,57:10,58:10,59:10,60:10,61:10,62:10,63:10,64:10,65:10,66:10,67:10,68:10,69:10
firmware ConfigurableFirmataEthernetBuild-1.ino
firmware_version V_2_10
i2c_pins 20,21
input_pins 2,3,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69
onewire_pins 2,3,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69
output_pins 2,3,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69
protocol_version V_2_06
pullup_pins 2,3,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69
pwm_pins 2,3,5,6,7,8,9,11,12,13,44,45,46
pwm_resolutions 2:8,3:8,5:8,6:8,7:8,8:8,9:8,11:8,12:8,13:8,44:8,45:8,46:8
serial_pins 14,15,16,17,18,19
serial_ports 14:3,15:3,16:2,17:2,18:1,19:1
servo_pins 2,3,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49
servo_resolutions 2:14,3:14,5:14,6:14,7:14,8:14,9:14,11:14,12:14,13:14,14:14,15:14,16:14,17:14,18:14,19:14,20:14,21:14,22:14,23:14,24:14,25:14,26:14,27:14,28:14,29:14,30:14,31:14,32:14,33:14,34:14,35:14,36:14,37:14,38:14,39:14,40:14,41:14,42:14,43:14,44:14,45:14,46:14,47:14,48:14,49:14
stepper_pins 2,3,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69
stepper_resolutions 2:21,3:21,5:21,6:21,7:21,8:21,9:21,11:21,12:21,13:21,14:21,15:21,16:21,17:21,18:21,19:21,20:21,21:21,22:21,23:21,24:21,25:21,26:21,27:21,28:21,29:21,30:21,31:21,32:21,33:21,34:21,35:21,36:21,37:21,38:21,39:21,40:21,41:21,42:21,43:21,44:21,45:21,46:21,47:21,48:21,49:21,54:21,55:21,56:21,57:21,58:21,59:21,60:21,61:21,62:21,63:21,64:21,65:21,66:21,67:21,68:21,69:21
Helper:
DBLOG:
state:
logdb:
TIME 1575049806.80221
VALUE Initialized
READINGS:
2019-11-29 18:50:06 state Initialized
SERIAL:
SocketDevice:
BUF
DeviceName 3030
NAME FIRMATA_xxx.xxx.xxx.xxx_55205
NR 1048
PARTIAL
PEER xxx.xxx.xxx.xxx
PORT 55205
SNAME FIRMATA
SSL
STATE disconnected
TEMPORARY 1
TYPE FRM
READINGS:
2019-11-29 21:31:10 state disconnected
Attributes:
disable 0
room Arduino,FHEM
Hier ein List vom Schrittmotor:
DEF DRIVER 5 6 1600
DIRECTION 0
DRIVER DRIVER
FUUID 5dc9c365-f33f-4bb4-6c34-2942ba1cc21d27c1
IODev FIRMATA
NAME Ofen
NR 532
PIN1 5
PIN2 6
POSITION 0
STATE 200
STEPPERNUM
STEPS 0
STEPSPERREV 1600
TYPE FRM_STEPPER
Helper:
DBLOG:
state:
logdb:
TIME 1575051550.42468
VALUE Initialized
READINGS:
2019-11-29 19:16:19 position 200
2019-11-29 19:19:10 state Initialized
Attributes:
IODev FIRMATA
eventMap /position 1600 100:AUS/position 1400 100:1/position 1200 100:2/position 1000 100:3/position 800 100:4/position 600 100:5/position 400 100:6/position 200 100:7/
room Arduino,FHEM
stateFormat position
Es funktioniert soweit alles wie gewünscht bis auf 1. Punkt:
Der Schrittmotor soll im Echteinsatz sehr selten verstellt werden, d.h. ca. 2-3 mal pro Woche. In der Zwischenzeit bleibt der Schrittmotor im Haltemoment aktiv, d.h. die Spulen werden die gesamte Zeit mit Strom versorgt, was in meinem Fall vollkommen unnötig ist, da der Heizungsregler sich nicht selbstständig verändern kann. Das Problem könnte man einfach lösen, in dem man den "Enable" Kontakt des Motortreibers auf HIGH stellt. Dadurch wird die Stromversorgung des Motors unterbrochen.
Leider kann ich im FRM_STEPPER nur einen Pin für STEP und einen Pin für DIRECTION einstellen. Es wäre sehr gut, wenn es dort noch einen Pin ENABLE gäbe, der den Motor bei Bedarf ein- und danach wieder ausschaltet.
Gibt es eine Möglichkeit, diese Funktionalität irgendwie abzubilden? Vielleicht einen Workaround um den Motor vor der Verstellung einzuschalten und danach wieder aus?
Grüße
Feller
leg doch einfach noch einen FRM Out an für den ENABLE
Vielen Dank für die schnelle Antwort. Genau so etwas hatte ich gesucht. Manchmal sieht man den Wald vor lauter Bäumen nicht (Mein 1. Arduino Projekt) :)
Hallo,
ich habe mittlerweile einen Pin mit FRM_OUT definiert um den StepperMotor vor der Bewegung einzuschalten und nach der Bewegung auszuschalten. Das funktioniert im Prinzip sehr gut!
Dabei ergibt sich aber jetzt ein weiteres Problem:
Die Bewegung des Steppers wird nun mit diesen Codezeilen durchgeführt
fhem( "set MotorEnable off" );
if( $Stufe eq "AUS")
{ fhem( "set OfenMotor position 1600 100" ); }
if( $Stufe eq "1")
{ fhem( "set OfenMotor position 1400 100" ); }
if( $Stufe eq "2")
{ fhem( "set OfenMotor position 1200 100" ); }
if( $Stufe eq "3")
{ fhem( "set OfenMotor position 1000 100" ); }
if( $Stufe eq "4")
{ fhem( "set OfenMotor position 800 100" ); }
if( $Stufe eq "5")
{ fhem( "set OfenMotor position 600 100" ); }
if( $Stufe eq "6")
{ fhem( "set OfenMotor position 400 100" ); }
if( $Stufe eq "7")
{ fhem( "set OfenMotor position 200 100" ); }
>>>sleep 10;<<<
fhem( "set MotorEnable on" );
Wenn ich nun den den StepperMotor starte schaltet der ENABLE Pin auf LOW, der Motor beginnt zu drehen und bleibt sofort wieder stehen, ohne seine gewünschte Position zu erreichen. D.h. der ENABLE Pin wird wieder auf HIGH gesetzt bevor der Motor seine Sollposition erreicht hat. Ich habe testweise vor dem letzten Befehl ein "sleep 10" eingebaut, dann klappt alles wie gewünscht.
Gibt es hier eine bessere Möglichkeit auf das Erreichen der Motorposition zu warten?
Vielen Dank für jede Unterstützung!
Da FRM_OUT die setExtensions unterstützt würde ich die erste Zeile ändern in
fhem( "set MotorEnable off-for-timer 10" );
wenn dir 10 Sekunden reichen , sonst nimm das was bei dir passt und lösche
>>>sleep 10;<<<
fhem( "set MotorEnable on" );
es sei denn du willst nicht X Sekunden den ENBALE an lassen, dann brauchst du ein notify das auf deine Endposition triggert um den Pin wieder on zu setzen.