10-bit ADC (SPI) MCP3008 - 8 Channel
Features
- 10-bit resolution
- ± 1 LSB max DNL
- ± 1 LSB max INL
- 8 input channels
- Analog inputs programmable as single-ended or pseudo-differential pairs
- On-chip sample and hold
- SPI serial interface (modes 0,0 and 1,1)
- Single supply operation: 2.7V - 5.5V
- 200 ksps max. sampling rate at VDD=5V
- 75 ksps max. sampling rate at VDD=2.7V
- Low power CMOS technology
- 5 nA typical standby current, 2 µA max.
- 500 µA max. active current at 5V
- Industrial temp range: -40°C to 85°C
Applications
- Sensor Interface
- Process Control
- Data Acquisition
- Battery Operated Systems
What's in the box?
1 x 10-bit ADC 8 Channel IC
Resources
The following sample assumes that you're running the latest official Raspbian distribution, that you're logged in as root and that you haven't yet customized Raspbian to use SPI from a Python script. By default, the kernel module managing SPI communications is not loaded on Raspbian, so let's ensure that the 'spidev' device is available.
root@raspberrypi:/# lsmodModule Size Used by snd_bcm2835 12808 0 snd_pcm 74834 1 snd_bcm2835 snd_seq 52536 0 snd_timer 19698 2 snd_seq,snd_pcm snd_seq_device 6300 1 snd_seq snd 52489 5 snd_seq_device,snd_timer,snd_seq,snd_pcm,snd_bcm2835 snd_page_alloc 4951 1 snd_pcm
If 'spidev' device is not listed, we need to remove it from the kernel module 'blacklist' so that it's automatically loaded on the next boot:
root@raspberrypi:/# nano /etc/modprobe.d/raspi-blacklist.conf
Put a hash character in front of the 'blacklist spi-bcm2708' statement and save the file:
#blacklist spi-bcm2708
then, manually load the SPI device:
root@raspberrypi:/# modprobe spidev
The command should just complete without returning an error. Validate the list of modules:
root@raspberrypi:/# lsmod Module Size Used by spi_bcm2708 4401 0 spidev 5136 0 snd_bcm2835 12808 0 snd_pcm 74834 1 snd_bcm2835 snd_seq 52536 0 snd_timer 19698 2 snd_seq,snd_pcm snd_seq_device 6300 1 snd_seq snd 52489 5 snd_seq_device,snd_timer,snd_seq,snd_pcm,snd_bcm2835 snd_page_alloc 4951 1 snd_pcm
The 'spidev' device should now be available.
Next, install the 'git' package. It will be needed to install other packages from Github.
apt-get install git-core
Install the 'python-dev' package. It will be needed to compile the 'py-spidev' package.
apt-get install python-dev
Download and compile the 'py-spidev' package.
root@raspberrypi:/# cd /home root@raspberrypi:/home# git clone git://github.com/doceme/py-spidev root@raspberrypi:/home# cd py-spidev/ root@raspberrypi:/home# python setup.py install
At this point, SPI is available from Python 2.7. Assuming that you have wired the MCP3008 to the Raspberry Pi's SPI bus using CE0 as the 'chip select' pin, you can read all eight analog inputs using the following Python script.
root@raspberrypi:/home# nano adc.py
Paste the script below in the editor and save it.
import spidev import time spi = spidev.SpiDev() spi.open(0,0) # read SPI data from MCP3008 chip, 8 possible adc's (0 thru 7) def readadc(adcnum): if ((adcnum > 7) or (adcnum < 0)): return -1 r = spi.xfer2([1,(8 adcnum)<<4,0]) adcout = ((r[1]&3) << 8) r[2] return adcoutwhile True: for adcInput in range(0,8): print "ADC(", adcInput,")=", readadc(adcInput) time.sleep(1)
To execute the script
root@raspberrypi:/home# python adc.py
Sample output using a 10K Ohm trimpot connected to the ADC's pin 3 and all other pins pulled down to ground using a 10k resistor.
ADC( 0 )= 0 ADC( 1 )= 0 ADC( 2 )= 0 ADC( 3 )= 507 ADC( 4 )= 0 ADC( 5 )= 0 ADC( 6 )= 0 ADC( 7 )= 0
Credits go to Jeremy for his work on the 'py-spidev' Python module which makes working with the MCP3008 straight forward. Alternatively, checkout wiringPi's SPI functions if you prefer using a 'C' API.
Related Tutorials & Samples