Bonjour à tous,
Aujourd'hui c'est l'étape finale, la programmation !
Bon voici le code simple :
/*
Capteur de distance à ultrasons HC-SR04 avec Arduino Uno
TipTopBoards.com 06 01 2014 Rolland
Cabler +5V et GND du détecteur sur l'arduino
Trig -> pin 13
Echo -> pin 12
moteurDroit + 470R -> pin 10
Le robot tourne selon la distance trop près / trop loin
*/
#define trigPin 13 //Trig Ultrasons (sortie)
#define echoPin 12 //Echo Ultrasons (entrée)
#define moteurDroit 6 // moteurDroit
#define moteurGauche 5 // moteurGauche
void setup()
{
Serial.begin (9600);
pinMode(trigPin, OUTPUT); //Trig est une sortie
pinMode(echoPin, INPUT); //Echo est le retour, en entrée
pinMode(moteurDroit, OUTPUT);
}
void loop()
{
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10); //Trig déclenché 10ms sur HIGH
digitalWrite(trigPin, LOW);
// Calcul de l'écho
duration = pulseIn(echoPin, HIGH);
// Distance proportionnelle à la durée de sortie
distance = duration*340/(2*10000); //Vitesse du son théorique
if (distance < 35)
{// Distance trop près
digitalWrite(moteurDroit,LOW); //moteur gauche activé seulement
digitalWrite(moteurGauche,HIGH); // moteur Gauche tourne
}
else
{//Trop loin
digitalWrite(moteurDroit,HIGH);
delay(100);
digitalWrite(moteurGauche,HIGH);
}
delay(100); //0.1 sec entre deux mesures
}
Et voici un code un peut plus poussé :
/* Utilisation du capteur Ultrason HC-SR04 */
// définition des broches utilisées
int trig = 13;
int echo = 12;
long lecture_echo;
long cm;
int val;
int vitesse_u;
int vitesse_lente_u;
#define vitesse 200
#define dure_virage 800
#define vitesse_lente 80
int etat;
unsigned long temps;
int EN1 = 6;
int EN2 = 5; //Roboduino Motor shield uses Pin 9
int IN1 = 7;
int IN2 = 4; //Latest version use pin 4 instead of pin 8
void MotorD(int pwm, boolean reverse)
{
analogWrite(EN1,pwm); //set pwm control, 0 for stop, and 255 for maximum speed
if(!reverse)
{
digitalWrite(IN1,HIGH);
}
else
{
digitalWrite(IN1,LOW);
}
}
void MotorG(int pwm, boolean reverse)
{
analogWrite(EN2,pwm);
if(!reverse)
{
digitalWrite(IN2,HIGH);
}
else
{
digitalWrite(IN2,LOW);
}
}
void setup()
{
pinMode(trig, OUTPUT);
digitalWrite(trig, LOW);
pinMode(echo, INPUT);
Serial.begin(9600);
etat = 0;
temps = millis();
vitesse_lente_u = vitesse_lente;
vitesse_u = vitesse;
delay(8000); //delai avant mise en route des moteurs
}
void loop()
{
// mesure de distance
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
lecture_echo = pulseIn(echo, HIGH);
cm = lecture_echo / 58;
Serial.print("Distancem : ");
Serial.println(cm);
if (etat ==0) //virage gauche
{
MotorD(vitesse_u,true);
MotorG(vitesse_lente_u,true);
if ((temps + dure_virage) < millis())
{
etat = 1;
temps = millis();
}
}
else if(etat ==1) //virage droite
{
MotorD(vitesse_lente_u,true);
MotorG(vitesse_u,true);
if ((temps + dure_virage) < millis())
{
etat = 0;
temps = millis();
}
}
if (cm < 30) //detection murale
{
if(etat ==1)//si mur pendant virage droite on tourne a gauche
{
MotorD(vitesse_u,true);
MotorG(vitesse_u,false);
delay(3000);
}
else if(etat ==0) //si mur pendant virage gauche on tourne a droite
{
MotorD(vitesse_u,false);
MotorG(vitesse_u,true);
delay(3000);
}
}
val = Serial.read(); //reception de commande
if(val!=-1)
{
switch(val)
{
case 's'://arret
vitesse_lente_u = 0;
vitesse_u = 0;
break;
case 'r'://redemarre
vitesse_lente_u = vitesse_lente;
vitesse_u = vitesse;
break;
}
}
}
Aucun commentaire:
Enregistrer un commentaire