Convertisseur Analogique Numérique pour Raspberry PI

 

Le Raspberry pi ne possède pas d'entrées analogiques, heureusement il existe un circuit simple à mettre en oeuvre le MCP3008 qui utilise le Port SPI.

Le schéma

Le MCP3008 peut directement être alimenté par le 3,3 V du raspberry. Donc comme le Raspberry ses 8 entrées (CH0 à CH7) ne supportent pas des tensions supérieures à 3,3 V.

La broche CS0 permet la sélection du circuit, les autres broches MOSI, MISO, SCLK appartiennent au Port SPI.


Le câblage


Il peut être réalisé sur plaque de connexion comme sur le dessin ci-dessous. Les fils verts sont les entrées à relier à une tension comprise entre 0 et 3,3 V
.

Activation de l'interface SPI

Il faut tout d'abord activer l'interface SPI sur le raspberry PI

Dans un terminal on tape :

$ sudo raspi - config

On choisit Advanced Options


On choisit SPI enable en répondant par OK à toutes les questions

On reboot

$ sudo reboot

Installation des bibliothèques

si la bibliothèque GPIO n'est pas chargée, il faut l'installer

$ pip install RPi.GPIO

puis installer les bibliothèques dev et le paquet spi

$ sudo apt - get install python3 dev
$ sudo apt - get libevent dev
$ sudo pip install spidev

Le programme

Le programme lit les 8 entrées analogiques du MCP3008. Il affiche dans la console l'entrée et la tension de 0 à 3,3 V avec 2 décimales .

Commentaires:

# Chargement du module spidev

# Creation d'un objet de com SPI

# Envoi de 3 bytes (requis par le  MCP3008, 128=>channel 0), renvoi une liste de 3 bytes pour les valeurs
# Valeur codée sur 10 bits

# Ouverture de la com SPI vers le MCP3008, broche CE0 (/dev/spidev0.0)

# Affichage de la tension arrondie à 2 décimales

# Fermeture de la com SPI, evite des erreurs suite à un trop grand nombre de connexions ouvertes simultanement

 

#!/usr/bin/python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO

import spidev
import time

if __name__ == "__main__":

	spiDevice = spidev.SpiDev()

	def ReadChannel(channel):

		adc = spiDevice.xfer2([1,(8+channel)<<4,0])
		data = ((adc[1]&3) << 8) + adc[2]
		return data

for channel in range(8):

	while True:

		if channel < 8:

			spiDevice.open(0,0)
			volt = ReadChannel(channel)
			print "Canal",channel
			print "Tension =", round(volt*(3.3/1023),2),"V"
			time.sleep(0.10)
			channel = channel+1
			spiDevice.close()

		else :

			channel = 0