Pages: [1]   Go Down
Author Topic: Tuto - Convertisseur D/A 12 bits MCP4921  (Read 1216 times)
0 Members and 1 Guest are viewing this topic.
Ales
Offline Offline
Faraday Member
**
Karma: 29
Posts: 3190
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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-grin

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% smiley-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  smiley-wink

Code:
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 !
Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 19
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 29
Posts: 3190
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut,

Concernant le LCD oui ça rentre parfaitement dans les "applications divers" smiley 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 !!
Logged


France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3025
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Quote
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.
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 29
Posts: 3190
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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 smiley-wink
Logged


France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3025
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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.
« Last Edit: September 13, 2010, 06:35:18 am by fdufnews » Logged

Ales
Offline Offline
Faraday Member
**
Karma: 29
Posts: 3190
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 19
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

http://servocity.com/

Logged

Pages: [1]   Go Up
Jump to: