|
View unanswered posts | View active topics
|
Page 1 of 1
|
[ 12 posts ] |
|
| Author |
Message |
|
gismo
|
Post subject: Programme Asuro Posted: Sat Mar 14, 2009 8:40 pm |
|
Joined: Fri Dec 05, 2008 6:58 pm Posts: 64 Location: Hylos
|
Bonjour,
Mon robot doit faire un quart de tour à la première collision, un demi tour à la deuxième et troisième collisions.
J'ai essayé ce code :
Code: else if (taste>0) // détection d'un aimant à l'aide de K6 => Bit0=1 { compteur(); } }
//-------------------------------------------------- // Compteur //--------------------------------------------------
void compteur(void) { int i; for(i = 0; i < 3; i++) { if (i==0) { detection_aimant(); } else { demi_tour(); } } }
Le problème, c'est qu'il fait bien dans l'ordre mais le fait l'un après l'autre sans s'arrêter. Une seule collision suffit pour qu'il fasse le quart de tour et les deux demi tours à la suite.
Que dois-je faire?
|
|
| Top |
|
 |
|
Arexx-Henk
|
Post subject: Posted: Sun Mar 15, 2009 4:29 pm |
|
Joined: Thu Jun 23, 2005 10:52 am Posts: 693 Location: Zwolle
|
Bonjour,
Est-ce que c'est une solution ?
Code: //-------------------------------------------------- // ATTENTE UNE SECONDE (1000 * 1ms) //-------------------------------------------------- void vAttenteUneSeconde(void){
int i;
//1000 times for(i=0;i<1000;i++){
//attente 73 * 13,75us = 1ms (13,75us = 8.000.000 / 110) Sleep(73); }//for }
//-------------------------------------------------- // Compteur //--------------------------------------------------
void compteur(void){
int i; for(i = 0; i < 3; i++){
if (i==0){ detection_aimant(); }
else{ demi_tour();
}
//attente vAttenteUneSeconde();
}
}
Salut,
Henk
|
|
| Top |
|
 |
|
gismo
|
Post subject: Posted: Sun Mar 15, 2009 5:12 pm |
|
Joined: Fri Dec 05, 2008 6:58 pm Posts: 64 Location: Hylos
|
|
Non, ce n'est pas une solution...
Au contraire, le robot fait n'importe quoi...
|
|
| Top |
|
 |
|
gismo
|
Post subject: Posted: Sun Mar 15, 2009 5:24 pm |
|
Joined: Fri Dec 05, 2008 6:58 pm Posts: 64 Location: Hylos
|
Code: else if (taste>0) // détection d'un aimant à l'aide de K6 => Bit0=1 { position = position + 1; switch (position) { case Debut_parcours : // égal à 0 case Fin_parcours : // égal à 2 { demi_tour(); // appel à la fonction pour faire demi-tour } break; case Depose_balle : // égal à 1 { detection_aimant(); // appel à la fonction sur la détection de l'aimant } break; } }
J'ai essayé ceci mais le robot ne fait que son quart de tour.
Que dois-je modfier?
|
|
| Top |
|
 |
|
Arexx-Henk
|
Post subject: Posted: Sun Mar 15, 2009 8:24 pm |
|
Joined: Thu Jun 23, 2005 10:52 am Posts: 693 Location: Zwolle
|
|
Bonjour,
Veuillez envoyer votre programme entier.
Henk
|
|
| Top |
|
 |
