Robot Ulysse
#23
Posté 08 juin 2013 - 12:06
J'ai testé aussi a lui faire suivre un objet de gauche à droite , mais cela donne des a coup au robot , je croie que c'est un problème de delay( 100);
Je me demandé si il existé pas de remplacé les delay par une autre formule , ( oui ) car les delay donne un temps de déplacement.
Sinon voici la vidéo de ulysse:
http://www.youtube.com/watch?feature=player_detailpage&v=pRmPNGUCT7E#t=0s
Désolé pour la qualité de la vidéo , cela a été filmé avec mon téléphone portable ^^
est voici le programme, qui n'est pas fini a causse de la raison que j'ai donné plus haut ^^
#include <Servo.h>
//Capteur infrarouge IR EYE
#define IRleft 1 // Compound Eye Left - analog input A1
#define IRright 3 // Compound Eye Right - analog input A3
#define IRup 0 // Compound Eye Up - analog input A0
#define IRdown 2 // Compound Eye Down - analog input A2
#define IRleds 2 // Compound Eye LEDs - digital output D2
//Déclaration des de servo ( suport de la tête du capteur pour le mouvement
#define panPin 3 // PAN Servo - digital output D3
#define tiltPin 8 // TILt Servo - digital output D8
//déclaration des Motoréducteurs
int MoteurPin = 6;
int MoteurPin2 = 5;
int dMoteurPin = 7;
int dMoteurPin2 = 4;
//Fonctions
//motoréducteur pour le mode déplacement automatique
void Moteur1(int pwm, boolean reverse)
{
analogWrite(MoteurPin,pwm); //Valeur_vitesse = 0 à l'arrêt, et 255 pour vitesse maximum
if(reverse)
{
digitalWrite(dMoteurPin,HIGH);
}
else
{
digitalWrite(dMoteurPin,LOW);
}
}
void Moteur2(int pwm, boolean reverse)
{
analogWrite(MoteurPin2,pwm); //Valeur_vitesse = 0 à l'arrêt, et 255 pour vitesse maximum
if(reverse)
{
digitalWrite(dMoteurPin2,HIGH);
}
else
{
digitalWrite(dMoteurPin2,LOW);
}
}
// defini les constants
byte LRscalefactor=10; //facteur d'échelle - calibrer les moteurs - calibrage Selon le servo
byte UDscalefactor=10; //facteur d'échelle - calibrer les moteurs - calibrage Selon le servo
// distance minimale pour le déplacement de la tête du capteur
int distancemax=255; // valeur distant du capteur pour l'entrée analogique
// distance qui provoque un décalage de gauche a droite
int bestdistance=330; // valeur pour trouver expérimentale du capteur
int PanZero=78; // stop servo di pan
int TiltZero=40; //arrêter servo haut bas - asservissement d'inclinaison arrêt
int LRmax=170; // Les valeurs max servo pan
int LRmin=10; // Valeur min servo de pan
int UDmax=170; // Max valore inclinable du servo
int UDmin=10; // min valore inclinable du servo
// Définir le support de la variables - définir les variables globales
int pan=PanZero;
int tilt=TiltZero;
int panscale;
int tiltscale;
int panOld;
int tiltOld;
int distance;
int temp;
// Capteurs infrarouge IR EYE
int updown;
int leftright;
int leftIRvalue;
int rightIRvalue;
int upIRvalue;
int downIRvalue;
//Servomoteurs
Servo panLR;
Servo tiltUD;
void setup()
{
// initialise et configure la broche des servos
panLR.attach(panPin);
panLR.write(PanZero);
tiltUD.attach(tiltPin);
tiltUD.write(TiltZero);
pinMode (IRleds,OUTPUT);
int i;
for(int i=4;i<=7;i++)
pinMode(i,OUTPUT); //Met les pin des moteurs 4,5,6,7 en mode sortie
}
void loop()
{
// servo régler pour la vitesse
panLR.write(pan);
tiltUD.write(tilt);
IReye(); // lire les valeurs du capteur
IRfollow(); // suivi
}
void IReye()//===============================================================Lire IR œil composé================================================
{
digitalWrite(IRleds,HIGH); // allumer LED IR pour lire la lumière infrarouge TOTAL (ambiante + reflété)
delay(2); // Prévoyez du temps pour phototransistors à répondre - aspetta par permettere LA Risposta dei phototransistors
leftIRvalue=analogRead(IRleft); // TOTAL IR = AMBIENT IR + LED IR REFLECTED FROM OBJECT
rightIRvalue=analogRead(IRright); // TOTAL IR = AMBIENT IR + LED IR REFLECTED FROM OBJECT
upIRvalue=analogRead(IRup); // TOTAL IR = AMBIENT IR + LED IR REFLECTED FROM OBJECT
downIRvalue=analogRead(IRdown); // TOTAL IR = AMBIENT IR + LED IR REFLECTED FROM OBJECT
delay(1);
digitalWrite(IRleds,LOW); // éteindre LA LED IR pour lire la lumière infrarouge ambiant (IR de l'éclairage intérieur et la lumière du soleil)
delay(2); // Prévoyez du temps pour répondre à phototransistors-aspetta par permettere LA Risposta dei phototransistors
leftIRvalue=leftIRvalue-analogRead(IRleft); // REFLECTED IR = TOTAL IR - AMBIENT IR
rightIRvalue=rightIRvalue-analogRead(IRright); // REFLECTED IR = TOTAL IR - AMBIENT IR
upIRvalue=upIRvalue-analogRead(IRup); // REFLECTED IR = TOTAL IR - AMBIENT IR
downIRvalue=downIRvalue-analogRead(IRdown); // REFLECTED IR = TOTAL IR - AMBIENT IR
distance=(leftIRvalue+rightIRvalue+upIRvalue+downIRvalue)/3;// la distance de l'objet est en moyenne illustrée - dans la distance de l'objet est la moyenne de la réflexion du capteur IR
}
void IRfollow ()//==============================================Suivre L'objet================================================================
{
// stop les Motoréducteur
MoteurPin;
MoteurPin2;
dMoteurPin;
dMoteurPin2;
// si la valeur de retour est faible, cela signifie qu'il n'y a pas d'objet voisins
// si la valeur lue est basse, il n'y a pas l'objet devant le capteur
if (distance<distancemax)
{
// le capteur revient à la position repos - réinitialiser le capteur à position zéro
if (pan>PanZero)pan=pan-1;
if (pan<PanZero)pan=pan+1;
if (tilt>TiltZero)tilt=tilt-1;
if (tilt<TiltZero)tilt=tilt+1;
}
else
{
//-------------------------------------------------------------Suivre objet avec la tête------------------------------------------------
panscale=(leftIRvalue+rightIRvalue)*LRscalefactor/10; //Facteur d'échelle - valeur d'échelle
tiltscale=(upIRvalue+downIRvalue)*UDscalefactor/10; // Facteur d'échelle - valeur d'échelle
// si la tête tourne vers la gauche
if (leftIRvalue>rightIRvalue)
{
leftright=(leftIRvalue-rightIRvalue)*10/panscale;
pan=pan==-leftright;
}
// si la tête tourne à droite
if (leftIRvalue<rightIRvalue)
{
leftright=(rightIRvalue-leftIRvalue)*10/panscale;
pan=pan+leftright;
}
// si la tête est levé
if (upIRvalue>downIRvalue)
{
updown=(upIRvalue-downIRvalue)*10/tiltscale;
tilt=tilt+updown;
}
// si la tête et vaire le bas
if (downIRvalue>upIRvalue)
{
updown=(downIRvalue-upIRvalue)*10/tiltscale;
tilt=tilt-updown;
}
panOld=pan;
tiltOld=tilt;
if (pan<LRmin) pan=LRmin;
if (pan>LRmax) pan=LRmax;
if (tilt<UDmin)tilt=UDmin;
if (tilt>UDmax)tilt=UDmax;
//-------------------------------------------------------------Tournez le corps du robot des qui suis un objet--------------------------------------------
// Si la tête tourne a plus de 60 degrés, exécute également le déplacement du corps du robot
temp=LRmax-panOld;
if (temp<10)
{
}
temp=panOld-LRmin;
if (temp<10)
{
}
//------------------------------------------------------Aller de l'avant ou vers l'arrière pour suivre l'objet------------------------------------
// si l'objet est à une distance inférieure à la distance optimale, revenir à cette distance,
// si la distance de l'objet est inférieure à la distance, déplacer le robot pour aller de nouveau à la même distance
temp=distance-bestdistance;
temp=abs(temp);
if (temp>1)
{
temp=temp-1;
if (distance>bestdistance)
{
Moteur1(250,false); //j'avance le moteur 1
Moteur2(250,true); // j'avance le moteur 2
delay(100); //j'attend 1 seconde
Moteur1(0,false); //j'arréte le moteur 1
Moteur2(0,true); // j'arréte le moteur 2
}
else
{
Moteur1(250,true); //j'avance le moteur 1
Moteur2(250,false); // j'avance le moteur 2
delay(100);
Moteur1(0,true); //j'arréte le moteur 1
Moteur2(0,false); // j'arréte le moteur 2
}
}
}
}
#24
Posté 09 juin 2013 - 06:27
Tres sympa ton robot !!
En fait tu as fait ton propre robot " MR.General " , car a la base ce capteur fait partis du Kit Mr.General . Sauf que la c'est un autre chassis.
En tout cas il est très bien !! Mais je n'ai pas compris ce qu'il se passe quand tu lui fait detecter des objet.
En tout cas bravo et merci pour le partage des codes !
Cordialement Dylan.
#25
Posté 09 juin 2013 - 11:32
Merci dydyouaki
Voilà se qui se passe quand je mais un objet ou ma mains devants le capteur eye:
je mais ma mains devant le capteur, je recule mas mains, est le robot avance ,
Je mais ma mains devants le capteur , est j'avance mas mains le robot recule.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Sinon je suis toujours sur sa programmation , j'ai fait en sorte que le code du capteur ,
des qui détecte mas mains ou autre sur la droite ou sur la gauche pour que le robot le suive ,
mais le robot fait des a-coup , comme si que les moteur coincé , mais se problème viens des delay
Donc du coup je ne c'est pas si le code est correcte ou si on peut l'amélioré voir le corrigé .
Répondre à ce sujet
0 utilisateur(s) li(sen)t ce sujet
0 members, 0 guests, 0 anonymous users













