[TUTORIEL] Convertisseur A/N MCP3008

Informations et questions sur les composants tiers de la boutique (émetteur/récepteur RF, capteurs...)

[TUTORIEL] Convertisseur A/N MCP3008

Message non lude Laetitia » Ven 1 Mar 2013 12:37

Bonjour,

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 -

Schéma_final.png
Schéma_final.png (40.1 Kio) Vu 1863 fois

Quelques petites précisions par rapport aux branchements :

Pinout_.png
Pinout_.png (18.24 Kio) Vu 1863 fois

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 :
SPI_single_slave.png
SPI_single_slave.png (5.36 Kio) Vu 1863 fois

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:

Config_bits_single.png
Config_bits_single.png (13.9 Kio) Vu 1863 fois

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 !
Fichiers joints
MCP3008_datasheet.pdf
(746.09 Kio) Téléchargé 115 fois
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 296
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse

Retourner vers Composants tiers

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron