Configuration des entrées analogiques

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.

Editer le fichier /boot/config.txt et ajouter la ligne suivante. Ouvrir l'éditeur avec la commande suivante

sudo nano /boot/config.txt
puis ajouter dans le fichier en bas de page
dtparam=spi=on

Lancer les commandes d'installation

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

Pour vérifier que cela fonctionne, le code python suivant va vous permettre de lire les valeurs (et les afficher en nombre de points et tension des 4 entrées).

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

Ici vous trouvez une séquence d'essai, avec une mise au potentiel de 3.3V (pris sur la broche 1WIRE), directement amené sur les broches 1 à 4 du MCP3204 (IC7)