помощь в цикличности в "case"

nikandr77
Offline
Зарегистрирован: 20.01.2020

Доброго времени форумчане. Помогите пожалуйста. Суть проблемы в следующем:
Есть шаговый двигатель, драйвер a4988, raspberry pi и arduino mega
Нужно сделать так, чтобы шаговый двигатель вращался некоторое кол-во оборотов или же несколько секунд, после чего останавливался ну и также в обратную сторону.
Я сделал так, чтобы малина отправляла команду на ардуино а та в свою очередь отправляла команду на драйвер
Но вот дело в том, что происходит только один шаг, а дальше ничего, суть проблемы я понимаю, но ее решение я не знаю

Кто может, помогите пожалуйста, скетч приложил снизу. Заранее спасибо :)

 

const int stepPin = 3; 
const int dirPin = 4; 

//----------------------------------------------------------
void setup()
{ 
    pinMode(stepPin,OUTPUT); 
    pinMode(dirPin,OUTPUT);
  
    Serial.begin(9600, SERIAL_8N1);
    while (!Serial) {}
    
}
 
//----------------------------------------------------------
void loop()
{
digitalWrite(dirPin,LOW);
  byte pos;
  
  if(Serial.available() > 0){
    // Чтение команды
    int inByte = Serial.read(); 
    // Обработка команд от малинки
    switch(inByte){
   case 'f':

    digitalWrite(dirPin,HIGH); 
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(700); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(700);

  case 's':
  
    //digitalWrite(dirPin,LOW);
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(700); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(700); 
    delay(0);

    }
    
    Serial.write(inByte);
    Serial.write('\n');
  
  } 
}

 

b707
Offline
Зарегистрирован: 26.05.2017

изложите своими словами, как вы понимаете суть проблемы

nikandr77
Offline
Зарегистрирован: 20.01.2020

При получении команды от малины, ардуино выполняет часть кода:

   case 'f':

    digitalWrite(dirPin,HIGH); 
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(700); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(700);
 

Но это только на один шаг, а мне надо несколько шагов, вот и вся проблема


nik182
Offline
Зарегистрирован: 04.05.2015

В конце казе брейк должен быть, если хочешь, чтобы другие казе не выполнялись. Сериал отдаёт чар.

sadman41
Offline
Зарегистрирован: 19.10.2016

По брейку верно, но Serial.read() таки отдаёт int, который нужно привести к char после проверки на -1.

nikandr77
Offline
Зарегистрирован: 20.01.2020

Спасибо, щас сделаю. Но а по поводу того, чтобы в case выполнялось все в цикле ? Можете подсказать как это сделать ?

b707
Offline
Зарегистрирован: 26.05.2017

nikandr77 пишет:

Но это только на один шаг, а мне надо несколько шагов, вот и вся проблема

ну и в чем проблема? :) Знаете, как выполнить, например, десять шагов? - ну так вставьте код для десяти шагов вместо этого...

nikandr77
Offline
Зарегистрирован: 20.01.2020

Мне нужно примерно 1600 шагов

sadman41
Offline
Зарегистрирован: 19.10.2016

Дак пусть для начала цыкл в case исполняется мб?

b707
Offline
Зарегистрирован: 26.05.2017

nikandr77 пишет:

Мне нужно примерно 1600 шагов

да хоть миллион

nikandr77
Offline
Зарегистрирован: 20.01.2020

ну мне так и надо
чтобы именно в case выполнялись команды:

    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(700); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(700);
nikandr77
Offline
Зарегистрирован: 20.01.2020

это довольно большой код ведь
и грузится долго будет ардуинка

b707
Offline
Зарегистрирован: 26.05.2017

nikandr77 пишет:

это довольно большой код ведь
и грузится долго будет ардуинка

судя по вопросу, вы собрались скопировать код для шага миллион раз ? :)

Пойдите почитайте что-нибудь про циклы for. С их помощью код на миллион шагов будет отличаться от кода на один шаг строго на 1 строку.