2016-01-02 5 views
0

Я пытаюсь управлять автомобилем/колесным роботом в основном с помощью этого кода. Проблема в том, что если я посылаю сигналы быстрее, чем 0,9 секунды, Arduino не может обработать его. Есть ли способ исправить это?Arduino circuit не отвечает

(Я проверил серийный монитор с другого компьютера, и он показывает, что Arduino все еще получает сигнал, но он не дает выход на мой контроллер мотора).

Любая помощь будет оценена по достоинству. Благодарю.

#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

Вы не показываете, что вызовет цикл, который не является циклом. Помимо этого: переместите глобальные переменные в локальные переменные в пределах функции, к которой они относятся, где это возможно. –

+1

@WeatherVane - 'setup()' и 'loop()' вызывается из скрытого 'main()' на Arduino. 'main()' продолжает вызов цикла снова и снова. –

+0

Я не знаю, как работает тайм-аут (для каждого символа или для каждого сообщения), но 9600 бод может получить только один символ за миллисекунду. Ваш тайм-аут составляет 10 миллисекунд, что немного жестко, чтобы получать два поля чисел в виде текста. –

ответ

1

Несколько вещей, чтобы попробовать:

Serial.begin(9600); 

Попробуйте установить скорость передачи данных выше (на обоих концах).

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

Прокомментируйте это для некоторых испытаний.

Servo myservo; 
Servo myservo2; 

2 сервоусилителя и 1 последовательный порт. Может случиться, что конфликт с таймерами (несколько библиотек, использующих/устанавливающих один и тот же таймер). Работает ли он с 1 сервомеханизмом?

+0

Пробовал менять скорость передачи. Никаких заметных изменений не наблюдалось. Пробовал использовать один серво, не улучшился. –

+0

Также, если это возможно, вы можете сообщить мне любые другие методы получения двух чисел из сигнала, который быстрее. Для этого я посылаю сигналы типа «120a90», чтобы получить onevar = 120 и twovar = 90. –

+0

@PrangonDeySwachha. Чтобы быстрее и быстрее отправлять и получать значения, лучше использовать Serial.write() и Serial.readBytes() (напрямую используя двоичные данные). Вы можете использовать readBytes для чтения в 16-битном номере без необходимости синтаксического анализа. Но они должны войти как двоичные, а затем. –