Configurable Firmata - FRM_STEPPER - Enable Funktion

Begonnen von Feller, 30 November 2019, 12:19:23

Vorheriges Thema - Nächstes Thema

Feller

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

Wzut

leg doch einfach noch einen FRM Out an für den ENABLE
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Feller

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)  :)

Feller

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!

Wzut

#4
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.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher