en:configuration_analogic_inputs

No renderer 'pdf' found for mode 'pdf'

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. <note important>Les entrées analogiques doivent évoluer uniquement dans la plage de tension 0 à 3,3 V</note>

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)

  • en/configuration_analogic_inputs.txt
  • Last modified: 2020/07/05 17:13
  • (external edit)