How to Use MCP3008 ADC with Raspberry Pi: Simple Guide
To use the
MCP3008 analog-to-digital converter with a Raspberry Pi, connect it via SPI pins and use a Python library like spidev to read analog inputs. The MCP3008 converts analog signals to digital values that the Raspberry Pi can process.Syntax
The basic steps to use MCP3008 with Raspberry Pi involve initializing SPI communication, selecting the ADC channel, and reading the digital value.
- Initialize SPI: Open SPI bus and device.
- Read Channel: Send command bytes to MCP3008 to select channel and receive data.
- Process Data: Convert received bytes to a usable integer value representing the analog input.
python
import spidev spi = spidev.SpiDev() spi.open(0, 0) # Open SPI bus 0, device (CS) 0 spi.max_speed_hz = 1350000 def read_channel(channel): # MCP3008 expects 3 bytes: start bit, single/diff bit + channel, and don't care adc = spi.xfer2([1, (8 + channel) << 4, 0]) data = ((adc[1] & 3) << 8) + adc[2] return data # Example usage value = read_channel(0) print(value)
Example
This example shows how to read analog input from channel 0 of MCP3008 and print the value continuously every second.
python
import spidev import time spi = spidev.SpiDev() spi.open(0, 0) # SPI bus 0, device 0 spi.max_speed_hz = 1350000 def read_channel(channel): adc = spi.xfer2([1, (8 + channel) << 4, 0]) data = ((adc[1] & 3) << 8) + adc[2] return data try: while True: analog_value = read_channel(0) print(f"Analog value from channel 0: {analog_value}") time.sleep(1) except KeyboardInterrupt: spi.close()
Output
Analog value from channel 0: 512
Analog value from channel 0: 513
Analog value from channel 0: 510
... (updates every second)
Common Pitfalls
Common mistakes when using MCP3008 with Raspberry Pi include:
- Not enabling SPI interface on Raspberry Pi via
raspi-config. - Incorrect wiring of SPI pins (MOSI, MISO, SCLK, CS).
- Using wrong SPI bus or device numbers in code.
- Not setting
max_speed_hzproperly, causing communication errors. - Forgetting to close SPI connection after use.
python
import spidev spi = spidev.SpiDev() # Wrong: opening bus 1 instead of 0 spi.open(1, 0) # This will fail if MCP3008 is on bus 0 # Correct way: # spi.open(0, 0) spi.max_speed_hz = 1350000 # Remember to close spi.close()
Quick Reference
| Step | Description |
|---|---|
| Enable SPI | Use sudo raspi-config to enable SPI interface on Raspberry Pi |
| Connect MCP3008 | Wire MCP3008 pins to Raspberry Pi SPI pins (MOSI, MISO, SCLK, CS, VDD, GND) |
| Install spidev | Run pip install spidev to install Python SPI library |
| Initialize SPI | Open SPI bus 0, device 0 in code with spidev |
| Read Channel | Send command bytes and read 10-bit ADC value |
| Close SPI | Close SPI connection after use to free resources |
Key Takeaways
Enable SPI on Raspberry Pi before using MCP3008.
Connect MCP3008 correctly to SPI pins: MOSI, MISO, SCLK, and CS.
Use spidev Python library to communicate with MCP3008 via SPI.
Read analog values by sending proper command bytes and processing response.
Always close SPI connection after finishing communication.