USB Funktions-Kontroller-Modul

Habe neues Kontrollermodul gebastelt:
Ein PIC-Modul(28Pin), dass preiswerte Funksteckdosen (433MHz) per USB steuern kann.

Man kann den Sender der FB benutzen, oder ein Extrasender benutzen.

Code ist vom Bascom-Forum nur angepasst, danke dafür!

Was Ähnliches gibt es von Arduino in GPL.

Das gleiche PIC-Modul(28Pin), zusätzlich mit 2xPWM (0-10Volt) und ULN-Treiber-IC (für 8 Relais oder anderes Schaltbares zB.LED)

Und eine PIC-Variante(40Pin), wie 28-poliges Modul, mit mehr Port’s, analoge/digitalen Messungen, 2 Zähler. Noch ohne Layout, weil Umfang nicht klar.

Die Module laufen als HID-Gerät per USB, ich habe 2 VID-Geräte-Licenzen dafür gekauft, jeder kann sein Modul von mir, mit der Licenz programmiert bekommen.
Nur PIC, schicken, FreiPorto anbei, Softwareänderungswünsche können auch geäußert werden.

Jedes Modul kann eine andere SerienNr. bekommen, sodass man sie in IPSymcon unterscheiden könnte.

Meine Parameter für die Übergabe sind in Byteform bisher:
Byte1 Hauscode(5bit)
Byte2 Steckdosencode(5/4bit)
Byte3 Befehl(0 oder1)
Byte4 toggle nach ca. Zeit(1-255s) oder nicht(0)

