====== Programmation Arduino ====== \\ Je vais enfin commencer à attaquer mon programme entier, comme il s'étalera sur plusieurs semaines, et que les photos prennent de la place je mettrai tout ici =) \\ ------------------------------------------------------------------------------------------------------------- === Programme détection luminosité === \\ Dans ce programme je mets en pratique ce que j'ai dit dans le journal de bord, a savoir que je lis les valeur des 2 photodiode et je les soustraits (laser éteint), puis j'allume le laser et relis les valeurs des 2 photodiodes, puis soustrais les 2 valeurs finales obtenues (pour enlever le problème de la luminosité de la pièce) pour plus de précision, je vous invite a relire la partie étude de la photodiode [[:wiki:projets:telemetre:jdb#semaine4|ici]]. \\ \\ Je modifie légèrement mon programme avec la fonction analogReference (comme expliqué dans les tests) pour beaucoup plus de précision. \\ \\ {{ :wiki:projets:telemetre:programme_bpw34.png?200 |}} \\ \\ /* Partie détection des signaux renvoyés par les photodiodes \\ - 2 Photodiodes BPW34 \\ - 2 Résistances de 100kohm \\ - Une diode laser (rouge) \\ Théo D */ int valeur1;\\ int valeur2;\\ int valeur_fin; void setup() { pinMode(1, OUTPUT); //laser en 1 pinMode(A0, INPUT); //photodiode 1 en A0 pinMode(A1, INPUT); //photodiode 2 en A1 Serial.begin(115200); //initialisation de la comunication avec le PC analogReference(INTERNAL); // valeur de référence analogique de 0 à 1,1V } void loop() { digitalWrite(1, LOW); //laser eteint valeur1 = analogRead(A0) - analogRead(A1); //lecture signaux delay(10); digitalWrite(1, HIGH); //laser alumé valeur2 = analogRead(A0) - analogRead(A1); //lecture signaux delay(10); valeur_fin = valeur2 - valeur1; //luminosité du laser Serial.print(valeur_fin); //renvoie de la valeur sur le moniteur série delay(10); } --------------------------------------------------------------------------------------------------------------- === Programme controle du moteur === \\ Voilà le programme pour notre moteur pas à pas, je vous rappelle que j'utilise le shield moteur d'arduino et que notre moteur est un moteur bipolaire. \\ \\ {{ :wiki:projets:telemetre:programme_mot.png?200 |}} \\ /*Programme moteur pas à pas RS 5350401 piloté pas un shield moteur Arduino \\ Théo D */ void setup() { //pins de direction pinMode(12, OUTPUT); //CH A pinMode(13, OUTPUT); //CH B //pins de frein pinMode(9, OUTPUT); // CH A pinMode(8, OUTPUT); // CH B } \\ int temp = 50; \\ void loop() { digitalWrite(9, LOW); //On enlève le frein sur CH A digitalWrite(8, HIGH); //On le met sur CH B digitalWrite(12, HIGH); // on choisis la direction analogWrite(3, 255); //on fait tourner CH A delay(temp); digitalWrite(9, HIGH); //On met le frein sur CH A digitalWrite(8, LOW); // On l'enlève sur CH B digitalWrite(13, LOW); //On choisis la direction analogWrite(11, 255); //On fait tourner CH B delay(temp); digitalWrite(9, LOW); //On enlève le frein sur CH A digitalWrite(8, HIGH); //On le met sur CH B digitalWrite(12, LOW); // on choisis la direction analogWrite(3, 255); //on fait tourner CH A delay(temp); digitalWrite(9, HIGH); //On met le frein sur CH A digitalWrite(8, LOW); // On l'enlève sur CH B digitalWrite(13, HIGH); //On choisis la direction analogWrite(11, 255); //On fait tourner CH B delay(temp); } \\ -------------------------------------------------------------------------------------------------- {{anchor:prog_nolcd}} === Programme final sans afficahge lcd === \\ Je couple le programme moteur au programme de détection, il faut que je change certaine entrée par exemple la A0 qui est utilisée par le shield moteur. De plus je joue avec la fonction delay qui met en pose completement le programme, or j'en est besoin dans les 2 programmes et il faut qu'ils s'exécutent en même temp. J'arive donc à les coupler. Par exemple la fonction détection a besoin de 30 miliseconde de delay en tout, or pour que notre moteur tourne doucement on a besoin de 100 miliseconde de delay a chaque pas (ce qui en plus logique au niveau conception: on ait une mesure a chaque "arret"), je crée donc une focntion détection qui s'exécute entre chaque pas, il suffit donc d'avoir un delay de 100-30 = 70 miliseconde. Il faut savoir que l'affichage lcd aura peutêtre besoin de delay, qui devront peutêtre même s'exécuter pendant une pause qui sert pour la partie détection par exemple or ce n'est pas possible avec la fonction delay, il faudra donc peutêtre que je m'interesse à la fonction millis. Mais pour l'instant voici le programme, il vous permetra peutêtre de mieu comprendre. \\ \\ /* Programme final sans affichage lcd\\ - 2 Photodiodes BPW34\\ - 2 Résistances de 100kohm\\ - Une diode laser (rouge)\\ - Un moteur RS 5350401 et un shield moteur d'Arduino\\ Théo D */ int valeur1;\\ int valeur2;\\ int valeur_fin;\\ int attente = 10;\\ int temp_m = 100 - (3 * attente); void setup() { //pins de direction pinMode(12, OUTPUT); //CH A pinMode(13, OUTPUT); //CH B //pins de frein pinMode(9, OUTPUT); // CH A pinMode(8, OUTPUT); // CH B pinMode(1, OUTPUT); //laser en 1 pinMode(A2, INPUT); //photodiode 1 en A0 pinMode(A3, INPUT); //photodiode 2 en A1 Serial.begin(115200); //initialisation de la comunication avec le PC analogReference(INTERNAL); // valeur de référence analogique de 0 à 1,1V } void loop() { digitalWrite(9, HIGH); //On enlève le frein sur CH A digitalWrite(8, LOW); //On le met sur CH B digitalWrite(12, LOW); // on choisis la direction analogWrite(3, 255); //on fait tourner CH A detection(); delay(temp_m); digitalWrite(9, LOW); //On met le frein sur CH A digitalWrite(8, HIGH); // On l'enlève sur CH B digitalWrite(13, HIGH); //On choisis la direction analogWrite(11, 255); //On fait tourner CH B detection(); delay(temp_m); digitalWrite(9, HIGH); //On enlève le frein sur CH A digitalWrite(8, LOW); //On le met sur CH B digitalWrite(12, HIGH); // on choisis la direction analogWrite(3, 255); //on fait tourner CH A detection(); delay(temp_m); digitalWrite(9, LOW); //On met le frein sur CH A digitalWrite(8, HIGH); // On l'enlève sur CH B digitalWrite(13, LOW); //On choisis la direction analogWrite(11, 255); //On fait tourner CH B detection(); delay(temp_m); } void detection() { digitalWrite(1, LOW); //laser eteint valeur1 = analogRead(A2) - analogRead(A3); //lecture signaux delay(attente); digitalWrite(1, HIGH); //laser alumé valeur2 = analogRead(A2) - analogRead(A3); //lecture signaux delay(attente); valeur_fin = valeur2 - valeur1; //luminosité du laser Serial.println(valeur_fin); //renvoie de la valeur sur le moniteur série delay(attente); } -------------------------------------------------------------------------------------------------- {{anchor:program_ecran}} ===Programme affichage lcd=== \\ Ici je réalise mon programme pour afficher la valeur que me renvoi une photodiode sur l'ecran: #include #include #include #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF Adafruit_TFTLCD tft(A3, A2, A1, A0, A4); float y1, y0; int hauteur = tft.width(); int largeur = tft.height(); void setup() { tft.reset(); tft.begin(0x9341); tft.setRotation(3); y1 = analogRead(A5); } void loop() { tft.fillScreen(WHITE); //affichage des axes et des graduations tft.drawLine(20, 10, 20, 230, BLACK); tft.drawLine(20, 120, 310, 120, BLACK); for (int x=20; x < largeur; x+=20){ tft.drawLine(x, 115, x, 125,BLACK); } for (int y = 20; y < hauteur; y+=20){ tft.drawLine(15, y, 25, y, BLACK); } //traçage de la courbe et affichages des valeurs for (float i=0; i < largeur; i++){ y0 = y1; y1 = analogRead(A5); tft.drawLine(i, y0 - 100, i+1, y1 - 100 , RED); tft.setCursor(160, 0); tft.setTextColor(RED); tft.setTextSize(2); tft.print("Tension: "); tft.print(y1*5/1023); delay(100); tft.fillRect(260, 0, 340, 20, WHITE); } } -------------------------------------------------------------------------------------------------- {{anchor:prog_finaux}} ===Programme affichage lcd présentation du projet=== \\ Ici le programme qu'il y a dans la carte lors de la présentation de notre porjet. C'est a dire un programme qui va faire afficher a l'ecran d'abord le texte "Profilomètre", et qui va ensuite attendre l'enclenchement du bonton pour tracer une courbe. On a ici crée une courbe fictive. \\ \\ #include #include #include #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF Adafruit_TFTLCD tft(A3, A2, A1, A0, A4); float y1, y0; int hauteur = tft.width(); int largeur = tft.height(); void setup() { pinMode(13, INPUT); tft.reset(); tft.begin(0x9341); tft.setRotation(3); //affichage nom projet tft.fillScreen(BLACK); tft.setTextColor(BLUE); tft.setTextSize(4); tft.setCursor(20, 90); tft.print("Pr"); tft.setTextColor(CYAN); tft.print("of"); tft.setTextColor(GREEN); tft.print("il"); tft.setTextColor(YELLOW); tft.print("om"); tft.setTextColor(MAGENTA); tft.print("et"); tft.setTextColor(RED); tft.println("re"); tft.setTextSize(2); tft.setTextColor(WHITE); tft.setCursor(60, 135); tft.print("Ou presque ..."); delay(5000); tft.fillScreen(BLACK); while (digitalRead(13) == 1){ tft.fillScreen(BLACK); tft.setTextColor(WHITE); tft.setCursor(65, 100); tft.print("Restez appuye sur"); tft.setCursor(95, 130); tft.print("le bouton"); delay(1000); } } void loop() { tft.fillScreen(BLACK); //affichage des axes et des graduations tft.drawLine(20, 10, 20, 230, WHITE); tft.drawLine(20, 120, 310, 120, WHITE); for (int x=20; x < largeur; x+=20){ tft.drawLine(x, 115, x, 125, WHITE); } for (int y = 20; y < hauteur; y+=20){ tft.drawLine(15, y, 25, y, WHITE); } //traçage de la courbe et affichage des valeurs y1 = 0; for (float i=0; i < largeur; i+=4){ y0 = y1; //y1 = 2*sin(i/10) * cos(i/7) * 80 ; y1 = (sqrt(sin(i/10)*sin(i/10)) + sin(i/10))*80/ 2*sin(i/10); tft.drawLine(i, y0 + 80, i+4, y1 + 80, CYAN); tft.setCursor(150, 0); tft.setTextColor(CYAN); tft.setTextSize(2); tft.print("Valeur: "); tft.print(float(120 - (y1 + 80))); delay(100); tft.fillRect(230, 0, 340, 20, BLACK); } } {{anchor:ici}} === Programme final sans affichage lcd (modification) === \\ Afin de contourner le problème causer par les vibration de notre chassis pour faire des mesure précices je modifie légérement le programme au niveau des delay, le temp entre chaque pas est maintenant de 800 ms, de plus la fonction détection s'effectue après le temp entre chaque pas afin de laisse la temp au chassis d'arreter de vibré. /* Programme final sans affichage lcd \\ - 2 Photodiodes BPW34 \\ - 2 Résistances de 100kohm \\ - Une diode laser (rouge) \\ - Un moteur RS 5350401 et un shield moteur d'Arduino \\ Théo D */ int valeur1, valeur2; \\ int valeur_fin; \\ int attente = 50; \\ int temp_m = 500 - (3 * attente); \\ void setup() { //pins de direction pinMode(12, OUTPUT); //CH A pinMode(13, OUTPUT); //CH B //pins de frein pinMode(9, OUTPUT); // CH A pinMode(8, OUTPUT); // CH B pinMode(A2, INPUT); //photodiode 1 en A0 pinMode(A3, INPUT); //photodiode 2 en A1 Serial.begin(9600); //initialisation de la comunication avec le PC analogReference(INTERNAL); // valeur de référence analogique de 0 à 1,1V } void loop() { digitalWrite(9, HIGH); //On enlève le frein sur CH A digitalWrite(8, LOW); //On le met sur CH B digitalWrite(12, LOW); // on choisis la direction analogWrite(3, 200); //on fait tourner CH A delay(temp_m); detection(); digitalWrite(9, LOW); //On met le frein sur CH A digitalWrite(8, HIGH); // On l'enlève sur CH B digitalWrite(13, HIGH); //On choisis la direction analogWrite(11, 200); //On fait tourner CH B delay(temp_m); detection(); digitalWrite(9, HIGH); //On enlève le frein sur CH A digitalWrite(8, LOW); //On le met sur CH B digitalWrite(12, HIGH); // on choisis la direction analogWrite(3, 200); //on fait tourner CH A delay(temp_m); detection(); digitalWrite(9, LOW); //On met le frein sur CH A digitalWrite(8, HIGH); // On l'enlève sur CH B digitalWrite(13, LOW); //On choisis la direction analogWrite(11, 200); //On fait tourner CH B delay(temp_m); detection(); } void detection() { valeur1 = analogRead(A2); valeur2 = analogRead(A3); //lecture signaux delay(attente); valeur_fin = valeur1 - valeur2; //luminosité Serial.println(valeur_fin); //renvoie de la valeur sur le moniteur série delay(attente); } \\ \\ {{anchor:ici2}} ===Programme final (Si carte Arduino MEGA)=== \\ Voici le programme final si on avait une arduino Mega, c'est a dire si on combinait l'affichage lcd avec la motorisation et les photodiodes. \\ \\ /* Programme final \\ - 2 Photodiodes BPW34 \\ - 2 Résistances de 100kohm \\ - Une diode laser (rouge) \\ - Un moteur RS 5350401 et un shield moteur d'Arduino \\ - un ecran tft 240x340 \\ - un bouton poussoir \\ Théo D */ \\ //inclusion des librairies \\ #include \\ #include \\ #include \\ //définition des couleurs \\ #define BLACK 0x0000 \\ #define BLUE 0x001F \\ #define RED 0xF800 \\ #define GREEN 0x07E0 \\ #define CYAN 0x07FF \\ #define MAGENTA 0xF81F \\ #define YELLOW 0xFFE0 \\ #define WHITE 0xFFFF \\ //définition des pins ou sont brancher les broche de l'ecran \\ Adafruit_TFTLCD tft(A3, A2, A1, A0, A4); \\ /* /!\ ici c'est le broche pour une arduino UNO, il faut surement \\ les modifier pour une MEGA */ \\ //définition des variables \\ float y1, y0; \\ int hauteur = tft.width(), largeur = tft.height(); \\ int valeur1, valeur2, valeur_fin; \\ int attente = 50; \\ int temp_m = 500 - attente; \\ void setup() { //pins de direction pinMode(12, OUTPUT); //CH A pinMode(13, OUTPUT); //CH B //pins de frein pinMode(9, OUTPUT); // CH A pinMode(8, OUTPUT); // CH B pinMode(A2, INPUT); //photodiode 1 en A0 pinMode(A3, INPUT); //photodiode 2 en A1 Serial.begin(9600); //initialisation de la comunication avec le PC analogReference(DEFAULT); // valeur de référence pinMode(31, INPUT); //pin du bouton de l'ecran (A choisir) tft.reset(); tft.begin(0x9341); tft.setRotation(3); //on met l'ecran dans le bon sens //affichage du nom de notre projet tft.fillScreen(BLACK); tft.setTextColor(BLUE); tft.setTextSize(4); tft.setCursor(20, 90); tft.print("Pr"); tft.setTextColor(CYAN); tft.print("of"); tft.setTextColor(GREEN); tft.print("il"); tft.setTextColor(YELLOW); tft.print("om"); tft.setTextColor(MAGENTA); tft.print("et"); tft.setTextColor(RED); tft.println("re"); tft.setTextSize(2); tft.setTextColor(WHITE); tft.setCursor(60, 135); tft.print("Ou presque ..."); delay(5000); tft.fillScreen(BLACK); //tant que le bouton n'est pas enclenché while (digitalRead(13) == 1){ tft.fillScreen(BLACK); tft.setTextColor(WHITE); tft.setCursor(65, 100); tft.print("Restez appuye sur"); tft.setCursor(95, 130); tft.print("le bouton"); delay(1000); } } void loop() { valeur1 = analogRead(A2); valeur2 = analogRead(A3); //lecture signaux delay(attente); y1 = valeur1 - valeur2; //luminosité tft.fillScreen(BLACK); //affichage des axes et des graduations tft.drawLine(20, 10, 20, 230, WHITE); tft.drawLine(20, 120, 310, 120, WHITE); for (int x=20; x < largeur; x+=20){ tft.drawLine(x, 115, x, 125, WHITE); } for (int y = 20; y < hauteur; y+=20){ tft.drawLine(15, y, 25, y, WHITE); } //traçage de la courbe et affichages des valeurs for (int i=0; i < largeur; i++)//boucle qui va décaler d'un pixel { y0 = y1; //y0 prend l'ancienne valeur valeur1 = analogRead(A2); valeur2 = analogRead(A3); //nouvelle valeur delay(attente); y1 = valeur1 - valeur2; //luminosité tft.drawLine(i, y0 - 100, i+1, y1 - 100 , CYAN); //on trace tft.setCursor(160, 0); tft.setTextColor(CYAN); tft.setTextSize(2); tft.print("Tension: "); //On affiche la tension associé tft.print(y1*5/1023); delay(100); tft.fillRect(260, 0, 340, 20, BLACK); //On fait avancer d'un pas if (i%4 == 0) { digitalWrite(9, HIGH); //On enlève le frein sur CH A digitalWrite(8, LOW); //On le met sur CH B digitalWrite(12, LOW); // on choisis la direction analogWrite(3, 200); //on fait tourner CH A delay(temp_m); } else if(i%4 == 1) { digitalWrite(9, LOW); //On met le frein sur CH A digitalWrite(8, HIGH); // On l'enlève sur CH B digitalWrite(13, HIGH); //On choisis la direction analogWrite(11, 200); //On fait tourner CH B delay(temp_m); } else if(i%4== 2) { digitalWrite(9, HIGH); //On enlève le frein sur CH A digitalWrite(8, LOW); //On le met sur CH B digitalWrite(12, HIGH); // on choisis la direction analogWrite(3, 200); //on fait tourner CH A delay(temp_m); } else { digitalWrite(9, LOW); //On met le frein sur CH A digitalWrite(8, HIGH); // On l'enlève sur CH B digitalWrite(13, LOW); //On choisis la direction analogWrite(11, 200); //On fait tourner CH B delay(temp_m); } } } -------------------------------------------------------------------------------------------------- * [[wiki:projets:telemetre:matériel|Matériel]] \\ * [[wiki:projets:telemetre:roles|Rôles]] \\ * [[wiki:projets:telemetre:jdb|Journal de bord]] \\ * [[wiki:projets:telemetre:tests|Diférents tests]] \\ * [[wiki:projets:telemetre:ressources|Ressources]]