Raspberry Pi PCF8591 AD-DA Sensor Python Interface
In this demo we'll be using Python Tkinter to build a user interface to control-read a PCF8591T sensor module. The PCF8591T features four-8-bit analog to digital converters and a single 8-bit digital to analog converter.
This will operate through the I2C interface on the Raspberry Pi. Tkinter will be used to program general the user interface pictured above. This features four buttons (labeled AIN0-AIN4) that when pressed will read corresponding AD channel.
In addition one can enter a values from 0-255 in the box and when AOUT is pressed the value is written to the DA channel where the output voltage can be measured with a volt meter.
In this case I connected the AOUT channel to AIN2 so the output value can be read back. The fact that the AD and DA process uses only 8-bits introduced an error of one or two LSB. The power supply connection for VCC was only 4.75 volts and the most of the apparent error was on the high end.
In addition I used a level converter between the Raspberry Pi's I2C operating at 3-volts with the PCF8255 operating at 5-volts. The converter should not have contributed to the conversion-read back errors.
One oddity is when reading one of the AD channels one must perform what I call a dummy read. Then read it again to get a value. The first read begins the conversion - the next get the first value. As long as one keeps reading the same channel, this only needs to be done once; change channels the process must be repeated.
The device has a sequential read mode for the four AD channels. See the spec sheet for more on that.
To write to the DA channel a single command must be written as follows:
bus.write_byte_data(address, 0x40, value)
Address of the device address, 0x40 is for function register to select DA, and value from 0-255 for the output voltage. The DA register like the AD registers are all 8-bit.
Some of the Tkinter design was adopted from Programming The Raspberry Pi by Monk, Simon. The book covered almost nothing on hardware and that wasn't the only problem I encountered. The book was written for Python 3 and above, but the smbus I used to access the I2C works in Python 2.7 not 3.
In addition using Tkinter with Python 2.7 the "T" must be upper case, with Python 3 lower case. That was a headache to find.
But the design works well and should be the basis for use with other I2C devices such as an Arduino. My next project is the use a similar interface to an Arduino to read Arduino's 10-bit AD converters.
Download program pcf8591.txt.
PCF8591 spec sheet. (PDF file)
PCF8591 module. (picture)
- Software and setup:
- Raspberry Pi Openbox Desktop 2019
- Setting up Openbox for Raspberry Pi
- WiringPi and Pulse-Width-Modulation with Raspberry Pi
- WiringPi for Raspberry Pi and MAX6675 thermal-couple sensor
- WiringPi Blink an LED Demo
- Interface I2C LCD to Raspberry Pi in C
- ADS1115 4-Channel ADC Uses I2C with Raspberry Pi
- MCP4725 12-Bit DAC Interface to Raspberry Pi
- Raspberry Pi with PCF8591 Analog To Digital Control in C
- Raspberry Pi PCF8591 AD-DA Sensor Python Interface
This is a collection of programs and hardware hacks related to mainly Raspberry Pi and Debian Linux.
- Main Light Fast Linux Desktops with Openbox, JWM
- Test Reuse Surplus PC Power Supplies
- Add WBAR Launch Dock to Raspberry Pi
- Add MPG123 Terminal Music Player to Raspberry Pi, Linux
- Basics of Alsamixer Audio Control for Linux
- Add Solid State Hard Drive to Raspberry Pi
- Beep a PC Speaker Add Beeper to Raspberry Pi
- Using FEH Wallpaper Setter Under Linux
- Scrot Lite Weight Screen Shot Software for Linux
- Using Light Weight Beaver Text Editor
- Install Viewnior Image Viewer for Linux
- Zmixer ALSA Sound Control Tutorial
- Tutorial Xinitrc Desktop Manager Control for Linux
- Setup Raspberry Pi Using JWM Window Manager
Web site Copyright Lewis Loflin, All rights reserved.
If using this material on another site, please provide a link back to my site.