Outils pour utilisateurs

Outils du site


wiki:projets:telemetre:programation

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

Je modifie légèrement mon programme avec la fonction analogReference (comme expliqué dans les tests) pour beaucoup plus de précision.



/* 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.


/*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);

}



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);

}


program_ecran

Programme affichage lcd


Ici je réalise mon programme pour afficher la valeur que me renvoi une photodiode sur l'ecran:

#include <SPFD5408_Adafruit_GFX.h> #include <SPFD5408_Adafruit_TFTLCD.h> #include <SPFD5408_TouchScreen.h>

#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);
}

}


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 <SPFD5408_Adafruit_GFX.h> #include <SPFD5408_Adafruit_TFTLCD.h> #include <SPFD5408_TouchScreen.h>

#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);
}

}

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);

}



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 240×340
- un bouton poussoir
Théo D */

inclusion des librairies
#include <SPFD5408_Adafruit_GFX.h>
#include <SPFD5408_Adafruit_TFTLCD.h>
#include <SPFD5408_TouchScreen.h>
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/programation.txt · Dernière modification: 2016/09/11 13:15 (modification externe)