RoboduLAB : Différence entre versions

De Wiki L.A.B
Aller à : navigation, rechercher
(Code arduino : démonstration du fonctionnement du robot en mode autonome)
(Programme sans NeoPixel Ring)
Ligne 51 : Ligne 51 :
 
==== [[Code arduino : démonstration du fonctionnement du robot en mode autonome]] ====
 
==== [[Code arduino : démonstration du fonctionnement du robot en mode autonome]] ====
 
===== Programme sans NeoPixel Ring =====
 
===== Programme sans NeoPixel Ring =====
<br />
 
  
 
Voici le programme qu'il faut éditer dans l'IDE Arduino, puis compiler et charger dans la carte Arduino
 
Voici le programme qu'il faut éditer dans l'IDE Arduino, puis compiler et charger dans la carte Arduino
Ligne 58 : Ligne 57 :
 
<syntaxhighlight lang="cpp" enclose="div">
 
<syntaxhighlight lang="cpp" enclose="div">
 
/*
 
/*
   Ce programme allume progressivement une LED RGB cathodes communes branchée sur les broches 3,5 et 6
+
   Ce programme de démonstration permet de faire fonctionner le robot d'une manière autonome
 
*/
 
*/
  
int ledR = 3; // broche de la LED Rouge
+
#include <Servo.h> // librairie pour servomoteur
int ledG = 5; // broche de la LED Verte
+
int ledB = 6; // broche de la LED Bleue
+
  
int i = 0; // variable de la boucle for
+
#define broche_servoA 3 // broche servo A
 +
#define broche_servoB 5 // broche servo B
 +
#define trig 2 // broche trig du capteur US HC-SR04
 +
#define echo 4 // broche echo du capteur US HC-SR04
  
void setup() // setup est déroulé une seule fois après la remise à zéro
+
const int MAX_SENS2=1000; // largeur impulsion pour position ANGLE_MIN degrés du servomoteur
{               
+
const int ARRET=1490; // largeur impulsion pour position ANGLE_MEDIANE degrés du servomoteur
   pinMode(ledR, OUTPUT); // la broche led (3) est initialisée en sortie  
+
const int MAX_SENS1=2000; // largeur impulsion pour position ANGLE_MAX degrés du servomoteur
   pinMode(ledG, OUTPUT); // la broche led (5) est initialisée en sortie
+
 
   pinMode(ledB, OUTPUT); // la broche led (6) est initialisée en sortie      
+
// classiquement : centrage sur 1500 - maxi sens 1 = 1000 et maxi sens 2 = 2000
 +
 
 +
// --- Déclaration des constantes des broches E/S numériques ---
 +
 
 +
long lecture_echo = 0; // variable sur 4 octets mesure de distance
 +
long cm = 0; // variable sur 4 octets pour la conversion en cm
 +
 
 +
//--- Création objet servomoteur
 +
Servo servoA;  // crée un objet servo pour contrôler le servomoteur A (en dessous du swich ON/OFF
 +
Servo servoB;  // crée un objet servo pour contrôler le servomoteur B (à gauche du servo A)
 +
 
 +
 
 +
 
 +
// ////////////////////////// 2. FONCTION SETUP = Code d'initialisation //////////////////////////
 +
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme
 +
 
 +
void setup()  { // debut de la fonction setup()
 +
 
 +
// --- ici instructions à exécuter 1 seule fois au démarrage du programme ---
 +
 
 +
   pinMode (broche_servoA,OUTPUT); // Broche broche_servo configurée en sortie
 +
  pinMode (broche_servoB,OUTPUT); // Broche broche_servo configurée en sortie
 +
   pinMode (trig,OUTPUT); // broche broche trig configurée en sortie
 +
  digitalWrite(trig, LOW); // met un niveau logique , LOW (BAS) sur la broche trig
 +
  pinMode(echo, INPUT);  // la broche echo est initialisée en entree
 +
   Serial.begin(115200);  // initialisation de la liaison série à 115200 bauds
 +
  delay (2000); // on attend 2s
 +
} // fin de la fonction setup()
 +
// ********************************************************************************
 +
 
 +
////////////////////////////////// 3. FONCTION LOOP = Boucle sans fin = coeur du programme //////////////////
 +
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension
 +
 
 +
void loop(){ // debut de la fonction loop()
 +
 
 +
  Avant();
 +
  digitalWrite(trig, HIGH); // met un niveau logique , HIGH (HAUT) sur la broche trig
 +
  delayMicroseconds(10); // attente pendant 10 microsecondes
 +
  digitalWrite(trig, LOW);  // met un niveau logique , LOW (BAS) sur la broche trig.
 +
  lecture_echo = pulseIn(echo, HIGH); //  lit la durée du niveau HAUT appliqué sur la broche echo
 +
  cm = lecture_echo / 58; // conversion de la distance en cm
 +
  Serial.print("Distance en cm : "); // affiche le message : "Distance en cm" sur le moniteur série
 +
  Serial.println(cm); // affiche la mesure en cm avec retour à la ligne
 +
  if (cm < 20) // si mesure < 10 => tourner sens aléatoire
 +
  {
 +
     if (millis()%2 == 1)
 +
    {
 +
        Droite();
 +
        delay (1000);
 +
    }
 +
    else
 +
    {
 +
        Gauche();
 +
        delay (1000);
 +
    }
 +
  }
 +
} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
 +
 
 +
void Stop() {
 +
  if (servoA.attached()) servoA.detach(); // détache le servomoteur de la broche  = arret propre servomoteur
 +
  if (servoB.attached()) servoB.detach(); // détache le servomoteur de la broche  = arret propre servomoteur
 
}
 
}
void loop() // loop est déroulé indéfiniment
+
 