|
gismo
|
Post subject: Posted: Wed Mar 18, 2009 3:41 pm |
|
Joined: Fri Dec 05, 2008 6:58 pm Posts: 64 Location: Hylos
|
Voici le code correspondant à mon premier post :
Code: #include "asuro.h"
//-------------------------------------------------- // Déclaration de fonction //--------------------------------------------------
void Suivi_ligne(void); void detection_aimant(void); void demi_tour(void);
//-------------------------------------------------- // Fonction principale //--------------------------------------------------
int main(void) { Init(); while(1) // Boucle sans fin { Suivi_ligne(); } return 0; }
//-------------------------------------------------- // Fonction du suivi de ligne //--------------------------------------------------
void Suivi_ligne(void) { unsigned int lineData[2]; //Allocation de la mémoire unsigned char taste;
taste=PollSwitch(); FrontLED(ON); // La LED frontale (D11) est allumée StatusLED(GREEN); // Diode d’état sur vert LineData(lineData); // Lire les valeurs de luminosité actuelle des phototransistors //-------------------------------------------------- // Trajectoire du robot : suivi de ligne //data[0] contient la valeur du phototransistor gauche (T9). //-------------------------------------------------- //data[1] contient la valeur du phototransistor droit (T10).
if (lineData[0]<lineData[1]) { // à gauche moins lumineux qu'à droite... MotorDir(FWD,FWD); // Les deux moteurs avancent MotorSpeed (60,200); // ...accélérer plus à droite BackLED(ON,OFF); // Allumer Led arrière gauche... Led arrière droite éteinte } else if (lineData[0]>lineData[1]) { // à gauche plus lumineux qu’à droite... MotorDir(FWD,FWD); // Les deux moteurs avancent MotorSpeed (200,40); // ... accélérer plus à gauche BackLED(OFF,ON); // Eteindre Led arrière gauche... Led arrière droite allumée } else if (taste>0) // détection d'un aimant à l'aide de K6 => Bit0=1 { compteur(); } }
//-------------------------------------------------- // Compteur //--------------------------------------------------
void compteur(void) { int i; for(i = 0; i < 3; i++) { if (i==0) { detection_aimant(); break; } else { demi_tour(); } } }
//-------------------------------------------------- // Détection d'un aimant //--------------------------------------------------
void detection_aimant(void) { int i; StatusLED(YELLOW); // Diode d'état jaune FrontLED(OFF); // LED frontale éteinte car ne suit plus la ligne // avance légèrement avant le quart de tour
for(i = 0; i < 255; i++) { MotorDir(FWD,FWD); // Les deux moteurs avancent MotorSpeed(i,i); // accélération progressive du moteur droit Sleep(255); // temporisation de quelques millisecondes }
// 1/4 de tour en avant vers la gauche
for(i = 0; i < 255; i++) { MotorDir(FWD,FWD); // Les deux moteurs avancent MotorSpeed(0,i); // accélération progressive du moteur droit Sleep(255); // temporisation de quelques millisecondes }
// 1/4 de tour en arrière pour revenir en position initiale
for(i = 0; i < 255; i++) { MotorDir(RWD,RWD); // Les deux moteurs reculent MotorSpeed(0,i); // accélération progressive du moteur droit Sleep(255); // temporisation de quelques millisecondes } }
//-------------------------------------------------- // Demi tour, arrivé à la fin du parcours //--------------------------------------------------
void demi_tour(void) { int i; StatusLED(RED); FrontLED(OFF);
for(i = 0; i < 255; i++) { MotorDir(RWD,RWD); MotorSpeed(0,i); Sleep(255); }
for(i = 0; i < 255; i++) { MotorDir(FWD,FWD); MotorSpeed(i,0); Sleep(255); } }
|
|
| Top |
|
 |
|
gismo
|
Post subject: Posted: Wed Mar 18, 2009 3:42 pm |
|
Joined: Fri Dec 05, 2008 6:58 pm Posts: 64 Location: Hylos
|
Voici le code correspondant à mon deuxième post :
Code: #include "asuro.h"
//-------------------------------------------------- // Déclaration de types //-------------------------------------------------- typedef enum { MAGNET_POSITON_START = 0, MAGNET_POSITON_BALL = 1, MAGNET_POSITON_END = 2, }TMagnetPosition;
//-------------------------------------------------- // Déclaration de fonction //--------------------------------------------------
void Suivi_ligne(TMagnetPosition eMagnetPositon); void detection_aimant(void); void demi_tour(void);
//-------------------------------------------------- // Fonction principale //--------------------------------------------------
int main(void) { TMagnetPosition eMagnetPositon = MAGNET_POSITON_START; Init(); while(1) // Boucle sans fin { Suivi_ligne(eMagnetPositon); } return 0; }
//-------------------------------------------------- // Fonction du suivi de ligne //--------------------------------------------------
void Suivi_ligne(TMagnetPosition eMagnetPositon) { unsigned int lineData[2]; //Allocation de la mémoire unsigned char taste; taste = PollSwitch(); FrontLED(ON); // La LED frontale (D11) est allumée StatusLED(GREEN); // Diode d’état sur vert LineData(lineData); // Lire les valeurs de luminosité actuelle des phototransistors //------------------------------- // Test de la aimant //------------------------------- if (taste > 0) { // on increment la position de l aimant detecte eMagnetPositon = eMagnetPositon + 1;
// on ramene la valeur de l aimant (3 valeurs possibles) eMagnetPositon = eMagnetPositon % 3;
switch(eMagnetPositon) { case MAGNET_POSITON_START : case MAGNET_POSITON_END : { demi_tour(); }break; case MAGNET_POSITON_BALL : { // appel à la fonction sur la détection de l'aimant detection_aimant(); }break;
} }
//-------------------------------------------------- // Trajectoire du robot : suivi de ligne //data[0] contient la valeur du phototransistor gauche (T9). //-------------------------------------------------- //data[1] contient la valeur du phototransistor droit (T10). if (lineData[0]<lineData[1]) { // à gauche moins lumineux qu'à droite.. MotorDir(FWD,FWD); // Les deux moteurs avancent MotorSpeed (60,200); // ...accélérer plus à droite BackLED(ON,OFF); // Allumer Led arrière gauche... Led arrière droite éteinte } else if (lineData[0]>lineData[1]) { // à gauche plus lumineux qu’à droite... MotorDir(FWD,FWD); // Les deux moteurs avancent MotorSpeed (200,40); // ... accélérer plus à gauche BackLED(OFF,ON); // Eteindre Led arrière gauche... Led arrière droite allumée } return eMagnetPositon; }
//-------------------------------------------------- // Détection d'un aimant //--------------------------------------------------
void detection_aimant(void) { int i; StatusLED(YELLOW); // Diode d'état jaune FrontLED(OFF); // LED frontale éteinte car ne suit plus la ligne // avance légèrement avant le quart de tour pour ne pa retomber sur l'aimant for(i = 0; i < 255; i++) { MotorDir(FWD,FWD); // Les deux moteurs avancent MotorSpeed(i,i); // accélération progressive du moteur droit Sleep(255); // temporisation de quelques millisecondes } // 1/4 de tour en avant vers la gauche for(i = 0; i < 255; i++) { MotorDir(FWD,FWD); // Les deux moteurs avancent MotorSpeed(0,i); // accélération progressive du moteur droit Sleep(255); // temporisation de quelques millisecondes } // 1/4 de tour en arrière pour revenir en position initiale for(i = 0; i < 255; i++) { MotorDir(RWD,RWD); // Les deux moteurs reculent MotorSpeed(0,i); // accélération progressive du moteur droit Sleep(255); // temporisation de quelques millisecondes } }
//-------------------------------------------------- // Demi tour, arrivé à la fin du parcours //--------------------------------------------------
void demi_tour(void) { int i; StatusLED(RED); // Diode d'état rouge FrontLED(OFF); // LED frontale éteinte // 1/4 de tour en arrière for(i = 0; i < 255; i++) { MotorDir(RWD,RWD); MotorSpeed(0,i); Sleep(255); } // 1/4 de tour en avant for(i = 0; i < 255; i++) { MotorDir(FWD,FWD); MotorSpeed(i,0); Sleep(255); } }
Dites moi ce qu'il ne va pas s'il vous plait.
Gismo
|
|
| Top |
|
 |
|
Arexx-Henk
|
Post subject: Posted: Wed Mar 18, 2009 7:24 pm |
|
Joined: Thu Jun 23, 2005 10:52 am Posts: 693 Location: Zwolle
|
|
| Top |
|
 |
|
gismo
|
Post subject: Posted: Wed Mar 18, 2009 7:29 pm |
|
Joined: Fri Dec 05, 2008 6:58 pm Posts: 64 Location: Hylos
|
|
Pensez vous que le lien que vous m'avez envoyer est une solution pour mon cas?
Son robot devait faire demi tour lorsqu'un des capteurs K2 ou K5 aient été activés...
Je tiens à vous rappeler que mon robot doit faire, avec l'aide du capteur K1 seulement, soit un quart de tour, soit un demi tour...
|
|
| Top |
|
 |
|
gismo
|
Post subject: Posted: Wed Mar 18, 2009 7:30 pm |
|
Joined: Fri Dec 05, 2008 6:58 pm Posts: 64 Location: Hylos
|
|
Je tenais à vous faire part également d'un problème que j'ai depuis cet après-midi, j'essaye d'envoyer un programme dans l'asuro. Mais, même après plusieurs essais, Flashtool n'arrive pas à se connecter à l'asuro, il affiche Timeout.
|
|
| Top |
|
 |
|
gismo
|
Post subject: Posted: Wed Mar 18, 2009 8:21 pm |
|
Joined: Fri Dec 05, 2008 6:58 pm Posts: 64 Location: Hylos
|
|
Merci Henk
Je suis arrivé à envoyer mon programme dans l'asuro, et cela marche.
Par contre, il exécute son quart de tour ou son demi-tour, même lorsque le capteur n'est pas enfoncé et que les moteurs sont en marche...
J'ai donc le même problème que Dyar.
Pouvez-vous m'en dire plus, svp.
Gismo
|
|
| Top |
|
 |
|
Arexx-Henk
|
Post subject: Posted: Thu Mar 19, 2009 9:50 pm |
|
Joined: Thu Jun 23, 2005 10:52 am Posts: 693 Location: Zwolle
|
Hi Gismo,
Essayez cette nouvelle fonction…
Code: //============================================================ // POLL SWITCH 2 //============================================================ // Une détection rapide et fiable de TOUT commutateur. // A fast and reliable detection of ANY switch. //============================================================ unsigned char ucPollSwitch2(void){
//var unsigned char ucSwi; unsigned char i; //supposez qu'aucun commutateur n'est actionné //assume that no switch is activated ucSwi=0; //---------------------------------------- //En ce moment, la borne 27 est un "output" //at this moment, pin 27 is an output //----------------------------------------
//---------------------------------------- // Une petite impulsion positive pour charger le condensateur C7. // A small positive pulse to charge capacitor C7 //----------------------------------------
//pin 27: pull-up (high) PORTC|= (1<<PC4); //pin 27: output (high) DDRC |= (1<<PC4); //pin 27: input (pull-up high) DDRC &=~(1<<PC4); //pin 27: input (no pull-up) PORTC&=~(1<<PC4);
//---------------------------------------- //Attendez un moment pour faire charger C7. //Wait one moment to charge C7. //----------------------------------------
//wait for 2ms Sleep(146); //---------------------------------------- // vérifiez si n'importe quelle clef est pressée (C7 est discharge) // check if ANY key is pressed (C7 is discharged) //----------------------------------------
//Si n'importe quel frontswitch est activé. //if any frontswitch is pressed if ( ~PINC & ( 1 << PC4 ) ) {
//---------------------------------------- // arrêtez les moteurs de bot // stop both motors //---------------------------------------- //arrêtez le moteur gauche //turn off the left engine PORTD&=~((1<<PD5)|(1<<PD4));
//arrêtez le moteur droit //turn off the right engine PORTB&=~((1<<PB5)|(1<<PB4));
//---------------------------------------- // attente 100 millisecondes. Attente la puissance de batterie de stabiliser. // wait for 100 milliseconds. Wait for the battery voltage to stabilize. //----------------------------------------
//faites 50 fois //do 50 times for(i=0;i<50;i++){ //attente 2ms //wait for 2ms Sleep(146); }//for
//---------------------------------------- //découvrez quels commutateurs sont actionnés // find out what switches are activated //----------------------------------------
// exécutez le pollswitch // execute pollswitch ucSwi = PollSwitch(); //---------------------------------------- // définissez la borne PD3 comme 'input' (le pollswitch l'a placé comme 'output') // define pin PD3 as 'input' (pollswitch sets it as 'output') //----------------------------------------
//PD3 = 'input' DDRD &= ~( 1 << PD3); }//if
//renvoyez la valeur mesurée de commutateur //return the measured switch value return ucSwi; }//ucPollSwitch2
Henk
|
|
| Top |
|
 |
|
Page 1 of 1
|
[ 12 posts ] |
|
Who is online |
Users browsing this forum: No registered users and 1 guest |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|
|