en:configuration_analogic_inputs

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

en:configuration_analogic_inputs [2016/01/27 22:31]
en:configuration_analogic_inputs [2020/07/05 17:13] (current)
Line 1: Line 1:
 +====== 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.
 +
 +===== File /boot/config.txt =====
 +Edit the file /boot/config.txt and add this line:
 +Run editor with this command
 +<code bash>
 +sudo nano /boot/config.txt
 +</code>
 +then add this line in the file at the end of the page
 +<code>
 +dtparam=spi=on
 +</code>
 +
 +===== Installation of the python module for the SPI bus management =====
 +For software modules installation, execute these commands
 +<code bash>
 +sudo apt-get install python-dev python-pip
 +sudo pip install spidev
 +</code>
 +=====  Acquisition tests of input analogs channels =====
 +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).
 +
 +<code python | 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
 +</code>
 +
 +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)
 +{{ :documents:test-analog-inputs.gif?nolink |}}