{
+
void Avant() {
for (i=0; i<=255;i++) // i varie de 1 à 255
+
   if (!servoA.attached()) servoA.attach(broche_servoA); // attache le servomoteur à la broche si pas attaché
   {
+
   servoA.writeMicroseconds(MAX_SENS1); // crée impulsion - sens2
  analogWrite(ledR,i); // génère une impulsion sur la broche de largeur i => la luminosité R augmente
+
   if (!servoB.attached()) servoB.attach(broche_servoB); // attache le servomoteur à la broche si pas attaché
  delay(20); // pause de 20 ms entre chaque pas
+
   servoB.writeMicroseconds(MAX_SENS2); // crée impulsion - sens1
  }
+
  digitalWrite (ledR,LOW);
+
  for (i=0; i<=255;i++) // i varie de 1 à 255
+
  {
+
  analogWrite(ledG,i); // génère une impulsion sur la broche de largeur i => la luminosité G augmente
+
  delay(20); // pause de 20 ms entre chaque pas
+
   }
+
  digitalWrite (ledG,LOW);
+
  for (i=0; i<=255;i++) // i varie de 1 à 255
+
  {
+
  analogWrite(ledB,i); // génère une impulsion sur la broche de largeur i => la luminosité B augmente
+
   delay(20); // pause de 20 ms entre chaque pas
+
  }
+
  digitalWrite (ledB,LOW);
+
  for (i=0; i<=255;i++) // i varie de 1 à 255
+
  {
+
  analogWrite(ledR,i); // génère une impulsion sur la broche de largeur i => la luminosité R augmente
+
   analogWrite(ledG,i); // génère une impulsion sur la broche de largeur i => la luminosité G augmente
+
  analogWrite(ledB,i); // génère une impulsion sur la broche de largeur i => la luminosité B augmente
+
  delay(20); // pause de 20 ms entre chaque pas
+
  }
+
  digitalWrite (ledR,LOW);
+
  digitalWrite (ledG,LOW);
+
  digitalWrite (ledB,LOW);
+
 
}
 
}
 +
 +
void Arriere() {
 +
  if (!servoA.attached()) servoA.attach(broche_servoA); // attache le servomoteur à la broche si pas attaché
 +
  servoA.writeMicroseconds(MAX_SENS2); // crée impulsion - sens1
 +
  if (!servoB.attached()) servoB.attach(broche_servoB); // attache le servomoteur à la broche si pas attaché
 +
  servoB.writeMicroseconds(MAX_SENS1); // crée impulsion - sens2
 +
}
 +
