



Voila pour le moment.
@Cordialement.
Posté 25 juin 2012 - 12:54
Page Facebook : https://www.facebook...appartelier2.0/
Page Twitter : https://twitter.com/2Appartelier (bateau seulement)
Boutique Robot-Maker : https://www.robot-ma...er-20/produits/
Besoin d'une impression 3D grand format ? Contactez moi !
Posté 25 juin 2012 - 02:04
Page Facebook : https://www.facebook...appartelier2.0/
Page Twitter : https://twitter.com/2Appartelier (bateau seulement)
Boutique Robot-Maker : https://www.robot-ma...er-20/produits/
Besoin d'une impression 3D grand format ? Contactez moi !
Posté 25 juin 2012 - 12:08
Posté 25 juin 2012 - 01:08
Posté 28 mai 2013 - 12:58
#include <Servo.h> #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 #define panPin 3 // PAN Servo - digital output D3 #define tiltPin 5 // TILt Servo - digital output D5 int sServoPin = 6; int sServoPin2 = 5; int dServoPin = 7; int dServoPin2 = 4; void stopper(void) //Stop { digitalWrite(sServoPin,LOW); digitalWrite(sServoPin2,LOW); } void advance(char <img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />/>/> //le robot avance { analogWrite (sServoPin,<img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />/>/>; digitalWrite(dServoPin,HIGH); analogWrite (sServoPin2,<img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />/>/>; digitalWrite(dServoPin2,HIGH); } void back_off (char <img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />/>/> //le robot recule { analogWrite (sServoPin,<img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />/>/>; digitalWrite(dServoPin,LOW); analogWrite (sServoPin2,<img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />/>/>; digitalWrite(dServoPin2,LOW); } void turn_L (char a) //Tourne a gauche { analogWrite (sServoPin,a); digitalWrite(dServoPin,HIGH); analogWrite (sServoPin2,a); digitalWrite(dServoPin2,LOW); } void turn_R (char a) //Tourne a droite { analogWrite (sServoPin,a); digitalWrite(dServoPin,LOW); analogWrite (sServoPin2,a); digitalWrite(dServoPin2,HIGH); } // defini les constants - define constants byte LRscalefactor=15; //facteur d'échelle - calibrer leurs moteurs - calibrage Selon le servos byte UDscalefactor=15; //facteur d'échelle - calibrer leurs moteurs - calibrage Selon le servo // distance minimale pour déplacer la tête du capteur int distancemax=255; // valeur capteur pour l'entrée analogique // distance qui provoque un décalage de gauche a droite int bestdistance=400; // 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 sMotorStop=90; // servo gauche - Stop: int dMotorStop=90; // Arrêtez servo droit int LRmax=170; // Les valeurs max servo pan int LRmin=10; // Valeur min servo de pan int UDmax=170; // Max valore inclinable int UDmin=10; // min valore inclinable // Définir le support de la variables - définir les variables globales int pan=PanZero; int tilt=TiltZero; int panscale; int tiltscale; int sSpeed=sMotorStop; int dSpeed=dMotorStop; int panOld; int tiltOld; int distance; int temp; // Capteurs IR int updown; int leftright; int leftIRvalue; int rightIRvalue; int upIRvalue; int downIRvalue; //Servomoteurs Servo panLR; Servo tiltUD; void setup() { // initialise et configure la broche servo // servos initialiser et configurer les broches 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 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(4); // 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(2); 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(4); // 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================================================================ { //servos a l'arrêt sSpeed=sMotorStop; dSpeed=dMotorStop; // 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)*15/panscale; pan=pan-leftright; } // si la tête tourne à droite if (leftIRvalue<rightIRvalue) { leftright=(rightIRvalue-leftIRvalue)*15/panscale; pan=pan+leftright; } // si la tête est levé if (upIRvalue>downIRvalue) { updown=(upIRvalue-downIRvalue)*15/tiltscale; tilt=tilt+updown; } // si la tête et vaire le bas if (downIRvalue>upIRvalue) { updown=(downIRvalue-upIRvalue)*15/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 corps du robot temp=LRmax-panOld; if (temp<60) { sSpeed=sMotorStop-50+temp/2; dSpeed=dMotorStop-50+temp/2; } temp=panOld-LRmin; if (temp<60) { dSpeed=dMotorStop+50-temp/2; sSpeed=sMotorStop+50-temp/2; } //------------------------------------------------------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>10) { temp=temp-10; if (distance>bestdistance) { dSpeed=dSpeed-temp/3; sSpeed=sSpeed+temp/3; } else { dSpeed=dSpeed+temp/3; sSpeed=sSpeed-temp/3; } } } }
Posté 28 mai 2013 - 03:05
Posté 28 mai 2013 - 03:41
Posté 28 mai 2013 - 08:58
Posté 29 mai 2013 - 08:14
Posté 30 mai 2013 - 05:57
BOB4, mon drone hélicoptère autonome d'intérieur http://heli.bot.free.fr/
BOB3, mon robot autonome d'intérieur avec WiFi + Foxboard Linux http://ze.bot.free.fr/
BOB5, robot bipède simulé, puis tentative de réalisation (fail)
Posté 30 mai 2013 - 04:43
Merci Leon pour ta réponse.
Donc je n'aurais pas besoins de faire du PID ( bon c'est déjà ça )
Ici, il te suffit de dire à ton robot de tourner à droite s'il voit l'objet plus à droite, et réciproquement. Si possible de manière "proportionnelle" : si l'objet est très à droite, tourne plus vite à droite
Oui je pence que cela devrai être plus facile a faire comparé a du PID ^^
Ben j'ai tenté aujourd'hui de faire mon programme , cela ne fonctionne pas , mais je doute que c'est pas la bonne façon de programmé cette effet.
Voilà la partit que j'ai fait:
///////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////// leftIRvalue = digitalRead(IRleft); rightIRvalue = digitalRead(IRright); // Si le gauche detecte quelque chose le robot tourne a droite if (leftIRvalue<rightIRvalue == LOW) { turn_R(255); } else { stopper(); } // Si le droite detecte quelque chose le robot tourne a gauche if (leftIRvalue>rightIRvalue == LOW) { turn_L(255); } else { stopper(); } //si les 2 capteurs IRs detecte en même temps le robot recule puis tourne if (leftIRvalue == LOW && rightIRvalue == LOW) { back_off(255); delay(2000); turn_L(255); delay(2000); } else { stopper(); } //sinon le robot avance if (leftIRvalue == HIGH && rightIRvalue == HIGH) { advance(255); } else { stopper(); } } } }
#include <Servo.h> #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 #define panPin 3 // PAN Servo - digital output D3 #define tiltPin 8 // TILt Servo - digital output D8 int sServoPin = 6; int sServoPin2 = 5; int dServoPin = 7; int dServoPin2 = 4; void stopper(void) //Stop { digitalWrite(sServoPin,LOW); digitalWrite(sServoPin2,LOW); } void advance(char <img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' /> //le robot avance { analogWrite (sServoPin,<img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />; digitalWrite(dServoPin,HIGH); analogWrite (sServoPin2,<img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />; digitalWrite(dServoPin2,HIGH); } void back_off (char <img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' /> //le robot recule { analogWrite (sServoPin,<img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />; digitalWrite(dServoPin,LOW); analogWrite (sServoPin2,<img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />; digitalWrite(dServoPin2,LOW); } void turn_L (char a) //Tourne a gauche { analogWrite (sServoPin,a); digitalWrite(dServoPin,HIGH); analogWrite (sServoPin2,a); digitalWrite(dServoPin2,LOW); } void turn_R (char a) //Tourne a droite { analogWrite (sServoPin,a); digitalWrite(dServoPin,LOW); analogWrite (sServoPin2,a); digitalWrite(dServoPin2,HIGH); } // defini les constants - define constants byte LRscalefactor=15; //facteur d'échelle - calibrer leurs moteurs - calibrage Selon le servos byte UDscalefactor=15; //facteur d'échelle - calibrer leurs moteurs - calibrage Selon le servo // distance minimale pour déplacer la tête du capteur int distancemax=255; // valeur capteur pour l'entrée analogique // distance qui provoque un décalage de gauche a droite int bestdistance=400; // 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 sMotorStop=90; // servo gauche - Stop: int dMotorStop=90; // Arrêtez servo droit int LRmax=170; // Les valeurs max servo pan int LRmin=10; // Valeur min servo de pan int UDmax=170; // Max valore inclinable int UDmin=10; // min valore inclinable // Définir le support de la variables - définir les variables globales int pan=PanZero; int tilt=TiltZero; int panscale; int tiltscale; int sSpeed=sMotorStop; int dSpeed=dMotorStop; int panOld; int tiltOld; int distance; int temp; // Capteurs IR int updown; int leftright; int leftIRvalue; int rightIRvalue; int upIRvalue; int downIRvalue; //Servomoteurs Servo panLR; Servo tiltUD; void setup() { // initialise et configure la broche servo // servos initialiser et configurer les broches 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 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(4); // 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(2); 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(4); // 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================================================================ { //servos a l'arrêt sSpeed=sMotorStop; dSpeed=dMotorStop; // 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)*15/panscale; pan=pan==-leftright; } // si la tête tourne à droite if (leftIRvalue<rightIRvalue) { leftright=(rightIRvalue-leftIRvalue)*15/panscale; pan=pan+leftright; } // si la tête est levé if (upIRvalue>downIRvalue) { updown=(upIRvalue-downIRvalue)*15/tiltscale; tilt=tilt+updown; } // si la tête et vaire le bas if (downIRvalue>upIRvalue) { updown=(downIRvalue-upIRvalue)*15/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 corps du robot temp=LRmax-panOld; if (temp<60) { sSpeed=sMotorStop-50+temp/2; dSpeed=dMotorStop-50+temp/2; } temp=panOld-LRmin; if (temp<60) { dSpeed=dMotorStop+50-temp/2; sSpeed=sMotorStop+50-temp/2; } //------------------------------------------------------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>10) { temp=temp-10; if (distance>bestdistance) { dSpeed=dSpeed-temp/3; sSpeed=sSpeed+temp/3; } else { dSpeed=dSpeed+temp/3; sSpeed=sSpeed-temp/3; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////// leftIRvalue = digitalRead(IRleft); rightIRvalue = digitalRead(IRright); // Si le gauche detecte quelque chose le robot tourne a droite if (leftIRvalue<rightIRvalue == LOW) { turn_R(255); } else { stopper(); } // Si le droite detecte quelque chose le robot tourne a gauche if (leftIRvalue>rightIRvalue == LOW) { turn_L(255); } else { stopper(); } //si les 2 capteurs IRs detecte en même temps le robot recule puis tourne if (leftIRvalue == LOW && rightIRvalue == LOW) { back_off(255); delay(2000); turn_L(255); delay(2000); } else { stopper(); } //sinon le robot avance if (leftIRvalue == HIGH && rightIRvalue == HIGH) { advance(255); } else { stopper(); } } } }
Posté 01 juin 2013 - 12:00
void advance(char B)/>/>/>/> //le robot avance { analogWrite (sServoPin,B)/>/>/>/>; digitalWrite(dServoPin,HIGH); analogWrite (sServoPin2,B)/>/>/>/>; digitalWrite(dServoPin2,HIGH); } void back_off (char B)/>/>/>/> //le robot recule { analogWrite (sServoPin,B)/>/>/>/>; digitalWrite(dServoPin,LOW); analogWrite (sServoPin2,B)/>/>/>/>; digitalWrite(dServoPin2,LOW);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////void advance(char B) //le robot avance
{
analogWrite (sServoPin,B);
digitalWrite(dServoPin,HIGH);
analogWrite (sServoPin2,B);
digitalWrite(dServoPin2,HIGH);
}
void back_off (char B) //le robot recule
{
analogWrite (sServoPin,B);
digitalWrite(dServoPin,LOW);
analogWrite (sServoPin2,B);
digitalWrite(dServoPin2,LOW);////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
0 members, 1 guests, 0 anonymous users