2016-08-09 7 views
0

Я работаю над ручным роботом Arduino, управляемым Bluetooth. Я хочу, чтобы, когда я отправляю целое число, серво движется, и когда я отправляю другой Int, он останавливается. Все, что я нашел на форумах, это системы, в которых сервопривод перемещается в определенную позицию, но я хочу, чтобы он действительно вращался, увеличивая его угол. Вот мой код, который не работает:Серво-непрерывное вращение Arduino Serial

#include <Servo.h> 

int val; 
int angle; 
int charsRead; 
char buffer[10]; 
Servo servo; 

void setup() { 
    Serial.begin(9600); 
    servo.attach(6); 
    angle = servo.read(); 
} 

void loop() { 
    servo.write(170); 
    serialCheck(); 
    if(val == 4021){ 
     servo.write(angle++); 
     delay(50); 
     } 
     } 
     else if(val == 4022){ 
     servo.write(angle); 
     } 
     serialCheck(); 
} 

void serialCheck(){ 
    while(Serial.available() > 0){ 
    charsRead = Serial.readBytesUntil('\n', buffer, sizeof(buffer) - 1); 
    buffer[charsRead] = '\0'; 
    val = atoi(buffer); 
    Serial.println(val); 
    } 
    } 

приложение я использую в основном посылает «4021», когда я долгое нажатие кнопки, и посылает «4022», когда я выпускаю его.

Я работал над этим в течение нескольких часов, и я не нашел никого, на каком-либо форуме, который имел такой же вопрос ...

Пожалуйста, помогите.

ответ

0

Ваша проблема заключается здесь:

void loop() { 
    servo.write(170); 
... 
} 

Что этот кусок кода делает устанавливается угол сервопривод 170 на каждой итерации цикла. Поскольку это будет происходить тысячи раз в секунду, это существенно заменит любые настройки сервопривода, введенные с помощью последовательных команд. Что вы должны сделать, так это переместить servo.write(170); в setup(), до servo.read(), что, я думаю, даст среднее положение в настоящее время или даже какой-то неопределенный результат. Согласно Arduino документации будет:

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

И BTW: сервопривод имеет ограниченный диапазон движения, поэтому вы должны проверить, не превышает ли требуемый угол пределы сервопривода.

+0

Большое вам спасибо! Я работаю над этим проектом уже более месяца, и это была моя последняя проблема! Оно работает! –

+0

@HugoTrombert Добро пожаловать :) Если ответ вам помог, отметьте его как принятый. – mactro

+0

@HugoTrombert: Вероятно, вы исправили больше проблем вокруг манипуляции с переменной угла. И если вы ничего не посылаете, val остается на последнем значении ist, повторяя предыдущее движение снова и снова ... – datafiddler