void Gauche() {
 +
  if (!servoA.attached()) servoA.attach(broche_servoA); // attache le servomoteur à la broche si pas attaché
 +
  servoA.writeMicroseconds(MAX_SENS1); // crée impulsion - sens2
 +
  if (!servoB.attached()) servoB.attach(broche_servoB); // attache le servomoteur à la broche si pas attaché
 +
  servoB.writeMicroseconds(MAX_SENS1); // crée impulsion - sens1
 +
}
 +
 +
void Droite() {
 +
  if (!servoA.attached()) servoA.attach(broche_servoA); // attache le servomoteur à la broche si pas attaché
 +
  servoA.writeMicroseconds(MAX_SENS2); // crée impulsion - sens1
 +
  if (!servoB.attached()) servoB.attach(broche_servoB); // attache le servomoteur à la broche si pas attaché
 +
  servoB.writeMicroseconds(MAX_SENS2); // crée impulsion - sens2
 +
}
 +
 +
 
</syntaxhighlight>
 
</syntaxhighlight>
  

Version du 9 août 2016 à 14:43

Présentation du projet


Un robot pour apprendre à programmer en classe

  • Utilisable en écoles primaires, collèges et lycées
  • Toutes les pièces mécaniques sont imprimables (impression 3D – fichiers .stl fournis)
  • Partie électronique basée sur une carte de prototypage « arduino »
  • Libre (copiable, modifiable) et évolutif (de nombreuses options possibles)


RoboduLAB, permet une approche ludique de l’apprentissage du code à l’école primaire, des plots au format lego permettent de personnaliser le robot.

RoboduLAB avec paques lego et ring 16 LED
En collège et en lycée RoboduLAB est un support de thème très riche pour le travail en équipes projets : conception, réalisation, expérimentation.

La programmation se fait par assemblage de blocs (type scratch). Le programme se télécharge directement dans le robot depuis le PC ou la tablette en WIFI.

600px

Constitution du robot

RoboduLAB est constiué d'un chassis, de deux roues montées sur des servomoteurs qui sont commandés par une carte de prototypage arduino. Il sera possible de rajouter différentes options au modèle de base :

  • suivi de ligne,
  • module WIFI,
  • détection des vides,
  • sons (MP3),

Chassis

Le chassis est constitué d'un ensemble de pièces imprimables par une une imprimante 3D et une roulette à bille.

Électronique

La partie électronique du robot comporte à minima :

  • une carte arduino (UNO),
  • deux servomoteurs à rotation continue,
  • un capteur à ultrasons,
  • une LED RGB (ou un NeoPixel Ring),
  • un boîtier pour les piles (6 piles AA)
  • un interrupteur à glissière.

Programmes

Le programme nécessaire pour le fonctionnement du robot peut être :
- soit écrit directement en C++ et téléchargé dans la carte arduino,
- soit représenté par des blocs graphiques (type scratch). Il sera alors possible de produire automatiquement le code en C++ qui sera téléchargé dans le robot.

Code arduino : démonstration du fonctionnement du robot en mode autonome

Programme sans NeoPixel Ring

Voici le programme qu'il faut éditer dans l'IDE Arduino, puis compiler et charger dans la carte Arduino

/*
  Ce programme de démonstration permet de faire fonctionner le robot d'une manière autonome
*/

#include <Servo.h> // librairie pour servomoteur 

#define broche_servoA 3 // broche servo A 
#define broche_servoB 5 // broche servo B 
#define trig 2 // broche trig du capteur US HC-SR04
#define echo 4 // broche echo du capteur US HC-SR04

const int MAX_SENS2=1000; // largeur impulsion pour position ANGLE_MIN degrés du servomoteur
const int ARRET=1490; // largeur impulsion pour position ANGLE_MEDIANE degrés du servomoteur
const int MAX_SENS1=2000; // largeur impulsion pour position ANGLE_MAX degrés du servomoteur

// classiquement : centrage sur 1500 - maxi sens 1 = 1000 et maxi sens 2 = 2000

// --- Déclaration des constantes des broches E/S numériques ---

long lecture_echo = 0; // variable sur 4 octets mesure de distance
long cm = 0; // variable sur 4 octets pour la conversion en cm

//--- Création objet servomoteur 
Servo servoA;  // crée un objet servo pour contrôler le servomoteur A (en dessous du swich ON/OFF
Servo servoB;  // crée un objet servo pour contrôler le servomoteur B (à gauche du servo A)



