помощь в цикличности в "case"
- Войдите на сайт для отправки комментариев
Пнд, 20/01/2020 - 16:09
Доброго времени форумчане. Помогите пожалуйста. Суть проблемы в следующем:
Есть шаговый двигатель, драйвер 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');
}
}
изложите своими словами, как вы понимаете суть проблемы
При получении команды от малины, ардуино выполняет часть кода:
case 'f': digitalWrite(dirPin,HIGH); digitalWrite(stepPin,HIGH); delayMicroseconds(700); digitalWrite(stepPin,LOW); delayMicroseconds(700);Но это только на один шаг, а мне надо несколько шагов, вот и вся проблема
В конце казе брейк должен быть, если хочешь, чтобы другие казе не выполнялись. Сериал отдаёт чар.
По брейку верно, но Serial.read() таки отдаёт int, который нужно привести к char после проверки на -1.
Спасибо, щас сделаю. Но а по поводу того, чтобы в case выполнялось все в цикле ? Можете подсказать как это сделать ?
ну и в чем проблема? :) Знаете, как выполнить, например, десять шагов? - ну так вставьте код для десяти шагов вместо этого...
Мне нужно примерно 1600 шагов
Дак пусть для начала цыкл в case исполняется мб?
Мне нужно примерно 1600 шагов
да хоть миллион
ну мне так и надо
чтобы именно в case выполнялись команды:
digitalWrite(stepPin,HIGH); delayMicroseconds(700); digitalWrite(stepPin,LOW); delayMicroseconds(700);это довольно большой код ведь
и грузится долго будет ардуинка
это довольно большой код ведь
и грузится долго будет ардуинка
судя по вопросу, вы собрались скопировать код для шага миллион раз ? :)
Пойдите почитайте что-нибудь про циклы for. С их помощью код на миллион шагов будет отличаться от кода на один шаг строго на 1 строку.