Как управлять сервоприводом непрерывного вращения через радиочастотный модуль HC-12
Я работаю над проектом беспроводного управления сервоприводом непрерывного вращения... что-то вроде беспроводного торгового автомата. Проблема, с которой я сталкиваюсь, заключается в том, чтобы контролировать, сколько оборотов делает сервопривод. Во время тестирования я использовал кнопку, и у меня не было проблем с правильной работой задержки. Теперь, когда он подключен к RF-модулю HC-12, я не могу настроить задержку, чтобы контролировать, сколько оборотов делает сервопривод. Я использую сервопривод FS90R.
#include <SoftwareSerial.h>
#include <Servo.h>
SoftwareSerial mySerial(2, 3); // прием, передача
Servo badservo;
int pos = 92;
unsigned long last = millis();
void setup() {
mySerial.begin(9600);
badservo.attach(9);
badservo.write(pos);
}
void loop() {
if(mySerial.available() > 1){
int input = mySerial.parseInt();//чтение последовательного ввода и преобразование в целое число (от -32 768 до 32 767)
int servpos = badservo.read();
if(millis() - last > 250){
if(servpos == 92 && input == 1234){
badservo.write(0);
delay(470);
//mySerial.println(8894);
}
else{
badservo.write(pos);
//mySerial.println(8894);
}
}
mySerial.flush();//очистить последовательный буфер от нежелательных входных данных
last = millis();
}
delay(20);//небольшая задержка для лучшей последовательной связи
}
Сервопривод, который я использую, имеет позицию остановки 92, что означает, что когда я серво.запись(92); это остановит сервопривод. Кроме того, задержка 470 была протестирована с помощью кнопки и представляла собой один полный оборот.
Теперь, с модулем HC-12, я не могу заставить сервопривод вращаться менее чем в 2,5 раза. Кто-нибудь знает, что я делаю неправильно? Цель состоит в том, чтобы заставить сервопривод вращаться только один раз, когда радиочастотный модуль получает правильный сигнал.
@user1675042, 👍0
Обсуждение1 ответ
Лучший ответ:
Вы не можете полагаться на то, что конкретная задержка равна одному обороту, особенно если вы используете SoftwareSerial. SoftwareSerial ломает многие вещи, и все, что использует прерывания (например, библиотека Servo), ломается из-за него. Это настоящий пожиратель прерываний.
Правильный способ сделать это — использовать поворотный энкодер на сервоприводе, чтобы сообщать о положении (или изменении положения), чтобы вы знали, где находится сервопривод. Это действительно единственный надежный способ заставить сервопривод выполнять точные операции.
Кстати:
mySerial.flush();//очистить последовательный буфер от нежелательных входных данных
абсолютно ничего не делает. Работа flush()
изменилась, когда API Arduino стал единицей. Теперь предполагается дождаться, пока циклический буфер TX и TX FIFO UART не опустеют. Это не имеет ничего общего с очисткой каких-либо входов. Вместо этого вы хотите:
while (mySerial.read() != -1);
Спасибо, что прояснили это! Какую библиотеку вы бы порекомендовали для связи с беспроводным устройством HC-12?, @user1675042
Существует множество альтернатив SoftwareSerial, и большинство из них значительно лучше, но все программные серийные реализации — отстой. Вы действительно хотите использовать аппаратный последовательный порт, но большинство небольших плат Arduino имеют только один UART, который используется интерфейсом USB., @Majenko
Ах. Я должен отметить, что я использую Arduino Pro Mini для этого проекта, так как все должно быть очень компактным. Можете ли вы указать мне какие-либо ресурсы, которые помогут с этим? В тех нескольких поисковых запросах Google, которые я только что сделал, есть много информации., @user1675042
Вместо этого вы можете рассмотреть Teensy-LC; Я считаю, что он имеет несколько аппаратных последовательных портов и довольно мал. Однако он представляет сложность собственного плагина IDE. Должна быть возможность заставить это работать, хотя и неловко, с обычным Arduino и программным серийным номером., @Chris Stratton
- Сервопривод не перестанет вращаться
- В чем разница между вариантами RF (wifi, xbee, NRF24L01)
- Радиочастотное дистанционное управление с использованием VirtualWire на ATtiny85, работающем на частоте 8 МГц на внутреннем генераторе
- Декодирование 2.4G RF пульта дистанционного управления?
- Как остановить вращение сервопривода?
- Питание Arduino Mini Pro с использованием батареи CR2032 в качестве пульта дистанционного управления
- SIM800C, CPIN: НЕ ГОТОВ (КОД ОШИБКИ: +CME ОШИБКА: 10)
- nRF24L01 + потеря пакетов, вызванная считыванием Arduino и связью с датчиками
Ощущение, что добавление задержки к процедуре последовательного приема приведет к «лучшему последовательному соединению», почти всегда является плохой идеей и указывает на серьезно нарушенный базовый дизайн. Вы, вероятно, также не хотите вызывать
flush()
- вам нужен надежный код, управляемый событиями., @Chris Stratton