Bonjour à tous,
Je suis prof de techno en collège et je réalise un petit robot autonome avec mes élèves de 5e.
Il est équipé d'un arduino, de moteurs,de capteurs de proximité, capteur à ultrason, suivi de ligne, lumière et buzzer.
La programmation se fera par l'interface Mblock (basé sur scratch mais avec la possibilité de programmer des arduinos par blocs.
J'ai créé une extension qui permet de simplifier la programmation pour les élèves.
Chaque bloc de l'extension génère le code arduino correspondant.
Une fois le programme dessiné à l'aide des blocs, on le téléverse dans l'arduino et on vérifie que ça marche.
J'ai dessiné ce programme qui évite les obstacles.
Je veux que lorsque mon robot détecte un obstacle, il s'en éloigne du coté opposé jusqu'à ne plus le détecter.
Et voici le code généré. (ça pourrait être plus propre mais je débute)
#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>
double angle_rad = PI/180.0;
double angle_deg = 180.0/PI;
int MGAV=5, MGAR=6, MDAV=9, MDAR=10;
int LED1=7, LED2=8, BZ=3;
int trig=2, echo=4;
int BT1=11, BT2=12;
int DG=14, DD=15, DAR=16;
int SLG=18, SLD=19;
void setup(){
pinMode(MGAV,OUTPUT); //moteur gauche en avant
pinMode(MGAR,OUTPUT); //moteur gauche en arrière
pinMode(MDAR,OUTPUT); //moteur droit en avant
pinMode(MDAV,OUTPUT); //moteur droit en arrière
pinMode(LED1,OUTPUT); //Lumière en fonctionnement
pinMode(LED2,OUTPUT); //lumière dysfonctionnement
pinMode(BZ,OUTPUT); //Buzzer
pinMode(trig,OUTPUT);
pinMode(echo,INPUT);
pinMode(BT1,INPUT_PULLUP); //Bouton mise en route
pinMode(BT2,INPUT_PULLUP); //Bouton mise à l'arrêt
pinMode(DG,INPUT_PULLUP); //détecteur de proximité gauche
pinMode(DD,INPUT_PULLUP); //détecteur de proximité droit
pinMode(DAR,INPUT_PULLUP); //détecteur de proximité arrière
pinMode(SLD,INPUT_PULLUP); //suivi de ligne droit
pinMode(SLG,INPUT_PULLUP); //suivi de ligne gauche
}
void loop(){
digitalWrite(MDAR,0);
digitalWrite(MDAV,0);
digitalWrite(MGAR,0);
digitalWrite(MGAV,0);
digitalWrite(LED1,0);
digitalWrite(LED2,0);
while(!(!digitalRead(11)))
{
_loop();
}
while(!(!digitalRead(12)))
{
_loop();
digitalWrite(LED1,1);
digitalWrite(LED2,0);
digitalWrite(MDAR,0);
digitalWrite(MGAR,0);
digitalWrite(MDAV,1);
digitalWrite(MGAV,1);
if(!digitalRead(14)){
digitalWrite(MDAR,0);
digitalWrite(MDAV,0);
digitalWrite(MGAR,0);
digitalWrite(MGAV,1);
while(!(!digitalRead(14)))
{
_loop();
}
}
if(!digitalRead(15)){
digitalWrite(MGAV,0);
digitalWrite(MDAR,0);
digitalWrite(MGAR,0);
digitalWrite(MDAV,1);
while(!(!digitalRead(15)))
{
_loop();
}
}
if(!digitalRead(16)){
digitalWrite(MDAR,0);
digitalWrite(MDAV,0);
digitalWrite(MGAR,0);
digitalWrite(MGAV,0);
digitalWrite(LED2,1);
while(!(!digitalRead(16)))
{
_loop();
}
}
}
_loop();
}
void _delay(float seconds){
long endTime = millis() + seconds * 1000;
while(millis() < endTime)_loop();
}
void _loop(){
}
Mon problème est que les moteurs ne s’arrêtent pas quand je le demande ou ne redémarrent pas.
Le robot détecte un obstacle à gauche par exemple, le moteur droit doit s’arrêter mais tourne au ralenti.
Une fois l'obstacle évité, donc plus détecté, le robot ne repart pas en marche avant.
Si il détecte une nouvelle fois un obstacle, alors là il repart en marche avant.
Tout ça de façon aléatoire.
Est-ce que mon code vous parait correct ?
Merci.