Заикающийся двигатель, использующий радиочастотный модуль
Я пытаюсь управлять шаговым двигателем по беспроводной сети с помощью кнопки. Я использую радиочастотный модуль 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;
}
}
}
}
@Mark Markrowave Charlton, 👍-1
Обсуждение1 ответ
Каков интервал входящих сообщений (1/Частота входящих сообщений)? Всякий раз, когда принимающая сторона получает сообщение "кнопка вниз", она должна активировать двигатель на этот интервал + достаточно долго, чтобы получить или не получить следующее "кнопка вниз". Как только следующая кнопка "вниз" должна была быть получена и пропущена, именно тогда вы должны остановить двигатель.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
как заставить двигатель двигаться плавно, когда я удерживаю кнопку по беспроводной сети, как остановить дрожание, @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