Aller au contenu principal

Découvrir le robot ERICbot

ProjetTypeDifficulté
Projets du LABProjet makerIntermédiaire

Matériel​

Le robot est construit autour d'un Arduino Uno et d'un châssis imprimé en 3D. Il est équipé de :

  • 2 servomoteurs à rotation continue
  • un interrupteur
  • un capteur ultrason HC-SR04
  • 2 roues
  • un axe libre à 360°
  • un bloc de piles
  • un anneau de LEDs (NeoPixel Ring)
Robot ERICbot

Assemblage​

L'interrupteur​

Fixer l'interrupteur sur la plaque, puis souder les fils sur ses broches. Ces fils sont ensuite soudés sur la connectique du bloc de piles.

Le bloc de piles​

Il est fixé au carter de l'interrupteur avec du scotch double-face et relié à la prise d'alimentation de l'Arduino Uno.

L'Arduino Uno​

Arduino du robot

Fixer l'Arduino Uno sur le châssis, puis câbler le contrôleur à ses périphériques. Les moteurs sont connectés à l'Arduino par des fils mâle-mâle, en suivant le tutoriel "Un moteur qui sait où il va : le servomoteur".

L'Arduino Uno ne dispose que d'une seule sortie 5V : il faut démultiplier l'alimentation en soudant des straps.

Les roues​

Pour améliorer l'adhérence au sol, coller sur chaque roue un petit élastique ou un morceau de chambre à air.

Déplacement avant/arrière​

En branchant les deux moteurs, on constate que les roues ne sont pas synchronisées. Il faut écrire des fonctions dédiées pour les faire avancer et reculer de manière coordonnée.

Rotation droite/gauche​

Même principe : des fonctions de rotation ne font tourner qu'un seul moteur à la fois.

Code​

#include <Servo.h>

Servo myservoGauche;
Servo myservoDroite;

int pos = 0;
void arreter() {
myservoGauche.write(90);
myservoDroite.write(90);
}

void avancer(int temps){
myservoGauche.write(0);
myservoDroite.write(180);
delay(temps);
arreter();
}
void reculer(int temps){
myservoGauche.write(180);
myservoDroite.write(0);
delay(temps);
arreter();
}
void tournerGauche(int temps){
myservoGauche.write(90);
myservoDroite.write(180);
delay(temps);
arreter();
}
void tournerDroite(int temps){
myservoGauche.write(0);
myservoDroite.write(90);
delay(temps);
arreter();
}
void setup()
{
myservoGauche.attach(2);
myservoDroite.attach(4);
}

void loop()
{
avancer(2000);
delay(1500);
tournerGauche(1000);
delay(1500);
reculer(2000);
delay(1500);
tournerDroite(1000);
delay(1500);
}

Capteur ultrason​

Le capteur se fixe à l'avant du robot. Quatre fils le relient à l'Arduino :

  • 2 entrées numériques (trig et echo)
  • alimentation 5V
  • masse (GND)

Le branchement suit le tutoriel "Mesure de distance - Ultrason".

Les yeux de ERICbot

Code complet avec évitement d'obstacles et LEDs​

Ce programme combine la navigation autonome et les effets lumineux sur l'anneau NeoPixel :

  • Vert : le robot avance (pas d'obstacle)
  • Orange : le robot tourne (obstacle entre 10 et 30 cm)
  • Rouge : le robot recule (obstacle à moins de 10 cm)
#include <Servo.h>
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define N_LEDS 16
Servo myservoGauche;
Servo myservoDroite;
int trig = 7;
int echo = 8;
int pos = 0;
long lecture_echo = 0;
long cm = 0;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN, NEO_GRB + NEO_KHZ800);
void arreter()
{
myservoGauche.write(90);
myservoDroite.write(90);
}

void avancer()
{
myservoGauche.write(0);
myservoDroite.write(180);
chase(strip.Color(0, 255, 0)); // Green

}
void reculer(int temps)
{
chase(strip.Color(255, 0, 0)); // Red
myservoGauche.write(180);
myservoDroite.write(0);
delay(temps);
arreter();
}
void tournerGauche()
{
chase(strip.Color(255, 145, 0)); // Orange
myservoGauche.write(90);
myservoDroite.write(180);
arreter();
}
void tournerDroite()
{
chase(strip.Color(255, 145, 0)); // Orange
myservoGauche.write(0);
myservoDroite.write(90);
arreter();
}
static void chase(uint32_t c)
{
for(uint16_t i = 0; i < strip.numPixels() + 4; i++)
{
strip.setPixelColor(i , c);
strip.setPixelColor(i - 4, 0);
strip.show();
delay(25);
}
}
void rainbowCycle()
{
uint16_t i, j;
for(j = 0; j < 256 * 5; j++)
{
for(i = 0; i < strip.numPixels(); i++)
{
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
}
}
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);
}
}

void setup()
{
myservoGauche.attach(2);
myservoDroite.attach(4);
pinMode(trig, OUTPUT);
digitalWrite(trig, LOW);
pinMode(echo, INPUT);
Serial.begin(115200);
strip.begin();
}

void loop()
{
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
lecture_echo = pulseIn(echo, HIGH);
cm = lecture_echo / 58;
if (cm > 30)
{
avancer();
}
if (cm < 30 && cm > 10)
{
tournerDroite();
}
if (cm < 10)
{
reculer(1000);
tournerGauche();
}
delay(1000);
}

Intégration de l'anneau de LEDs​

Se référer au tutoriel "Sur bandeau de LED". Attention : il s'agit d'un anneau (Ring), pas d'un bandeau — le branchement diffère. Connecter le 5V au 5V, le Ground au GND et le Data In à la broche souhaitée.

Pour brancher plusieurs composants sur le 5V : souder des picots entre eux pour créer un pont commun.

Picots soudés

Conseils pratiques​

  1. Prévoir des élastiques ou de la chambre à air de rechange pour les roues.
  2. Intégrer les pas de vis directement à l'impression du socle, plutôt que de les forcer après coup.