2014-05-19 3 views
0

Je fais un bot sumo pour un projet en utilisant un Arduino. Je n'ai aucune expérience avec le code Arduino, mais j'ai une expérience Java. Cela dit, ce bot a un détecteur de bord pour l'empêcher de tomber, un pilote L298, et ainsi de suite. Avec mon manque d'expérience, je ne sais pas exactement comment le code d'Arduino fonctionne avec les méthodes et etc. Cela dit, ma question principale est comment est-ce que j'exécute mes méthodes avec les délais? Est-ce qu'il se coince dans les méthodes sans retour? Ne pas entrer? L'exécution se terminant plus tard? Actuellement, il semble juste faire fonctionner les moteurs sans l'interrupteur. J'ai également vérifié le câblage. (Je m'excuse pour le mauvais interrogatoire - stackedoverflow vierge).Arduinosumo bot avec moteur rotatif

int motor_forward = 10; 
int motor_reverse = 9; 
int motor2_forward = 13; 
int motor2_reverse = 12; 
int edgeDec1 = 7; 
//int edgeDec2 = 6; 

//the setup routine runs once when you press reset; 
void setup(){ 
//initialize the digital pin as an output. 
pinMode(motor_forward, OUTPUT); 
pinMode(motor_reverse,OUTPUT); 
pinMode(motor2_forward,OUTPUT); 
pinMode(motor2_reverse,OUTPUT); 
pinMode(edgeDec1,INPUT); 

} 
//the loop routine runs over and over again forever 
void loop(){ 
    int indicator = random(2); 

    delay(5000);//5 second delay 
    //loop to prevent another 5 second delay 
    while(true){ 
    if (indicator = 0){ 
     for(int x = 0; x < random(200); x++){ 
     Forward(); 
     EdgeDec(); 
     delay(10); 
     } 
    } 
    else if (indicator = 1){ 
     for(int x = 0; x < random(200); x++){ 
     TurnLeft(); 
     EdgeDec(); 
     delay(10); 
     } 
    } 
    else if (indicator = 2){ 
     for(int x = 0; x < random(200); x++){ 
     TurnRight(); 
     EdgeDec(); 
     delay(10); 
     } 
    } 

    } 

} 
void Forward(){ 
    //right motor 
    digitalWrite(motor_forward,1);//terminal d1 will be high 
    digitalWrite(motor_reverse,0);//terminal d2 will be low 

    //left motor 
    digitalWrite(motor2_forward,1);//terminal d1 will be high 
    digitalWrite(motor2_reverse,0);//terminal d2 will be low 

} 
//going in reverse 
void Reverse(){ 
    //right motor 
    digitalWrite(motor_forward,0);//terminal d1 will be low 
    digitalWrite(motor_reverse,1);//terminal d2 will be high 

    //left motor 
    digitalWrite(motor2_forward,0);//terminal d1 will be low 
    digitalWrite(motor2_reverse,1);//terminal d2 will be high 

} 
//rotating left 
void TurnLeft(){ 
    //right motor 
    digitalWrite(motor_forward,0);//terminal d1 will be high 
    digitalWrite(motor_reverse,1);//terminal d2 will be low 

    //left motor 
    digitalWrite(motor2_forward,1);//terminal d1 will be high 
    digitalWrite(motor2_reverse,0);//terminal d2 will be low 

} 
void TurnRight(){ 
    //right motor 
    digitalWrite(motor_forward,1);//terminal d1 will be high 
    digitalWrite(motor_reverse,0);//terminal d2 will be low 

    //left motor 
    digitalWrite(motor2_forward,0);//terminal d1 will be high 
    digitalWrite(motor2_reverse,1);//terminal d2 will be low 

} 
void EdgeDec(){ 
    if(edgeDec1 == 1){ 
    Reverse(); 
    delay(700); 
    TurnLeft(); 
    delay(1000); 
    Forward(); 

    } 
} 

Répondre

0

Vous avez quelques erreurs/malentendus dans votre code, j'ai donc ajouté un peu de débogage simple qui fonctionne en ouvrant Outils> Moniteur série après avoir téléchargé votre code. Dans votre fonction EdgeDec() (fonction = méthode Java) vous aviez if (EdgeDec = 1), mais EdgeDec est juste un int avec la valeur de 7. Ce que vous vouliez était de lire la valeur d'une broche numérotée 7 - if (digitalRead (edgeDec1) == LOW). Aussi, j'ai inversé votre logique de HIGH (1) à LOW (0) parce que vous n'aviez pas attaché les pins digitalRead soit LOW (en utilisant des résistances externes) ou HIGH (en utilisant les résistances internes de l'Arduino) - lire mes commentaires dans le code. Je ne sais pas ce que vous faisiez avec la boucle while (true) - peut-être un débogage plus poussé? En tout cas, j'espère que cela aidera ...

int motor_forward = 10; 
int motor_reverse = 9; 
int motor2_forward = 13; 
int motor2_reverse = 12; 
int edgeDec1 = 7; 
//int edgeDec2 = 6; 
int indicator; // pulled this out of your loop - askchipbug 

String repeatstring; //debugging variable, stops a debug string from repeating in Serial monitor when watching a loop - askchipbug 

//the setup routine runs once when you press reset; 
void setup(){ 
    Serial.begin(9600);   // set up Serial library at 9600 bps, using SerialMonitor to debug - askchipbug 
    //initialize the digital pin as an output. 
    pinMode(motor_forward, OUTPUT); 
    pinMode(motor_reverse,OUTPUT); 
    pinMode(motor2_forward,OUTPUT); 
    pinMode(motor2_reverse,OUTPUT); 
    pinMode(edgeDec1,INPUT_PULLUP); // set this high so it doesn't float about - askchipbug 
    // you can use the internal 20k pullups with INPUT_PULLUP which means 1 = off, 0 = on 
    // or you have to use external pulldown resistors to have 1 = on, 0 = off 
    pr("setup completed"); // askchipbug 

} 
//the loop routine runs over and over again forever 
void loop(){ 
    randomSeed(analogRead(0)); // seeds the random() function with a different number each time the loop runs - askchipbug 
    indicator = random(2); 
    pr("indicator: " + String(indicator)); // askchipbug 
    pr("5 second delay"); 
    delay(5000);//5 second delay 
    //loop to prevent another 5 second delay 
    while(true){ 
    if (indicator == 0){ //you had this set as indicator = 0 - askchipbug 
     pr("indicator: " + String(indicator)); // askchipbug 
     for(int x = 0; x < random(200); x++){ 
     Forward(); 
     EdgeDec(); 
     delay(10); 
     } 
    } 
    else if (indicator = 1){ 
     pr("indicator: " + String(indicator)); //askchipbug 
     for(int x = 0; x < random(200); x++){ 
     TurnLeft(); 
     EdgeDec(); 
     delay(10); 
     } 
    } 
    else if (indicator = 2){ 
     pr("indicator: " + String(indicator));// askchipbug 
     for(int x = 0; x < random(200); x++){ 
     TurnRight(); 
     EdgeDec(); 
     delay(10); 
     } 
    } 
    } 

} 
void Forward(){ 
    //right motor 
    pr("forward"); //askchipbug 
    digitalWrite(motor_forward,1);//terminal d1 will be high 
    digitalWrite(motor_reverse,0);//terminal d2 will be low 

    //left motor 
    digitalWrite(motor2_forward,1);//terminal d1 will be high 
    digitalWrite(motor2_reverse,0);//terminal d2 will be low 
} 
//going in reverse 
void Reverse(){ 
    pr("reverse"); //askchipbug 
    //right motor 
    digitalWrite(motor_forward,0);//terminal d1 will be low 
    digitalWrite(motor_reverse,1);//terminal d2 will be high 

    //left motor 
    digitalWrite(motor2_forward,0);//terminal d1 will be low 
    digitalWrite(motor2_reverse,1);//terminal d2 will be high 
} 
//rotating left 
void TurnLeft(){ 
    pr("turn left"); //askchipbug 
    //right motor 
    digitalWrite(motor_forward,0);//terminal d1 will be high 
    digitalWrite(motor_reverse,1);//terminal d2 will be low 

    //left motor 
    digitalWrite(motor2_forward,1);//terminal d1 will be high 
    digitalWrite(motor2_reverse,0);//terminal d2 will be low 
} 
void TurnRight(){ 
    pr("turn right"); //askchipbug 
    //right motor 
    digitalWrite(motor_forward,1);//terminal d1 will be high 
    digitalWrite(motor_reverse,0);//terminal d2 will be low 

    //left motor 
    digitalWrite(motor2_forward,0);//terminal d1 will be high 
    digitalWrite(motor2_reverse,1);//terminal d2 will be low 
} 
void EdgeDec(){ 
    pr("edge detector: " + String(digitalRead(edgeDec1))); // read pin 7 - askchipbug 
    if(digitalRead(edgeDec1) == LOW){ // remember we're using the internal pullups so LOW = on - askchipbug 
    pr("edge detected!"); // askchipbug 
    Reverse(); 
    delay(700); 
    TurnLeft(); 
    delay(1000); 
    Forward(); 
    } 
} 

//simple debug technique - use pr("something"); in your code - askchipbug 
void pr(String txt){ 
    if(repeatstring != txt){ 
    //if the debug text is different, print it 
    Serial.println(txt); //prints the text and adds a newline 
    Serial.flush(); //waits for all the data to be printed 
    delay(1000); //just pauses the scrolling text for 1 second, make bigger if you want a longer pause 
    repeatstring = txt; 
    } 
} 
+0

Je pense que cela me met sur la bonne voie, merci. Le texte de débogage aide également à localiser le problème. J'ai pensé à la façon dont je pourrais le tester mais je n'étais pas sûr. – user3651225

+0

Vous êtes les bienvenus, tenez-nous au courant et marquez comme correct si cela fonctionne pour vous! Je ne voulais pas interférer avec le moment (vrai) car je supposais que vous travailliez sur d'autres choses là-bas. – askchipbug

0

La méthode delay Arduino D'une manière générale est mis en œuvre simplement l'exécution d'un certain nombre de nop s sur la CPU pour les cycles suffisant pour compenser le temps de retard requis. C'est essentiellement un appel bloquant en ce qu'il utilise juste complètement le CPU pendant assez de temps comme spécifié par l'argument passé à delay. Par exemple, disons que votre processeur fonctionne à 100hz, alors pour retarder pendant 1 seconde, il faudrait générer 100 instructions nop que le processeur exécutera. Le présume bien sûr qu'une telle instruction prend exactement 1 cycle d'horloge. Étant donné que l'Arduino Uno fonctionne avec un microprocesseur ATMEGA328p, vous pouvez consulter cette fiche technique pour en savoir plus.