ENIB 2022 - groupe B : Canard Suiveur de Ligne
Sommaire
Photo du Projet
Auteurs
Ont participé à la rédaction de cette fiche :
Que fait ce projet ?
C'est un canard qui suit un parcours a la manière des canards de la pèche au canard, cependant, c'est au sec et le parcours est représenté par une ligne noire.
Liste des composants
- 2x Moteurs continus
- 2x Roues
- 1x Roue folle
- 1x Pont en H
- 1x Capteur de luminosité
- 1x Wemos
- 1x Bouton poussoir (+ rampe d'adaptation)
- 2x Porte pilles 4 piles (ou équivalent) (4s2p)
- 8x Piles
- Des Cables
- Bandeau Led (20 LED)
Code
ATTENTION:
- Le code ne fonctionne pas très bien voir pas dans l'état actuel.
- Nécessite de plus ample tests.
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
#define LED_PIN D4
#define LED_COUNT 20
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
// Definitions Arduino pins connected to input H Bridge
int IN1 = 4;
int IN2 = 5;
int IN3 = 13;
int IN4 = 15;
int led = 2;
int buttonPin = 16;
int analogInPin = A0;
int buttonState = 0;
int buttonStateLast = 0;
int analogValue = 0;
unsigned long winTime=0;
unsigned long time_now=0;
unsigned long time_last_operation=0;
unsigned long loop_count=0;
void setup()
{
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif
Serial.begin(9600);
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
strip.show(); // Turn OFF all pixels ASAP
strip.setBrightness(180);
pinMode(led, OUTPUT);
pinMode(buttonPin, INPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop()
{
//CODE DE L'ASSERV
analogValue = analogValue*0.75+ analogRead(analogInPin)*0.25;
//detection ligne
if ( analogValue>=0 && analogValue<400 ) {
if(loop_count%200<60){ digitalWrite(IN1, HIGH);} else { digitalWrite(IN1, LOW);}
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}else if( analogValue>=400 && analogValue<=600 ) {
if(loop_count%200<60){ digitalWrite(IN1, HIGH);} else { digitalWrite(IN1, LOW);}
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
if(loop_count%100<60){ digitalWrite(IN4, HIGH);} else { digitalWrite(IN4, LOW);}
}else if( analogValue>=600 && analogValue<=1024 ) {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
if(loop_count%200<60){ digitalWrite(IN4, HIGH);} else { digitalWrite(IN4, LOW);}
}
//CODE DU BOUTON
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
// turn LED on:
digitalWrite(led, LOW);
} else {
// turn LED off:
digitalWrite(led, HIGH);
if(buttonStateLast==HIGH) { //si le bouton n'est pas appuyé mais l'était au cycle d'avant
//play reward sond
winTime=millis();
}
}
buttonStateLast=buttonState;
//led band
/*
time_now=millis();
if(time_now-winTime<2000 && time_now>2000) {
for(int i=0; i<strip.numPixels(); i++) {
if(i<15){
strip.setPixelColor(i, strip.Color(50, 255, 0));
} else {
strip.setPixelColor(i, strip.Color(255, 255, 255));
}
}
} else {
for(int i=0; i<strip.numPixels(); i++) {
if(i<15){
if( (time_now%2000)<1000) {
if(i%2==0) {strip.setPixelColor(i, strip.Color(50, 0, 150));}
else {strip.setPixelColor(i, strip.Color(150, 0, 50)); }
}
else {
if(i%2==0) {strip.setPixelColor(i, strip.Color(150, 0, 50));}
else {strip.setPixelColor(i, strip.Color(50, 0, 150)); }}
} else {
strip.setPixelColor(i, strip.Color(255, 255, 255));
}
}
}*/
for(int i=0; i<strip.numPixels(); i++) {
if(i<15){
strip.setPixelColor(i, strip.Color(0, 0, 0));
} else {
strip.setPixelColor(i, strip.Color(255, 255, 255));
}}
strip.show();
loop_count++;
}
Problématiques
D'après notre diagnostique
- Les moteurs a courant continus allant trop vite (pour détecter la ligne), On aurait aimer puvoir régler la vitesse des moteurs mais comme nous n'avons qu'un pont en H (tout ou rien) nous devions passer via du PWM qui fait des appels de courant suffisamment important pour perturber le signal.
- Un manque de temps pour implementer toutes nos idées.
- ...
