Bonjour,
Je suis un lycéen en Terminale SSI et j'ai un projet à faire pour la fin de l'année, sauf que j'ai un gros soucis. De plus, je trouve la programmation intéressante, mais je n'y connais pas grand chose...
J'ai donc un programme qui permet de faire avancer "une voiture" avec deux moteurs qui marchent indépendamment l'un de l'autre. Lors de l'essai du programme seul, sur un prototype, j'ai réussi à faire marcher les moteurs à l'aide de boutons pour les faire tourner à droite, à gauche, puis avancer. Ensuite, j'ai voulu rajouter un programme que j'ai fait à part avec des capteurs ultrasons (il y en a 2 au total) qui permettent d'arrêter le moteur lorsqu'il y a un obstacle devant. En assemblant les deux programmes, plus rien ne marche. Je voudrai savoir si quelqu'un pourrait m'apporter son aide pour ça.
Je voudrais tout d'abord savoir si je peux résoudre le problème là, sachant que pour l'instant je teste le programme avec des boutons, et qu'au final, les moteurs marcheront à l'aider de 2 capteurs de luminosité dirigés vers le sol sur une bande de couleur noire (les moteurs avanceront quand les capteurs détecteront le peu de lumière renvoyée par la bande noire).
Merci de votre aide d'avance et je vous laisse mon programme ci-dessous :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
 
// La LED est câblée sur la patte 2.
// Le bouton est câblé sur la patte 3
// give it a name:
 
/*#define VITESSE 340
#include <Wire.h>
 
 
const int USTrig = 5; // Déclencheur sur la broche 8
const int USEcho = 4; // Réception sur la broche 9
const int PinLed = 8; // Branchement de la Led
const int PinBuzzer = 3;  // Branchement du buzzer 
const double distanceMax = 0.3; //Distance maximum avant alerte (en m)*/
 
float distance; //Variable distance utilisée plus bas 
 
int DirMotA = 12;
int FreinMotA = 9;
int PWMMotA = 3;
 
int DirMotB = 13;
int FreinMotB = 8;
int PWMMotB = 11;
 
int BoutonBP7 = 7;
int BoutonBP2 = 2;
int BoutonBP6 = 6;
 
boolean Ancien_Appui7 = true;
boolean Nouvel_Appui7 = false;
boolean Etat_mot = false;
 
boolean Ancien_Appui2 = true;
boolean Nouvel_Appui2 = false; 
boolean Tournedroite = false;
 
boolean Ancien_Appui6 = true;
boolean Nouvel_Appui6 = false;
boolean Tournegauche = false;
 
// Le sous programme setup s'éxécute à la mise sous tension ou après un Reset:
void setup() {                
  // initialise les entrées digitales en entrées et sorties.
  pinMode(BoutonBP7, INPUT);
  pinMode(BoutonBP2, INPUT);
  pinMode(BoutonBP6, INPUT); 
  pinMode(DirMotA, OUTPUT);
  pinMode(FreinMotA, OUTPUT);
  pinMode(PWMMotA , OUTPUT);
  pinMode(DirMotB , OUTPUT);
  pinMode(FreinMotB , OUTPUT);
  pinMode(PWMMotB , OUTPUT);
 
 /* pinMode(USTrig, OUTPUT); //On définit le type de sortie de chaque cable
  pinMode(USEcho, INPUT);
  pinMode(PinLed, OUTPUT);
  pinMode(PinBuzzer, OUTPUT);
  digitalWrite(USTrig, LOW);
  Serial.begin(9600);
  digitalWrite(13,LOW);
  digitalWrite(8,LOW);
  analogWrite(11,55);
  digitalWrite(12,LOW);
  digitalWrite(9,LOW);
  analogWrite(3,55); */
}
 
// Le sous programme loop tourne en boucle:
void loop()/* {
   
  // put your main code here, to run repeatedly:
   float distanceMesuree = mesureDistance();
            // 6. On affiche la distance
      if (distanceMesuree>0)
      {
       Serial.print("Distance = ");
       Serial.print(distanceMesuree); //affiche la distance mesurée (en mètres) sur le moniteur
       Serial.println("m");
      
      } 
      else
      {
        Serial.println("Mesure echouee");
       
      }
 
     if (distanceMesuree < distanceMax) //si la distance est inférieure à la distance définie
   {
   
    digitalWrite(PinLed,HIGH); //On allume la led
    digitalWrite(PinBuzzer,HIGH); //Le buzzer sonne
    delay(10);
    digitalWrite(PinBuzzer,LOW);
    digitalWrite(13,LOW);
    digitalWrite(8,LOW);
    analogWrite(11,0);// On éteint le moteur
    delay(200);
    digitalWrite(12,LOW);
    digitalWrite(9,LOW);
    analogWrite(3,0);// On éteint le moteur
    delay(200);
    }
   else
   {
    digitalWrite(PinLed, LOW);
    digitalWrite(13,HIGH);
    digitalWrite(8,LOW);
    analogWrite(11, 55);//On allume le moteur
    digitalWrite(12,LOW);
    digitalWrite(9,LOW);
    analogWrite(3 , 55);//On allume le moteur
    delay(200);
   }
 
 // petite pause
   delay(90);
 
 
}
 
float mesureDistance(){
// 1. Un état haut de 10 microsecondes est mis sur la broche "Trig"
   digitalWrite(USTrig, HIGH);
   delayMicroseconds(10); //on attend 10 µs
   // 2. On remet à l’état bas la broche Trig
   digitalWrite(USTrig, LOW);
 
   // 3. On lit la durée d’état haut sur la broche "Echo"
   unsigned long duree = pulseIn(USEcho, HIGH);
 
   if(duree > 30000)
   {
      // si la durée est supérieure à 30ms, l'onde est perdue
      Serial.println("Onde perdue, mesure échouée !");
      return 0;
   }
   else
   {
      // 4. On divise cette durée par deux pour n'avoir qu'un trajet
      duree = duree/2;
      // 5. On calcule la distance avec la formule d=v*t
      float temps = duree/1000000.0; //on met en secondes
      distance = temps*VITESSE; //on multiplie par la vitesse, d=t*v
      return distance;
    }
   } */
{
  Nouvel_Appui7 = digitalRead(BoutonBP7);  // teste l'état du bouton BP7
  if (Nouvel_Appui7==true && Ancien_Appui7==false) 
  {
      if (Etat_mot==false) // si la variable Etat_mot est faux
      {
        Etat_mot = true; // alors on l'a met à vrai
        digitalWrite( DirMotA , HIGH );
        digitalWrite( FreinMotA , LOW );
        analogWrite( PWMMotA , 55);
        digitalWrite( DirMotB , LOW );
        digitalWrite( FreinMotB , LOW );
        analogWrite( PWMMotB , 55); // on allume le mot
      }
      else // sinon on fait l'opposé
      {
        Etat_mot = false;
        digitalWrite( DirMotA , HIGH );
        digitalWrite( FreinMotA , LOW );
        analogWrite( PWMMotA , 0);
        digitalWrite( DirMotB , LOW );
        digitalWrite( FreinMotB , LOW );
        analogWrite( PWMMotB , 0);
      } 
  }
  Nouvel_Appui2 = digitalRead(BoutonBP2);  // teste l'état du bouton BP2
  if (Nouvel_Appui2==true && Ancien_Appui2==false)
    {    
     if (Tournedroite==false)
      { 
        Tournedroite == true;
        digitalWrite( DirMotA , HIGH );
        digitalWrite( FreinMotA , LOW );
        analogWrite( PWMMotA , 55);
        digitalWrite( DirMotB , LOW );
        digitalWrite( FreinMotB , LOW );
        analogWrite( PWMMotB , 0);
      }
      else
      {
        Etat_mot = true; // alors on la met à vrai
        digitalWrite( DirMotA , HIGH );
        digitalWrite( FreinMotA , LOW );
        analogWrite( PWMMotA , 55);
        digitalWrite( DirMotB , LOW );
        digitalWrite( FreinMotB , LOW );
        analogWrite( PWMMotB , 55);
      }
    }
    Nouvel_Appui6 = digitalRead(BoutonBP6);   // teste l'état du bouton BP6
  if (Nouvel_Appui6==true && Ancien_Appui6==false)
  {
    if (Tournegauche==false)
      { 
        Tournegauche == true;
        digitalWrite( DirMotA , HIGH );
        digitalWrite( FreinMotA , LOW );
        analogWrite( PWMMotA , 0);
        digitalWrite( DirMotB , LOW );
        digitalWrite( FreinMotB , LOW );
        analogWrite( PWMMotB , 55);
      }
      else 
      {
        Etat_mot = true; // alors on la met à vrai
        digitalWrite( DirMotA , HIGH );
        digitalWrite( FreinMotA , LOW );
        analogWrite( PWMMotA , 55);
        digitalWrite( DirMotB , LOW );
        digitalWrite( FreinMotB , LOW );
        analogWrite( PWMMotB , 55);
      }
      delay(200); // tempo qui permet de se prémunir des rebonds
  }  
 
  Ancien_Appui7 = Nouvel_Appui7;
  Ancien_Appui2 = Nouvel_Appui2;
  Ancien_Appui6 = Nouvel_Appui6; // sert à déterminer les nouveaux états des boutons BP7, BP2, BP6
}