Forum: Mikrocontroller und Digitale Elektronik ADC- und DAC-Experimente mit PCF8591 auf Banana Pi SBCs (WiringPi, i2c-tools)


von Mutluit M. (mutluit)


Angehängte Dateien:

Lesenswert?

Hi,
ich wollte am Banana Pi (M1, R1, M2 Berry) mit Debian 8 (jessie) den 
AD/DA-Konverter PCF8591 anschliessen über I2C.

Hab mir so ein fertiges Modul wie im Bild besorgt mit einigen Sensoren 
drauf (Fotodiode (Licht), Temperatur, sowie ein manuelles Poti):
https://www.roboter-bausatz.de/207/pcf8591-ad/da-converter-module

Datenblätter etc:
https://www.roboter-bausatz.de/media/pdf/e7/25/21/PCF8591_AD-DA.pdf
https://www.nxp.com/products/analog/interfaces/ic-bus/ic-dacs-and-adcs/8-bit-a-d-and-d-a-converter:PCF8591?tab=Documentation_Tab

Dazu habe ich das Paket i2c-tools installiert, und hab im Web 
verschiedene Versionen von WiringPi gefunden. Irgendwie scheint der den 
Banana Pi aber nicht direkt zu unterstützen. Das ist noch nicht fertig 
bei mir.

Ich hab diesbezüglich noch einige Links und auch Code aus dem Web. Die 
muss ich noch aussortieren und werde sie hier auch noch posten.

Hat sonst jemand schon WiringPi (bzw. das obige Modul) am Banana Pi 
bereits zum Laufen gebracht und könnte ein Paar Tips geben?

: Verschoben durch User
von Mutluit M. (mutluit)


Lesenswert?

Nach einigen Irrungen und Wirrungen bzgl. der richtigen WiringPi-Version
bin ich mit der folgenden Version etwas weitergekommen.
Ich mache das auf einem Banana Pi R1 welches wie der M1
den Allwinner A20 SoC benutzt, daher nehme ich unten "bananapi":

# git clone https://github.com/LeMaker/WiringBP -b bananapi
Cloning into 'WiringBP'...
remote: Enumerating objects: 270, done.
remote: Total 270 (delta 0), reused 0 (delta 0), pack-reused 270
Receiving objects: 100% (270/270), 223.78 KiB | 0 bytes/s, done.
Resolving deltas: 100% (146/146), done.
Checking connectivity... done.

# cd WiringBP/

# chmod +x build

# ./build
...
All Done.

NOTE: This is wiringBPi v1, and if you need to use the lcd, Piface,
  Gertboard, MaxDetext, etc. routines then you must change your
  compile scripts to add -lwiringPiDev

# gpio readall
+----------+-Rev3-+------+--------+------+-------+
| wiringPi | GPIO | Phys | Name   | Mode | Value |
+----------+------+------+--------+------+-------+
|      0   |  17  |  11  | GPIO 0 | IN   | Low   |
|      1   |  18  |  12  | GPIO 1 | IN   | Low   |
|      2   |  27  |  13  | GPIO 2 | IN   | Low   |
|      3   |  22  |  15  | GPIO 3 | IN   | Low   |
|      4   |  23  |  16  | GPIO 4 | IN   | Low   |
|      5   |  24  |  18  | GPIO 5 | IN   | Low   |
|      6   |  25  |  22  | GPIO 6 | IN   | Low   |
|      7   |   4  |   7  | GPIO 7 | IN   | Low   |
|      8   |   2  |   3  | SDA    | ALT5 | High  |
|      9   |   3  |   5  | SCL    | ALT5 | High  |
|     10   |   8  |  24  | CE0    | ALT5 | Low   |
|     11   |   7  |  26  | CE1    | ALT5 | Low   |
|     12   |  10  |  19  | MOSI   | ALT5 | Low   |
|     13   |   9  |  21  | MISO   | ALT5 | Low   |
|     14   |  11  |  23  | SCLK   | ALT5 | Low   |
|     15   |  14  |   8  | TxD    | ALT0 | Low   |
|     16   |  15  |  10  | RxD    | ALT0 | Low   |
|     17   |  28  |   3  | GPIO 8 | IN   | Low   |
|     18   |  29  |   4  | GPIO 9 | ALT4 | Low   |
|     19   |  30  |   5  | GPIO10 | OUT  | Low   |
|     20   |  31  |   6  | GPIO11 | ALT4 | Low   |
+----------+------+------+--------+------+-------+


# i2cdetect -l
i2c-1   i2c             mv64xxx_i2c adapter                     I2C 
adapter
i2c-0   i2c             mv64xxx_i2c adapter                     I2C 
adapter


# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- UU -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --


# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --


Noch verstehe ich die Zusammenhänge noch nicht ganz, aber kommt noch... 
:-)

Wo hängt nun das ADC/DAC-Modul dran? Ich glaube es müsste das mit -y 1 
sein (= I2CBUS 1), also Adresse 0x48 ...

: Bearbeitet durch User
von PostalDude (Gast)


Lesenswert?

Das letzte Mal wo ich mit dem PCF8591 zu tun hatte, stand die
Adresse noch im Datenblatt.

von Mutluit M. (mutluit)


Angehängte Dateien:

Lesenswert?

PostalDude schrieb:
> Das letzte Mal wo ich mit dem PCF8591 zu tun hatte, stand die
> Adresse noch im Datenblatt.

Hmm. meinst du die I2C-Adresse (A2 A1 A0) mit Wert 0 bis 7 ?
Das sind die 3 Jumper bei diesem Modul, s. Bild.

Die andere Adresse ("48"), die ich auf anderen WebSeiten gelesen habe, 
kommt im Datenblatt mMn überhaupt nicht vor.

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

>Die andere Adresse ("48"), die ich auf anderen WebSeiten gelesen habe,
>kommt im Datenblatt mMn überhaupt nicht vor.

Datenblatt Seite 13. Und die "48" ist hex.

von Mutluit M. (mutluit)


Lesenswert?

Hab den folgenden Code im Web gefunden, aber das mit der Pin-Base (hier 
PCF) habe ich nicht kapiert. Wo hat der denn die 120 her? Auf was müsste 
ich das bei mir ändern? Denn so steigt er beim Aufruf des 
pcf8591Setup(...) aus und bringt die Fehlermedlung "Unable to open I2C 
device: No such file or directory"

1
#include <stdio.h>
2
#include <wiringPi.h>
3
#include <pcf8591.h>
4
5
#define PCF       120
6
7
int main (void)
8
{
9
  int value ;
10
  wiringPiSetup () ;
11
  // Setup pcf8591 on base pin 120, and address 0x48
12
  pcf8591Setup (PCF, 0x48) ;
13
  while(1) // loop forever
14
  {
15
    value = analogRead  (PCF + 0) ;
16
    printf("%d\n", value);
17
    analogWrite (PCF + 0, value) ;
18
    delay (10) ;
19
  }
20
  return 0 ;
21
}

: Bearbeitet durch User
von Mutluit M. (mutluit)


Lesenswert?

holger schrieb:
>>Die andere Adresse ("48"), die ich auf anderen WebSeiten gelesen habe,
>>kommt im Datenblatt mMn überhaupt nicht vor.
>
> Datenblatt Seite 13. Und die "48" ist hex.

Ja auf Seite 13 taucht das Wort "ADDRESS" auf, damit sind wohl die A0 
bis A2 gemeint, also ein Wert von 0 bis 7 (also die Adresse des Moduls).
Aber in dem Datenblatt taucht doch kein 48 auf. Oder habe ich da was 
übersehen?

Aber was hat es mit den viel grösseren Zahlen 120 und 0x48 auf sich?
Die sind ja ausserhalb von 0 bis 7.
Irgendwas passt da noch nicht ganz... :-)

: Bearbeitet durch User
von Dergute W. (derguteweka)


Lesenswert?

Moin,

Mutluit M. schrieb:
> Aber was hat es mit den viel grösseren Zahlen 120 und 0x48 auf sich?
> Die sind ja ausserhalb von 0 bis 7.
> Irgendwas passt da noch nicht ganz... :-)

Guck! in! die! i2c-bus-Spec!

Gruss
WK

von Mutluit M. (mutluit)


Lesenswert?

Also, meine Recherchen haben ergeben, dass die bekannten GPIO-Libs und 
I2C-Libs nur für die orignalen Raspberry Pi Modelle entwickelt sind. Die 
RasPi's benutzen einen speziellen DMA-Baustein von Broadcom der in den 
Libraries verwendet wird. Die Banana Pi's haben diesen Baustein gar 
nicht (oder haben einen anderen), folglich kann man die Libs nicht 1:1 
übernehmen.
Jetzt wo das klar ist, brauche ich mich nicht mehr wundern warum es 
nicht klappt, und kann dann gezielter recherchieren...

: Bearbeitet durch User
von Dergute W. (derguteweka)


Lesenswert?

Moin,

Mutluit M. schrieb:
> Die
> RasPi's benutzen einen speziellen DMA-Baustein von Broadcom der in den
> Libraries verwendet wird. Die Banana Pi's haben diesen Baustein gar
> nicht (oder haben einen anderen), folglich kann man die Libs nicht 1:1
> übernehmen.

Axso - Ja, da gehts dir wohl wie dem Bauern, der wegen der falschen 
Badehose nicht schwimmen kann; da kann man dann wohl nix machen...

SCNR,
WK

von Mutluit M. (mutluit)


Lesenswert?

Dergute W. schrieb:
> Moin,
>
> Mutluit M. schrieb:
>> Die
>> RasPi's benutzen einen speziellen DMA-Baustein von Broadcom der in den
>> Libraries verwendet wird. Die Banana Pi's haben diesen Baustein gar
>> nicht (oder haben einen anderen), folglich kann man die Libs nicht 1:1
>> übernehmen.
>
> Axso - Ja, da gehts dir wohl wie dem Bauern, der wegen der falschen
> Badehose nicht schwimmen kann; da kann man dann wohl nix machen...

Keine Sorge, das wird schon laufen, braucht nur bischen mehr Recherche.
Danke für deinen geistreichen Beitrag :-)

von Markus W. (dl8mby)


Angehängte Dateien:

Lesenswert?

@Mutluit M,

im Prinzip müsstest Du doch die Infos zu der
GPIO HW aus dem device-tree des Kernels zum
Deinen BPi-M1/R1/M2 SBC herauslessen können
(Adr./Status-Register/etc.)

Markus

Nachtrag:
Oder aus
ls -lR /sys/firmware/devicetree/base
und cat auf die Files, die Dich interessieren.

Nachtrag #2:

Beim mir z.B. BPi-R2 liefert das u.g. Kommando

dtc --in-format dtb --out-format dts mt7623n-bananapi-bpi-r2.dtb --out 
mt7623n-bananapi-bpi-r2.dts

das angehängte DTS als String File im Anhang.


Bei mir steht folgenden zum I2C drin:

  i2c@11007000 {
    compatible = "mediatek,mt7623-i2c\0mediatek,mt6577-i2c";
    reg = <0x00 0x11007000 0x00 0x70 0x00 0x11000200 0x00 0x80>;
    interrupts = <0x00 0x2c 0x08>;
    clock-div = <0x10>;
    clocks = <0x1a 0x19 0x1a 0x0d>;
    clock-names = "main\0dma";
    #address-cells = <0x01>;
    #size-cells = <0x00>;
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <0x1f>;
  };

  i2c@11008000 {
    compatible = "mediatek,mt7623-i2c\0mediatek,mt6577-i2c";
    reg = <0x00 0x11008000 0x00 0x70 0x00 0x11000280 0x00 0x80>;
    interrupts = <0x00 0x2d 0x08>;
    clock-div = <0x10>;
    clocks = <0x1a 0x1a 0x1a 0x0d>;
    clock-names = "main\0dma";
    #address-cells = <0x01>;
    #size-cells = <0x00>;
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <0x20>;
  };

  i2c@11009000 {
    compatible = "mediatek,mt7623-i2c\0mediatek,mt6577-i2c";
    reg = <0x00 0x11009000 0x00 0x70 0x00 0x11000300 0x00 0x80>;
    interrupts = <0x00 0x2e 0x08>;
    clock-div = <0x10>;
    clocks = <0x1a 0x1b 0x1a 0x0d>;
    clock-names = "main\0dma";
    #address-cells = <0x01>;
    #size-cells = <0x00>;
    status = "disabled";
  };

: Bearbeitet durch User
von Mutluit M. (mutluit)


Lesenswert?

Jetzt klappt's endlich!
Lösung liegt darin, diese Libraries wie wiringPi oder pigpio überhaupt 
nicht zu benutzen, und stattdessen das ureigene Linux-Interface zu 
benutzen. Und das bedeutet praktisch nur basic File-I/O mit open(), 
ioctl(), write(), read() und close(). So einfach!  :-)

Man lese in dem Zusammenhang auch diesen Kommentar eines weisen Posters
https://raspberrypi.stackexchange.com/questions/41316/i2c-using-wiringpi-or-ioctl-in-c-more-than-2-bytes

"... I would strongly encourage you to not use wiringPi or any other pi 
specific library for this, and instead use the linux kernel interface. 
For some reason, there is a trend with the pi to intentionally write 
non-portable code, which is the opposite of what would normally be 
considered best practice. It is easy to say now, "Well I am only ever 
going to be using this on a raspberry pi anyway," but if at some point 
you get another board/device/whatever with I2C pins running linux (there 
are many such things), code using the kernel dev API will work without 
modification. Code written using wiringPi will not. Generally there is 
no purpose to using such libraries for I2C. I would guess the reason it 
is there at all, at least in the wiringPi case, is because the library 
was intended to mimic an Arduino library, making it familiar for novice 
programmers coming from there. Judging by your examination of the source 
in the question, it is built on ioctl(), meaning it is just using the 
kernel interface anyway!
"

Ich werde in Kürze meine Lösung posten, muss zuvor den Code etwas "nice" 
machen :-)

von Mutluit M. (mutluit)


Lesenswert?

@Markus W., vielen Dank. Die Lösung ist sehr einfach; diese 
Raspi-spezifischen Libraries haben es nur verkompliziert, also 
verschlimmbessert.
Ich werde alles zusammenfassen und in Kürze hier posten.

: Bearbeitet durch User
von Mutluit M. (mutluit)


Angehängte Dateien:

Lesenswert?

Hier also meine Lösung:

1
/*
2
pcf8591_AD_DA_on_any_Pi_device.c
3
4
Programming the ADC/DAC chip PCF8591 (and modules/hats that use such a chip)
5
for reading data from its analog input channels
6
as well sending data to its analog output channel.
7
For details see PCF8591 Data Sheet ( https://www.nxp.com/docs/en/data-sheet/PCF8591.pdf ).
8
9
This implementation does use just basic C programming,
10
and does not need any of the popular RaspberryPi-specific libraries
11
like WiringPi or pigpio. Ie. this is a portable implementation.
12
13
Written 2019-05-29-We by um@mutluit.com
14
15
16
Prerequisites:
17
  Install package i2c-tools from the Linux repository
18
19
20
list the i2c devices
21
  # ls -l /dev/i2c*
22
  crw-rw---- 1 root i2c 89, 0 Jan  1  1970 /dev/i2c-0
23
  crw-rw---- 1 root i2c 89, 1 Jan  1  1970 /dev/i2c-1
24
25
26
get the address (in hex) of i2c device 1, ie. /dev/i2c-1
27
  # i2cdetect -y 1
28
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
29
     00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
30
     10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
31
     20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
32
     30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
33
     40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 
34
     50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
35
     60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
36
     70: -- -- -- -- -- -- -- --                         
37
38
39
Compile:
40
  # gcc -O2 -Wall -Wextra -std=gnu11 -o pcf8591_AD_DA_on_any_Pi_device.exe pcf8591_AD_DA_on_any_Pi_device.c
41
42
43
Run as root (or use sudo):
44
  # ./pcf8591_AD_DA_on_any_Pi_device.exe  
45
46
47
NOTES:
48
  In this example below, only the analog input channel 0 is read. You can change it below.
49
  See also the data sheet of the PCF8591 and also the documentation of your specific module.
50
51
  I used the following module: https://www.roboter-bausatz.de/207/pcf8591-ad/da-converter-module
52
  That module has some additional sensors (light, temperature and a manual potentiometer)
53
  for easy testing of the ADC/DAC chip.
54
  You can find it (and similar modules) at many places on the net, also in ebay.
55
56
  I developed and tested this code on Banana Pi devices (M1, R1): http://www.banana-pi.org/r1.html#others
57
  The module was attached to the 3.3V pin, TWI2-SDA, TWI2-SCK, and GND pin.
58
59
  It continously just reads 1 byte and displays it. For further usage one would convert/scale that value
60
  to a meaningful range depending on the context, ie. temperature, voltage, daylight etc.
61
62
*/
63
64
#include <stdio.h>
65
#include <string.h>
66
#include <fcntl.h>
67
#include <linux/i2c-dev.h>
68
#include <sys/ioctl.h>
69
#include <unistd.h>
70
#include <errno.h>
71
#include <stdint.h>
72
73
74
// see comments above
75
#define MY_I2C_ADDR   0x48
76
77
78
// see PCF8591 Data Sheet, page 6, Control Byte; link above
79
struct pcf8591_control_byte
80
{
81
  uint8_t Channel        : 2,   // 0..3
82
          ChannelAutoInc : 1,   // see data sheet
83
          Reserved1      : 1,   // value 0
84
          ChannelMixing  : 2,   // see data sheet
85
          Enable_AOUT    : 1,   // enabling AOUT, ie. DAC functionality
86
          Reserved2      : 1;   // value 0
87
};
88
89
90
int main(void)
91
{
92
  int fd = open("/dev/i2c-1", O_RDWR);   // see comments above
93
  if (fd < 0)
94
  {
95
      printf("Error opening device: %s\n", strerror(errno));
96
      return 1;
97
  }
98
  if (ioctl(fd, I2C_SLAVE, MY_I2C_ADDR) < 0)
99
  {
100
      printf("ioctl error: %s\n", strerror(errno));
101
      close(fd);
102
      return 1;
103
  }
104
105
  // write 0x0: ie. use just channel 0, see data sheet
106
  struct pcf8591_control_byte S;
107
  memset(&S, 0, sizeof(S));
108
  /*
109
  S.Channel        = 0;
110
  S.ChannelAutoInc = 0;
111
  ChannelMixing    = 0;
112
  Enable_AOUT      = 0;
113
  */
114
  if (write(fd, &S, 1) != 1)
115
    printf("ERR #1: %s\n", strerror(errno));
116
117
  // read continously 1000 values with 50ms delay between each reading:
118
  for (int i = 0; i < 1000; ++i)
119
  {
120
    uint8_t u;
121
    const ssize_t n = read(fd, &u, 1);
122
    if (!n)
123
      printf("ERR\n");
124
    else  
125
      printf("%d\n", u);
126
127
    usleep(50 * 1000);    // 50ms delay
128
  }
129
130
  close(fd);
131
  return 0;
132
}

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Geht doch! Lag wohl doch weder an der Badehose, noch am 
Broadcom-DMA-Baustein. ;-)

Gruss
WK

von Uwe R. (Gast)


Lesenswert?

Mutluit M. schrieb:
> # i2cdetect -y 0
>      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
> 30: -- -- -- -- UU -- -- -- -- -- -- -- -- -- -- --

Das ist der PMIC (AXP209) - der hat auch 'n ADC eingebaut :)

von Mutluit M. (mutluit)


Lesenswert?

Dergute W. schrieb:
> Moin,
>
> Geht doch! Lag wohl doch weder an der Badehose, noch am
> Broadcom-DMA-Baustein. ;-)

Du sagst es! :-)

cu

von Mutluit M. (mutluit)


Lesenswert?

Uwe R. schrieb:
> Mutluit M. schrieb:
>> # i2cdetect -y 0
>>      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
>> 30: -- -- -- -- UU -- -- -- -- -- -- -- -- -- -- --
>
> Das ist der PMIC (AXP209) - der hat auch 'n ADC eingebaut :)

Ja, kann man den denn frei benutzen? Oder ist der intern schon vergeben 
bzw. wird benutzt?
Das UU müsste doch bedeuten dass es bereits in Benutzung ist, nicht 
wahr?


Nachtrag:
$ man i2cdetect :
       · "UU". Probing was skipped, because this address is currently in 
use by a driver. This strongly suggests that there is a chip at this 
address.

: Bearbeitet durch User
von Uwe R. (Gast)


Lesenswert?

Mutluit M. schrieb:
>> Das ist der PMIC (AXP209) - der hat auch 'n ADC eingebaut :)
>
> Ja, kann man den denn frei benutzen? Oder ist der intern schon vergeben
> bzw. wird benutzt?

Ne, du kannst nur die Spannungen und die Chiptemperatur auslesen..

> Nachtrag:
> $ man i2cdetect :
>        · "UU". Probing was skipped, because this address is currently in
> use by a driver. This strongly suggests that there is a chip at this
> address.

Für den gibts es wohl mittlerweile ein *.ko

lsmod|grep axp20x

find sys -name '*axp*'

von Mutluit M. (mutluit)


Lesenswert?

Jetzt frage ich mich natürlich, wie man die On-Board-Sensoren auf diesem 
Modul disablen kann, damit man an die 4 Analog-Eingänge AIN0, AIN1, 
AIN2, AIN3 des PCF8591 eigene Sensoren bzw. Analogquellen anschliessen 
kann.
Muss mal das Data Sheet des Moduls selbst auffinden... Vlt. habe ich es 
schon downgeloadet von irgendwoher auf dem Web.. Such such... :-)

Nachtrag:
also, es heisst die Jumper auf dem Modul sind genau dafür vorgesen
(ich hatte bis jetzt angenommen, diese wären dafür da um jedem Modul 
seine eigene Sub-Adresse im Bereich 0..7 zu vergeben; lag damit wohl 
falsch).

Hier ein Auszug aus einem Review dieses Moduls mit der Bezeichnung 
"PCF8591 YL-40 AD/DA Module":
https://brainfyre.wordpress.com/2012/10/25/pcf8591-yl-40-ad-da-module-review/
"
The jumpers control whether analog input channels of the IC are 
connected to the analog sources:

Jumper P4 for AIN1: The temperature sensed by the R6 thermister is 
provided to the ADC.
Jumper P5 to AIN0: The R7 photocell voltage (resistance drop) is 
provided to the DAC.
Jumper P6 to AIN3: The single turn 10K ohm trimpot voltage (resistance 
drop – brighter light, lower resistance).
"

: Bearbeitet durch User
von Mutluit M. (mutluit)


Lesenswert?