Byte5 PortNr.(1-255)
Byte6 Date(0-255)
Byte7 Befehl(0/1=Lesen-Schreiben oder Zeit(128 nur schreiben)
Byte8 Zeitwert 1-255 in ca. Sek

Byte9 PWM1(0-255=0-10V)
Byte10 PWM2(0-255=0-10V)

Byte11 Kanalauswahl für analoge Wandler,
Byte12 Sollen Zähler gespeichert werden oder einzel auf „0“ gesetzt 64,128 129 … als Befehl
…Byte 13 - X (später weitere Zähler oder Temperatur)

Als Rückgabewert zum PC kommt bisher:
Byte1 analoger High-Wert des ausgewählten analog-Kanal
Byte2 analoger Low-Wert des ausgewählten analog-Kanal
Byte3 Daten (des durch PortNr adressierten Port)
Byte4 + 5 noch offen (da hoffe ich auf Anregung)
Temperatur ?
Byte 6+7 Zähler 1 (High- und Low-Wert der 16-bit Zählerstände)
Byte 8+9 Zähler 2 " "
die vorletzten 2-Byte bringen die Steckdose und die PortNr, die zuletzt übergeben wurden als Rückmeldung.

Temperatur sind noch nicht „reinprogrammiert“

Für die PortNr-Geschichte ist ein Aufsatz für die Relais-Grundplatine des 24-fach Webserverprojektes geroutet.

Ein anderer Aufsatz wird für die 24-fach 230V~In-Webserverplatine geroutet.

Bei der Zähler-Geschichte muss ich mir noch eine Optoentkopplung ausdenken.
Geräte müssen „gepollt“ werden.

Habe auch ein Purebasicprogrämmchen, wer es ohne IPSymcon benutzen will.

Sind noch 3 Bytes der Ausgabe Parameter unbestimmt, ev. 1Wire, 18B20? Näheres später, Bilder:
Edit: Parameterbestimmung verschlimmbessert, ist noch nicht fertig…
Vorläufige [b]IPSymcon-Anbindung HIER[/b]

FunkInterface.png

2 Zähler für Strom. Gas oder sonst was rein programmiert.

Sind je 2Byte groß, sollte reichen.

Der Befehl 64 im Parameter 11, speichert die Zählerstände ins EEprom des Kontrollers-

Der Befehl 128 setzt Zähler Nr.1 auf „0“.
Der Befehl 129 setzt Zähler Nr.2 auf „0“

HID-Ausgabe-Bytebelegung siehe erste Post.

DS18B20 noch?

Die Parametergeschichte (speziell für den 40-poligen Kontroller) steht noch nicht fest.
Es ist die Frage, ob man es mit „Befehlsverschlüsselung“ im ersten Parameter zum PIC macht.
Also zB 01 für Funkbefehl, 02 für Portbefehl, 03 für PWM…usw…

Ich meine, das könnte man machen, nur bei den Parametern die zum PC kommen, da bin ich der Meinung, dass da sogar noch mehr als 12 kommen sollten.

Hinergrund:
Es muss gepollt werden, da wäre es gut wenn möglichst viele Parameter auf einmal kommen, sonst wird da nur rumgepollt. :rolleyes:

Meine weiteren Funktionen, die ich mir vorstellen kann, sind/werden iM:
1Wire Temperaturen (in Arbeit, iM mit 4 Stück ohne Ausgabe der ID, wohl unnötig, kann einfacher gewechselt werden)
Ansteuerung der FHT 8i Funk-Ventilansteuerung mit dem Ziel die 1Wire-Temperaturen zu verknüpfen. (ähnlich meinem [b]HIER[/b] gepostetem Modul)

Vorgaben auch über Parameterübergabe für:
Welcher Port-Pin (Relais) hört auf welche Input(Taster), incl. Zentral-„AUS“, Zentral-„EIN“
Welcher Taster soll überhaupt Zentralfunktionen können.

Also es geht in Richtung einer Art Etagenkontroller

Endziel ist, dass er recht viel „alleine“ kann, ohne weitere IPSymcon-Befehle.
Möglichst nur zur Visu und zur Para-Übergabe oder Änderung.

Was sagen die Bastlerkollegen?

Es spricht sicher auch nichts dagegen, wenn der PIC die Daten auch selbstständig zum PC schickt, wenn er eine meldenswerte Information/Änderung festgestellt hat. So spart sich IPS das resourcenfressende Pollen, was SEEEHR empfehlenswert wäre. Dann kann man wieder schön mit Events über Variablen arbeiten und hat die Abfragelast nur am PIC.

Tommi

Menschenskinder :eek:, ich bin froh, dass ich es soweit hin bekommen habe, nun soll er auch noch selber denken. :rolleyes:

Ja, nee is klar.
Muss ich wohl noch machen, nur wo sind die Grenzen.
Irgendeine Temperatur ändert sich immer in der letzen Stelle…

Dann über einen Timer … Temperatur minütlich übermitteln ? :wink:

Hallo Jens,
auslösend für eine Antwort vom PIC ist eine Übertragung zum PIC.

Das ist bis jetzt so, wird aber noch so geändert, dass bei Input-Änderung auch eine Übertragung mit den Änderungen statt findet.

Und da ist die Frage welche Temperaturänderung soll dazu führen, oder (grübel, grübel)… ich spendiere dafür auch einen Parameter…

Aber erst einmal mache ich mit den DS18B20 weiter, dann kommt die Geschichte:
Wer (Port) hört auf welchen Eingang, so wie Gruppenadressen bei EIB/KNX.

Hallo Helmut,
Du schaffts das schon!!!
Vielleicht solltest Du statt/Alternativ dem USB auch einen LAN-Anschluss z.b. über Xport oder NetIo oder … vorsehen, damit Du einen Etagenkontroller auch über Etagen verteilen kannst. Das Protokoll kann ja bleiben.

Für Version2 kannst du schon mal den Kaffeeautomaten-Kontroller planen, also Kaffee portitionieren, die richtige Menge Wasser bereitstellen, Die korrekte Brühtemperatur einhalten und zum Schluss den Weckvorgang starten…:D.

Sag nicht, wir hätten keine interessanten Ideen bzw. Herausforderungen…

Viele Grüße
Tommi

Ja, verar**ht mich nur.

Hab` kein Kaffee mehr, alles ausgetrunken.

Ideen habe ich auch genug, Funkdose mit RFM12, bidirektional, bisher über Arduino-Software, mit C.
Und ich kann nur Basic…

RX und TX ist noch frei, könnte an die Serielle von der Funkdose(RFM12).

Hab` bei der Leiterplattenbestellung (für Durchkontaktierte) bisher nur Geld bezahlt, aber nichts bekommen.
Sonst könnte ich es gleich mal ausprogieren:

So, meine 1Wire Programmierung ist fertig.

Nur ich weiß echt nicht, ob es in den PIC-Controller mit rein soll.

Ich hänge mal ein Textfile hier ran.

Es werden 1Wire-IC gesucht, dessen SerienNr ermittelt, Tempwerte usw gelesen.

Da er Dieses alle 750ms für jede Temp macht, kommt da eine hohe Zeitbelastung raus.

Soll er die Daten kontinuierlich übermitteln oder nur auf Anfrage?

Oder soll diese Geschichte lieber ein eigener PIC-Kontroller machem?
Weil, wenn jemand viele Tempwerte hat… lohnt sich das ev.

Ist auch die Frage, wie dass mit den SerienNr. der Fühler gehandhabt werden soll?

1Wire_Test_neu.TXT (12.4 KB)

Hi Helmut,

nur auf Anfrage = Polling ist unschön, da nicht zeitnah.

kontinuierlich = laufende Belastung, und damit Auslastung, auf dem USB Bus; auch nicht so toll.

Wie wäre es mit: Übermittlung bei Änderung der Temperatur.

Im Auswerteskript von IPS wird ja eh eine Variable für diesen Zweck vorgesehen sein.

Gibt es schon einen IPS Treiber für dieses Projekt?
Bei meinem ist der von Toni programmierte Treiber durch den Releasewechsel von V2.04 auf 2.1 leider nicht mehr nutzbar.

mfg

Bernd

Hallo Bernd!!
Da das Kontrollerteilchen noch einiges mehr enthält, gibt es eine USB-HID-Übertragung bei Zustandswechsel eines EingangsBit von Port XY

Dann würde noch die analog Messung und jetzt die Temperatur-Messung eine Übertragung auslösen.

Und die Zähler sind auch noch drin…

Nur nach welchen Kriterien, 0,1 Grad, 0,2 mV oder welcher Zählerstand.

Um es gut zu machen, müßten die Kriterien auch noch programmierbar werden.

Dann wird es aber echt unübersichtlich.

Überlege ernsthaft mehr als 12 Parameter zu übertragen, es gehen 64 !!

Dann bekommt man zwar viele Bytes, aber dessen Inhalte müssen nicht vorher mit Befehlen erst bestimmt werden.

zB 32 In-, 32 Out-Port-Pin= je 4Byte= 8Byte
4 analoge = 4 High- und 4 Low-Byte auch 8Byte
2 Zähler = je 2 Byte High- und Low-Byte = 4Byte
zB 5 Tempwerte= 5 Vorzeichen und 5 Werte=10Byte

da wäre noch erfassbar.

Modul hatte Tommi sich sehr eingesetzt, nur, wie du auch erlebt hast, gibt es immermal Versionsgeschichten.

Man kann es auch ohne Modul erfassen
, wenn man die von IPSymcon gestellten HID-Befehle „pur“ nimmt.
Modul ist naturlemang schöner :slight_smile:

Übrigens, viel Glück, sprich Moos, mit deinem Internetauftritt !!!

Hi Helmut,

ich setzt die Skripterei hier mal fort.

Fangen wir an mit der Auswertung per For Schleife:

<?

define("Wert1",14144 /*[Technik\.Helmut´s 433MHz Modul\01 analoger Eingang High-Wert]*/);
define("Wert2",47900 /*[Technik\.Helmut´s 433MHz Modul\02 analoger Eingang Low-Wert]*/);
define("Wert3",51969 /*[Technik\.Helmut´s 433MHz Modul\03 Daten des adressierten Ports]*/);
define("Wert4",56301 /*[Technik\.Helmut´s 433MHz Modul\04 wofür?]*/);
define("Wert5",17189 /*[Technik\.Helmut´s 433MHz Modul\05 wofür?]*/);
define("Wert6",27399 /*[Technik\.Helmut´s 433MHz Modul\06 Zähler 1 High-Wert]*/);
define("Wert7",39903 /*[Technik\.Helmut´s 433MHz Modul\07 Zähler 1 Low-Wert]*/);
define("Wert8",48195 /*[Technik\.Helmut´s 433MHz Modul\08 Zähler 2 High-Wert]*/);
define("Wert9",31921 /*[Technik\.Helmut´s 433MHz Modul\09 Zähler 2 Low-Wert]*/);
define("Wert10",54861 /*[Technik\.Helmut´s 433MHz Modul\10 wofür?]*/);
define("Wert11",23687 /*[Technik\.Helmut´s 433MHz Modul\11 wofür?]*/);
define("Wert12",13591 /*[Technik\.Helmut´s 433MHz Modul\12 zuletzt angesprochene Steckdose]*/);
define("Wert13",58687 /*[Technik\.Helmut´s 433MHz Modul\13 zuletzt angesprochener Port]*/);
define("Wert14",20603 /*[Technik\.Helmut´s 433MHz Modul\14 wofür?]*/);
define("AnzWerte", 14 /*Anzahl der Werte*/);


switch($IPS_SENDER)                                // ermitteln, wodurch das Skript aufgerufen wurde
{
    case "Execute":                                // von Hand aufgerufen: Schleife starten
    case "TimerEvent":                             // vom Timer aufgerufen: Schleife starten
		HID_SendEvent(42538 /*[Helmut´s 433 MHz Modul]*/, 0, chr(0x00).chr(0x01).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x7D).chr(0x7D).chr(0x00).chr(0x00)); // Blankoaufruf senden
    break;

    case "RegisterVariable":                       // durch Registervariable aufgerufen: neuer Wert wurde empfangen

       SetValue(45705 /*[Technik\.Helmut´s 433MHz Modul\vom 433MHz Modul]*/, $IPS_VALUE);  // empfangenen Wert abspeichern

// Erklärung der neu kennengelernten PHP Befehle:
// SetValue sollte klar sein, speichert den Krempel in die rot gekennzeichnete Objekt ID
// ord sorgt für die Darstellung des ASCII Wertes des selektierten Bytes
// substr beginnt bei dem Zeichen, welches im ersten Parameter genannt wird für die Länge des im im 2.ten Parameter genannten Wertes2


for ($i = 1; $i <= AnzWerte; $i++) 	{ 						/*Programmschleife wird formuliert */
	$name = "Wert" .$i;                     				/*Der jeweils benötigte Konstantenname wird zusammengehäkelt */
	SetValue($name, ord(substr ($IPS_VALUE, $i, 1)));  /*Der zugehörige Wert wird in die zugehörige Variable geschrieben */
}                                   						/*for Programmschleife wird abgeschlossen */
    break;
}

