Wir haben unser Produktspektrum um zwei neue I2C-Baugruppen zum aufschnappen auf die Norm-Hutschiene erweitert. Die Abmessungen der Leiterplatten sind 45,5 mm x 65,5 mm und passen in die WAGO Montagesockel für Kleinplatinen, die auf Standard-DIN-Schienen montiert werden können.
Die Karten gibt es im Onlineshop Horter-Shop. Artikel I2HAE
Analoge Eingabekarte mit 5 Kanälen und 10 Bit Auflösung (I2HAE)
Allgemeines
Die Analog-In Karte verfügt über insgesamt 5 A/D Wandler mit einer Auflösung von 10 Bit. Die Analog-In Karte ist komplett Register gesteuert. Alle Daten werden in les- und schreibbaren Registern gespeichert.
Hardware
Gesteuert werden alle Vorgänge auf der Karte von einem Mikrokontroller (PIC 18F13K22). Dieser stellt die Verbindung zwischen dem I2C-Bus und den A/D-Wandlern her. Er sorgt dafür dass die Daten in den Registern mit einer Frequenz von 80 Hz aktualisiert werden..
Der minimale Wert eines Registers liegt bei 0x0000 (dec. 0) der Maximale 0x03FF (dec. 1023). Die A/D-Wandler messen gegen eine interne Referenzspannung von 2,048 Volt. Somit entspricht der maximale Wert einer messbaren Spannung von 2,048 Volt am Eingang. Mit entsprechenden Eingangswiderständen lässt sich der Messbereich der Karte erweitern.
I2C-Adresse
Wie bei allen Karten kann man die I2C-Adresse innerhalb eines gewissen Rahmens wählen.
I2C-Adressen sind immer als 7+1 Bit Adressen aufgebaut. Das letzte Bit entscheidet darüber ob der Master lesen oder schreiben will.
Auf gerade I2C-Adressen wird immer geschrieben – von ungeraden Adressen wird immer gelesen.
Beim Raspberry muss die 7-Bit Adresse angegeben werden. Die Umschaltung des letzten Adress-Bits wird vom PI selbst gesteuert.
Analog IN | 8-Bit dez | 8-Bit hex | 7-Bit dez | 7-Bit hex |
OFF OFF OFF OFF | 16 | 10 | 8 | 08 |
OFF OFF OFF ON | 18 | 12 | 9 | 09 |
OFF OFF ON OFF | 20 | 14 | 10 | 0A |
OFF OFF ON ON | 22 | 16 | 11 | 0B |
OFF ON OFF OFF | 24 | 18 | 12 | 0C |
OFF ON OFF ON | 26 | 1A | 13 | 0D |
OFF ON ON OFF | 28 | 1C | 14 | 0E |
OFF ON ON ON | 30 | 1E | 15 | 0F |
ON OFF OFF OFF | 48 | 30 | 24 | 18 |
ON OFF OFF ON | 50 | 32 | 25 | 19 |
ON OFF ON OFF | 52 | 34 | 26 | 1A |
ON OFF ON ON | 54 | 36 | 27 | 1B |
ON ON OFF OFF | 56 | 38 | 28 | 1C |
ON ON OFF ON | 58 | 3A | 29 | 1D |
ON ON ON OFF | 60 | 3C | 30 | 1E |
ON ON ON ON | 62 | 3E | 31 | 1F |
Datenübertragung
Eigentlich ist die Karte zum Messen da und zum Auslesen der gemessenen Spannungen. Es gibt aber einen Wert den man schreiben kann, den Register-Zeiger. Mit ihm ist es möglich einen bestimmten Kanal auszulesen. er ist 1 Byte lang.
Nach Spannung ein ist das Register auf Null gestellt. Somit werden die Analogwerte ab Kanal 0 gelesen.
Bei der Datenübertragung können beliebig viele Bytes gelesen werden.
- die Anzahl der Bytes muss immer ungerade sein (1, 3, 5 usw.)
- alle Registerwerte werden mit dem LSB voran gelesen
- alle überflüssigen Leseoperationen werden ignoriert.
Im einfachsten Fall liest man immer 11 Bytes von der Analogeingabekarte und bekommt so alle Werte wie folgt in einem Datenarray abgelegt
Byte 1 Zeiger
Byte 2 Analogwert 1 Low Byte
Byte 3 Analogwert 1 High Byte
Byte 4 Analogwert 2 Low Byte
Byte 5 Analogwert 2 High Byte
Byte 6 Analogwert 3 Low Byte
Byte 7 Analogwert 3 High Byte
Byte 8 Analogwert 4 Low Byte
Byte 9 Analogwert 4 High Byte
Byte 10 Analogwert 5 Low Byte
Byte 11 Analogwert 5 High Byte
Beispiel für I2C-RS232-Modem 2 oder I2C-USB-Modem
Im Beispiel wird mit dem Befehl 51 das Auslesen der 11 Bytes von der Analogkarte angest0ßen. Die empfangenen Daten werden in das Array D(x) abgelegt.
Aus dem Byte D(2) und D(3) wird dann der erste Analogwert berechnet indem man das High-Byte mit 255 multipliziert und das Low-Byte einfach hinzuaddiert. Eine Multiplikation mit 255 entspricht ein links schieben um 8 Bitstellen.
Option Explicit 'Globale Variablen anlegen, die in der Funktion "Modem_Antwort" 'beschrieben werden Dim FB 'Frame Befehl Dim FA 'Frame Anzahl Dim FE 'Frame Ende Dim D(1 To 128) 'Daten
Private Sub Command_LESEN_Click() 'Der Befehl I2C-Data 33 hex = 51 dez. 'liest oder schreibt bis zu 128 Bytes vom I2C-Slave Dim Adr Adr = Combo_AIN_Adresse 'Adresse aus Cobo-Box SENDBYTE (51) 'Befehl 51 = I2C-DATA SENDBYTE (3) 'Frame Anzahl = 3 SENDBYTE (Adr + 1) 'Bus-Adresse des I2C-ADC zum Lesen SENDBYTE (0) 'Adresse MSB SENDBYTE (11) '11 Byte lesen SENDBYTE (4) 'Endekennung If Modem_Antwort = True Then TextBox_AIN1.Text = D(3) * 256 + D(2) TextBox_AIN2.Text = D(5) * 256 + D(4) TextBox_AIN3.Text = D(7) * 256 + D(6) TextBox_AIN4.Text = D(9) * 256 + D(8) TextBox_AIN5.Text = D(11) * 256 + D(10) Else MsgBox ("Fehler bei I2C-AIN") End If End Sub
Hallo,
ich habe das Problem, das das LB des Eingang 1 immer 0 ist. Alle anderen Eingänge funktionieren einwandfrei und die Messung ist sehr Präzise.
Außerdem passen die gelesenen bytes nicht zur Beschreibung.
Byte 1 > immer 0
Byte 2 > HB IN 1
Byte 3 > LB IN 2
Byte 4 > HB IN 2
….
Byte 9 > LB IN 5
Byte 10 > HB IN 5
Die Berechnung funktioniert einwandfrei für die Eingänge 2-5 mit der angegeben Reihenfolge.
Hallo Timo,
das liegt an der Python-Version oder am OS.
Manche PIs haben ein Problem mit dem Clock-Stretch.
Wir konnten aber noch nicht genau ergründen wie es dazu kommt. Mit C tritt der Fehler nicht auf.
Hallo Timo,
das liegt an der Python-Version und an der OS-Version vom PI.
Manche Konstellationen haben Probleme mit dem Clock-Stretch.
Unter C tritt das Problem nicht auf.
Sehr geehrter Herr Horter,
ich habe vor kurzem den Bausatz I2HAE „Analoge Eingangskarte 5 Kanal 10 Bit“ bestellt.
Jetzt habe ich leider ein kleines Problem damit!
Und zwar liefert der Controller am Raspberry Pi4 keine Daten und wenn ich die Karten an einen Raspberry Pi2 anschließe liefert der 1. Kanal falsche Daten.
So wie es aussieht werden die Daten um 1 Byte verschoben in die Register gelegt.
Beispiel:
Lese i2c_block_Daten mit python smbus Library:
Spannung an den Kanälen 1,2,5 = 0VDC
Daten byteweise
0,0,0,0,0,0,0,0,0,0,255
Spannung an den Kanälen 1,2,5 = 3,3VDC
Daten byteweise
0,1,66,1,0,0,0,0,66,1,255
Spannung an den Kanälen 1,2,5 = 5,3VDC
Daten byteweise
0,2,10,2,0,0,0,0,10,2,255
Spannung an den Kanälen 1,2,5 = 7,6VDC
Daten byteweise
0,2,225,2,0,0,0,0,255,2,255
Spannung an den Kanälen 1,2,5 = 10VDC
Daten byteweise
0,3,203,3,0,0,0,0,203,3,255
Kann es sein, dass ich hier was falsch mache, oder haben wir hier ggf ein Firmware-Problem??
Vielen Dank für Ihre Hilfe
Mit freundlichen Grüßen
Stefan A.
Hallo,
unser PIC auf der Analogkarte verwendet Clock-Stretching d.h. der Slave zeiht für einen kurzen Moment die SCL-Leitung auf GND. Der Master muss so lange warten, bis der Slave SCL wieder frei gibt.
Die smbus-Library von Python unterstützt keinen Clock-Stretch :-(.
Hier sind die entsprechenden Informationen zu finden:
https://learn.sparkfun.com/tutorials/raspberry-pi-spi-and-i2c-tutorial/all
Hallo,
danke für die Info.
Ich hab Ich habe mir noch von Ihrer Seite das c Beispiel geladen und für mich adaptiert!.
https://www.horter.de/blog/i2c-analog-input-am-pi-mit-c-einlesen/
Diese rufe ich auf und lese dann die Ausgabe ein, damit ich sie weiterverarbeiten kann.
Dass der Raspberry kein Clock-Stretching unterstützt scheint doch ein Hardware Problem zu sein, oder?:
http://www.advamation.com/knowhow/raspberrypi/rpi-i2c-bug.html
Gibt es denn eine Erklärung dafür, warum das C-Programm auf dem Raspberry funktioniert, das python Programm jedoch nicht?
nach meiner Info unterstützt der BCM-Chip auf dem Raspberry schon den Clock-Stretch.
Die SM-Bus Bibliothek (i2c/smbus.h) ignoriert den Clock-Stretch.
Das C-Programm kommt ohne die smbus.h aus.
Komischerweise funktioniert bei vielen Kunden auch die SM-Bus-Lib anscheinend.
Vielleicht hängt es auch vom Typ des BCM-Chip ab.
Hallo,
Gibt es für das Modul einen Beispiel Code für Arduino bzw. ESPxx ?
Mit freundlichen Grüßen
Ricardo
ja, hier Arduino I2C Analog IN Karte
Hallo,
Sie haben anhand von Beispielen dargestellt, wie man die digitalen I2C Karten in FHEM einbinden kann.
Haben Sie solch tolle Beispiele auch für Ihre analogen Karten (ein -und Ausgabe) ?
Vielen Dank im voraus.
Mit freundlichen Grüßen
Theo Klein
Hallo,
wir sind dran Beispiele für die analogen Karten zu programmieren und in den Blog zu stellen.
Hallo,
ich habe das I²C-Analog-Input 5 Kanal 0-10 V 10 Bit Modul gekauft und es an einen Raspberry Pi angeschlossen, um eine Spannung von 5-10 V zu messen. An dem Kanal 1 habe ich eine Gleichspannung von 8 V angeschlossen. Beim Auslesen (i2cget -y 1 0x1f) des Moduls mit dem Raspberry Pi wird immer der Wert „0“ bzw. „0X00“ zurückgeliefert. Auch beim Ändern der Eingangsspannung ändert sich der Rückgabewert nicht. Woran kann dies liegen, was wird von mir falsch gemacht?
Vielen Dank im Voraus.
Gruß Ricardo
Hallo Ricardo,
der Befehl i2cget -y 1 0x1f liest nur ein Byte vom I2C-Slave.
Bei der Analog-Eingangskarte ist das erste Byte der Zeiger. Dieser steht im Normalfall auf 0
Also stimmt die Antwort, die Sie erhalten.
Um Analogwerte zu lesen müssen Sie mindestens 3 Bytes zusammenhängend lesen.
Das geht meines Wissens in der Konsole nicht. Das muss mit Phyton oder C gemacht werden.
Im Beitrag oben ist der Aufbau der Register beschrieben.
Beispiel mit Phyton: I2C-Analog-Input-Modul mit Python und TkInter
und ein Beispiel für C: I2C-Analog Input am PI mit C einlesen
Hallo,
mit der Anleitung hat es auf Anhieb funktioniert. Vielen Dank für ihre Unterstützung.
Mit freundlichen Grüßen
Ricardo
Hallo Herr Horter,
ich habe zwei Fragen:
1. Es ist beim einem Pt100 Sensor, der 4..20mA ausgibt, sinnvoller einen Messwandler einzusetzen oder nach dieser Methode https://www.horter.de/blog/20ma-sensor-an-i2c-analogkarte/ zu verfahren?
2. Gibt es ein Beispielprogramm in Python zum Auslesen eines 0..10V Sensors und zum adresssieren eines Aktors mit der Analog-Output-Karte?
Mit freundlichen Grüßen
S. Ehrismann
Hallo,
1. die über einen Messwandler bekommen Sie bessere Ergebnisse, weil Sie einen Bestimmten Temperaturbereich auf 0-10V skalieren können.
bei der Schaltung mit dem Spannungsteiler haben Sie immer einen kleineren Analogbereich zur Verfügung und büßen damit Genauigkeit ein.
2. Python-Programmbeispiele habe ich im Blog veröffentlicht:
I2C-Analog-Input-Modul mit Python und TkInter
I2C-Analog-Output-Modul mit Python und TkInter
Hallo Herr Horter,
beim Betrieb des Sensors über den Messwandler an der Inputkarte ist ein Problem aufgetreten. Der Messwandler (http://brodersencontrols.com/images/PXC-10_11.pdf) gibt das Ausgangssignal über zwei Drähte aus. Zwischen diesen beiden kann ich 0-10V messen, allerdings nicht zwischen einem der Drähte und Ground der Inputkarte. Nun habe ich versucht, zwei Groundpins der Karte zu isolieren, indem ich die Leiterbahnen ein bisschen manipuliert habe, um beiden Drähte des Messwandlers anschließen zu können. Leider brachte dies nicht den gewünschten Erfolg.
Ist Ihnen so ein Problem schon einmal untergekommen oder haben Sie noch eine Idee, wie man dem Problem bei kommt?
Mit freundlichen Grüßen
S.Ehrismann
Hallo,
die GND-Leitung vom Messwandler muss mit dem GND der Analogkarte verbunden werden, sonst kann die nicht messen.
Wenn das nicht geht oder Sie das nicht machen wollen brauchen Sie einen Trennverstärker.
Gruß, JH
Hallo,
ich habe das Analog – Input – Modul zusammen mit dem I2C – Repeater am Raspberry angebracht. Allerdings scheint da was nicht zu stimmen, das Tool i2cdetect liefert ein device mit Adresse 0x08. Die Jumper auf dem Modul sind so eingestellt, dass es die Adresse 0x10 hat. Auch ein Wechsel auf Adresse 0x30 änderte daran nix. Wenn ich o.g. Bytefolge zum Auslesen aller 5 Kanäle sende, bekomme ich 0xFFFFFFFF zurück. Ich kann via i2cset und get 1 Byte schreiben und auch wieder auslesen (wobei die angenommenen Werte zwischen 0 und 5 liegen, höhere Werte werden immer als 5 gespeichert). Muss ich evtl. dem Repeater zuerst eine bestimmte Bytefolge schicken sodass ich das AD – Modul ansprechen kann oder ist der Repeater diesbezüglich „durchsichtig“?
PS: Am Eingang des AD-Moduls hängt ein PT1000 Messumwandler und liefert (gemessen) 0-10 Volt.
Für Ihre Unterstützung bin ich sehr dankbar.
Mit freundlichen Grüßen
Stefan Z.
Hallo Stefan Z.,
Adresse 0x08 für die analoge eingangskarte ist richtig. (Siehe Blogbeitrag I2C-Module am Raspberry PI)
Die Adresse sollte sich auch ändern wenn Sie die Jumper anders einstellen und die Spannung an der Karte einschalten.
Zum Auslesen der Analogkarte müssen Sie 11 Bytes hintereinander also OHNE I2C-Stop lesen.
Über die Kommandozeile geht das glaube ich nicht.
Mit Phyton ist das hier beschrieben: I2C-Analog-Input-Modul mit Python und TkInter
Hallo,
gibt es eine einfache möglichkeit einen PT 1000 Fühler an den Analog Eingängen zu betreiben ?
Hallo,
Die beste Lösung ist einen Messwandler PT1000 / 0-10V einzusetzten.
Die gibt’s relativ günstig im Netz.
Wenn’s nicht allzu genau werden muss kann man den PT1000 über einen Spannungsteiler an die Analogkarte anschließen.
Dabei sollte der Strom durch den Widerstand nicht mehr als 2mA betragen, weil der sich sonst selbst erwärmt und die Messung noch mehr verfälscht.
Hier mal die Widerstandswerte vom PT100 (R-PT1000) zwischen -40 .. +150 °C
Nimmt man einen Vorwiderstand von 8,87 kOhm und hängt dann den Spannungsteiler an 12V ergibt sich ein Mess-Strom (Imess) von ca. 1,2 mA der wiederum einen Spannungsabfall am PT1000 von 1,04 und 1,8V zur Folge hat.
Eine Spannung bis 2,048V kann direkt am PIC angeschlossen und gemessen werden.
Dazu am entsprechenden Kanal den Vorwiderstand z.B. R1 brücken und den anderen Widerstand z.B. R11 nicht bestücken.
Hallo.
Wir haben in unserer Wasserversorgung noch einen alten Registrierempfänger mit alten Farbnadeln die die Kurven plotten auf Papier. Ich möchte diesen durch modernere Technik ersetzen. Der „Drucker“ hat 0-10V Eingänge was natürlich hier gleich passen würde. Ich würde jedoch aber 15 Eingänge benötigen. Kann man mittels ändern der Adressen 3 Boards gleichzeitig nutzen?
Vielen Dank und Grüsse aus der Schweiz
Hallo,
Sie können von den analogen Eingangskarten bis zu 16 Stück am I2C-Bus anschließen.
Drei Karten sind also überhaupt kein Problem.
Grüße in die Schweiz
Hallo,
Ich habe ein I2AE Modul von Ihnen welches auch einwandfrei funktioniert. Jetzt würde ich aber gerne einen Honeywell Feuchtigkeitssensor an dem Modul nutzen. Das Problem ist nun, dass der Sensor bei 50% Luftfeuchte nur 0,5V als Signal ausgibt. Lassen sich solche kleinen Spannungen mit dem Modul zuverlässig messen?
Gruß,
Stefan L.
Hallo Stefan,
der Analogeingang am PIC ist für Werte zwischen 0 und 2,048V ausgelegt.
Mit den Widerständen 120k und 30k wird die 0-10V Messspannung auf diesen Wert heruntergeteilt (Spannungsteiler 1:5)
Sie können bei dem gewünschten Kanal einfach den 30kOhm Widerstand auslöten und den 120k überbrücken.
z.B. für Kanal 1
R1 brücken
R11 auslöten
Dann macht der Kanal 0..2V anstatt 0..10V.
Hallo Stefan,
ich habe eine ähnlich gelagerte Frage.
Der zu messende Bereich liegt zwischen 0 und 3,5V – wie müsste ich die Widerstände anpassen, dass.die Schaltung sauber funktioniert?
Danke für eine kurze Antwort.
Viele Grüße
Carsten
bei 0-3,5V braucht es wieder einen Spannungsteiler.
Die Formel ist Ue = (2V:R11)*(R1+R11)
0-3,5V mit R1=120k und R11=160k
0-4,0V mit R1=100k und R11=100k
0-5,0V mit R1=150k und R11=100k
0-10V mit R1=120k und R11=30k (Standard)
0-22V mit R1=120k und R11=12k
Hello,
I love it .
I want 10 pieces of I2C analog input 5 kanale 0..10V 10bit.
How can i buy them? how much are they?
Please help me get them.
Hello Suceava,
you can buy the items in our onlineshop
https://www.horter-shop.de/en/i2c-din-rail-modules/172-kit-i2c-analog-input-module-5-channel-10-bit-4260404260745.html
Best wishes to Romania