Code arduino : démonstration du fonctionnement du robot en mode autonome
De Wiki L.A.B
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)
// 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()
// ********************************************************************************
// 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_SENS2); // 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 Arriere() {
if (!servoA.attached()) servoA.attach(broche_servoA); // attache le servomoteur à la broche si pas attaché
servoA.writeMicroseconds(MAX_SENS1); // 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
}
void Gauche() {
if (!servoA.attached()) servoA.attach(broche_servoA); // attache le servomoteur à la broche si pas attaché
servoA.writeMicroseconds(MAX_SENS1); // 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 - 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 - sens2
if (!servoB.attached()) servoB.attach(broche_servoB); // attache le servomoteur à la broche si pas attaché
servoB.writeMicroseconds(MAX_SENS2); // crée impulsion - sens2
}
Programme avec 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 équipé d'un Neopixel Ring d'une manière autonome
*/
#include <Servo.h> // librairie pour servomoteur
#include <Adafruit_NeoPixel.h> // librairie pour NeoPixel Ring
#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
#define ring 6 // broche Data du NeoPixel Ring
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
Servo servoB; // crée un objet servo pour contrôler le servomoteur B
Adafruit_NeoPixel strip = Adafruit_NeoPixel(16, ring, NEO_GRB + NEO_KHZ800); //
// 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
strip.begin();
strip.show(); // Initialisation du NeoPixel Ring
rainbowCycle(10); // LED RING = Arc en ciel
}
// fin de la fonction setup()
// ********************************************************************************
// 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 < 20 cm => tourner sens aléatoire
{
if (millis()%2 == 1)
{
Droite(); // appel fonction Droite()
delay (1000);
}
else
{
Gauche(); // appel fonction 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_SENS2); // 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
ringOff(); // appel fonction extinction de toutes les LED
strip.setPixelColor(14, strip.Color(0,150,0)); // LED verte brillance moyenne.
strip.setPixelColor(15, strip.Color(0,150,0)); // LED verte brillance moyenne.
strip.setPixelColor(0, strip.Color(0,150,0)); // LED verte brillance moyenne.
strip.show(); // Envoi des données vers le Ring.
}
void Arriere() {
if (!servoA.attached()) servoA.attach(broche_servoA); // attache le servomoteur à la broche si pas attaché
servoA.writeMicroseconds(MAX_SENS1); // 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
}
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
ringOff(); // appel fonction extinction de toutes les LED
for(int i=2;i<5;i++){
strip.setPixelColor(i, strip.Color(150,0,0)); // LED rouge brillance moyenne.
strip.show(); // Envoi des données vers le Ring.
}
}
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
ringOff(); // appel fonction extinction de toutes les LED
for(int i=10;i<13;i++){
strip.setPixelColor(i, strip.Color(150,0,0)); // LED rouge brillance moyenne.
strip.show(); // Envoi des données vers le Ring.
}
}
void ringOff()
{
for(int i=0;i<16;i++){
strip.setPixelColor(i, strip.Color(0,0,0)); // Toutes les LED éteintes
strip.show(); // Envoi des données vers le Ring.
}
}
void rainbowCycle(uint8_t wait) {
uint16_t i, j;
for(j=0; j<256; j++) { // 1 cycle couleur arc en ciel j<256*n = n cycles couleur arc en ciel
for(i=0; i< strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
delay(wait);
}
}
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if(WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
} else if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
} else {
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
}