Как управлять сервоприводом непрерывного вращения через радиочастотный модуль 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 раза. Кто-нибудь знает, что я делаю неправильно? Цель состоит в том, чтобы заставить сервопривод вращаться только один раз, когда радиочастотный модуль получает правильный сигнал.

, 👍0

Обсуждение

Ощущение, что добавление задержки к процедуре последовательного приема приведет к «лучшему последовательному соединению», почти всегда является плохой идеей и указывает на серьезно нарушенный базовый дизайн. Вы, вероятно, также не хотите вызывать flush() - вам нужен надежный код, управляемый событиями., @Chris Stratton


1 ответ


Лучший ответ:

0

Вы не можете полагаться на то, что конкретная задержка равна одному обороту, особенно если вы используете 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