Un convertisseur analogique-numérique (CAN) est un composant qui permet faire correspondre à un signal analogique, une valeur numérique (codée sur plusieurs bits) proportionnelle à celle-ci.
L'Arduino possède son propre CAN, qui permet d'interpréter ce qui arrive sur ses pins analogiques et de les retranscrire sous la forme d'un nombre compris entre 0 et 1023 (1024 = 2^10 valeurs, soit 10 bits). Mais si vous avez besoin de davantage d'entrées analogiques il faudra passer par l'intermédiaire d'un CAN afin de "traduire" un signal analogique sur une pin digitale.
Le MCP3008 permet d'ajouter 8 entrées analogiques (codées sur 10 bits également) à votre Arduino en utilisant seulement 4 pins et fonctionne grâce à une interface SPI.
Le montage d'aujourd'hui nous permettra de remonter la valeur lue sur un potentiomètre rotatif, sur une pin digitale !
- MATÉRIEL -
- Arduino Uno (x1)
- Convertisseur analogique/numérique MCP3008 (x1)
- Potentiomètre rotatif (x1)
- SCHÉMA DU MONTAGE -
Quelques petites précisions par rapport aux branchements :
Les pins 1 à 8 du CAN correspondent aux différents canaux sur lesquels se feront les lectures analogiques. Pour les pins 9 à 16 :
- DGND = Digital Ground, à relier à la masse
- CS = Chip Select, actif à l'état bas, à relier à la pin D10 de l'Arduino (SS)
- DIN = Data IN, à relier à la pin D11 (MOSI)
- DOUT = Data OUT, à relier à la pin D12 (MISO)
- CLK = Clock, à relier à la pin D13 (SCLK)
- AGND = Analog Ground, à relier à la masse aussi
- VREF = Voltage Reference, le maximum qui correspondra à la valeur 1023 une fois la conversion effectuée, ici +5V
- VDD = alimentation, ici +5V.
- EXPLICATIONS -
Le MCP3008 communique via une interface SPI. Quelques explications sont nécessaires :
Wikipedia a écrit:Une liaison SPI (Serial Peripheral Interface) est un bus de données série synchrone qui opère en full-duplex.
Décortiquons un peu :
> Synchrone = fonctionne avec une horloge
> Full-duplex = les données sont transportées simultanément dans les deux sens (de maître à esclave et inversement).
La liaison entre le maître et l'esclave se fait de la façon suivante :
avec SCLK = Serial Clock ; MOSI = Master Out, Slave In ; MISO = Master In, Slave Out ; SS = Slave Select (la barre au-dessus signifie qu'il est actif à l'état bas).
Transmission typique :
Le maître génère l'horloge et sélectionne l'esclave avec lequel il veut communiquer. L'esclave répond aux requêtes du maître. A chaque coup d'horloge le maître et l'esclave s'échangent un bit.
L'IDE Arduino intègre une librairie SPI pour faciliter les échanges. La communication peut se faire soit via le connecteur ICSP, soit sur certaines cartes directement via des pins dédiées.
Ici sur un Arduino Uno, on aura :
- SS > D10
- MOSI > D11
- MISO > D12
- SCLK > D13
Maintenant que vous avez compris le principe d'une liaison SPI, nous allons nous intéresser à la communication avec notre CAN en particulier. Quand on parcourt la datasheet on se rend rapidement compte qu'il faut envoyer une commande spécifique pour sélectionner chaque canal, suivant le mode d'utilisation choisi.
Ici on ne s'intéressera pas aux modes différentiels (qui permettent de calculer une différence de potentiel entre deux entrées), on trouve donc le tableau suivant page 19 de la datasheet:
Il faut étudier le chronogramme en page 20 pour voir que le CAN s'attend à recevoir les bits de contrôle juste après le bit de start, donc sous la forme [Start][SGL/DIFF][D2][D1][D0][x][x][x], où [x] est un bit de n'importe quelle valeur.
- CODE -
- Code: Tout sélectionner
/*
Utilisation d'un convertisseur analogique-numérique MCP3008 avec Arduino
Lecture d'un potentiomètre sur pin digitale
Arduino IDE 1.0.3
*/
#include <SPI.h>
#define slaveSelect 10
void setup()
{
pinMode(slaveSelect, OUTPUT);
// Initialisation du bus SPI
SPI.begin();
// Configuration du mode d'envoi des données :
SPI.setBitOrder(MSBFIRST); // bit le plus à gauche en premier
SPI.setDataMode(SPI_MODE0); // Mode 0 : données capturées sur front montant d'horloge et transmises sur front descendant
// Initialisation de la liaison série
Serial.begin(9600);
}
void loop()
{
// Commande à envoyer au MCP3008 (sélection du canal)
byte channel = 0b01000000;
digitalWrite(slaveSelect, LOW);
// Envoi de la commande de lecture
SPI.transfer(channel);
// Envoi de deux bytes nuls pour réception des données
byte high = SPI.transfer(0);
byte low = SPI.transfer(0);
// Fin de la communication
digitalWrite(slaveSelect, HIGH);
// Conversion en un seul "mot" de 16 bits
unsigned int data = word(high, low);
// Décalage à droite pour conserver les 10 bits qui nous intéressent
data = (data >> 6);
// Envoi sur liaison série
Serial.println(data);
delay(250);
}
Voilà, vous êtes maintenant capable d'utiliser un CAN et de faire communiquer votre Arduino avec n'importe quel composant via une liaison SPI ! Pour ceux qui veulent aller plus loin : plus d'infos sur les CAN et le SPI...
C'est tout pour aujourd'hui, j'espère que ce tutoriel vous aura plu, et bonne bidouille en attendant le prochain !