?>

geht irgend wann mal weiter mit der Eingabe.

mfg

Bernd

Hallo Bernd,

da war ich ev. zu schlau mit der Bemerkung: geht sicher auch mit Array’s.

Weil das ist gar nicht so schlau, weil ich dann nicht meine Parameter mit Namen betiteln kann, die Rückschlüsse auf das Ergebniss zu lassen.

Also Hauscode, Temperatur(en), PortNr, Daten, Zustände usw. und was ich gestern reinprogrammiert habe VentilNr und %Wert des Heizkörperventils.

Die Ansteuerung von dem ELV-Modul zur Ansteuerung der max. 4 Heizkörperventile FHT 8i , was ich in Bascom-AVR hier schon veröffentlicht hatte, habe ich auch in dem PIC reinprogrammiert.

Vielleicht mache ich mir den, auf dieser ELV-Platine vorhandenen, Sender noch für andere Aufgaben zu nutze. :rolleyes:
Wenn er denn schon mal da ist…

Noch `ne Frage: wie ersetze/konvertiere ich chr(0x1F) mit einer Stringvariablen?

Hintergrund ist der Ersatz mit erkennbaren Beschreibungen: zB Ventil_Stellwert_verzögerung als Stringvariable anstelle von chr(0x03) als Übergabe zum PIC.
Vom PIC zum PC habe ich schon Stringvariablen.

Das Array würde ich nur innerhalb des Skriptes nutzen. Bei meinem obigen Ansatz werden die Konstanten ja auch nur innerhalb des Skriptes benutzt. Selbstverständlich kannst Du dann Deinen Variablen „sprechende“ Namen geben. Ich werd das oben mal anpassen.
Jetzt bist Du bei 16 Parametern?, brauchst nur das obige Skript um diese beiden ergänzen und das Feld: „Wertxx“ anpassen und die letzte define „AnzWerte“, von 14 auf 16 zu ändern.

Wenn dat man geit? Ich fürchte, dass die rausgehenden Befehle in der Firmware auf die der Ventilantriebe beschränkt ist. Oder?

mfg

Bernd

Ja Nee, aber ich kann ja, vom Modul zum Sender, einen elektronischen Schalter (4066 oder Fet`s ) dazwischen legen.
Wenn dann mal eine Nachricht nicht ankommt, ist es nicht so schlimm.

