Hardrobot : Différence entre versions
(→2 ème étape capteur de proximité) |
(→1 ere Étape moteur) |
||
(26 révisions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
=1 ere Étape moteur = | =1 ere Étape moteur = | ||
+ | présentation du robot en vidéo http://www.youtube.com/watch?v=qjyGY_saNkU | ||
+ | |||
+ | petite vidéo du fonctionnement très rudimentaire http://www.youtube.com/watch?v=RFTtGAS0Rkk | ||
+ | ==Soudage des composants== | ||
+ | [http://www.sparkfun.com/tutorials/183 Présentation en ligne] | ||
==programme arduino == | ==programme arduino == | ||
− | + | <source lang=c> | |
− | + | inttesttimer=0; | |
− | + | const intledhaut=8; | |
− | + | const int ledpinv=5; | |
− | + | const int ledpinj=6; | |
− | + | const int ledpinr=7; | |
− | + | int pwm_a = 10; | |
− | + | //PWM control for motor outputs 1and 2 is on digital pin 10 | |
− | + | int pwm_b = 11; | |
− | + | //PWM control for motor outputs 3and 4 is on digital pin 11 | |
− | + | int Pindir_a = 12; | |
− | + | int dir_a=1; | |
− | int | + | //PWM control for motor outputs 1and 2 is on digital pin 12 |
− | + | int Pindir_b = 13; | |
− | + | int dir_b=1; | |
− | + | //PWM control for motor outputs 3and 4 is on digital pin 13 | |
− | + | int val0=0;//valuersur1024 de capteur0 | |
+ | intval1=0;//valuer sur1024 de capteur1 | ||
+ | intval2=0;//valuer sur1024 de capteur2 | ||
+ | intariv=0;//capteur d'arrivé | ||
+ | intanalogPin0 = 0;//capteur0(millieu) broche0 | ||
+ | intanalogPin1 = 1;//capteur1(gauche) broche1 | ||
+ | intanalogPin2 = 2;//capteur2(droit) broche2 | ||
+ | intanalogPin4 =5;//capteur d'arrivé | ||
+ | intcompteura=20; | ||
+ | intcompteurb=20; | ||
+ | int anciencompteura ; | ||
+ | intanciencompteurb; | ||
+ | char c; | ||
+ | int zero; | ||
+ | intafaire=0; | ||
+ | int tim=0; | ||
+ | void setup(){ | ||
+ | Serial.begin(115200); // ouvre le port série, fixe le débit à 115200 bauds | ||
+ | pinMode(pwm_a, OUTPUT); //vitesse | ||
+ | pinMode(pwm_b, OUTPUT); //vitesse | ||
+ | pinMode(Pindir_a, OUTPUT); //sens | ||
+ | pinMode(Pindir_b, OUTPUT); //sens | ||
+ | //capteur optique | ||
+ | attachInterrupt (0,test , CHANGE);//patte 2,moteur a | ||
+ | attachInterrupt (1,test2 , CHANGE);//patte 3,moteur b | ||
+ | pinMode(ledpinv, OUTPUT); | ||
+ | pinMode(ledpinj, OUTPUT); | ||
+ | pinMode(ledpinr, OUTPUT); | ||
+ | //sens du moteur | ||
+ | //si 0 recule,si 1 avance | ||
+ | digitalWrite(Pindir_a, dir_a); | ||
+ | //si 0 recule,si 1 avance | ||
+ | digitalWrite(Pindir_b, dir_b); | ||
+ | cli();//stop interrupts | ||
+ | |||
+ | // TCCR1A = 0; //Reset control registers | ||
+ | // TCCR1B = 0; //Reset control registers | ||
+ | // TCCR1B |= (1 << WGM12); // Clear Timer on Compare Match (CTC) Mode | ||
+ | // TCCR1B |= (1 << CS10); // Prescaler x1 | ||
+ | // OCR1A = 255; //Set compared value | ||
+ | // TIMSK1 = 0; //Reset Timer/Counter2 Interrupt Mask Register | ||
+ | TIMSK1 |= (1 << OCIE1A); // Enable Output Compare Match A Interrupt*/ | ||
+ | |||
+ | sei();//allow interrupts | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | ISR(TIMER1_COMPA_vect) {//timer1 interrupt 1Hz toggles pin 13 (LED) | ||
+ | |||
+ | testtimer++; | ||
+ | |||
+ | if (testtimer==2000) | ||
+ | { | ||
+ | |||
+ | testtimer=0; | ||
+ | afaire=1; | ||
+ | |||
+ | |||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | void test(){ | ||
+ | tim=tim+1; | ||
+ | compteura=anciencompteura ; | ||
+ | if (dir_a==1){ | ||
+ | compteura=compteura+1; | ||
+ | } | ||
+ | else{ | ||
+ | compteura=compteura-1; | ||
+ | } | ||
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | void test2(){ | |
− | + | if (dir_b==1){ | |
− | + | compteurb=compteurb+1; | |
− | |||
} | } | ||
else{ | else{ | ||
− | + | compteurb=compteurb-1; | |
} | } | ||
− | Serial.println( | + | |
+ | } | ||
+ | |||
+ | void loop(){ | ||
+ | anciencompteura=compteura;//compteur a | ||
+ | anciencompteurb=compteurb;//compteur b | ||
+ | |||
+ | |||
+ | |||
+ | /* Serial.print('a'); | ||
+ | Serial.println(compteura); | ||
+ | Serial.print('b'); | ||
+ | Serial.println(compteurb);*/ | ||
+ | val0 = analogRead (analogPin0); // lecture dela broche d'entrée0 | ||
+ | val1 = analogRead (analogPin1); // lecture dela broche d'entrée1 | ||
+ | val2 = analogRead (analogPin2); // lecture dela broche d'entrée2 | ||
+ | ariv = analogRead (analogPin4); | ||
+ | Serial.print('m'); | ||
+ | Serial.println (ariv); // valeurs d'arrivé | ||
+ | /* Serial.print('g'); | ||
+ | Serial.println (val1); // debug valeur | ||
+ | Serial.print('d'); | ||
+ | Serial.println (val2); // debug valeur | ||
+ | */ | ||
+ | |||
+ | if(val0>=200||val1>=100||val2>=100)//detetion d'obstacle etesquive | ||
+ | { | ||
+ | |||
+ | digitalWrite(ledpinv, LOW); | ||
+ | digitalWrite(ledpinj, HIGH); | ||
+ | digitalWrite(ledpinr, LOW); | ||
+ | |||
+ | dir_a=0; | ||
+ | dir_b=0; | ||
+ | //compteura=0; | ||
+ | //compteurb=0; | ||
+ | digitalWrite(Pindir_a, dir_a); | ||
+ | digitalWrite(Pindir_b, dir_b); | ||
+ | //if(compteura<=-40&compteurb<=-40){ | ||
+ | analogWrite(pwm_b,200); | ||
+ | analogWrite(pwm_a,80); | ||
+ | delay(500); | ||
} | } | ||
− | + | else //condition normal | |
− | + | { | |
− | + | digitalWrite(ledpinj, LOW); | |
+ | digitalWrite(ledpinv, HIGH); | ||
+ | digitalWrite(ledpinr, LOW); | ||
+ | |||
+ | analogWrite(pwm_b,100); | ||
+ | analogWrite(pwm_a,114); | ||
+ | dir_a=1; | ||
+ | dir_b=1; | ||
− | + | digitalWrite(Pindir_a, dir_a); | |
− | + | digitalWrite(Pindir_b, dir_b); | |
− | + | delay(200); | |
− | + | } | |
− | + | if(afaire=1){// si dection de blocagealors déblocage du robots | |
+ | digitalWrite(ledpinv, LOW); | ||
+ | digitalWrite(ledpinj, LOW); | ||
+ | digitalWrite(ledpinr, HIGH); | ||
+ | |||
+ | if(compteura==anciencompteura&compteurb==anciencompteurb){ | ||
+ | dir_a=0; | ||
+ | dir_b=0; | ||
+ | digitalWrite(Pindir_a, dir_a); | ||
+ | digitalWrite(Pindir_b, dir_b); | ||
+ | analogWrite(pwm_b,80); | ||
+ | analogWrite(pwm_a,200); | ||
+ | delay(500); //afficher les valeurs | ||
+ | } | ||
+ | if(ariv>=1000)// detection d'une couleurnoir sur le dessous alors on s'arrete | ||
+ | |||
+ | |||
+ | { | ||
+ | digitalWrite(ledpinv, LOW); | ||
+ | digitalWrite(ledpinj, HIGH); | ||
+ | digitalWrite(ledpinr, HIGH); | ||
+ | |||
+ | analogWrite(pwm_b,0); | ||
+ | analogWrite(pwm_a, 0); | ||
+ | delay(10000); | ||
+ | |||
} | } | ||
− | + | ||
− | + | ||
− | + | } | |
− | + | </source> | |
− | + | ||
− | + | ==carte ARDUINO== | |
− | + | Lors de la conception nous nous sommes aperçu que le robots s’arrêtait tout seul au bout de quelque seconde, en faite le convertisseur 12v - 5v prévue dans la carte arduino chauffait de trop pour cela 2 transistors de conversion on été rajouter sur le composants pour aider la carte arduino a gérer ces tensions | |
− | + | [[Fichier:M0.jpg|vignette]] | |
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
==roue codeuse et capteur optique== | ==roue codeuse et capteur optique== | ||
− | remplacement des nouvel roue codeuse | + | 1.remplacement des nouvel roue codeuse |
30 noir | 30 noir | ||
30 blache | 30 blache | ||
4 degret chacune | 4 degret chacune | ||
− | + | 2.voici le shéma du cablage que nous avons réalisé | |
+ | [[Fichier:Schema fourche optique.jpg|500px]] | ||
+ | |||
+ | 3.Mise en place des capteur, puis test petit problème du à l'alignement des capteurs optiques et à la position qui créaient des frottement sur le moteur. Réparation du et remise en place des composants. Mise en place de la batterie. | ||
+ | |||
+ | |||
− | |||
− | = 2 ème étape capteur de proximité = | + | ===Visualisation=== |
+ | [[Fichier:M1234.jpg|vignette]] | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | |||
+ | = 2 ème étape l'esquive = | ||
+ | == capteur de proximité == | ||
On a choisi de mettre 3 capteurs fait a base de photodiode et photo-transistor. L'émetteur d'entrée est alimenté sous un courant provocant une émission radiative puis récupérée par la base du photo-transistor pour donner à la sortie un courant collecteur. | On a choisi de mettre 3 capteurs fait a base de photodiode et photo-transistor. L'émetteur d'entrée est alimenté sous un courant provocant une émission radiative puis récupérée par la base du photo-transistor pour donner à la sortie un courant collecteur. | ||
Listes des composants: - 1 photodiode LD271 | Listes des composants: - 1 photodiode LD271 | ||
Ligne 85 : | Ligne 238 : | ||
Schéma de principe: | Schéma de principe: | ||
+ | |||
+ | [[Fichier:Detec obstacle.JPG|500px]] | ||
+ | |||
+ | == Détection de blocage == | ||
+ | Grace a une commande interrupt on peut constater quand le robot est à l’arrêt. | ||
+ | |||
+ | cli(); | ||
+ | //stop interrupts // TCCR1A = 0; | ||
+ | // Reset control registers // TCCR1B = 0; | ||
+ | // Reset control registers | ||
+ | // TCCR1B |= (1 << WGM12); | ||
+ | // Clear Timer on Compare Match (CTC) Mode | ||
+ | // TCCR1B |= (1 << CS10); | ||
+ | // Prescaler x1 // OCR1A = 255; | ||
+ | // Set compared value // TIMSK1 = 0; | ||
+ | // Reset Timer/Counter2 Interrupt Mask Register TIMSK1 |= (1 << OCIE1A); // Enable Output Compare Match A Interrupt */ sei(); | ||
+ | //allow interrupts } ISR(TIMER1_COMPA_vect) { | ||
+ | //timer1 interrupt 1Hz toggles pin 13 (LED) testtimer++; | ||
+ | if (testtimer==2000) { | ||
+ | testtimer=0; afaire=1; } } | ||
+ | |||
+ | = 3 Détection de l'arrivée = | ||
+ | On utilise un capteur optique pour détecter le changement de couleur du sol ainsi on détectera la zone d'arrivée du robot. | ||
+ | Voici le schéma du cablage du capteur optique: | ||
+ | |||
+ | [[Fichier:Detect_arrive.JPG|500px]] | ||
+ | |||
+ | |||
+ | |||
+ | [[Fichier:m123.jpg|vignette]] |
Version actuelle datée du 27 mars 2013 à 14:58
Sommaire
1 ere Étape moteur
présentation du robot en vidéo http://www.youtube.com/watch?v=qjyGY_saNkU
petite vidéo du fonctionnement très rudimentaire http://www.youtube.com/watch?v=RFTtGAS0Rkk
Soudage des composants
programme arduino
inttesttimer=0;
const intledhaut=8;
const int ledpinv=5;
const int ledpinj=6;
const int ledpinr=7;
int pwm_a = 10;
//PWM control for motor outputs 1and 2 is on digital pin 10
int pwm_b = 11;
//PWM control for motor outputs 3and 4 is on digital pin 11
int Pindir_a = 12;
int dir_a=1;
//PWM control for motor outputs 1and 2 is on digital pin 12
int Pindir_b = 13;
int dir_b=1;
//PWM control for motor outputs 3and 4 is on digital pin 13
int val0=0;//valuersur1024 de capteur0
intval1=0;//valuer sur1024 de capteur1
intval2=0;//valuer sur1024 de capteur2
intariv=0;//capteur d'arrivé
intanalogPin0 = 0;//capteur0(millieu) broche0
intanalogPin1 = 1;//capteur1(gauche) broche1
intanalogPin2 = 2;//capteur2(droit) broche2
intanalogPin4 =5;//capteur d'arrivé
intcompteura=20;
intcompteurb=20;
int anciencompteura ;
intanciencompteurb;
char c;
int zero;
intafaire=0;
int tim=0;
void setup(){
Serial.begin(115200); // ouvre le port série, fixe le débit à 115200 bauds
pinMode(pwm_a, OUTPUT); //vitesse
pinMode(pwm_b, OUTPUT); //vitesse
pinMode(Pindir_a, OUTPUT); //sens
pinMode(Pindir_b, OUTPUT); //sens
//capteur optique
attachInterrupt (0,test , CHANGE);//patte 2,moteur a
attachInterrupt (1,test2 , CHANGE);//patte 3,moteur b
pinMode(ledpinv, OUTPUT);
pinMode(ledpinj, OUTPUT);
pinMode(ledpinr, OUTPUT);
//sens du moteur
//si 0 recule,si 1 avance
digitalWrite(Pindir_a, dir_a);
//si 0 recule,si 1 avance
digitalWrite(Pindir_b, dir_b);
cli();//stop interrupts
// TCCR1A = 0; //Reset control registers
// TCCR1B = 0; //Reset control registers
// TCCR1B |= (1 << WGM12); // Clear Timer on Compare Match (CTC) Mode
// TCCR1B |= (1 << CS10); // Prescaler x1
// OCR1A = 255; //Set compared value
// TIMSK1 = 0; //Reset Timer/Counter2 Interrupt Mask Register
TIMSK1 |= (1 << OCIE1A); // Enable Output Compare Match A Interrupt*/
sei();//allow interrupts
}
ISR(TIMER1_COMPA_vect) {//timer1 interrupt 1Hz toggles pin 13 (LED)
testtimer++;
if (testtimer==2000)
{
testtimer=0;
afaire=1;
}
}
void test(){
tim=tim+1;
compteura=anciencompteura ;
if (dir_a==1){
compteura=compteura+1;
}
else{
compteura=compteura-1;
}
}
void test2(){
if (dir_b==1){
compteurb=compteurb+1;
}
else{
compteurb=compteurb-1;
}
}
void loop(){
anciencompteura=compteura;//compteur a
anciencompteurb=compteurb;//compteur b
/* Serial.print('a');
Serial.println(compteura);
Serial.print('b');
Serial.println(compteurb);*/
val0 = analogRead (analogPin0); // lecture dela broche d'entrée0
val1 = analogRead (analogPin1); // lecture dela broche d'entrée1
val2 = analogRead (analogPin2); // lecture dela broche d'entrée2
ariv = analogRead (analogPin4);
Serial.print('m');
Serial.println (ariv); // valeurs d'arrivé
/* Serial.print('g');
Serial.println (val1); // debug valeur
Serial.print('d');
Serial.println (val2); // debug valeur
*/
if(val0>=200||val1>=100||val2>=100)//detetion d'obstacle etesquive
{
digitalWrite(ledpinv, LOW);
digitalWrite(ledpinj, HIGH);
digitalWrite(ledpinr, LOW);
dir_a=0;
dir_b=0;
//compteura=0;
//compteurb=0;
digitalWrite(Pindir_a, dir_a);
digitalWrite(Pindir_b, dir_b);
//if(compteura<=-40&compteurb<=-40){
analogWrite(pwm_b,200);
analogWrite(pwm_a,80);
delay(500);
}
else //condition normal
{
digitalWrite(ledpinj, LOW);
digitalWrite(ledpinv, HIGH);
digitalWrite(ledpinr, LOW);
analogWrite(pwm_b,100);
analogWrite(pwm_a,114);
dir_a=1;
dir_b=1;
digitalWrite(Pindir_a, dir_a);
digitalWrite(Pindir_b, dir_b);
delay(200);
}
if(afaire=1){// si dection de blocagealors déblocage du robots
digitalWrite(ledpinv, LOW);
digitalWrite(ledpinj, LOW);
digitalWrite(ledpinr, HIGH);
if(compteura==anciencompteura&compteurb==anciencompteurb){
dir_a=0;
dir_b=0;
digitalWrite(Pindir_a, dir_a);
digitalWrite(Pindir_b, dir_b);
analogWrite(pwm_b,80);
analogWrite(pwm_a,200);
delay(500); //afficher les valeurs
}
if(ariv>=1000)// detection d'une couleurnoir sur le dessous alors on s'arrete
{
digitalWrite(ledpinv, LOW);
digitalWrite(ledpinj, HIGH);
digitalWrite(ledpinr, HIGH);
analogWrite(pwm_b,0);
analogWrite(pwm_a, 0);
delay(10000);
}
}
carte ARDUINO
Lors de la conception nous nous sommes aperçu que le robots s’arrêtait tout seul au bout de quelque seconde, en faite le convertisseur 12v - 5v prévue dans la carte arduino chauffait de trop pour cela 2 transistors de conversion on été rajouter sur le composants pour aider la carte arduino a gérer ces tensions
roue codeuse et capteur optique
1.remplacement des nouvel roue codeuse 30 noir 30 blache 4 degret chacune
2.voici le shéma du cablage que nous avons réalisé
3.Mise en place des capteur, puis test petit problème du à l'alignement des capteurs optiques et à la position qui créaient des frottement sur le moteur. Réparation du et remise en place des composants. Mise en place de la batterie.
Visualisation
2 ème étape l'esquive
capteur de proximité
On a choisi de mettre 3 capteurs fait a base de photodiode et photo-transistor. L'émetteur d'entrée est alimenté sous un courant provocant une émission radiative puis récupérée par la base du photo-transistor pour donner à la sortie un courant collecteur. Listes des composants: - 1 photodiode LD271
- 1 photo-transistor BPW50 - 1 résistance de 19 Ohm - 1 résistance de 220 KOhm
Schéma de principe:
Détection de blocage
Grace a une commande interrupt on peut constater quand le robot est à l’arrêt.
cli(); //stop interrupts // TCCR1A = 0; // Reset control registers // TCCR1B = 0; // Reset control registers // TCCR1B |= (1 << WGM12); // Clear Timer on Compare Match (CTC) Mode // TCCR1B |= (1 << CS10); // Prescaler x1 // OCR1A = 255; // Set compared value // TIMSK1 = 0; // Reset Timer/Counter2 Interrupt Mask Register TIMSK1 |= (1 << OCIE1A); // Enable Output Compare Match A Interrupt */ sei(); //allow interrupts } ISR(TIMER1_COMPA_vect) { //timer1 interrupt 1Hz toggles pin 13 (LED) testtimer++; if (testtimer==2000) { testtimer=0; afaire=1; } }
3 Détection de l'arrivée
On utilise un capteur optique pour détecter le changement de couleur du sol ainsi on détectera la zone d'arrivée du robot. Voici le schéma du cablage du capteur optique: