Wednesday, 29 April 2015

Raspberry Pi, MCP3008 ADC & Python

I'm converting a vintage radio into a Raspberry Pi powered music player and I needed an analogue to digital converter (ADC) to allow my raspberry pi to read the old crusty switched and volume controls.

The MCP3008 ADC is pretty cheap and easy to use with the Pi, so I bagged myself one.


Raspberry Pi Spy has got a really good tutorial on setting up an MCP3008 to read analogue sensors which I followed to get everything running, but the code didn't fit my needs so I created a python class for reading data from the MCP3008.
from spidev import SpiDev

class MCP3008:
    def __init__(self, bus = 0, device = 0, channel = 0):
        self.bus, self.device, self.channel = bus, device, channel
        self.spi = SpiDev()

    def __enter__(self):
        self.open()
        return self

    def open(self):
        self.spi.open(self.bus, self.device)
    
    def read(self):
        adc = self.spi.xfer2([1, (8 + self.channel) << 4, 0])
        data = ((adc[1] & 3) << 8) + adc[2]
        return data

    def __exit__(self, type, value, traceback):
            self.close()
            
    def close(self):
        self.spi.close()

The class is really easy to use, using Python's 'with' statement to control it:
with MCP3008(channel = 0) as ch0:
    print ch0.read()
The code is here - github.com/martinohanlon/mcp3008

No comments:

Post a Comment

Note: only a member of this blog may post a comment.