Das mit der Anpassung ist klar, … das verstehe ich.
Die Anzahl wird, glaube ich viel höher als 12, werde wohl auf eine Übertragung von möglichst allen Rückgabewerten gehen.

Auch zum PIC ist mir eine direkte Erkennbarkeit der Parameter immer wichtiger geworden.

Hi,

dann lass uns doch erst mal die, die wir schon haben, checken und auf den aktuellen Stand bringen. In der Bildanlage die, welche ich begriffen habe; sei Bitte so nett und ergänze mal die für mich unklaren. Ich ergänze das dann im Skript.

Friemel ich Dir auch noch rein.

mfg

Bernd

Hab`gerade ein Progrämmchen geschrieben, dass 2 Funksteckdosen über das HID-Modul betüttelt.

Wer mehr Steckdosen schalten will, ruft das Program nochmal auf :wink:

Ist jetzt fertig, zwei lecker Bildchen. Das IPSymcon-Webfenster läst sich auch bedienen, Purebasic WebGadget !!

Das Schöne an der USB-HID-Geschichte:
HID-Daten können von zB. meinem PC-Programm betascht werden und IPSymcon bekommt alles mit und kann genauso gut darauf zu greifen.

Das geht über die Serielle nicht. :slight_smile:

Auf besonderen Wunsch habe ich mal ein Layout passend für das FHT8i-Modul geroutet.

FHT8i ?? ( Ansteuerung der Funk-Stellventile ohne FHT-Thermostate)
Hatte ich mal in Bascom mit RS232 gemacht, die Älteren erinnern sich vielleicht… :wink:

Die USB-Buchse sitzt deshalb an der Seite, damit die Sendeleistung durch das Metall der Buchse nicht gehemmt wird.

Damit wird nur eine der Möglichkeiten des USB-HID-Prozessors aufgezeigt:

Bis zu 4 Funk-Stellventile[/b] über die FHT8i-Platine.

Vorteil der FHT8i-Platine:

Fussbodenheizungregelung oder Regelung anderer Heizkörper, bei denen mehr Zeitwert gebraucht werden, als zB. der Thermostat FHT8b möglich macht.

Edit:
Layout ist getestet, waren natürlich Fehler drin, Bestückung: Elko raus 100nF rein, LED raus 1N4148 rein, 3R`s und 1Array dazu, Programm ist getestet, Erklärung der Parameter im RAR-File, nun bin ich zufrieden.
Eine Platine zur Aufnahme von 2 FHT8i - Modulen angefertigt.

