![]() |
Dernière révision : avril 2025 |
![]() |
![]() |
![]() |
![]() |
![]() | ![]() |
Sommaire Introduction L’électronique et l’informatique ont profondément modifié notre société. C’est certainement la révolution industrielle la plus rapide de l’histoire de l’humanité. Aujourd'hui, les systèmes embarqués sont omniprésents dans notre vie quotidienne et nous emmènent vers un monde de plus en plus connecté, avec ses avantages et ses inconvénients... L’auteur ne pourra en aucun cas être tenu responsable des dommages qui résulteraient de l’utilisation des informations publiées sur ce site, sous licence Creative Commons BY-NC-SA. Toute reproduction ou modification d'un document, même partielle, est autorisée à condition que son origine et le nom de l'auteur soient clairement indiqués (BY), qu'il soit utilisé à des fins non commerciales (NC), que son mode de diffusion soit identique au document initial (SA), et que cela ne porte pas atteinte à l’auteur. Ce document présente un projet utilisant une carte Arduino, en espérant toujours être le plus clair et précis possible. Malgré tout le soin apporté à la rédaction, l'auteur vous remercie de bien vouloir le contacter si vous relevez la moindre erreur ou omission, et vous souhaite une agréable lecture. Objectif Générer une courbe à l'aide d'un module MCP4725 (DAC 12 bits). Niveau ![]() Matériel utilisé
Programme (sketch) // générer une courbe à l'aide d'un module MCP4725 (DAC 12 bits) // philippe.notez@inmc.fr // cc-by-nc-sa #include <Wire.h> #include <Adafruit_MCP4725.h> #include <EEPROM.h> Adafruit_MCP4725 dac; unsigned char type_courbe; int nbr_pas,nbr_cycles; long periode,duree_pas; void delayMilliseconds(unsigned temps) { unsigned i=0; while (i<temps) { yield(); delayMicroseconds(1000); i++; } } void modif_par() { unsigned char car=0,i=0,tab_nbr_pas[5],tab_periode[6],tab_nbr_cycles[4],saisie=0; int adr_eeprom=1; // type de courbe Serial.write("Entrez le type de courbe (1 = sinus, 2 = demi-sinus, 3 = triangle, défaut = 1) : "); while (car!=13) if (Serial.available()>0) { car=Serial.read(); if (car!=13) type_courbe=car; } Serial.write(type_courbe); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); if ((type_courbe<49) || (type_courbe>51)) type_courbe=49; // nombre de pas pour une période // 10 pas -> 1000 mV / pas // 20 pas --> 500 mV / pas // 50 pas --> 200 mV / pas // 100 pas -> 100 mV / pas // 200 pas --> 50 mV / pas // 500 pas --> 20 mV / pas // 1000 pas -> 10 mV / pas Serial.write("Entrez le nombre de pas pour une période (10, 20, 50, 100, 200, 500 ou 1000, défaut = 10) : "); car=0; while (car!=13) if (Serial.available()>0) { car=Serial.read(); if ((car!=13) && (i<4)) tab_nbr_pas[i++]=car; } tab_nbr_pas[i]=0; Serial.write(tab_nbr_pas,strlen(tab_nbr_pas)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); nbr_pas=atoi(tab_nbr_pas); if ((nbr_pas!=10) && (nbr_pas!=20) && (nbr_pas!=50) && (nbr_pas!=100) && (nbr_pas!=200) && (nbr_pas!=500) && (nbr_pas!=1000)) nbr_pas=10; // période (86400 s = 24 h) Serial.write("Entrez la période (1 à 86400 s, défaut = 1 s) : "); car=0; i=0; while (car!=13) if (Serial.available()>0) { car=Serial.read(); if ((car!=13) && (i<5)) tab_periode[i++]=car; } tab_periode[i]=0; Serial.write(tab_periode,strlen(tab_periode)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); periode=atol(tab_periode); if ((periode<1) || (periode>86400)) periode=1; duree_pas=(periode*1000)/nbr_pas; // nombre de cycles Serial.write("Entrez le nombre de cycles (1 à 365, défaut = 1) : "); car=0; i=0; while (car!=13) if (Serial.available()>0) { car=Serial.read(); if ((car!=13) && (i<3)) tab_nbr_cycles[i++]=car; } tab_nbr_cycles[i]=0; Serial.write(tab_nbr_cycles,strlen(tab_nbr_cycles)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); nbr_cycles=atoi(tab_nbr_cycles); if ((nbr_cycles<1) || (nbr_cycles>365)) nbr_cycles=1; Serial.write("Enregistrer les paramètres dans l'EEPROM (o/N) ? "); car=0; while (car!=13) if (Serial.available()>0) { car=Serial.read(); if (car!=13) saisie=car; } Serial.write(saisie); if (tolower(saisie)=='o') { // EEPROM.update(int adresse, octet) : lire, puis écrire si l'octet est différent // EEPROM.put(int adresse, variable) : écrire une donnée de type quelconque (utilise EEPROM.update) // EEPROM.get(int adresse, variable) : lire une donnée de type quelconque EEPROM.update(0,1); EEPROM.update(adr_eeprom++,type_courbe); i=0; while (i<=strlen(tab_nbr_pas)) EEPROM.update(adr_eeprom++,tab_nbr_pas[i++]); i=0; while (i<=strlen(tab_periode)) EEPROM.update(adr_eeprom++,tab_periode[i++]); i=0; while (i<=strlen(tab_nbr_cycles)) EEPROM.update(adr_eeprom++,tab_nbr_cycles[i++]); } } void lire_eeprom() { unsigned char valeur,i=0,tab_nbr_pas[5],tab_periode[6],tab_nbr_cycles[4],car=0,saisie=0; int adr_eeprom=1; valeur=EEPROM[0]; if (valeur==1) { // type de courbe type_courbe=EEPROM[adr_eeprom++]; Serial.write("Type de courbe (1 = sinus, 2 = demi-sinus, 3 = triangle) : "); Serial.write(type_courbe); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); // nombre de pas pour une période while (EEPROM[adr_eeprom]!=0) tab_nbr_pas[i++]=EEPROM[adr_eeprom++]; tab_nbr_pas[i]=0; nbr_pas=atoi(tab_nbr_pas); Serial.write("Nombre de pas pour une période (10, 20, 50, 100, 200, 500 ou 1000) : "); Serial.write(tab_nbr_pas,strlen(tab_nbr_pas)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); // periode adr_eeprom++; i=0; while (EEPROM[adr_eeprom]!=0) tab_periode[i++]=EEPROM[adr_eeprom++]; tab_periode[i]=0; periode=atol(tab_periode); duree_pas=periode/nbr_pas; Serial.write("Période (1 à 86400 s) : "); Serial.write(tab_periode,strlen(tab_periode)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); // nombre de cycles adr_eeprom++; i=0; while (EEPROM[adr_eeprom]!=0) tab_nbr_cycles[i++]=EEPROM[adr_eeprom++]; tab_nbr_cycles[i]=0; nbr_cycles=atoi(tab_nbr_cycles); Serial.write("Nombre de cycles (1 à 365) : "); Serial.write(tab_nbr_cycles,strlen(tab_nbr_cycles)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); Serial.write("Modifier les paramètres (o/N) ? "); while (car!=13) if (Serial.available()>0) { car=Serial.read(); if (car!=13) saisie=car; } Serial.write(saisie); if (tolower(saisie)=='o') { Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); modif_par(); } } else modif_par(); } void setup(void) { Wire.begin(); dac.begin(0x60); // adresse I2C (0x60 à 0x67) dac.setVoltage(0,false); // false = ne pas enregistrer la valeur dans l'EEPROM interne Serial.begin(9600); while (Serial.available()>0) Serial.read(); Serial.write(13); Serial.write(10); lire_eeprom(); } void loop(void) { int num_pas,valeur; float angle,pas; while (nbr_cycles>0) { num_pas=0; switch (type_courbe) { // sinus case 49 : angle=-PI/2; pas=(2*PI)/nbr_pas; while (num_pas<nbr_pas) { valeur=2047+(sin(angle)*2047); // 0 à 4094 dac.setVoltage(valeur,false); delayMilliseconds(duree_pas); angle+=pas; num_pas++; } break; // demi-sinus case 50 : angle=0; pas=PI/nbr_pas; while (num_pas<nbr_pas) { valeur=sin(angle)*4095; // 0 à 4095 dac.setVoltage(valeur,false); delayMilliseconds(duree_pas); angle+=pas; num_pas++; } break; // triangle case 51 : valeur=0; pas=8190/nbr_pas; while (num_pas<=nbr_pas) { dac.setVoltage(valeur,false); delayMilliseconds(duree_pas); if (num_pas<(nbr_pas/2)) valeur+=pas; else valeur-=pas; num_pas++; } } nbr_cycles--; } } |
Haut de page |
![]() |
![]() |
![]() |