CraftBeerPi Plugin für Induktionskochfeld via Serielle Schnittstelle

Antworten
Benutzeravatar
matschie
Posting Junior
Posting Junior
Beiträge: 87
Registriert: Samstag 17. März 2018, 17:26

CraftBeerPi Plugin für Induktionskochfeld via Serielle Schnittstelle

#1

Beitrag von matschie » Mittwoch 5. September 2018, 10:58

Hallo zusammen!

Ich habe in einem anderen Thread (Klick) unter Hilfe von einigen Usern hier eine Möglichkeit gefunden, mein Induktionskochfeld per serieller Schnittstelle anzusteuern. Das passende Arduino-Skript läuft auch schon.

Nun folgt die Einbindung des Arduinos in CBPi, nur dass ich von Python keine Ahnung habe. Daher brauche ich mal das Expertenwissen der CBPi-Profis hier.

Die Ansteuerung des Feldes erfolgt von einem Arduino aus, welcher nun von CBPi aus befehle erhalten soll.

Meine Idee war Folgende:
CBPi rechnet den %-Wert (PID) der Heizleistung aus und übergibt diesen Wert an den Arduino
Der Arduino rechnet die Heizstufe (P1-P5) aus und setzt diese, ggf. wird innerhalb der Heizstufe über "Pulsen" noch feiner gesteuert.

Alle PID-Plugins die ich gefunden habe, steuern jedoch nur über "AN/AUS", hier ein Beispiel aus dem "PID Arduino":

Code: Alles auswählen

   
   while self.is_running():
            heat_percent = pid.calc(self.get_temp(), self.get_target_temp())
            heating_time = sampleTime * heat_percent / 100
            wait_time = sampleTime - heating_time
            self.heater_on(100)
            self.sleep(heating_time)
            self.heater_off()
            self.sleep(wait_time)

Hier könnte man ja ansetzen und nur "self.power(heat_percent)" einfügen, oder nicht? also quasi so:

Code: Alles auswählen

   
   while self.is_running():
            heat_percent = pid.calc(self.get_temp(), self.get_target_temp()) 
            self.heater_on(heat_percent)
Ich bräuchte dann noch einen Aktor, der heat_percent an den Arduino schickt.

Da überlege ich noch, wie. Per HTTPActor ist zu träge, daher dachte ich an eine Serielle Schnittstelle per USB. Dafür müsste ein Actor dann die entsprechenden Befehle seriell übertragen. Eine Auswertung am Arduino sollte kein Problem darstellen.

Ich habe mir mal was zurechtkopiert:

Code: Alles auswählen

from modules import cbpi
from modules.core.hardware import ActorBase
from modules.core.props import Property
import serial

@cbpi.actor
class SerialActor(ActorBase):
   
   device = Property.Text("Device Name", configurable=True, default_value="/dev/ttyUSB0", description="Serial Device Port")
   baud = Property.Number("Baud Rate", configurable=True, default_value=9600, description="Serial Baud Rate")
   
    power = 0
    cmd_on = "ON"
    cmd_off = "OFF"
    
    def send(self, command):
        try:
            s = serial.Serial(self.device, self.baud)
            s.open()
            s.write("command")
	    s.close()
	    
    def on(self, power=None):
        self.send(self.cmd_on)
        if power is not None:
            self.set_power(power)

    def off(self):
        self.send(self.cmd_off)
        
    def set_power(self, power):
        if power is not:
            if power != self.power:
                self.power = int(power)
                self.send(power)
oder habe ich da jetzt noch einen gröberen Denkfehler?

Außerdem würde ich gerne die Möglichkeit haben, Fehlermeldungen zurückzumelden. Beispiel: Mein Arduino kann auslesen, wenn kein Topf auf dem Feld steht. Das würde ich gerne als Fehler oder Hinweis in CBPi angezeigt bekommen. Dafür fehlt mir jedoch noch die Idee, wie das gehen kann.

Vielen Dank!

Edit: Halb fertigen Satz beendet ;)

Benutzeravatar
matschie
Posting Junior
Posting Junior
Beiträge: 87
Registriert: Samstag 17. März 2018, 17:26

Re: CraftBeerPi Plugin für Induktionskochfeld via Serielle Schnittstelle

#2

Beitrag von matschie » Samstag 8. September 2018, 10:10

Hallo nochmal,

leider konnte mir ja bislang niemand helfen, ich bin aber selber ein paar Schritte weitergekommen.

Folgenden Actor habe ich mir zusammengebastelt:

Code: Alles auswählen

from modules import cbpi
from modules.core.hardware import ActorBase
from modules.core.props import Property
import serial
import time

@cbpi.initalizer(order=3000)
def init(cbpi):
    global serialConnection
    serialConnection = serial.Serial('/dev/ttyACM0',9600)

    if serialConnection.isOpen():
        serialConnection.close()
        time.sleep(2)
        serialConnection.open()
    pass

@cbpi.actor
class SerialActor(ActorBase):

	pPower = 0

	def on(self, power=None):
		if power is not None:
			self.set_power(power)
		else:
			self.set_power(0)

	def off(self):
		self.set_power(0)

	def set_power(self, power):
		if power is not None:
			if power != self.pPower:
				self.pPower = int(power)
				serialConnection.write(str(power))
Was funktioniert: Anschalten (Knopf wird grün, Power bleibt auf 0), Manuell "Power" auf einen Wert einstellen, Wert wird gesendet und auch empfangen, Ausschalten.
Was nicht funktioniert: Standardmäßig ist für den Actor 100% Power eingestellt. Wenn ich ihn einschalte, wird er aber nicht auf 100 eingestellt..
Wenn ich ihn erst auf einen Wert einstelle und dann einschalte, wird nicht z.B: "75" sondern "750" gesendet.

Des Weiteren funktioniert die Steuerung via PID Controller gar nicht. Ich habe z.B. den PIDArduino entsprechend verändert:

Code: Alles auswählen

self.heater_on()
        while self.is_running():
			heat_percent = pid.calc(self.get_temp(), self.get_target_temp())
			self.actor_power(heat_percent)
        self.heater_off
 
Das gibt leider nur einen Core Error.

Hat jemand eine Idee?

Vielen Dank

clmnsk
Posting Klettermax
Posting Klettermax
Beiträge: 109
Registriert: Freitag 10. März 2017, 00:12

Re: CraftBeerPi Plugin für Induktionskochfeld via Serielle Schnittstelle

#3

Beitrag von clmnsk » Samstag 8. September 2018, 13:26

Nicht konkret, aber benutze doch den Logger zum debuggen und mach dir das log auf der Konsole mit tail auf.
self.api.app.logger.info("Debugging meldung")

Benutzeravatar
matschie
Posting Junior
Posting Junior
Beiträge: 87
Registriert: Samstag 17. März 2018, 17:26

Re: CraftBeerPi Plugin für Induktionskochfeld via Serielle Schnittstelle

#4

Beitrag von matschie » Sonntag 9. September 2018, 14:52

Kurzes Update: Funktioniert. Gerade läuft ein angepasster PIDAutoTune, bin mal gespannt was dabei rumkommt.

Edit: AutoTune klappt nicht, mit geschätzten PID Werten funktioniert es jedoch super (0.2° Hysterese).
Werde demnächst mal ausführlich beschreiben wie es funktioniert.

Benutzeravatar
secuspec
Posting Klettermax
Posting Klettermax
Beiträge: 113
Registriert: Sonntag 9. Juli 2017, 06:31
Wohnort: Königstein
Kontaktdaten:

Re: CraftBeerPi Plugin für Induktionskochfeld via Serielle Schnittstelle

#5

Beitrag von secuspec » Freitag 14. September 2018, 13:26

matschie hat geschrieben:
Sonntag 9. September 2018, 14:52
Kurzes Update: Funktioniert. Gerade läuft ein angepasster PIDAutoTune, bin mal gespannt was dabei rumkommt.

Edit: AutoTune klappt nicht, mit geschätzten PID Werten funktioniert es jedoch super (0.2° Hysterese).
Werde demnächst mal ausführlich beschreiben wie es funktioniert.
Das ist wirklich super ! Habe die Platte auch gerade bei GGM Gastro bestellt.

Die detaillierte Beschreibung des Arduino Sketch, als auch des CBPi Plugins, sowie der notwendigen Verdrahtung wäre was fürs WiKi.

Vielen Dank schonmal :Drink
Klassisches 2 Geräte Sudhaus auf Basis 80l Töpfen mit Hendi für die Rasten und einem Ultra Low Power 8kW Heizelement fürs Kochen. Alles gesteuert über CraftBeerPi. :Drink

Benutzeravatar
matschie
Posting Junior
Posting Junior
Beiträge: 87
Registriert: Samstag 17. März 2018, 17:26

Re: CraftBeerPi Plugin für Induktionskochfeld via Serielle Schnittstelle

#6

Beitrag von matschie » Sonntag 16. September 2018, 13:54

So, nun wie versprochen meine Info's zu meiner Steuerung für das Induktionskochfeld.
Hier mal die Box:
DSCF8624.JPG
Zum Arduino-Sketch
Der Sketch besteht aus 4 Dateien, und es werden derzeit nicht alle Funktionen genutzt.
Z.B. die readInput() im Reiter "Indu" funktioniert zwar, wird aber derzeit nicht benutzt. kommt noch.
Der Reiter "LED" beschäftigt sich mit dem Display (jaja, ist ein LCD, war aber mal ein LED und ich habs nicht umbenannt ;) )
Wenn man kein Display nutzt, braucht man diese Funktionen nicht.
Der Reiter "setup" ist eigentlich obsolet, da war mal mehr drin, das hab ich aus performance-gründen stark gekürzt.

Was noch kommen soll:
  • readInput() soll Fehlermeldungen der Platte lesen und an CBPi weitergeben, dort sollen sie dann per notify unten eingeblendet werden.
  • Anschluss eines Potis für manuelle Steuerung
  • Eventuell Implementierung einer eigenen PID-Funktion zum Stand-Alone-Betrieb
  • Hier ist Platz für eure Ideen:__________________________
Verkabelung:
DSCF8625.JPG
Das Display wird an 5V, GND, und I2C angeschlossen (20,21)

Der Anschluss des Kochfelds besteht aus 5 Leitungen:
Rot +5V geht an Vin
Schwarz GND an GND
Blau ist die "Rückleitung" geht an 2 (Interrupt-fähig)
Gelb ist die "Datenleitung" für Befehle, geht an 5
Weiss ist, um das Hauptrelais der Platte zu schalten, geht an 3.

Die Pins können natürlich beliebig ausgetauscht werden. Die Rückleitung funktioniert aber nur über einen Interrupt-fähigen Pin wirklich gut.
Ich habe einen MEGA genommen, da dieser auf allen Pins 5V-Fähig ist, darauf sollte man bei der Wahl der Platine achten.

Das Kabel ist das der originalen Steuerung, ich hatte "Glück" dass meine Steuereinheit kaputt angeliefert wurde (Ausgebrochene Plastikteile), und GGM mir kostenlos ersatz zugeschickt hat. So hab ich eine Steuerung im "Originalzustand" und eine zerlegte, aus der auch das Kabel stammt.

Zu den CBPi Plugins
Es sind insgesamt 3 Plugins:

Der SerialActor
Aktuell kann nichts konfiguriert werden. Daher muss in der python-Datei ggf. der Gerätename (/dev/ttyACM0) angepasst werden. Ansonsten funktioniert er recht gut.

Was noch fehlt / kann:
  • Konfiguration z.B. Gerätename und Baud über CBPi Oberfläche
  • Logik wiederaufbau Serielle Kommunikation bei Verlust (Kabel raus,...)
  • Hier ist Platz für eure Ideen:__________________________
PIDArduinoPowerOutput
Dies ist quasi 1:1 das PIDArduino Plugin, ich habe nur umgeschrieben, dass statt Relais an/aus die aktuell berechnete "Power" Stufe gesendet wird.

PIDAutoTunePowerOutput
Siehe oben, nur zum Autotuning. Achtung: bitte nur mit 100% -Schritten arbeiten, der Rest klappt nicht (und ist auch nicht nötig, AutoTune klappt mit 100% sehr gut.

Über Ideen / Anregungen / Kritik würde ich mich freuen!

Edit: Anhänge angefügt ;)
Dateianhänge
Arduino Sketch.zip
(5.71 KiB) 4-mal heruntergeladen
CBPi Plugins.zip
(9.81 KiB) 1-mal heruntergeladen

Benutzeravatar
secuspec
Posting Klettermax
Posting Klettermax
Beiträge: 113
Registriert: Sonntag 9. Juli 2017, 06:31
Wohnort: Königstein
Kontaktdaten:

Re: CraftBeerPi Plugin für Induktionskochfeld via Serielle Schnittstelle

#7

Beitrag von secuspec » Sonntag 16. September 2018, 16:29

:thumbsup :Drink Genial ! DANKE !
Klassisches 2 Geräte Sudhaus auf Basis 80l Töpfen mit Hendi für die Rasten und einem Ultra Low Power 8kW Heizelement fürs Kochen. Alles gesteuert über CraftBeerPi. :Drink

JackFrost
Posting Junior
Posting Junior
Beiträge: 93
Registriert: Dienstag 15. Mai 2018, 18:10

Re: CraftBeerPi Plugin für Induktionskochfeld via Serielle Schnittstelle

#8

Beitrag von JackFrost » Montag 17. September 2018, 21:01

Hast du in den Sketch so geschrieben das der Arduino es merkt wenn der Raspi abschmiert ?

Zur Not einfach immer ein spezielles Kommando schicken das den WDT zurücksetzt.

Gruß JackFrost

Benutzeravatar
matschie
Posting Junior
Posting Junior
Beiträge: 87
Registriert: Samstag 17. März 2018, 17:26

Re: CraftBeerPi Plugin für Induktionskochfeld via Serielle Schnittstelle

#9

Beitrag von matschie » Montag 24. September 2018, 16:27

JackFrost hat geschrieben:
Montag 17. September 2018, 21:01
Hast du in den Sketch so geschrieben das der Arduino es merkt wenn der Raspi abschmiert ?
Jetzt ja, habe eine neue Version im Anhang, auch etwas "Aufgeräumter". Es ist insgesamt ein Error Handling dazugekommen. Wenn die Serielle Kommunikation ausbleibt, schaltet die Platte ab.

Allerdings heisst das, dass man derzeit nur den Automatikmodus nutzen kann, da im manuellen modus nur einmal der Befehl gesendet wird. Wird noch geändert ;)

Edit: Anhang.
Dateianhänge
180918_Induktion.zip
(9.04 KiB) 2-mal heruntergeladen

Antworten