Handling:

Bis jetzt gibt man für die Funksteckdosen Hauscode, Gerätecode und
Befehl in den ersten 4 Bytes ein.

zB 31 2 1 0 für
Hauscode 31, Steckdose B Befehl „EIN“ ohne Zeitwert, sprich über USB-HID 31 2 1 0 ausgeben.

Wenn man bei dem Befehl eine 2 einträgt, dann weiß der Kontroller, dass er ein FHT8i (Nr.1) ansteuern soll.

Wenn man bei dem Befehl eine 3 eingibt, ist es das 2. FHT8i - Modul bei einer doppelten Platine. Dann sind 8 Stellantriebe möglich !!

Dann heißt es, zB. für den Befehl: Ventil Nr1 mit 100% auf:
Hauscode 1, Steckdose 255, Befehl 2, sprich über USB-HID 1 255 2 ausgeben.
oder:
Dann heißt es, zB. für den Befehl: Ventil Nr5 mit 100% auf:
Hauscode 1, Steckdose 255, Befehl 3, sprich über USB-HID 1 255 3 ausgeben.

In der Antwort bekommt man dann die Werte mit Quersumme, so wie es in der Anleitung zum FHT8i steht, wieder.

USB_FHT8i_Ansicht.jpg

2550_V7_FHT8i_seit_USB.rar (26.7 KB)