// ////////////////////////// 2. FONCTION SETUP = Code d'initialisation ////////////////////////// 
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// --- ici instructions à exécuter 1 seule fois au démarrage du programme --- 

  pinMode (broche_servoA,OUTPUT); // Broche broche_servo configurée en sortie
  pinMode (broche_servoB,OUTPUT); // Broche broche_servo configurée en sortie
  pinMode (trig,OUTPUT); // broche broche trig configurée en sortie
  digitalWrite(trig, LOW); // met un niveau logique , LOW (BAS) sur la broche trig
  pinMode(echo, INPUT);  // la broche echo est initialisée en entree
  Serial.begin(115200);  // initialisation de la liaison série à 115200 bauds
  delay (2000); // on attend 2s
} // fin de la fonction setup()
// ********************************************************************************

////////////////////////////////// 3. FONCTION LOOP = Boucle sans fin = coeur du programme //////////////////
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

   Avant();
   digitalWrite(trig, HIGH); // met un niveau logique , HIGH (HAUT) sur la broche trig
   delayMicroseconds(10); // attente pendant 10 microsecondes
   digitalWrite(trig, LOW);  // met un niveau logique , LOW (BAS) sur la broche trig.
   lecture_echo = pulseIn(echo, HIGH); //  lit la durée du niveau HAUT appliqué sur la broche echo
   cm = lecture_echo / 58; // conversion de la distance en cm
   Serial.print("Distance en cm : "); // affiche le message : "Distance en cm" sur le moniteur série
   Serial.println(cm); // affiche la mesure en cm avec retour à la ligne
   if (cm < 20) // si mesure < 10 => tourner sens aléatoire
   {
     if (millis()%2 == 1)
     {
        Droite();
        delay (1000); 
     }
     else
     {
        Gauche();
        delay (1000); 
     }
   }
} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin

void Stop() {
  if (servoA.attached()) servoA.detach(); // détache le servomoteur de la broche  = arret propre servomoteur
  if (servoB.attached()) servoB.detach(); // détache le servomoteur de la broche  = arret propre servomoteur
}

void Avant() {
  if (!servoA.attached()) servoA.attach(broche_servoA); // attache le servomoteur à la broche si pas attaché
  servoA.writeMicroseconds(MAX_SENS1); // crée impulsion - sens2
  if (!servoB.attached()) servoB.attach(broche_servoB); // attache le servomoteur à la broche si pas attaché
  servoB.writeMicroseconds(MAX_SENS2); // crée impulsion - sens1
}

void Arriere() {
  if (!servoA.attached()) servoA.attach(broche_servoA); // attache le servomoteur à la broche si pas attaché
  servoA.writeMicroseconds(MAX_SENS2); // crée impulsion - sens1
  if (!servoB.attached()) servoB.attach(broche_servoB); // attache le servomoteur à la broche si pas attaché
  servoB.writeMicroseconds(MAX_SENS1); // crée impulsion - sens2
}
void Gauche() {
  if (!servoA.attached()) servoA.attach(broche_servoA); // attache le servomoteur à la broche si pas attaché
  servoA.writeMicroseconds(MAX_SENS1); // crée impulsion - sens2
  if (!servoB.attached()) servoB.attach(broche_servoB); // attache le servomoteur à la broche si pas attaché
  servoB.writeMicroseconds(MAX_SENS1); // crée impulsion - sens1
}

void Droite() {
  if (!servoA.attached()) servoA.attach(broche_servoA); // attache le servomoteur à la broche si pas attaché
  servoA.writeMicroseconds(MAX_SENS2); // crée impulsion - sens1
  if (!servoB.attached()) servoB.attach(broche_servoB); // attache le servomoteur à la broche si pas attaché
  servoB.writeMicroseconds(MAX_SENS2); // crée impulsion - sens2
}

Téléchargements

Documents de présentation

Pièces imprimables


Les pièces imprimables : base, roue, support capteur Ultra-sons et plaque pour support de piles sont téléchargeable sur Thingiverse:
http://www.thingiverse.com/thing:833005

Programmes

Rajout du capteur de vide