Запутался в буфере
- Войдите на сайт для отправки комментариев
Сб, 19/09/2015 - 19:59
Привет парни. В теме ни так давно, новичок. Вопрос про управление шаговика. Написал скетч, который читает символ в буфере порта, если символ равен 'w' то шаговик делает оборот на 360 градусов. Когда снова в мониторе порта ввожу символ 'w' и нажимаю Enter, ожидая, что шаговик снова сделает оборот на 360 градусов, то никакой реакции не следует. Помогите понять, что и где не углядел.
#include <Stepper.h>
#include <SPI.h>
char info = 0; //храним данные с буфера
byte stepper = 0; //
byte input1 = 3;
byte input2 = 4;
byte input3 = 5;
byte input4 = 6;
void setup() {
Serial.begin(9600);
pinMode (input1, OUTPUT);
pinMode (input2, OUTPUT);
pinMode (input3, OUTPUT);
pinMode (input4, OUTPUT);
}
void loop () {
if (Serial.available()>0){ // читаем, есть ли что-то в буфере
info = Serial.read(); // если есть, то это значение присваиваем переменной info
} //if
switch (info){ // разноусловная конструкция
case 'w':
while (stepper<50){
stepper++;
digitalWrite(input1, HIGH);
digitalWrite(input2, LOW);
digitalWrite(input3, LOW);
digitalWrite(input4, HIGH);
delayMicroseconds(800);
digitalWrite(input1, LOW);
digitalWrite(input2, HIGH);
digitalWrite(input3, LOW);
digitalWrite(input4, HIGH);
delayMicroseconds(800);
digitalWrite(input1, LOW);
digitalWrite(input2, HIGH);
digitalWrite(input3, HIGH);
digitalWrite(input4, LOW);
delayMicroseconds(800);
digitalWrite(input1, HIGH);
digitalWrite(input2, LOW);
digitalWrite(input3, HIGH);
digitalWrite(input4, LOW);
delayMicroseconds(800);
} //while
if (stepper==50){
while (Serial.available()) Serial.read();
digitalWrite(input1, LOW);
digitalWrite(input2, LOW);
digitalWrite(input3, LOW);
digitalWrite(input4, LOW);
break;
} //if
break;
case 's':
break;
case 'a':
break;
case 'd':
break;
} //switch
} //void loop
При первом запуске скетча, все работает как надо: ввожу в мониторе порта 'w' - шаговик делает оборот 360градусов и останавливается. Ввожу повторно 'w' - ни как не реагирует. Дальше, закрываю окно монитора порта, затем снова открываю и ввожу 'w' - шаговик снова делает полный оборот. Каждый раз, перед последующим вводом 'w', приходится закрывать и снова открыть мнитор порта.
Вставьте stepper=0; между 63-й и 64-й строками.
Вставьте stepper=0; между 63-й и 64-й строками.
Добавил строчку, двигатель крутится в бесконечном цикле. Не помогло.
Вставьте info = 0; между 80-й и 81-й.
Обратите внимание, два раза одни и те же грабли в маленьком скетче : Вы не контролируете значения управляющих переменных.
Вставьте info = 0; между 80-й и 81-й.
Обратите внимание, два раза одни и те же грабли в маленьком скетче : Вы не контролируете значения управляющих переменных.
Спасибо! Кажется, начинаю понимать:) Завтра испытаю вашу рекомендацию. Да, действительно, я упустил из виду то, что переменным присваиваются определенные значения при первом запуске, и их в конце цикла нужно как-то обнулить.