Hier mal eine ungefähre Handhabung des USB-HID Prozessormodules:

1.Schritt: Splitterinstanz anlegen —> I/O HID (Bild Schritt 1 und 2)
2. Schritt: HID-Gerät auswählen --> Übernehmen ( Schritt 3 ), Registervariable dazu anlegen.
3. Schritt: Variablen für die hier 20 IN- und 20 Out-Variablen mit einem Script oder von Hand anlegen ( Schritt 4 )
4. Schritt: Ein Script anlegen, das die Outvariablen beschreibt, wenn das HID-Gerät antwortet. ( Schritt 5)
5. Schritt Ein Script schreiben, das die gewünschten Befehle zum HID-Gerät übergibt.
Hier das FHTi8 Modul, welches in diesem Beispiel " huckepack " (siehe ein Beitrag zurück) sitzt, mit dem Befehl:
Ventil Nr.1 auf 50% aufmachen. ( Schritt 6 )

Hat man kein FHT8i huckepack, will man Funken oder Dimmen:

Für die Funksteckdosenansteuerung 32 1 1 0 = HC(32) Steckd (1) „Ein“ ohne Zeit-toogle(0)
Für die PWM 0 0 0 0 0 0 0 0 0 125 125 = beide Kanäle 50%------Auch für LED-Dimmer geeignet :wink:

Achtung im Script werden Hex-Zeichen verwendet!

Bild 7 zeigt einmal nur die Variablen für diese Beispiel

Ist nicht so schwer oder??? Doch, für mich schon!.

Wenn das Forum keinen Bernd gehabt hätte… sehe ich noch älter aus, Danke Danke!

Scripte in PHP sind nicht meine Welt…
Die HID Variablen habe ich jetzt schon auf 20 erhöht, weil Dallas 18B20 Sensoren in die Aus- und RFM12 Funkmodul in die Ein und Ausgabe da auch noch mit rein soll. Bis zu 4 PWM können noch usw…Programmspeicher hat noch Platz.
Kann bis 64 werden

schritt1.png

schritt2.png

schritt3.png