Analogs inputs configuration

Le Raspberry Pi (2) est dépourvu d'entrées analogiques. La carte SVXLink Card est équipée d'un convertisseur assurant cette fonction (IC7 MCP3204) pour 4 mesures.

Les entrées analogiques doivent évoluer uniquement dans la plage de tension 0 à 3,3 V

Il faut dans un premier temps mettre en route le bus SPI au démarrage.

Edit the file /boot/config.txt and add this line: Run editor with this command

sudo nano /boot/config.txt
then add this line in the file at the end of the page
dtparam=spi=on

For software modules installation, execute these commands

sudo apt-get install python-dev python-pip
sudo pip install spidev

To verify it works, the following python code will allow you to read the values (and display in points and voltage of the 4 inputs).

test-analog.py

#!/usr/bin/python
#
# MCP3204/MCP3208 sample program for Raspberry Pi
#
# how to setup /dev/spidev?.?
# $ sudo modprobe spi_bcm2708
#
# how to setup spidev
# $ sudo apt-get install python-dev python-pip
# $ sudo pip install spidev
#
import spidev
import time
 
class MCP3208:
	def __init__(self, spi_channel=0):
		self.spi_channel = spi_channel
		self.conn = spidev.SpiDev(0, spi_channel)
		self.conn.max_speed_hz = 1000000 # 1MHz
 
	def __del__( self ):
		self.close
 
	def close(self):
		if self.conn != None:
			self.conn.close
			self.conn = None
 
	def bitstring(self, n):
		s = bin(n)[2:]
		return '0'*(8-len(s)) + s
 
	def read(self, adc_channel=0):
		# build command
		cmd = 128 # start bit
		cmd += 64 # single end / diff
		if adc_channel % 2 == 1:
			cmd += 8
		if (adc_channel/2) % 2 == 1:
			cmd += 16
		if (adc_channel/4) % 2 == 1:
			cmd += 32
 
		# send & receive data
		reply_bytes = self.conn.xfer2([cmd, 0, 0, 0])
 
		#
		reply_bitstring = ''.join(self.bitstring(n) for n in reply_bytes)
		# print reply_bitstring
 
		# see also... http://akizukidenshi.com/download/MCP3204.pdf (page.20)
		reply = reply_bitstring[5:19]
		return int(reply, 2)
 
if __name__ == '__main__':
		spi = MCP3208(0)
 
		count = 0
		a0 = 0
		a1 = 0
		a2 = 0
		a3 = 0
 
		#while count <= 11:
		while True:
			count += 1
			a0 += spi.read(0)
			a1 += spi.read(1)
			a2 += spi.read(2)
			a3 += spi.read(3)
 
			if count == 10:
				print "A1=%04d(%.2fV) A2=%04d(%.2fV) A3=%04d(%.2fV) A4=%04d(%.2fV)" % (a0/10, a0/10*3.3/4096, a1/10, a1/10*3.3/4096, a2/10, a2/10*3.3/4096, a3/10, a3/10*3.3/4096,)
				time.sleep(1)
 
				count = 0
				a0 = 0
				a1 = 0
				a2 = 0
				a3 = 0

Here is a test sequence, with the voltage setting of 3.3V (taken on the 1WIRE pin), directly sent to pins 1 to 4 of the MCP3204 (IC7)