2016-01-02 3 views
0

J'essaie de contrôler un robot voiture/roue essentiellement avec ce code. Le problème ici est que si j'envoie des signaux plus rapidement que 0.9 secondes, l'Arduino ne peut pas le traiter. Y a-t-il un moyen de le réparer?Le circuit Arduino ne répond pas

(J'ai vérifié le moniteur série d'un autre ordinateur et il montre que l'Arduino reçoit toujours le signal mais il ne fournit pas la sortie à mon contrôleur de moteur).

Toute aide serait appréciée. Merci.

#include <Servo.h> 

//Using mega 2560 and sabertooth 2x12 dip switch 010111 

int onevar; 
int twovar; 
Servo myservo; 
Servo myservo2; 

void setup() { 
    // put your setup code here, to run once:s 
    pinMode(servo1, OUTPUT); 
    pinMode(servo2, OUTPUT); 
    Serial.begin(9600); 
    myservo.attach(servo1); 
    myservo2.attach(servo2); 
    Serial.setTimeout(10); 
    //works for 10ms 0.9s need to figure out 
} 

void loop() { 
    // put your main code here, to run repeatedly: 
    // Receive up to 7 bytes 
    if (Serial.available()>0) { 
    // Wait for characters 
    onevar = Serial.parseInt(); 
    twovar = Serial.parseInt(); 
    //number = atoi(buffer); 
    Serial.println(onevar); 
    Serial.println(twovar); 
    /* if (Serial.available() > 0) { 
    number = Serial.read()-'0'; // read the incoming byte: 
    Serial.print(number); 
    */ 
    myservo.write(onevar); 
    // 93 is stop backward and forward is scalable range 25 to 155 
    myservo2.write(twovar); 
    //93 is no steering 30 to 160 
    } 
} 
+0

Vous ne montrez pas ce que vous appelez 'loop' qui n'est pas une boucle de toute façon. À côté: déplacer les variables globales pour qu'elles soient des variables locales dans la fonction à laquelle elles se rapportent, dans la mesure du possible. –

+1

@WeatherVane - 'setup()' et 'loop()' sont appelés depuis un 'main()' caché sur Arduino. 'main()' continue d'appeler la boucle encore et encore. –

+0

Je ne sais pas comment le délai d'attente fonctionne ici (par caractère ou par message), mais 9600 bauds ne peuvent recevoir qu'un seul caractère par milliseconde. Votre délai d'expiration est de 10 millisecondes, ce qui est un peu juste pour recevoir deux champs numériques sous forme de texte. –

Répondre

1

Quelques choses à essayer:

Serial.begin(9600); 

Définissez la vitesse de transmission plus élevée (aux deux extrémités).

Serial.println(onevar); 
    Serial.println(twovar); 

Commentez ceux qui sont sortis pour un test.

Servo myservo; 
Servo myservo2; 

2 servos et 1 port série. Il peut arriver qu'il y ait un conflit avec les minuteurs (plusieurs bibliothèques utilisant/réglant le même minuteur). Est-ce que cela fonctionne avec 1 servo?

+0

Essayé de changer le débit en bauds. Aucun changement notable n'a été observé. Essayé en utilisant un servo, n'a pas amélioré. –

+0

Aussi si c'est possible pouvez-vous me faire savoir d'autres méthodes d'obtenir deux nombres d'un signal qui est plus rapide. Pour celui-ci j'envoie des signaux comme "120a90" pour obtenir onevar = 120 et twovar = 90. –

+0

@PrangonDeySwachha - Pour envoyer et recevoir des valeurs plus rapidement, Serial.write() et Serial.readBytes() seraient meilleurs (en utilisant directement les données binaires). Vous pouvez utiliser readBytes pour lire un nombre de 16 bits sans avoir besoin d'analyser. Mais ils doivent aussi être binaires. –