



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