Tuto - Convertisseur D/A 12 bits MCP4921

Bonjour à tous,

Aller c'est parti, 2ème tuto, cette fois je fais l'inverse de la dernière fois, à savoir comment passer du digital à l'analogique :smiley:

Digital à analogique, Késako ??

Vous connaissez surement le PWM, mais le PWM n'est pas réellement une tension continue. La bestiole que je vous propose, elle, fournit une réelle tension continue :

http://radiospares-fr.rs-online.com/web/search/searchBrowseAction.html?method=getProduct&R=0402756

Datasheet :

http://docs-europe.origin.electrocomponents.com/webdocs/0a88/0900766b80a88143.pdf

Les applications sont divers, celà permet dans beaucoup de cas d'obtenir un "potentiomètre" controlé par l'arduino.

Hardware

Rien de bien compliqué :

1 : +5V
2, 3, 4 : à relier à 3 pins digital de l'arduino.
5 : au GND pour la plupart des applications.
6 : c'est la tension de référence (la tension maxi qu'on retrouvera en sortie. Sur ce convertisseur c'est au maximum la tension d'alimentation, donc la plupart du temps on la mettre au +5V.
7 : GND.
8 : la sortie !

Software

J'ai concocté un ptit programme qui permet d'envoyer par port série une valeur de 0 à 100 (comme 0-100% :wink: ), 0 donnant 0V et 100 donnant 5V. Le dialoque avec l'engin est assez simple, il suffit de lui envoyer un mot de 16 bits, les 5 premiers étant des bits de configuration (cf. datasheet pour savoir à quoi ils correspondent), les 11 autres, la valeurs souhaitée.

Comme d'habitude pensez à adapter les numéros de pins aux votres :wink:

int CS=44;
int SCK=46;
int SDI=48;

char buffer[3];

void setup(){

  Serial.begin(9600);
  pinMode(CS,OUTPUT);
  pinMode(SDI,OUTPUT);
  pinMode(SCK,OUTPUT);
  digitalWrite(SCK,LOW);
  digitalWrite(SDI,LOW);
  digitalWrite(CS,LOW);   
}

void loop(){


if (Serial.available()) {
    
  for (int z=0;z<4;z++) buffer[z]='\0';   // on efface le buffer série
  int x=0;
  delay(20);
  
  while (Serial.available()) {  // réception des données série
      buffer[x++] = Serial.read();
    }

  int temp = strtol(buffer,NULL,10); // on passe le tableau en int
  constrain(temp,0,100);  // on vérifie qu'on est bien entre 0 et 100%
  temp= map (temp,0,100,0,4095); // on convertit à l'échelle du convertisseur (12 bits)
  int command[]={0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // le mot à envoyer, les 5 premiers bits étant la partie "configuration"

  for(int y=15;y>3;y--){    // on fait passer la valeur temp en binaire et on l'écrit dans le mot
  command[y]=temp & 1;  
  temp = temp >> 1;    
    }

    digitalWrite(CS,LOW); // c'est parti on envoi le mot !!
    
    for (int z=0;z<16;z++){
   
    
    if (command[z]==0) {
      digitalWrite(SDI,LOW);
      } else {
      digitalWrite(SDI,HIGH);
      }
   
    delay(1);
    digitalWrite (SCK,HIGH);
    delay(1);
    digitalWrite(SCK,LOW);
    delay(1);
      }
   
    digitalWrite(SDI,LOW);
    digitalWrite(CS,HIGH);
    
    
  }
}

Joyeux arduinage à tous !

bonsoir B@tto

quand tu dis :

Les applications sont divers, celà permet dans beaucoup de cas d'obtenir un "potentiomètre" controlé par l'arduino.

via ton petit circuit pense tu que je puisse l'utiliser pour faire varier le contraste d'un LCD sans trop de cablage ?
parce que pour le coup je suis bien intéréssé par ton jouet

Sur un autre sujet aurais tu un conseil pour un bon servo moteur assez puissant pour faire bouger environ 8 kilo ?

Merci par Avance

Salut,

Concernant le LCD oui ça rentre parfaitement dans les "applications divers" :slight_smile: et question cablage comme tu peux le lire dans mon tuto, il n'y a que de la connexion à faire, et certains pins sont reliés à la même chose. Au final tu as besoin : du +5V, du GND et 3 fils pour le commander depuis l'arduino. Il ne reste que ta sortie ensuite !

Concernant le servo désolé mais je ne m'y connais pas du tout ! Mais 8 kilos tu commences à taper dans du très gros il me semble !!

via ton petit circuit pense tu que je puisse l'utiliser pour faire varier le contraste d'un LCD sans trop de cablage ?

C'est pas un peu luxueux pour régler le contraste d'un afficheur. Les 1024 niveaux de l'ADC de l'arduino doivent être largement suffisants

Sur un autre sujet aurais tu un conseil pour un bon servo moteur assez puissant pour faire bouger environ 8 kilo

je n'ai pas de référence à te proposer mais tu devrais regarder dans les servo utiliser dans le modélisme à voile. Il y a des modèles assez puissants utilisés pour border les voiles.

Quote:
via ton petit circuit pense tu que je puisse l'utiliser pour faire varier le contraste d'un LCD sans trop de cablage ?

C'est pas un peu luxueux pour régler le contraste d'un afficheur. Les 1024 niveaux de l'ADC de l'arduino doivent être largement suffisants

C'est un DAC, pas un ADC :wink:

C'est un DAC, pas un ADC

Aïe, aïe dyslexie passagère (enfin je l'espère).

Je reste quand même sur ma position, une conversion 12 bits pour le réglage du contraste d'un LCD cela reste quand même luxueux.

Oui sur ce point tu n'as pas tort !! Mais de mémoire en-dessous de 8 bits y a pas grand chose, et les prix sont quasi les mêmes.

en meme temps c'est que 3 euros environ
Mais j'aime bien l'idée , pour un autre projet

Concernant le Servo , j'ai trouvé ca mais je sais pas si cela existe moins cher