Возможность запуска двух функций одновременно
Итак, я делаю проект, в котором группа сервоприводов перемещается на 90–120 градусов и постепенно ускоряется, пока не достигнет максимальной скорости и, таким образом, не останется на этой скорости. Это делается путем редактирования задержки в цикле развертки сервопривода. Однако, хотя это и работает, со следующим компонентом это не работает.
Что я хочу сделать дальше, так это RFID-считыватель MFRC522, который всегда сканирует и в любой момент обнаруживает карту и проверяет ее, сервоприводы, на какой бы скорости они сейчас ни находились, начинают замедляться. Проблема в том, что я не могу заставить две функции работать одновременно. ЕСЛИ сервопривод выполняет функцию развертки, она должна завершиться, прежде чем RFID-метка сможет сканировать. Из-за этого все устройство выглядит очень медленным. Есть ли способ заставить RFID-сканер постоянно считывать показания, даже когда работает цикл сервопривода?
Вот код: Обратите внимание, что я разместил распечатки повсюду, чтобы увидеть, как часто сканируется RFID и т. д., пока я тестирую код. По сути, у меня есть две функции: одна называется nocardservo и yescardservo, каждая из которых активируется, есть ли там карта или нет. Любая помощь будет фантастической!!!
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#define RST_PIN 9 //
#define SS_PIN 10 //
MFRC522 mfrc522(SS_PIN, RST_PIN); // Создаем экземпляр MFRC522
Servo myservo;
int pos = 0;
int y = 15;
int z = y;
void setup() {
myservo.attach(6);
myservo.writeMicroseconds(1518);
Serial.begin(9600); // Инициализируем последовательную связь с ПК
while (!Serial); // Ничего не делать, если последовательный порт не открыт (добавлено для Arduino на базе ATMEGA32U4)
SPI.begin(); // Инициализация шины SPI
mfrc522.PCD_Init(); // Инициализируем MFRC522
//ПоказатьПодробностиЧитания(); // Показать подробную информацию о PCD - сведения о устройстве чтения карт MFRC522
//Serial.println(F("Сканировать PICC, чтобы увидеть UID, тип и блоки данных..."));
}
void loop() {
// Ищем новые карты
if ( ! mfrc522.PICC_IsNewCardPresent()) {
nocardservo();
return;
}
delay(20);
Serial.println("carddetected");
// Выбираем одну из карт
if ( ! mfrc522.PICC_ReadCardSerial()) {
}
Serial.println("correctcard");
yescardservo();
delay(20);
return;
}
//***Если карта не обнаружена, эта функция запускается**//
void nocardservo() {
for (pos = 90; pos < 180; pos += 1) // изменяется от 0 градусов до 180 градусов
{ // с шагом в 1 градус
myservo.write(pos); // сообщаем сервоприводу перейти на позицию в переменной 'pos'
delay(15); // ждем 15 мс, пока сервопривод достигнет позиции
}
for (pos = 180; pos >= 90; pos -= 1) // изменяется от 180 градусов до 0 градусов
{
myservo.write(pos); // сообщаем сервоприводу перейти на позицию в переменной 'pos'
delay(15);
}
}
}
//***Если карта обнаружена, эта функция запускается**//
void yescardservo() {
for (pos = 90; pos < 180; pos += 1) // изменяется от 0 градусов до 180 градусов
{ // с шагом в 1 градус
myservo.write(pos); // сообщаем сервоприводу перейти на позицию в переменной 'pos'
delay(50); // ждем 15 мс, пока сервопривод достигнет позиции
}
for (pos = 180; pos >= 90; pos -= 1) // изменяется от 180 градусов до 0 градусов
{
myservo.write(pos); // сообщаем сервоприводу перейти на позицию в переменной 'pos'
delay(50);
}
}
@Omegaforshort, 👍0
Обсуждение2 ответа
Лучший ответ:
То, что вы хотите реализовать, описано в разделе Мигание без задержки. По сути, вместо того, чтобы использовать функцию задержки, чтобы просто ждать, пока истечет ваше время, вы используете переменные для измерения того, сколько времени прошло, и выполняете операцию только тогда, когда она истечет. А пока вы можете проверить другие дела и заняться ими.
Хорошая ссылка. Только комментарий: обратите внимание, что любые копии значения millis() должны храниться в переменной «unsigned long», а использование, например, «long», как в предыдущем сохранении Millis() в примере «Мигание без задержки», приведет к ошибкам в некоторые случаи., @Russell McMahon
Посмотрите мой пример программы ниже.
/*
* Author BALASAIDULU.N
* function -1 : Fading led with pwm pin 9
* fucntion -2 : Blinking LED on pin 13
* connect an LED on pin 9 with a 330 ohms resistor
*/
int leda=9;
int ledd=13;
int i,g,s1,s2;
int switchPin=8;
void setup() {
pinMode(ledd,OUTPUT);
pinMode(switchPin,INPUT);
}
void fading()
{
st:
if(s1==0){
if(s1==1){goto hy;}
analogWrite(leda,i);
delay(30);
i+=5;
if(i>255){s1=1;}
goto st1;
}
hy:
if(i<0){s1=0;goto st;}
i-=5;
analogWrite(leda,i);
delay(30);
st1:
delay(10);
}
void blinking()
{
digitalWrite(ledd,HIGH);
delay(30);
digitalWrite(ledd,LOW);
delay(30);
}
void loop() {
int g;
g=digitalRead(switchPin);
if(g==1) {delay(50);}
if(g==0){
blinking();
fading();}
}
Что не так с использованием goto: https://stackoverflow.com/questions/3517726/what-is-wrong-with-using-goto, @VE7JRO
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
«Секрет» заключается в использовании функции millis(), которая позволяет вам сделать снимок текущего времени и сравнить его с более поздним временем. Вот как JamesG ссылается на «Мигание без задержки» и достигает своего результата. Обратите внимание, что любые копии значения millis() должны храниться в «беззнаковой длинной» переменной и использовать, например, «long», как в предыдущей функции Millis(), сохраняя в пример «Мигание без задержки» в некоторых случаях приведет к ошибкам., @Russell McMahon