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 I2HAA
Analoge Ausgangskarte mit 4 Kanälen und 10 Bit Auflösung (I2HAA)
Allgemeines
Die Analog-Out Karte verfügt über insgesamt 4 D/A Wandler mit einer Auflösung von 10 Bit. Die Analog-Out Karte ist komplett Register gesteuert. Dies bedeutet es gibt keine Befehle! Einzig der Inhalt der Register steuert das Verhalten der Karte. 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 D/A-Wandlern her. Er sorgt dafür dass die Daten aus den Registern an die DA-Wandler MCP4812 gesendet werden. Die Ausgangsspannung lässt sich mit einer Breite von 10 Bit gegen eine interne Referenzspannung von 2,048 Volt einstellen. Die nachgeschalteten Operationsverstärker sorgen für eine Ausgangsspannung im Bereich von 0 – 10 Volt. Der minimale Wert liegt bei 0x0000 (dec. 0) der Maximale 0x03FF (dec. 1023). Der maximale Wert entspricht einer Spannung von 2,048 Volt am Ausgang des MCP4812 bzw. 10,24 Volt am Ausgang der Operationsverstärker.
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. Somit ergibt sich das auf der Adresse 0xB0 (176 dec.) Daten auf die Karte geschrieben und auf der Adresse 0xB1 (177 dec.) Daten von der Karte gelesen werden Mittels Jumper 3 lässt sich die Basisadresse der Karte einstellen.
Wird der Jumper in die Position OFF gestellt, so ist die Basisadresse 0xB0. Daraus ergeben sich folgende Adressen:
176 dez = B0 hex 178 dez = B2 hex 180 dez = B4 hex 182 dez = B6 hex 184 dez = B8 hex 186 dez = BA hex 188 dez = BC hex 190 dez = BE hex
In der Position ON ist die Basisadresse 0xD0. Daraus ergeben sich folgende Adressen:
208 dez = B0 hex 210 dez = D2 hex 212 dez = D4 hex 214 dez = D6 hex 216 dez = D8 hex 218 dez = DA hex 220 dez = DC hex 222 dez = DE hex
Datenübertragung
Bei der Datenübertragung können beliebig viele Bytes gesendet oder empfangen werden. Dabei gelten vier Regeln.
- die Anzahl der Bytes muss immer ungerade sein (1, 3, 5 usw.)
- es muss mindestens ein Byte übertragen werden
- alle Registerwerte werden mit dem LSB voran gesendet
- alle überflüssigen Schreib- oder Leseoperationen werden ignoriert.
Im einfachsten Fall schreibt man immer 3 Bytes zur Analogkarte.
Byte 1 Zeiger = 0 Byte 2 Analogwert 0 Low Byte Byte 3 Analogwert 0 High Byte
Würde man weiter 2 Bytes übertragen landen diese im Analog-Kanal 1
Byte 1 Zeiger = 0 Byte 2 Analogwert 0 Low Byte Byte 3 Analogwert 0 High Byte Byte 4 Analogwert 1 Low Byte Byte 5 Analogwert 1 High Byte
oder direkt nur auf Kanal 3
Byte 1 Zeiger = 3 Byte 2 Analogwert 3 Low Byte Byte 3 Analogwert 3 High Byte
Beispiel für I2C-RS232-Modem 2 oder I2C-USB-Modem
Im Beispiel wird mit dem Befehl 51 das Übertragen der 3 Bytes zur Analogausgabekarte angest0ßen. Die Fehlerbehandlung soll nur einen Programmabsturz verhindern wenn in den feldern keine Zahlen eingegeben wurden..
Private Sub Command_AOUT1_SCHREIBEN_Click() 'Der Befehl I2C-Data 33 hex = 51 dez. 'liest oder schreibt bis zu 128 Bytes vom I2C-Slave Dim Adr, HBy, LBy Adr = Combo_AOUT_Adresse 'Adresse aus Cobo-Box On Error GoTo ErrorHandler 'Für falsche Eingaben im Feld If TextBox_AOUT1.Text > 1023 Then MsgBox ("Im Feld WERT nur Zahlen <= 1023 erlaubt") TextBox_AOUT1.Text = 1023 Else 'HIGH-Byte berechnen HBy = Fix(TextBox_AOUT1.Text / 256) 'LOW-Byte berechnen LBy = TextBox_AOUT1.Text - HBy * 256 SENDBYTE (51) 'Befehl 51 = Daten senden SENDBYTE (5) 'Frame Anzahl = 5 SENDBYTE (Adr) 'Bus-Adresse des PCF 8574 SENDBYTE (0) 'Adresse MSB SENDBYTE (0) 'Kanal 0 SENDBYTE (LBy) 'LOW-Byte schreiben SENDBYTE (HBy) 'HIGH-Byte schreiben SENDBYTE (4) 'Endekennung End If If Modem_Antwort = False Then MsgBox ("Fehler bei I2C-DATA") End If ErrorHandler: Select Case ERR.Number 'Fehlernummer auswerten. Case 0 'ok Case 13 MsgBox ("Im Feld WERT nur Zahlen erlaubt") TextBox_AOUT1.Text = "0" Case Else MsgBox ("Fehler " & ERR.Number) End Select End Sub
Beispiel für Arduino
/* ============================================== Test I2HAA board ============================================== */ #include <Wire.h> #define I2C_AOUT_ADDR 176 >> 1 // I2HAA-Addresse als 7 Bit (Alle Jumper unten) int AW_CH0=0; // Analogwert Kanal 1 int AW_CH1=0; // Analogwert Kanal 2 int AW_CH2=0; // Analogwert Kanal 3 int AW_CH3=0; // Analogwert Kanal 4 byte LBy=0; // Low-Byte byte HBy=0; // High-Byte void setup() { Serial.begin(9600); // Serielle Schnittstelle konfigurieren Wire.begin(); // I2C-Pins definieren } void loop() { AW_CH0 = 250; // Spannung am Ausgang 1 z.B. 2,5V AW_CH1 = 500; // Spannung am Ausgang 2 z.B. 5V AW_CH2 = 750; // Spannung am Ausgang 3 z.B. 7,5V AW_CH3 = 1000; // Spannung am Ausgang 4 z.B. 10V // ============== Kanal 0 schreiben ================================================ HBy = AW_CH0 / 256; //HIGH-Byte berechnen LBy = AW_CH0 - HBy * 256; //LOW-Byte berechnen Wire.beginTransmission(I2C_AOUT_ADDR); // Start Übertragung zur ANALOG-OUT Karte Wire.write(0); // Kanal schreiben Wire.write(LBy); // LOW-Byte schreiben Wire.write(HBy); // HIGH-Byte schreiben Wire.endTransmission(); // Ende delay(20); // ============== Kanal 1 schreiben ================================================ HBy = AW_CH1 / 256; //HIGH-Byte berechnen LBy = AW_CH1 - HBy * 256; //LOW-Byte berechnen Wire.beginTransmission(I2C_AOUT_ADDR); // Start Übertragung zur ANALOG-OUT Karte Wire.write(1); // Kanal schreiben Wire.write(LBy); // LOW-Byte schreiben Wire.write(HBy); // HIGH-Byte schreiben Wire.endTransmission(); // Ende delay(20); // ============== Kanal 2 schreiben ================================================ HBy = AW_CH2 / 256; //HIGH-Byte berechnen LBy = AW_CH2 - HBy * 256; //LOW-Byte berechnen Wire.beginTransmission(I2C_AOUT_ADDR); // Start Übertragung zur ANALOG-OUT Karte Wire.write(2); // Kanal schreiben Wire.write(LBy); // LOW-Byte schreiben Wire.write(HBy); // HIGH-Byte schreiben Wire.endTransmission(); // Ende delay(20); // ============== Kanal 3 schreiben ================================================ HBy = AW_CH3 / 256; //HIGH-Byte berechnen LBy = AW_CH3 - HBy * 256; //LOW-Byte berechnen Wire.beginTransmission(I2C_AOUT_ADDR); // Start Übertragung zur ANALOG-OUT Karte Wire.write(3); // Kanal schreiben Wire.write(LBy); // LOW-Byte schreiben Wire.write(HBy); // HIGH-Byte schreiben Wire.endTransmission(); // Ende delay(20); }
Finder-Dimmer über Analogwert steuern
Der Finder-Dimmer 15.11.8.230.0400 verfügt über einen analogen Eingang als Sollwert-Vorgabe von extern.
Leider liegt an dem Eingang eine Spannung Spannung an, die der Operationsverstärker LM324, der in unseren Karten als Ausgangstreiber verbaut ist, nicht auf Null Volt ziehen kann. Es bleibt eine kleine Restspannung anstehen, die dazu führt, dass die der Dimmer noch einen kleinen Sollwert bekommt und die angeschlossene Lampe leicht glimmt.
FINDER Dimmer 15.11.8.230.0400 mit I2C-Analog-Ausgangskarte ansteuern
Wenn unsere Analogkarte eingesetzt werden soll um z.B. per FHEM, MQTT, Codesys, LogiCals oder…. vom Raspberry-Pi oder Arduino den Finder-Dimmer zu steuern muss ein Präzisions-OPV eingesetzt werden. Der ist Pin-Kompatibel zum LM324. Bitte bei der Bestellung erwähnen, dann mache ich Ihnen ein Angebot über den Präzisions-OPV.
Guten Tag!
Gibt es eventuell auch die Möglichkeit 0-12V auszugeben? Kann man da einfach einen andern OPV nehmen?
Danke, lg
Hallo Philipp,
klar geht das Der LM324 kann bis zu 30V regeln.
Der analoge Ausgang am PIC mach 2,048V
Über den Spannungsteiler 5:1 R9=12,0k und R14=3,0k kommen die 0..10V am Ausgang raus.
Verändert man den Spannungsteiler, kann man auch andere Ausgangsspannungen machen.
Im Fall von 0..12V würde ich R9=15,0k und R14=3,0k einbauen.
Sie können jeden Kanal einzeln über den Spannungsteiler einstellen.
Es ist also möglich den ersten Kanal mit 0-12V und die anderen Kanäle mit 0-10 Volt oder 0-5V zu betreiben.
Ich habe einige Präzisionswiderstände mit 0,1% Toleranz vorrätig.
Bitte bei der Bestellung Sonderwünsche im Feld Bemerkungen angeben. Dann lege ich die richtigen Widerstände für den Spannungsteiler bei.
Gruß Jürgen Horter
Hallo Horter & Kalb-Team,
gibt es für diesen Bausatz auch irgendwo technische Daten?
Min/Max Eingangsspannung, min. Eingangsstrom, max. Eingangsstrom bei Volllast, max. Ausgangsstrom, I²C Spannung, usw.
Steht das tatsächlich nirgends und hat seit 8 Jahren wirklich niemand danach gefragt? Oder habe ich das schlichtweg übersehen?
VG
Michael
Hallo,
auf der Seite SPS-Karten für Raspberry-PI habe ich die wichtigsten Daten aufgelistet.
Ansonsten stehen auch Maximalwerte im Datenblatt LM324N
Gruß, JH
Hallo zusammen,
ich möchte hier ein Problem schildern und fragen, ob evtl. auch sonstwer diese Erfahrung gemacht hat und gar eine Lösung parat hat.
Ich verwende zwei dieser Bausteine I2HAA-Bk mit den Adressen 0x58 und 0x59.
Nach einiger Zeit (das kann 1 Tag, wenige Tage oder sogar bis zu 2 Wochen sein) verschwindet der Baustein mit der Adresse 0x59.
Überwachen tut dies ein Script, das alle 60 Sekunden ‚ic2detect -y 1‘ ausführt.
Probiert habe ich einiges (IC-Tausch, Positionstausch der Karten, Umdressieren, Nachlöten).
Ergebnis:
# Es fällt immer der Baustein mit der Adresse 0x59 aus,
* egal welcher IC drinsteckt,
* egal welcher der beiden Baustein 0x59 codiert ist
* egal an welcher Stelle im Bus er sich befindet
* egal an welcher Stelle im Schaltschrank sich die Platine befindet (ok, nur zwei Positionen getestet)
# Nach Verschwinden von 0x59 taucht manchmal kurzzeitig die Adresse 0x5a im Log auf
Nebenbei habe ich noch einige DI und DO Karten in Betrieb. Dort tritt dieses Verhalten nicht auf.
Nun habe ich die Karten beide auf 0x68 und 0x69 umgejumpert und bin gespannt.
FG
Hallo Alexander,
wenn die Karte am Bus nicht mehr erreichbar ist, hat sie sich aufgehängt.
Selbst der eingebaute und aktivierte Watchdog kann die nicht aufwecken.
Das kann folgende Ursache haben:
1. Zu viele Daten zu schnell gesendet.
Der PIC braucht einen kurzen Moment bis er die daten zu den DA-Wandlern gesendet hat.
Wenn in dieser Zeit wieder Daten kommen, startet die ISR durch den Interrupt erneut und ruft sich quasi selber noch einam auf.
2. EMV-Störungen
3. Zu lange Busleitungen
Einiges haben Sie ja schon ausgeschlossen.
Können Sie im Programm den Analogwert und alle 500ms schreiben?
Geben Sie mal bitte kurz Bescheid, ob der Fehler mit den anderen Adressen auch auftritt.
Hallo,
danke für die ausführliche Antwort. Zur Ergänzung lässt sich noch sagen, dass auf dem PI Codesys läuft (mit Lizenz, also länger als nur 2h) allerdings werden die Analogkarten derzeit noch nicht angesteuert. Einzig eine der DO-Karten läuft im Dauertestbetrieb als Blinker.
Zu den Punkten im Detail.
1. Bewusst schreibe ich noch keine Daten. Ob codesys dennoch irgendwas schickt, weiss ich nicht.
2. Da habe ich in der Tat am WE einige potentielle Störquellen entschärft – hoffentlich.
3. 15m bis 20m, allerdings verwende ich ihren Treiber für lange Busleitungen.
Ich werde weiter berichten.
Guten Morgen,
gestern habe ich die Schaltung in Betrieb genommen. Bereits nach kurzer Zeit verschwand eine der beiden Karten. Nach Wiederbelebung lief die Karte wieder. Danach verschwand in unregelmässigen Abständen mal die eine, dann die andere Karte (immer wiederbelebt) und heute Nacht verschwand (laut Logfile) gegen 1 Uhr die Karte mit Adresse 68 und gegen 2:20 die mit Adresse 69.
Das Benutzen der Karten scheint ihr „Verschwinden“ zu fördern.
Kurz zum System: Raspberry 3B+, Codesys, Raspbian Buster
Als erste Massnahme habe ich versucht, den I2C-Takt zu senken (ich denke, der Standardwert ist 100kHz) und den Raspberry zu rebooten. Das hat aber nicht geholfen, eine Karte ist schon wieder weg.
Nun muss ich mal gucken, ob es in Codesys Möglichkeiten gibt, die Schreibzugriffe zu reduzieren.
An meiner Test-SPS (ohne Lizenz, also stoppt die Runtime nach zwei Stunden) ist das Absturzverhalten momentan nicht festzustellen. Der Raspberry selbst laeuft seit Tagen durch und per „ic2detect -y 1“ sind die Karten bislang jederzeit auffindbar.
Es scheint auch möglich zu sein, in Codesys die Anzahl der Schreibzugriffe zu reduzieren, wenn man den FB nur nach Ablauf eines Intervalls aufruft.
Die 500ms-Vorgabe, die sie, Herr Horter, vorgeschlagen haben lässt sich so gut einhalten.
Demnächst kommt zumindest eine der Karten wieder in die SPS mit Lizenz. Dort wird sie dann aber kontrolliert angesteuert, Mindestintervall 500ms.
Hallo,
das Problem scheint behoben. Die Karte arbeitet nun seit locker 3 Wochen problemlos unter Codesys.
Wie empfohlen, habe ich die Schreibrate runtergesetzt und zwar auf 1/s. Dies geht meines Wissens aber nur, wenn man ihre (oder selbstgeschriebene) FBs verwendet, denn nur so hat man die Kontrolle, wann auf die Karte(n) zugegriffen wird. Die Treiber dagegen schreiben am Ende eines jeden Zyklus.
Also, vielen Dank für die FBs.
FG
Ich bräuchte diese Gerät eventuell um von einem Arduino eine Wirbelstrombremse eines Prüfstandes zu versorgen.
Dabei ist es ganz wichtig das die Spannung am Analogausgang konstant bleibt. Also keine Schwankungen hat.
Ist das damit realisierbar wenn ich eine konstante Spannungsversorgung anlege?
Danke!
Hallo,
der Operationsverstärker regelt die Ausgangsspannung auf den digitalen Ausgangswert des DA-Wanlders.
Der Ausgangswert sollte nicht schwanken, wenn der digitale Wert nicht verändert wird.
Sie können ggf. einen Präzisions-OPV mit bestellen, der noch etwas präziser regelt.
Könnten Sie mir noch den Präzisions Operationsverstärker verlinken oder die Bezeichnung nennen.
Haben Sie in ihrem Shop auch eine stabile Spannungsversorgung für diese Platine?
Sie können den bequem im Onlineshop mit dazu bestellen
Horter-Shop – Präzisions-Operationsverstärker Rail-to-Rail
Das 12 .. 24V Netzteil braucht keine spezielle Spezifikation.
Der OPV regelt das schon aus.
Hello,
For those who are interested using this card with micropython on a raspberry pico…
Works fine with a niko universal dimmer 0..10V
Where dimpart contains a value 0-6 (brightness)
inp = selected channel
ud = 0 = increase brightness
ud = 1 = lower brightness
def dimmer(inp,ud):
global dimpar
dimlow = [0,200,100,220,88,32,255]
dimhigh = [0,0,1,1,2,3,3]
if ud:
if (dimpar[inp] 0):
dimpar[inp] = dimpar[inp] - 1
msg = bytearray()
msg.append(dimlow[dimpar[inp]])
msg.append(dimhigh[dimpar[inp]])
i2c1.writeto_mem(0x58, inp, msg)
Greets
Christophe
Guten Abend,
lässt sich diese Karte umverdrahten auf 4-20mA Ausgänge? oder muss es anders bestückt werden.
Ich sehe bei den OPs das die 12V benötigen, laut Datenblatt schaffen die auch viel mehr, ich habe 24V. Würde also auch gehen, oder verfälsche ich dann die Ausgänge?
Vielen Dank schon mal!
Hallo Markus,
die Karte kann nur 0-10V ausgeben. Die ist nicht für 0-20mA Analogsignale gemacht.
Der OPV kann bis 30V gespeist werden. 24V ist also in Ordnung.
Gruß, JH
Hallo!
Ich wollte nur zur Sicherheit nachfragen, ob es tatsächlich in Ordnung ist, an dem mit „12V“ beschrifteten Pin des I2C Analog Output Modul eine Spannung von 29,8V anzuschließen. Dann könnte ich ein weiteres Netzteil vermeiden und meine KNX Spannungsquelle nutzen.
Danke & lg. Peter
Hallo Peter,
wenn Sie den LM324 aus dem Bausatz verwenden ist das kein Problem.
Elektrische Werte
Versorgungsspannung 32, ±16 VDC
Eingangsspannung -0,3 – 32 VDC
Eingangsstrom 0,05 A
Ausgangsspannung 5 – 28 V DC
Igf 1,5 – 3 mA
Bitte aber trotzdem mal prüfen wie sehr der warm wird.
Gruß, JH
Hello
I bought the I2C-Analog Output 4 Kanäle 0-10V 10 Bit, I have connected 3 ouputs to 3 electrical valves, for some reason one of the outputs is giving always low voltage (no change) and the other two are working ok. I have a 24 Voltage power supply. I will appreciate if you have any suggestion.
Regards,
Hello Susana,
this may be due to the output operational amplifier.
You can take the LM324 out of the socket and measure the voltage at the following pins.
Channel 1 = pin 12
Channel 2 = pin 3
Channel 3 = pin 5
Channel 4 = pin 10
A voltage between 0 and 2.048V must be present here when you output an analog value.
This voltage is amplified to 0-10V by the operational amplifier.
Hallo Susana,
das kann am Ausgangs-Operationsverstärker liegen.
Können SIe mal den LM324 aus dem Sockel nehmen und an folgenden Pins die Spannung messen.
Kanal1 = Pin 12
Kanal 2 = Pin 3
Kanal 3 = Pin 5
Kanal 4 = Pin 10
Hier muss eine Spannung zwischen 0 und 2,048V anstehen, wenn Sie einen Analogwert ausgeben.
Diese Spannung wird vom Operationsverstärker auf 0-10V verstärkt.
Hallo,
ich weiß die Kommentare hier sind schon ein bisschen älter.
Ich habe mir die Platine gekauft, damit ich meine LED Stripes über WLAN dimmen kann. Dabei habe ich die Platine an ein ESP Modul gehängt und dann diese an folgendes Netzteil angeschlossen:
https://www.isolicht.com/led-beleuchtung/led-trafo-netzteile/24-v-trafos-ip65/led-trafo-24v-dc-200w-ip67-multi-dimmbar
Die Spannungen passen auch fast immer lediglich im Bereich > 8,5 V weicht die Regelspannung von den Werten, die ich mittels I2C übertrage ab und ich erreiche am Ende ca. 9,5 V.
Kann mir Elektronik Laien jemand sagen, was ich falsch mache, woran das liegen kann?
Viele Grüße
Michael
Hallo Michael,
klemmen Sie mal bitte den Dimmer ab ob die Spannung dann passt.
Messen Sie dann bitte am Dimmer Eingang ob da vielleicht eine Spannung ausgegeben wird.
Bei Dimmern der Firma Finder gibt es das Problem auch.
Sie müssen in diesem Fall einen Präzisions-OPV einsetzten.
Der ist Pin-Kompatibel mit dem LM324. Der Präzisions-OPV Hat die Kraft auch gegen Fremdspannungen den Ausgangswert zu regeln.
Wenn Sie möchten, kann ich Ihnen ein Angebot über so einen Präzisions-OPV machen.
Hallo,
Die Vermutung war richtig, das Netztei (der Trafo) hat eine Spannung von 18 V angezeigt.
Mit dem neuen Präzisions-OPV funktioniert es jetzt genau so wie es soll!
Denke für die schnelle und kompetente Hilfe.
Hallo Herr Horter,
Ich möchte mit der Analog-Ausgangskarte das Signal eines Hall-Effekt Sensoren simulieren. Dazu bräuchte ich eine Angabe zum Innenwiderstand der Ausgänge. Können Sie mir hierzu eine Angabe machen? Wenn ja, ist der Innenwiderstand konstant oder verändert er sich mit der Ausgangsspannung?
Viele Grüße.
Hallo,
die Ausgangsspannung der Analogen Ausgangskarte wird mit einem Operationsverstärker erzeugt.
Da der OPV nachregelt, wenn die Ausgangsspannung durch eine Last absinkt kann man davon ausgehen, dass der Innenwiderstand annähernd Null ist unabhängig der Höhe der Ausgangsspannung und bis zu einer Grenze auch unabhängig der Last.
Für präzise Anwendungen und bei Applikationen, bei der eine externe Spannung abgeregelt werden muss, kann auch ein „Präzisions-OPV mit Rail to Rail Ausgang“ eingesetzt werden.
Gruß, JH
Hallo JH!
Ich suche gerade für ein kleines Industrieprojekt nach einer Möglichkeit, 4 Proportionaldruckregelventile (Festo VPPM) mithilfe eines Controllino Maxi Automation zu steuern. Da dieser nur 2 Analoge Ausgänge hat wäre meine Frage, ob die hier vorgestellte Platine mit dem 24V Controllino kompatibel ist, um 2 weitere Ventile mit 0-10V zu steuern.
Vielen Dank im Voraus!
Jan P.
Hallo,
Laut Hersteller hat der Controllino Maxi Automation der auf den ATmega2560 aufbaut eine I2C Schnittstelle.
Hier ein Link zum Produkt: https://www.controllino.shop/p/controllino-maxi-automation
und ein Link zum Datenblatt
Laut Pinout befindet sich
– SDA auf X1-18 (Arduino-Pin 20) und
– SCL auf X1-19 (Arduino-Pin 21)
Würde mich auf ein Feedback freuen wenn es funktioniert hat.
Hallo,
Vielen Dank für die Antwort, die Kombination funktioniert gut zusammen.
Hallo,
ich habe den I2C Repeater V2 für Raspberry PI und das i2C-Analog-Output erworben, in der Hoffnung dass diese funktionieren würden.
Problem: I2C-Analog-Outpt verwendet I2C-Adressen welche nicht dem Standard entsprechen.
Lediglich die 7Bit-Adressen werden vom Raspberry unterstützt. Wie soll das nun gehen.
sudo i2cdetect -y 1 zeigt mir kein Device an.
Grüße
Hallo,
klar gehen die Module am Raspberry-PI.
Siehe Blogbeitrag I2C-Module am Raspberry PI adressieren
Die Umrechnung der Adressierungsweise ist u.a. hier beschrieben
I2C-Baugruppen adressieren
Wenn der Befehl i2cdetect -y 1 keine Ergebnisse liefert, stimmt etwas mit der Verdrahtung nicht.
Verwenden Sie unseren Repeater?
Hat die analoge Ausgangskarte 5V an der Klemme anliegen?
Messen Sie auch mal zwischen SDA und GNS sowie zwischen SCL und GND.
Im Ruhezustand müssen überall 5V anliegen.
Viel Erfolg
Hallo,
kann diese Karte verwendet werden um Osram Quicktronic DIM EVG zu steuern?
Die EVG haben eine 0-10V Schnittstelle, die jedoch schon selbst 10V (nachgemessen knapp 12) liefert, davon 0,6mA pro EVG. Ich hätte 6 EVG zu steuern wobei immer zwei über einen Ausgang gesteuert werden könnten. Macht dieser „gegenstrom“ dem Modul etwas aus oder kann dieses den Strom übersteuern?
Viele Grüße
Hallo,
das testen wir. Ich schicke Ihnen ein fertiges Modul zu und Sie geben mir bitte ein Feedback ob das funktioniert hat.
Hallo,
das funktioniert optimal, ich habe sogar je zwei EVG pro Ausgang angehängt und auch dann ist dies kein Problem. Die einfache Ansteuerung und der übersichtliche aufbau machen es einem wirklich leicht.
Im Prinzip würden her 1-10V reichen da das EVG unabhängig der Steuerspannung nur bis auf ca. 10% herunter regelt. Darunter wird es aber sowieso schwierig Leuchtstoffröhren zu betreiben, ist aber auch vollkommen ausreichend.
Vielen Dank und viele Grüße
Dear.
I have bought this module a week ago and trying to get it up and running with a Py script.
Is it mandatory to feed 12V (or max 30V) before the module is visible on the I2C network?
I have (only) connected to lower connections of the module (5V+, GND, SDA and SCL), but the module is not visible (with i2cdetect) on my Raspberry Pi Zero W. I Don’t make use of a repeater, it’s directly linked to my RPi0W.
Thank you in advance for your answer.
Kindest regards.
Hello,
it is not necessary to connect the 12V.
The PIC is detected when it hangs on the bus with 5V.
If you do not use a repeater you may need to install 10kOhm resistors between
SCL and + 5V and
SDA and + 5V
But a Repeater is much better!
Best wishes
Thank you for this great product. I use this in combination with an Arduino ethernet to control my led light drivers that require a 0-10V signal, works perfect!
Hallo zusammen,
in einer aufgebauten Anlage wird dieses Analogmodul verwendet um Umrichter anzusteuern.
Nun wurde der Großteil bereits mit Matlab programmiert, nur hängt es noch an der Kommunikation mit dem Analogmodul. Es sind 3 Umrichter angeschlossen.
Kann mir jemand helfen? Zumindest wie es vielleicht grundsätzlich mit der Kommunikation aussehen muss? Was muss gesendet werden?
Bin ein bisschen Ratlos, da ich schon viel ausprobiert habe.
Vielen Dank
Chris
Vielleicht noch eine Info, die Kommunikation funktioniert über einen Arduino Mega 2560.
Grüße
Beispielcode für Arduino finden Sie hier im Blog › Arduino I2C Analog OUT Karte
Das sollte mit jedem Arduino funktionieren wenn die richtigen Pins angeschlossen werden.
Beim Arduino Mega 2560 sind das lt. Pinout Pin 20 (SDA) und Pin 21 (SCL).
Hallo Chris,
um den Analogwert für den ersten FU zu ändern müssen 3 Bytes zum Slave geschickt werden.
Byte 1 0 (Zeiger)
Byte 2 Analogwert 0 Low Byte
Byte 3 Analogwert 0 High Byte
Sollen alle drei Analogwerte gesendet werden müssen sieben Bytes geschickt werden.
Byte 1 0 (Zeiger)
Byte 2 Analogwert 0 Low Byte
Byte 3 Analogwert 0 High Byte
Byte 4 Analogwert 1 Low Byte
Byte 5 Analogwert 1 High Byte
Byte 6 Analogwert 2 Low Byte
Byte 7 Analogwert 2 High Byte
Wichtig!!
Die Bytes müssen nacheinander, also ohne Pause gesendet werden.
Hallo,
ich nutze das Modul mit einem Controllino MEGA über i²c.
Funktioniert einwandfrei!
Hier der Code… bei Fragen einfach melden.
Grüße
#include // Bibliothek einbinden
#include // I2C Schnittstelle einbinden
int Analog_1 = 100; // Kanal 1: 1V
int Analog_2 = 500; // Kanal 2: 5V
int Analog_3 = 1000; // Kanal 3: 10V
int Analog_4 = 800; // Kanal 4: 8V
// Aufteilen des dezimalen zahlenwertes auf 2 Bytes:
byte by_1_1 = Analog_1 & 0xFF; // Byte 1, Kanal 1
byte by_2_1 = (Analog_1-by_1_1)/256; // Byte 2, Kanal 1
byte by_1_2 = Analog_2 & 0xFF; // Byte 1, Kanal 2
byte by_2_2 = (Analog_2-by_1_2)/256; // Byte 2, Kanal 2
byte by_1_3 = Analog_3 & 0xFF; // Byte 1, Kanal 3
byte by_2_3 = (Analog_3-by_1_3)/256; // Byte 2, Kanal 3
byte by_1_4 = Analog_3 & 0xFF; // Byte 1, Kanal 4
byte by_2_4 = (Analog_3-by_1_3)/256; // Byte 2, Kanal 4
byte Kanal = 0; // Kanalauswahl
void setup() {
Wire.begin();
}
void loop() {
Wire.beginTransmission(0xB0>>1); // Beginn der Übertragung
// an Adresse 0xB0 (Hex) = 176 (Dez)
// „>>1“ –> Bitmanipulation: verschiebt Moduladresse um eine Stelle (Bit) nach rechts
// da nur 7 Bits gesendet werden können, Moduladresse aber aus 8 Bits besteht
Wire.write(Kanal); // sende Kanal 0 –> auswählen/aktivieren
// Werte werden gespiegelt mit LSB voran gesendet
// daher zuerst by_1x, dann by_2_x senden
Wire.write(by_1_1); // sende Byte 1 Kanal 1
Wire.write(by_2_1); // sende Byte 2 Kanal 1
Wire.write(by_1_2); // sende Byte 1 Kanal 2
Wire.write(by_2_2); // sende Byte 2 Kanal 2
Wire.write(by_1_3); // sende Byte 1 Kanal 3
Wire.write(by_2_3); // sende Byte 2 Kanal 3
Wire.write(by_1_4); // sende Byte 1 Kanal 4
Wire.write(by_2_4); // sende Byte 2 Kanal 4
Wire.endTransmission(); // Ende der Übertragung
}
Ist eine I2C Platine angedacht für 4x PT1000 ? Ich denke das wäre interessant.
Franz K.
Hallo,
eine I2C-PT100 RDC oder I2C-PT1000 RDC ist derzeit nicht geplant.
Besorgen Sie sich „PT100 Temperatur Messumformer 0-100C Ausgang 0-10V DC“ und schließen Sie diese an die Analoge Eingangskarte an.
Messumformer „PT100 4-20mA 24VDC“ können Sie über einen 500 Ohm Widerstand auch anschließen.
20mA Sensor an I2C-Analogkarte
Wir planen aber eine I2C-Karte für max. 5 Thermoelemente mit dem MAX31855.
Hallo Herr Horter,
können Sie vielleicht ein Beispiel für eine Ausgabe an die Karte per i2cset nennen?
Bleiben die Werte der einzelnen Ausgänge erhalten wenn andere Kanäle geändert werden?
Danke
/ Manuel
Hallo,
mit I2Cset kann man meines Wissens nur ein Byte übertragen
i2cset -y 1 0x20 0xFF
überträgt FF an einen Slave an Adresse 20oder in ein Byte in ein definiertes Register schreiben
i2cset -y 1 0x50 0x00 0x10
Schreibt in ein EEprom an Adresse 50 an die Speicherzelle 0 den Wert 10Unsere Analog-Karte braucht aber mindestens 3 Byte hintereinander ohne ACK damit ein Kanal angesprochen werden kann.
Byte 1 Zeiger = 0
Byte 2 Analogwert 0 Low Byte
Byte 3 Analogwert 0 High Byte
Der Analogwert z.B. vom Kanal 0 bleibt bestehen, wenn ein neuer Wert zum Kanal 2 geschrieben wird
Byte 1 Zeiger = 2
Byte 2 Analogwert 2 Low Byte
Byte 3 Analogwert 2 High Byte
Gruß, JH
i2cset kennt auch den block write mode: https://linux.die.net/man/8/i2cset
„The mode parameter, if specified, is one of the letters b, w, s, or i, corresponding to a write size of a single byte, a 16-bit word, a SMBus block write, or an I2C block write, respectively. For SMBus and I2C block writes, the write size is determined by the number of value parameters.“
Müsste das dann klappen wenn ich ein i an den Schluss hänge, oder?
toll 🙂
Das müssen wir dann mal ausprobieren. Wäre super, wenn das funktioniert.
Ja, das funktioniert.
Sollte mal eindeutig gesagt werden. Bin nämlich grad dran, meine beiden I2HAA-Baugruppen zu testen, nachdem ich mir beide PICs zerschossen habe.
Ich wunderte mich schon, warum ich nicht auf Werte über ca 2,5V kam bzw. warum das Senden von LB und HB nicht akzeptiert wurde.
Mit dem „i“ am Ende klappt es hervorragend.
Danke für diesen Teilthread.
Hallo,
ich nutze den RPI 3 Model B mit dem I2C Repeater und der Analogkarte. 12V sind eingespeist.
Ich erhalte jedoch keine Spannungsänderung am A1 GND mit folgendem Phython Code:
import smbus
bus = smbus.SMBus(1)
aout = 1023
Hby = int (aout / 256)
LBY = int (aout – Hby * 256)
field = [LBY, Hby]
bus.write_i2c_block_data (0x58, 0x00, field)
Bitte um Hilfe 🙂
Hallo,
haben Sie schon mal mit i2cdetect -y 1 getestet ob die Karte überhaupt erreichbar ist?
I2C-Module am Raspberry PI
Gruß, JH
Es funktioniert! Ich hatte einen Fehler bei der Messung.
Nochmals, vielen Dank!
Hallo,
ich teste die analog out karte mit einem raspberrypi mit repeater. 12 V sind am Eingang. I2C Ansteuerung von LED’s war o.k.
Leider war keine Spannungsaenderung an A1 GND messbar.
Für einen Hinweis wäre ich dankbar.
Der Code:
# test I2C-Analog Output am raspberrypi
import time
import pigpio # ’sudo service –status-all‘
# deamon ‚piogpiod‘
import sys
BUS = 1
PIC_I2C_ADDR = 0x58 # with ’sudo i2cdetect -y 1′
pi = pigpio.pi() # open local Pi
h = pi.i2c_open(BUS, PIC_I2C_ADDR) # open device at address 0x58 on bus 1
if h >= 0: # Connected OK?
print(h)
pi.i2c_write_byte(h,0) # send byte 0 chanal 0
pi.i2c_write_byte(h,0x03) # send high byte
pi.i2c_write_byte(h,0xFF) # send low byte
pi.i2c_close(h)
pi.stop()
Hallo Ulf,
Entschuldigung für nicht Deutsch…
I have successfully used this product with a Raspberry Pi. I have a small Python test script that sets the A1 output to 0V and then increases to 10V over a few seconds.
On the Pi header, I connected the Pi 3.3V to +5 on the board, GND – GND, SDA – SDA, SCL – SCL.
The script needs smbus for Python3 to be installed:
sudo apt-get install python3-smbus
Here is the script:
#!/usr/bin/env python
import smbus
import time
# Horter.de 4 channel analogue output 10V 10bit module
# value range 0 – 1023 for 0 – 10V on the analog outputs
bus = smbus.SMBus(1)
aout = 0
try:
while True:
aout = aout + 1
Hby = int (aout / 256)
LBY = int (aout – Hby * 256)
field = [LBY, Hby]
print (field)
bus.write_i2c_block_data (0x58, 0x00, field)
time.sleep(0.01)
print (aout)
if aout > 1023:
aout = 0
break
except:
pass
Hello Andrew,
Thank you very much for your post. This has helped me very much! The same applies for the contribution of Mr. Horter: „Unsere Analog-Karte braucht aber mindestens 3 Byte hintereinander ohne ACK damit ein Kanal angesprochen werden kann.“
Therefore, the Arduino code can not be transferred directly to the Raspberry Pi. Maybe it would be helpful to provide a Python code as well.
Thank you and best regards from Germany
Hallo,
es sollte doch problemlos möglich sein, eine Versorgungsspannung von 24 V statt 12 V zu wählen. Der verwendete LM324 ist schließlich bis 32 V spezifiziert. Oder sehe ich das falsch?
Für 12 V müsste ich nämlich einen eigenen Spannungsregler vorsehen, und den Aufwand möchte ich mir gerne sparen.
Der gewünschte Ausgangsspannungsbereich soll dabei unverändert 0 V … 10 V sein.
Über eine Antwort freue ich mich. Danke
Hallo Walter N.,
bis 30V können Sie problemlos einspeisen.
Das muss ich mal in die Beschreibung mit aufnehmen.
Viel Erfolg, JH
Hallo,
Ich würde mit dem Bausatz gern Heizkörper Thermostate regeln.
Gibt es auch ein Beispiel wie man das Modul an einen Raspberry Pi anschließt und steuert?
Danke + Gruß
Björn
Hallo Björn,
Das Modul am Besten mit dem I2C-Repeater an den Raspberry-PI anschließen.
Programmieren kann man dann z.B. mit Python.
Codebeispiele für Python werden wir demnächst für alle unsere Baugruppen zur Verfügung stellen.
Momentan mal im Netz mit den Begriffen „I2C Raspberry Python“ suchen.
Hallo Björn,
hast du es letztendlich hinbekommen?
Hallo Yuri,
ja, mit dem C-Programm klappt’s super:
https://www.horter.de/blog/i2c-analog-output-am-pi-mit-c-ansprechen/
Gruss B.
Hello JH, I bought this module, but I do not have the codes for Arduino
can you give example code for arduino ?
thank you
hello
here you can find code for adruino
Arduino I2C Analog OUT Karte
thanks
thank you . since i am using i2c on smbus (beaglebone black with ubuntu ) i tried to write the three bytes as you instructed . i defined a new method in the Adafruit_I2C to expose the smbus write_byte method. i then called it three times to send each individual byte . the bytes are formatted correctly as seen through print command , however the channels are not outputting values . i checked both on the DAC output and the card 0~10V output . i’m new to i2c so am working as closely as possible with existant code . the code which i’m emulating expect register values . is there a dummy register value i can include ? i tried using the channel number as the register , to no effect . thanks again .
sorry for the late reply.
Do you put on 12V to the analog card?
The 12V required for the operational amplifier so that can generate the output signal of 0-10V.
Best wishes, JH
can you include an example of the I2C Analog Output 0-10V 4 channel 10 bit instead of the modem . can you explain “ The analog output card is completely controlled register. This means there are no instructions! Only the contents of registers controls the behavior of the map.“ (google translation). my co-workers purchased these and handed them off to me without realizing they are more complicated than single output units. do we have to contact the PIC to program it , or is there a register map to write values to the four outputs ?
Hello John,
to an analog value output on channel 0 they simply send 3 bytes to the slave.
Byte 1 = 0 (Channel 0)
Byte 2 = LBy (Low Byte from analog value)
Byte 2 = HBy (High Byte from analog value)
‚Calculate HIGH Byte
HBy = Fix(Ananlog_Value / 256)
‚Calculate HIGH Byte
LBy = Ananlog_Value – HBy * 256
The analog value must be between 0 and 1023 (0=0V 1000=10V)
To 5V output at output 3 will send the following 3 Bytes
Byte 1 = 3
Byte 2 = 1
Byte 2 = 244
I hope I could help