I2C-Analog Output 4 Kanäle 0-10V 10 Bit

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)

I2C-DAC 4 CH 10 Bit

I2C-Analog Output card 4 Chanel 0-10V 10 Bit

 

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.

I2C-Analog-Ausgangskarte mit FINDER Dimmer

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.

Speichere in deinen Favoriten diesen permalink.

67 Kommentare

  1. 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.

      Formel:
      2V
      —- * 12k + 3k = 10V
      3K

      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.

      Formel:
      2V
      —- * 15k + 3k = 12V
      3K

      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

  2. 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

  3. 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

  4. 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!

  5. 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

  6. 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

  7. 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.

  8. 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.

  9. 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

  10. 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.

  11. 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

  12. 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

  13. 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

  14. 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!

  15. 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

    • 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.

  16. 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
    }

  17. 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.

  18. 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 20

      oder 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 10

      Unsere 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.

  19. 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 🙂

  20. 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

  21. 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

  22. 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

  23. Hello JH, I bought this module, but I do not have the codes for Arduino
    can you give example code for arduino ?
    thank you

  24. 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

  25. 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

Schreibe einen Kommentar zu JH Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert