Запутался в буфере

Putnic
Offline
Зарегистрирован: 15.05.2015

Привет парни. В теме ни так давно, новичок. Вопрос про управление шаговика. Написал скетч, который читает символ в буфере порта, если символ равен '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

 

Putnic
Offline
Зарегистрирован: 15.05.2015

При первом запуске скетча, все работает как надо: ввожу в мониторе порта 'w' - шаговик делает оборот 360градусов и останавливается. Ввожу повторно 'w' - ни как не реагирует. Дальше, закрываю окно монитора порта, затем снова открываю и ввожу 'w' - шаговик снова делает полный оборот. Каждый раз, перед последующим вводом 'w', приходится закрывать и снова открыть мнитор порта.

Araris
Offline
Зарегистрирован: 09.11.2012

Вставьте stepper=0; между 63-й и 64-й строками.

Putnic
Offline
Зарегистрирован: 15.05.2015

Araris пишет:

Вставьте stepper=0; между 63-й и 64-й строками.

 

Добавил строчку, двигатель крутится в бесконечном цикле. Не помогло.

Araris
Offline
Зарегистрирован: 09.11.2012

Вставьте info = 0; между 80-й и 81-й.

Обратите внимание, два раза одни и те же грабли в маленьком скетче : Вы не контролируете значения управляющих переменных.

Putnic
Offline
Зарегистрирован: 15.05.2015

Araris пишет:

Вставьте info = 0; между 80-й и 81-й.

Обратите внимание, два раза одни и те же грабли в маленьком скетче : Вы не контролируете значения управляющих переменных.

Спасибо! Кажется, начинаю понимать:) Завтра испытаю вашу рекомендацию. Да, действительно, я упустил из виду то, что переменным присваиваются определенные значения при первом запуске, и их в конце цикла нужно как-то обнулить.