Achtung! Entgegen der Werbeaussagen mancher Anbieter, die behaupten man 
könne bis zu 8 solcher Module an den selben I2C-Bus anschliessen, kann 
man von diesem Modul tatsächlich wohl nur 1 Stück anschliessen.
Die andere Variante gibt es auch (nennt sich "Mini PCF8591 AD DA Shell 
Module", kostet aber ca. 3x mehr:
https://arduinodiy.wordpress.com/2016/10/17/adding-a-pcf-8591-adcdac-to-esp8266-01/

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

HI

>Achtung! Entgegen der Werbeaussagen mancher Anbieter, die behaupten man
>könne bis zu 8 solcher Module an den selben I2C-Bus anschliessen, kann
>man von diesem Modul tatsächlich wohl nur 1 Stück anschliessen.

Blödsinn. Du hast drei frei auswählbare Adresspins. das reicht für acht 
Adressen. Also acht PCF8591 anschließbar.

MfG Spess

von Joachim B. (jar)


Lesenswert?

Mutluit M. schrieb:
> Achtung! Entgegen der Werbeaussagen

spess53 schrieb:
> Blödsinn. Du hast drei frei auswählbare Adresspins

eben, ich bin nicht mal sicher ob der TO nicht nur ein Troll ist, erst 
will er den super hyper USBSATAFIREBUS kreieren, dann eröffnet er immer 
so merkwürdige Threads und irgendwann kommt ein neuer Thread.......

Wenn es schon am Datenblatt lesen und verstehen scheitert?.....

Beitrag "SATA FullSpeed"
Beitrag "Marke Eigenbau: SoC-Imitat"
Beitrag "Re: DAC-Verstärker"
Beitrag "Tip: SATA-Kabel"

von spess53 (Gast)


Lesenswert?

Hi

>eben, ich bin nicht mal sicher ob der TO nicht nur ein Troll ist, erst
>will er den super hyper USBSATAFIREBUS kreieren, dann eröffnet er immer
>so merkwürdige Threads und irgendwann kommt ein neuer Thread.......

Ich habe alle Beiträge von ihm gelesen. Diesen Troll-Verdacht habe ich 
schon seit einiger Zeit. Aber vielleicht ist er nur ein kleiner Spinner.

MfG Spess

von Joachim B. (jar)


Lesenswert?

spess53 schrieb:
> kleiner

das kleiner nimmst du zurück

von Mutluit M. (mutluit)


Lesenswert?

spess53 schrieb:
>
>>Achtung! Entgegen der Werbeaussagen mancher Anbieter, die behaupten man
>>könne bis zu 8 solcher Module an den selben I2C-Bus anschliessen, kann
>>man von diesem Modul tatsächlich wohl nur 1 Stück anschliessen.
>
> Blödsinn. Du hast drei frei auswählbare Adresspins. das reicht für acht
> Adressen. Also acht PCF8591 anschließbar.

Es geht um das hier benutzte Modul namens "PCF8591 YL-40 AD/DA Module", 
also nicht um den PCF8591 selbst.
Denn, in dem Modul ist die Addresse festverdrahtet (verlötet), eben die 
bekannte I2C-Adresse 0x48. Zitat aus
https://arduinodiy.wordpress.com/2016/10/17/adding-a-pcf-8591-adcdac-to-esp8266-01/
1
"The module is hardwired to 0x48 as the three address lines are soldered to ground. So if you would want to use more than one module on the same I2C port you would need to do some de-soldering (or use bare PCF8591 chips ofcourse). [..]
2
There is a (more expensive) fully configurable module (Mini PCF8591 AD DA Shell Module), that allows to set the I2C address with jumpers. That module is daisy chainable with other I2C modules in the same range (there is for example a PCF8547 digital I/O module with similar connections). [..]"

Also, um mehr als eins solch baugleicher Module anzuschliessen, muss man 
etwas rumlöten (Lötstellen aufbrechen und so neu verdrahten usw.)

: Bearbeitet durch User
von Mutluit M. (mutluit)


Lesenswert?

Joachim B. schrieb:
> Mutluit M. schrieb:
>> Achtung! Entgegen der Werbeaussagen
>
> spess53 schrieb:
>> Blödsinn. Du hast drei frei auswählbare Adresspins
>
> eben, ich bin nicht mal sicher ob der TO nicht nur ein Troll ist, erst
> will er den super hyper USBSATAFIREBUS kreieren, dann eröffnet er immer
> so merkwürdige Threads und irgendwann kommt ein neuer Thread.......
>
> Wenn es schon am Datenblatt lesen und verstehen scheitert?.....
>
> Beitrag "SATA FullSpeed"
> Beitrag "Marke Eigenbau: SoC-Imitat"
> Beitrag "Re: DAC-Verstärker"
> Beitrag "Tip: SATA-Kabel"

Du nervst mit deinem ständigen Off-Topic-Müll. Geh wo anders spielen
wenn du schon keinen sachbezogenen Beitrag zu leisten im Stande bist.

von Mutluit M. (mutluit)


Lesenswert?

Joachim B. schrieb:
> spess53 schrieb:
>> kleiner
>
> das kleiner nimmst du zurück

Du bist Off-Topic.

von Joachim B. (jar)


Lesenswert?

Mutluit M. schrieb:
> muss man
> etwas rumlöten

und wo ist das Problem?

Mutluit M. schrieb:
> Lötstellen aufbrechen

wer tut denn sowas, ich kenne nur einen der "aufbricht"

Heinz Erhardt "auf lasset uns brechen und machen auf den Weg"

von Mutluit M. (mutluit)


Lesenswert?

spess53 schrieb:
> Hi
>
>>eben, ich bin nicht mal sicher ob der TO nicht nur ein Troll ist, erst
>>will er den super hyper USBSATAFIREBUS kreieren, dann eröffnet er immer
>>so merkwürdige Threads und irgendwann kommt ein neuer Thread.......
>
> Ich habe alle Beiträge von ihm gelesen. Diesen Troll-Verdacht habe ich
> schon seit einiger Zeit. Aber vielleicht ist er nur ein kleiner Spinner.

Den Spinner nimmst du zurück und verpisst dich aus meinem Thread!

von Mutluit M. (mutluit)


Lesenswert?

Hallo @Moderator, kannst du mal was gegen die paar Idioten was 
unternehmen die hier den Thread vergiften mit ihren Off-Topic-Müll ?

von Mutluit M. (mutluit)


Lesenswert?

Joachim B. schrieb:
> Mutluit M. schrieb:
>> muss man
>> etwas rumlöten
>
> und wo ist das Problem?
>
> Mutluit M. schrieb:
>> Lötstellen aufbrechen
>
> wer tut denn sowas, ich kenne nur einen der "aufbricht"
>
> Heinz Erhardt "auf lasset uns brechen und machen auf den Weg"

Ja, ja, behalt solchen irrelevanten Schmarrn lieber für dich, hier 
jedenfalls ist es Off-Topic.

von Mutluit M. (mutluit)


Lesenswert?

Hab erst eben entdeckt, dass dieses Modul auch eine grüne LED hat die 
mit AOUT verbunden ist (d.h. wenn man DAC macht). Je nach Ausgabewert 
variiert die Intensität dieser LED. Sichtbar wird es erst so ab einem 
Wert von ca. 160+.
Sieht cool aus :-)

: Bearbeitet durch User
von Mutluit M. (mutluit)


Angehängte Dateien:

Lesenswert?

Hab jetzt eine simple ncurses Text-GUI dafür gebastelt. Sieht so aus:
1
PCF8591 YL-40 AD/DA Module - Press + or - to change AOUT, any other key to quit.
2
3
AIN0 (photocell:  brightness)      122  ******************************
4
AIN1 (thermistor: temperature)     254  ***************************************************************
5
AIN2 (?)                           255  ***************************************************************
6
AIN3 (trim poti: resistor)         211  ****************************************************
7
AOUT (aout: LED: intensity)        170  ******************************************
Code poste ich in Kürze.

Nachtrag: die Zuordnungen sind evtl. noch nicht richtig gesetzt,
denn Temperatur sollte eigentlich nicht so einen hohen Wert haben... :-)
Evtl. mit AIN0 vertauscht. Muss noch überprüfen...

: Bearbeitet durch User
von Mutluit M. (mutluit)


Lesenswert?

Also, wie ich oben auch schon angemerkt hatte, scheint mit dem 
Temperatur-Sensor allgemein etwas nicht in Ordnung zu sein, wie auch der 
folgende Tester schreibt:
https://arduinodiy.wordpress.com/2016/10/17/adding-a-pcf-8591-adcdac-to-esp8266-01/
1
"In my version of the board the NTC channel only varied between 255 and 254, changing the temperature didnt seem to have any influence, but removing jumper P4 made the value go all over the place so i presume the channel is ok, and only the NTC might not be OK."
(Mit NTC meint er den Temperatur-Sensor, aka thermistor)

Vielleicht aber fehlt noch etwas spezielles an der Programmierung, denn 
ich kann mir kaum vorstellen, dass so ein HW-Fehler über die ca. 10+ 
Jahre die es dieses Modul am Markt schon gibt, nicht bemerkt und gefixt 
worden wäre.

: Bearbeitet durch User
Beitrag #5859565 wurde vom Autor gelöscht.
von Markus W. (dl8mby)


Lesenswert?

@ Mutluit M.

wozu sind eigentlich die drei Jumper auf der Platine?

https://www.roboter-bausatz.de/media/image/c3/90/6c/PCF8591-1_600x600.jpg

Ich dachte die sind für die Einstellung der I2C Adresse ab einem Fixen
vorgegebenen Wert (z.B. 0x48) mit der Möglichkeit diesen um ein Delta
von 0-7 zu verändern.

Markus

von Joachim B. (jar)


Lesenswert?

spess53 schrieb:
> Du hast drei frei auswählbare Adresspins. das reicht für acht
> Adressen. Also acht PCF8591 anschließbar.

Mutluit M. schrieb:
> Denn, in dem Modul ist die Addresse festverdrahtet (verlötet)

Markus W. schrieb:
> Ich dachte die sind für die Einstellung der I2C Adresse ab einem Fixen
> vorgegebenen Wert (z.B. 0x48) mit der Möglichkeit diesen um ein Delta
> von 0-7 zu verändern.

das dachte ich auch, aber es ist ein leichtes die drei Jumper 
nacheinander zu ziehen und den I2C scan durchzuführen, man könnte ja 
auch per DMM die Jumperleitungen zu den Adresspins "durchklingeln"

Aber auf die Idee muss man erst mal kommen :)

Nach der Moderation zu rufen mit geklauten Bildern ist aber auch nicht 
besonders schlau!

: Bearbeitet durch User
von Mutluit M. (mutluit)


Lesenswert?

Markus W. schrieb:
>
> wozu sind eigentlich die drei Jumper auf der Platine?
>
> https://www.roboter-bausatz.de/media/image/c3/90/6c/PCF8591-1_600x600.jpg
>
> Ich dachte die sind für die Einstellung der I2C Adresse ab einem Fixen
> vorgegebenen Wert (z.B. 0x48) mit der Möglichkeit diesen um ein Delta
> von 0-7 zu verändern.

Das dachte ich die ganze Zeit auch, es trifft aber nicht zu;
denn die sind zum Anklemmen/Abklemmen der 3 On-Board-Sensoren.
Hatte bereits was dazu geschrieben, mit Verweis:
Beitrag "Re: ADC- und DAC-Experimente mit PCF8591 auf Banana Pi SBCs (WiringPi, i2c-tools)"

von Markus W. (dl8mby)


Lesenswert?

@Mutluit M.

Wenn Du an den Onboard Sensoren nicht so interessiert bist,
kannst Du sie ja ablöten und die Jumper für die I2C Adress-
Auswahl umfunktionieren. Bei einem Modul-Preis von 2€ kann man
den Verlust verschmerzen, falls was kaputt gehen sollte.

Von so billigen Dingern ordere ich mir meist fünf bis zehn,
da man da oft rumpfriemeln muss bis es einigermaßen funktioniert.

Markus

von Mutluit M. (mutluit)


Lesenswert?

Diese Module (PCF8591 YL-40) haben sogar 2 LEDs drauf (gekennzeichnet 
als D1 und D2), aber bei mir funktioniert nur D1 (AOUT). D2 soll 
leuchten wenn das Modul Strom hat (leuchtet bei mir nicht, ob das vlt. 
nur bei 5V geht und nicht 3.3V?).

Noch ein kleines Problem: ich hab 2 äusserlich identische von diesen 
Modulen (beide aus der selben Bestellung). Bei einem leuchtet D1 grün, 
bei dem anderen rot, und wie oben schon gesagt, leuchtet bei keinem die 
LED D2.

Hier ist der Schaltplan des Moduls, vlt. hat jemand eine Idee woran es 
liegen könnte dass D2 nicht leuchtet:
https://brainfyre.wordpress.com/2012/10/25/pcf8591-yl-40-ad-da-module-review/

Na, wie diese Dinger die QC passiert haben muss man sich schon fragen... 
:-)

von Markus W. (dl8mby)


Lesenswert?

@Mutluit M.

Da die Dinger so billig sind, besteht die Möglichkeit
das sie die QC, falls vorhanden, nicht bestanden haben
und nun auf einem Billigweg verramscht werden.
Check mal mit einem DMM ob die LED richtig herum eingelötet
ist, falls nicht, dann umlöten, oder beide LED,s gegeneinander
tauschen ;-)

Markus

von Mutluit M. (mutluit)


Lesenswert?

Joachim B. schrieb:
> spess53 schrieb:
>> Du hast drei frei auswählbare Adresspins. das reicht für acht
>> Adressen. Also acht PCF8591 anschließbar.
>
> Mutluit M. schrieb:
>> Denn, in dem Modul ist die Addresse festverdrahtet (verlötet)
>
> Markus W. schrieb:
>> Ich dachte die sind für die Einstellung der I2C Adresse ab einem Fixen
>> vorgegebenen Wert (z.B. 0x48) mit der Möglichkeit diesen um ein Delta
>> von 0-7 zu verändern.
>
> das dachte ich auch, aber es ist ein leichtes die drei Jumper
> nacheinander zu ziehen und den I2C scan durchzuführen, man könnte ja
> auch per DMM die Jumperleitungen zu den Adresspins "durchklingeln"
>
> Aber auf die Idee muss man erst mal kommen :)

Ach du Genie, hier friss:
i2cdetect zeigt immer die selbe Adresse 0x48 an, egal ob eine oder 
mehrere/alle Jumper angesteckt oder abgesteckt sind.
Da brauchst du nicht mehr mit DMM hingehen, weil überflüssig!
Ja, auf die Idee muss du echt erst mal kommen!... :-)

> Nach der Moderation zu rufen mit geklauten Bildern ist aber auch nicht
> besonders schlau!

Ein Screenshot machen kann man wohl kaum als geklaut nennen.
Das ist doch gang und gäbe in den Foren.
Es fällt sicherlich unter das sog. "Zitatrecht"
https://de.wikipedia.org/wiki/Urheberrecht#Zitatrecht
bzw. "Fair use and Fair dealing":
https://en.wikipedia.org/wiki/Copyright#Fair_use_and_fair_dealing

Wenn der Mod den Screenshot beanstandet hätte, dann hätte er schon 
darauf aufmerksam gemacht.

von Mutluit M. (mutluit)


Lesenswert?

Markus W. schrieb:
>
> Da die Dinger so billig sind, besteht die Möglichkeit
> das sie die QC, falls vorhanden, nicht bestanden haben
> und nun auf einem Billigweg verramscht werden.

Das Gefühl habe ich auch :-)

> Check mal mit einem DMM ob die LED richtig herum eingelötet
> ist, falls nicht, dann umlöten, oder beide LED,s gegeneinander
> tauschen ;-)

Das sind mikrig-kleine LEDs. Da lohnt sich der Aufwand nicht und mein 
Kolben ist auch nicht so fein für so eine Arbeit.
Da kann man nix mehr machen, muss es halt so akzeptieren, stört ja im 
Grunde nicht, hat halt nur eine andere Farbe. Egal. Man kann damit 
leben.

Ich würde dieses Modell sowieso nicht mehr kaufen, sondern das Modell wo 
man per Jumper die Adresse einstellen kann und dadurch bis zu 8 Module 
ans I2C-Bus ranhängen kann.

Nachtrag:
Ich hatte letztens auch folgenden 16-Kanal-Multiplexer gesehen (3 Stk 
für €5.37); aber ist wohl nur ein Umschalter so dass nur ein Kanal aktiv 
ausgewählt sein kann, aber dennoch interessant:
https://www.ebay.de/itm/3pcs-16CH-Analog-Digital-Multiplexer-Breakout-Precise-Module-CD74HC4067-TE669/133046277016
D.h. damit kann man pro ADC-Kanal aus 16 weiteren Kanälen dahinter 
auswählen.
Betriebsspannung ist zwar 2 bis 6V, aber ob die Signale mehr als 3.3V 
sein müssen geht aus der Beschreibung nicht klar hervor (4.5V taucht da 
auf); muss man sich wohl das Datenblatt des ICs besorgen.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.