Заикающийся двигатель, использующий радиочастотный модуль

Я пытаюсь управлять шаговым двигателем по беспроводной сети с помощью кнопки. Я использую радиочастотный модуль 433 МГц и библиотеку Virtualwire.

код работает, приемник получает сообщения от передатчика, но проблема в том, что сообщения отправляются чрезвычайно медленно, настолько, что индикатор схемы приемника включается и выключается вместо того, чтобы оставаться в положении "включено", когда кнопка передатчика удерживается нажатой. следовательно, шаговый двигатель заикается вместо того, чтобы двигаться плавно.

Я попытался увеличить количество бит в секунду в vw_setup, но это просто заставляет светодиод мигать быстрее и не оставаться в включенном положении. это также заставляет шаговый двигатель вибрировать сильнее.

как сделать так, чтобы шаговый двигатель плавно перемещался по беспроводной сети вч?

код передатчика:

#include <VirtualWire.h>

int currentlocation = 0;
const int stepPin = 3; 
const int dirPin = 4;  
int active = 0;
const int ledPin =  13;      // номер вывода светодиода
String dataout;
char buffer[1];
int idx=0;

class Button {

  public:

    int pin;
    int state;
    int location;
    int Speed;
    int Direction;
    int active;
    int prevstate;

    Button(int pin1, int state1, int location1, int active1, int previousState)
    {
      pin = pin1;
      state = state1;
      location = location1;
      active = active1;
      prevstate = previousState;
    }

    Button(int pin1, int state1, int speed1, int direction1)
    {
      pin = pin1;
      state = state1;
      Speed = speed1;
      Direction = direction1;
    }

    Show(){
      if (digitalRead(pin) == HIGH){
          digitalWrite(ledPin, HIGH);
          } else {
          // turn LED off:
          digitalWrite(ledPin, LOW);
          }
    }
};

Button button(7,0,0,0,0);
Button button2(8,0,30,0,0);
Button Movebutton1(5,0,500,HIGH);
Button Movebutton2(6,0,500,LOW);
Button buttons[2] = {button, button2};
Button Movebuttons[2] = {Movebutton1, Movebutton2};

void setup() {
      vw_setup(2000);
      pinMode(stepPin,OUTPUT); 
      pinMode(dirPin,OUTPUT);
      pinMode(ledPin, OUTPUT);
      Serial.begin(9600);      // open the serial port at 9600 bps:    
}

void loop() {
    for (int i = 0; i<2; i++){
      buttons[i].Show();
      if (digitalRead(buttons[i].pin) == HIGH){  
      sprintf(buffer, "%d", i);
      vw_send((uint8_t *)buffer, strlen(buffer));
      vw_wait_tx();
      }
    }
    for (int i = 0; i<2; i++){
      Movebuttons[i].Show();
      if (digitalRead(Movebuttons[i].pin) == HIGH){
      sprintf(buffer, "%d", i+2);
      vw_send((uint8_t *)buffer, strlen(buffer));
      vw_wait_tx();
      }
    }
}

Код приемника:

#include <VirtualWire.h>

char message[VW_MAX_MESSAGE_LEN]; // a buffer to store the incoming messages
byte messageLength = VW_MAX_MESSAGE_LEN; // the size of the message
int last_idx = 0;

int currentlocation = 0;
const int stepPin = 3; 
const int dirPin = 4;  
int active = 0;
const int ledPin =  13;      // the number of the LED pin
String str_out;

class Button {

  public:

    int pin;
    int state;
    int location;
    int Speed;
    int Direction;
    int active;
    int prevstate;

    Button(int pin1, int state1, int location1, int active1, int previousState)
    {
      pin = pin1;
      state = state1;
      location = location1;
      active = active1;
      prevstate = previousState;
    }

    Button(int pin1, int state1, int speed1, int direction1)
    {
      pin = pin1;
      state = state1;
      Speed = speed1;
      Direction = direction1;
    }

    Relocate(){
      int shift = location - currentlocation;
      if (shift > 0){
        Direction = 0;
      }
      else{
        Direction = 1;
      }
      shift = abs(shift);
      digitalWrite(dirPin,Direction); // Enables the motor to move in a particular direction
      // Makes 200 pulses for making one full cycle rotation
      for(int x = 0; x < shift; x++) {
        digitalWrite(stepPin,HIGH); 
        delayMicroseconds(500); 
        digitalWrite(stepPin,LOW); 
        delayMicroseconds(500); 
      }
      currentlocation = location;
    }

    Move(){
      digitalWrite(dirPin,Direction); // Enables the motor to move in a particular direction
      // Makes 200 pulses for making one full cycle rotation
        digitalWrite(stepPin,HIGH); 
        delayMicroseconds(Speed); 
        digitalWrite(stepPin,LOW); 
        delayMicroseconds(Speed); 
      if (Direction == 1){
      currentlocation -= 1;
      }
      else{
      currentlocation += 1;
      }
    }

    Show(){
      if (vw_get_message(message, &messageLength)){
          digitalWrite(ledPin, HIGH);
          } else {
          // turn LED off:
          digitalWrite(ledPin, LOW);
          }
    }
};

Button button(7,0,0,0,0);
Button button2(8,0,30,0,0);
Button Movebutton1(5,0,500,HIGH);
Button Movebutton2(6,0,500,LOW);
Button buttons[2] = {button, button2};
Button Movebuttons[2] = {Movebutton1, Movebutton2};


void setup() {
        // Initialize the IO and ISR
      vw_setup(2000); // Bits per sec
      vw_rx_start(); // Start the receiver
      Serial.begin(9600);
      pinMode(stepPin,OUTPUT); 
      pinMode(dirPin,OUTPUT);
      pinMode(ledPin, OUTPUT);   
}

void loop() {

      // Set buffer to size of expected message
    if (vw_get_message(message, &messageLength)){
    int idx=atoi(message);
    Serial.print(message);
    for (int i = 0; i<2; i++){
      buttons[i].Show();
      if (idx == i){
      buttons[i].Relocate();
      active = i;    
      //buttons[i].location = currentlocation;
      }
    }
    for (int i = 2; i<4; i++){
      Movebuttons[i-2].Show();
      if (idx == i){
      Movebuttons[i-2].Move();
      buttons[active].location = currentlocation;
      }
    }
    }
}

, 👍-1

Обсуждение

как заставить двигатель двигаться плавно, когда я удерживаю кнопку по беспроводной сети, как остановить дрожание, @Mark Markrowave Charlton

какова связь между кнопкой и двигателем? .... пожалуйста, предоставьте четкое описание ожидаемого поведения устройства, @jsotola

кнопка приведет к тому, что приемник Цифровая запись(шаговая,ВЫСОКАЯ); Задержка в микросекундах(скорость); Цифровая запись(плавная,НИЗКАЯ); Задержка в микросекундах(скорость); другими словами, включите двигатель один раз, @Mark Markrowave Charlton

при удержании в положении вкл он будет продолжать наступать, @Mark Markrowave Charlton

нажмите кнопку, удерживайте в течение 5 секунд, затем отпустите ..... для этого требуется отправить только два сообщения с интервалом в 5 секунд ..... почему двигатель должен заикаться между двумя сообщениями?, @jsotola

нет, я хочу удерживать кнопку и отправить положение вкл, пока я удерживаю ее нажатой, @Mark Markrowave Charlton

двигатель заикается, потому что сообщения заикаются, @Mark Markrowave Charlton

прочитайте мой комментарий еще раз и подумайте об этом, @jsotola

каждый раз, когда функция цикла выполняется, она проверяет, правильно ли включена кнопка? поэтому, если сообщение не приходит вовремя, предполагается, что оно отключено, @Mark Markrowave Charlton

Скорость передачи в битах 2000 является нормальной. Некоторые модули 433 МГц могут работать на частоте 4 кГц, но это должно быть указано, и такие спецификации трудно найти. Есть накладные расходы, я предполагаю, что на одно значение требуется от 20 до 25 импульсов. По закону передатчик может быть занят только на 10%. Это приводит к отправке данных 8 раз в секунду. Всего 8 в секунду, не больше., @Jot


1 ответ


0

Каков интервал входящих сообщений (1/Частота входящих сообщений)? Всякий раз, когда принимающая сторона получает сообщение "кнопка вниз", она должна активировать двигатель на этот интервал + достаточно долго, чтобы получить или не получить следующее "кнопка вниз". Как только следующая кнопка "вниз" должна была быть получена и пропущена, именно тогда вы должны остановить двигатель.

,