Spottbilliger A/D D/A Wandler für den RPi : PCF8591

  • Hallo Leute, das nächste, interessante Modul aus Asien ist angeschlossen und ausprobiert.

    Ich habe hier ein Modul mit einem PCF8591. Bei diesem Baustein handelt es sich um einen 8-Bit Analog/Digital Digital/Analog Wandler mit vier analogen und einem digitalen Eingang.
    Er verfügt über eine I2C-Schnittstelle und kann direkt an den GPIOs betrieben werden.
    Der Gebrauch des Moduls ist so simpel, dass ich mir ein Tutorial spare.
    Es kann sicherlich auch mit script-Sprachen verwendet werden, weil sich die Kommunikation mit dem Modul auf byteweises Lesen bzw. Schreiben des I2C-Bus beschränkt.
    Nähere Informationen zum Chip selbst findet ihr im Datenblatt.


    Das Modul:

    Das Modul ist schon ab 2 Euro z.B. bei meinem bevorzugten Asiaten erhältlich, wird aber auch von anderen Anbietern z.B. auf ebay vertrieben

    Mir ist aufgefallen, dass es wohl verschiedene Ausführungen des Moduls gibt. Meine Beschreibung bezieht sich auf die meines Dealers.
    Ob und welche Unterschiede es zwischen den einzelnen Modulen gibt, kann ich leider nicht sagen. Aber ich denke, von der Grundfunktion und der Idee dahinter dürften alle zumindest ähnlich sein.

    Dieses Modul ist imho mit Abstand das genialste, das ich in den letzten Monaten ausprobiert habe.
    Noch dazu der Preis, der mir unschlagbar erscheint.

    Neben dem PCF8591 befinden sich auf dem Modul eine doppelreihige Stiftleiste mit fünf Polen, die mit Jumpern verbunden sind. Dies sind die vier Eingänge (AN0, AN1, AN2, AN3) und der digitale Ausgang (OUT), die durch die Jumper mit den „Onboard“-Komponenten verschaltet werden.
    Ausserdem sind auf der Platine eine LED, ein lichtempfindlicher Widerstand, ein temperaturabhängiger Widerstand und ein Potentiometer verbaut.
    Schliesslich sind noch eine rote Power-LED und fünf Anschluss-Pins für die GPIOs vorhanden.


    Anschluss und Stromversorgung:

    Wie bereits oben erwähnt, kann das Modul direkt an die GPIOs angeschlossen werden.
    Das Modul hat fünf Anschluss-Pins die ich folgendermassen verdrahtet habe:

    Vcc des Moduls mit Pin #1 der GPIOs
    Gnd des Moduls mit Pin #9 der GPIOs
    SDA des Moduls mit Pin #3 (GPIO2, SDA) der GPIOs
    SCL des Moduls mit Pin #5 (GPIO3, SCL) der GPIOs
    A0 des Moduls mit Pin #6 der GPIOs (Gnd)

    Das Modul funktioniert out of the box und wird nach dem Anschliessen mit

    Code
    $sudo i2cdetect -y 1


    auf Adresse 0x48 angezeigt.

    Im Gegensatz zum Chip hat das Modul nur einen Adress-Pin: A0.
    Verbindet man diesen nicht mit GND sondern mit +5V ändert sich die Adresse des Moduls auf 0x49.



    Funktionsweise des Moduls:

    Das Modul ist in meinen Augen eine Super-Lösung zum experimentieren mit analogen Signalen.
    Sobald das Modul angeschlossen ist, kann man auch die „Onboard“-Komponenten verwenden.
    Das Modul hat die Basisadresse 0x48.

    Die digitalisierten Werte der Onboard-Komponenten können nun über die Datenregister

    Zitat


    0x40 für den Fotowiderstand
    0x41 für den freien Eingangspin (ohne Jumper)
    0x42 für das Potentiometer und
    0x43 für den Temperaturfühler


    ausgelesen werden.

    Verändert man die Umgebungs-Bedingungen (Licht, Temperatur) oder dreht am Potentiometer, kann man verfolgen wie die Werte sich verändern.
    An den freien Eingang kann man zum Testen mal +3,3V bzw Masse anlegen und wird feststellen, das der Wert einmal 255 und, auf Masse gezogen, 0 ist.
    Achtung! Den dem Chip zugewandten Pin zum Anschliessen verwenden.

    Die LED kann über das Register 0x40 angesteuert werden.
    Je höher der Wert (0-255) ist, den man in das Register schreibt, desto heller leuchtet die LED.

    Um seine Grundlagenforschungen in Sachen AD/DA Wandler weiter zu führen kann man
    die Jumper entfernen und die Eingänge des Chips mit eigenen analogen Signalen versorgen.
    Angeschlossen werden die eigenen Eingänge an der dem Chip näher liegenden Seite der Pfosten-Doppelreihe.


    Das Programm im Anhang:

    Im Anhang findet ihr ein kleines C-Programm, das ich nebenbei mal auf die Schnelle eingetippt habe. Is nix Dolles, aber es tut und kann mit

    Code
    gcc -o pcf8591 pcf8591.c -lrt


    übersetzt werden.


    Das Programm ist, wie gesagt, total simpel aufgebaut. Es stellt eine Verbindung zum Modul über den I2C-Bus her und initialisiert den Chip auf dem Modul durch senden des Control-Byte.
    In einer Schleife werden jetzt die vier Register ausgelesen, deren Werte ausgegeben und das Register für die LED mit dem Schleifenzähler beschrieben.
    Dadurch leuchtet die LED bei jedem Schleifendurchlauf heller.
    Am Schluss wird noch die LED abgeschaltet und aufgeräumt.

    Tja, und das war's jetzt auch schon.
    Wenn man bedenkt, dass dieses Modul in China preiswerter zu bekommen ist als der nackte Chip in Deutschland, dann halte ich das für ein durchaus lohnenswertes Schnäppchen und werde mir da wohl noch das eine oder andere Zweitmodul besorgen.

    Dann wünsche ich Euch viel Spaß mit dem Teil.
    Fragen, Anregungen usw. aufgrund des fehlenden Tutorials diesmal hier.

    Viele Grüße aus einer südlichen und lauen Nacht,
    -ds-

  • Spottbilliger A/D D/A Wandler für den RPi : PCF8591? Schau mal ob du hier fündig wirst!

  • Hej,
    Cool nach sowas suche ich. Aber kannst du mir nochmal bei deinem Code Helfen? Habe noch einige Fehler und bin nicht sonderlich fit darin. Vermute mir fehlt eine Libary oder?


    Fehlermeldung:
    /tmp/ccnohmB7.o: In function `pcf8591_read_value':
    I2Cpcf8591.c:(.text+0x100): undefined reference to `i2c_smbus_read_byte_data'
    /tmp/ccnohmB7.o: In function `pcf8591_write_value':
    I2Cpcf8591.c:(.text+0x14c): undefined reference to `i2c_smbus_write_byte_data'
    collect2: ld returned 1 exit status

    Einmal editiert, zuletzt von Mateusz224 (2. August 2013 um 03:18)

  • Fehlermeldung:
    /tmp/ccnohmB7.o: In function `pcf8591_read_value':
    I2Cpcf8591.c:(.text+0x100): undefined reference to `i2c_smbus_read_byte_data'
    /tmp/ccnohmB7.o: In function `pcf8591_write_value':
    I2Cpcf8591.c:(.text+0x14c): undefined reference to `i2c_smbus_write_byte_data'
    collect2: ld returned 1 exit status

    Moin Mateusz224,

    sorry ... hatte ich vorausgesetzt aber nicht dazugeschrieben.
    Für Programme, die auf den I2C-Bus zugreifen brauchst Du das Paket i2c-dev, um i2cdetect verwenden zu können das Paket i2c-tools.


    Code
    sudo apt-get install i2c-dev
    sudo apt-get install i2c-tools

    Jetzt sollte das klappen ...
    ciao,
    -ds-

  • hmm.. aber "i2c-dev" kann er nicht finden...


    Code
    pi@raspberrypi ~/Desktop/Projekte/I2C $ sudo apt-get install i2c-dev
    Paketlisten werden gelesen... Fertig
    Abhängigkeitsbaum wird aufgebaut.       
    Statusinformationen werden eingelesen.... Fertig
    E: Paket i2c-dev kann nicht gefunden werden.
    pi@raspberrypi ~/Desktop/Projekte/I2C $

    Einmal editiert, zuletzt von Mateusz224 (2. August 2013 um 14:57)

  • Ach sorry ... ist schon fast ein halbes Jahr her ...

    libi2c-dev ....


    Code
    pi@raspberrypi ~ $ sudo apt-get install libi2c-dev
    Paketlisten werden gelesen... Fertig
    Abhängigkeitsbaum wird aufgebaut.       
    Statusinformationen werden eingelesen.... Fertig
    libi2c-dev ist schon die neueste Version.
    0 aktualisiert, 0 neu installiert, 0 zu entfernen und 4 nicht aktualisiert.
    pi@raspberrypi ~ $


    Und hier steht noch was, um den Zugriff auf den Bus zu aktivieren.

    Wenn noch was ist, einfach melden.
    Ich behalte das hier mal im Auge ;) ...

    cu,
    -ds-


  • Schade, dass er nur 8-Bit Genauigkeit hat. Aber für einige Anwendungsgebiete reicht das auch.
    Ein 12-Bit oder 16-Bit AD-Wandler ist ein wenig teurer, gibts aber auch:
    http://www.exp-tech.de/Shields/ADS101…-Amplifier.html
    bzw
    http://www.exp-tech.de/Shields/ADS111…-Amplifier.html

    Hallo .... macht nix ... äh Machtnix,

    danke für die Links ... mal sehen, ob ich mal bei meinem Dealer so was bekomme bzw. mitbestellen kann.
    Wenn ich mir das so anschaue, dann glaube ich, dass das genauso funktioniert ...

    cu,
    -ds-

  • zuerst fand ich die Idee toll.

    Aber eine Platine mit viel Krimskrams ?
    Dann dachte ich, nimm nur den Chip, aber der kostet hier im Laden doppelt so viel.
    Ich glaube fast es ist günstiger und vielseitiger einen Atmel AVR für die AD Wandlung per rs232 anzukoppeln,
    der könnte sich um Ports, AD Wandlung, Uhr, IR empfänger mit wake-up vom PI o.ä. im Hintergrund kümmern.
    Am SPI kann der sogar programmiert werden, nur so eine Idee.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (3. August 2013 um 10:21)


  • Nein, das sind die kompletten Module, wie sie abgebildet sind. Das 12-Bit-Modul hab ich real vor mir liegen. Das Datenblatt ist nur vom Chip.

    Hi,
    ne ... sorry ... Mist verstanden ;) ...

    Ich bezog mich auf jars Post, weil das Teil, das ich habe noch mir LED, Poti ... bestückt ist.
    Und das zusätzliche Zeug ist halt bei Dir nicht drauf ...

    Sommerliche Grüsse,
    -ds-


  • Hi jar,
    wenn Du meinst, dass das einfacher ist ... warum nicht?
    cu,
    -ds-

    jetzt erst recht wo ich gerade gelernt habe das die Mega auch I2C slave sein können, damit wird ein Atmel ja günstiger und interessanter als die I2C Ports und Wandler, vor allem wenn die SPI Programmierung erst mal im PI ist.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (3. August 2013 um 14:45)

  • Moin,

    was sollte denn Deiner Meinung nach ausgegeben werden.

    Du übersetzt den Quellcode - der Compiler hat daran nichts zu bemängeln oder auszusetzen - also tut er das, was Du ihm gesagt hast: das Programm erzeugen.
    Linux ist - wie die *ix Derivate überhaupt - eher schweigsam und plappert nicht so viel unnützes Zeug wie andere Betriebssysteme.

    cu,
    -ds-


  • Verbindet man diesen nicht mit GND sondern mit +5V ändert sich die Adresse des Moduls auf 0x49.

    aua, am PI sollte man doch Module nicht an 5V betreiben ausser sie müssen !

    Der Chip jedenfalls arbeitet auch mit 3,3V

    5V können am Modul genutzt werden wenn
    1. wenn die I2C spannungsfrei vom Modul sind
    2. externe pullups zu 3,3V für die SDA und SCL benutzt werden

    aber wir durften ja hier schon lesen, obwohl I2C oc also open Collector sein sollten hält sich nicht jeder Modulhersteller daran, also obacht !

    Wenn das Modul an 5V designed wurde können u.U. Anpassungen an Vorwiderstände nötig werden, an LED uvam. manche LEDs die erst ab >3,5V arbeiten können u.U den Dienst verweigern.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)


  • Ja ich dachte er gibt mir die Werte des A/D Wandlers aus?:D

    Wie bekomm ich das Programm dazu?

    Aaah .. ok, dann mit

    Zitat


    $ ./pcf8591


    aufrufen, bzw. mit

    Zitat


    $ sudo ./pcf8591


    wenn eine Fehlermeldung mit "Zugriff verweigert" bzw. "Permission denied" ausgegeben wird.

    Dieser Chip wird übrigens mittlerweile auch von wiringPi unterstützt ;)

    cu,
    -ds-

  • Hat funktioniert. Dankeschön

    Edit: Wenn ich den Sensor mit 5V nutzen will/muss (MQ-4 Methan Sensor) wie muss ich ihn dann anschließen? Ich hab hier so ein I2C Level Conversion Module, aber wo kommt das dazwischen?

    Muss ich das ganze so verkabeln?:

    A/D-Wandler VCC -> RPi 5V
    A/D-Wandler SDA -> Level Conversion Module - RPi SDA
    A/D-Wandler SCL -> Level Conversion Module - RPi SCL
    A/D-Wandler GND -> Level Conversion Module - RPi GND

    MQ4 VCC -> RPi 5V
    MQ4 GND -> RPi GND

    MQ4 AO -> A/D-Wandler AN0

    Ach ja, gibts irgendein Programm das den A/D-Wandler (und vielleicht DS18B20-Sensoren) mitloggen kann?

    MfG c3ntry

    Einmal editiert, zuletzt von c3ntry (21. Januar 2014 um 21:40)

  • Blöderweise wird das Thema wohl beim Edit nicht gepusht, also Sorry für den Doppelpost.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!