Запутался в буфере
- Войдите на сайт для отправки комментариев
Сб, 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-й.
Обратите внимание, два раза одни и те же грабли в маленьком скетче : Вы не контролируете значения управляющих переменных.
Спасибо! Кажется, начинаю понимать:) Завтра испытаю вашу рекомендацию. Да, действительно, я упустил из виду то, что переменным присваиваются определенные значения при первом запуске, и их в конце цикла нужно как-то обнулить.