Радиоуправляемая машинка, которая возвращается в центральное положение, если не нажата левая или правая кнопка
Привет, я сейчас работаю над школьным проектом, моя единственная проблема в том, что я хочу, чтобы моя радиоуправляемая машина возвращалась в среднее направление (которое я установил на 66 в серводвигателе), когда левая или правая кнопка не нажата. Я использовал операторы if, но это не работает. Есть ли какие-либо функции, которые я могу использовать? Вот мой код для передатчика, я использовал библиотеку RC-Switch (https://www.arduinolibraries.info/libraries/rc-switch)
#include <RCSwitch.h>
#include <Servo.h>
const int IN1 = 3;
const int IN2 = 4;
const int trigPin = 5;
const int echoPin = 6;
const int Buzzer = 8;
int distance = 0;
int value = 0;
long duration;
RCSwitch mySwitch = RCSwitch();
Servo myservo;
void setup () {
mySwitch.enableReceive(0);
myservo.attach(7);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(trigPin, OUTPUT); // Устанавливает trigPin как выход
pinMode(echoPin, INPUT); // Устанавливает echoPin как вход
pinMode(Buzzer,OUTPUT);
Serial.begin (9600); // Только отладка
Serial.println ("Receiver Ready");
}
void loop () {
delayMicroseconds(10);
// Очищает тригПин
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Устанавливает trigPin в состояние HIGH на 10 микросекунд
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Считывает echoPin, возвращает время прохождения звуковой волны в микросекундах
duration = pulseIn(echoPin, HIGH);
// Расчет расстояния
distance= duration*0.034/2;
// Выводит расстояние на последовательный монитор
//Serial.print("Расстояние: ");
//Serial.println(distance); //distance — это возвращаемое целое число,
if (mySwitch.available()) {
value = mySwitch.getReceivedValue();
Serial.println (value);
if(value == 1) {
forward ();
Serial.println (" = forward");
}
if(value == 2){
backward ();
Serial.println (" = backward");
}
if(value == 3) {
left ();
Serial.println (" = left");
}
if(value == 4) {
right ();
Serial.println (" = right");
}
Serial.print(" ");
}
mySwitch.resetAvailable();
//myservo.write(45);
}
void forward () {
digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
}
//значение = mySwitch.getReceivedValue();
void backward () {
if ((distance < 50)&& (value == '2'))
{
digitalWrite (IN1, LOW);
digitalWrite (IN2, LOW);
digitalWrite (Buzzer, HIGH);
}
else if ((distance > 50)&& (value == '2'))
{
digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
digitalWrite (Buzzer, LOW);
}
}
// 66 — средний
void right () {
if (value == 4){
myservo.write(110);
} else
myservo.write(66);
}
void left () {
if (value == 3){
myservo.write(50);
}else
myservo.write(66);
}
А вот и код передатчика
// КОД ПЕРЕДАТЧИКА
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
// Назначение кнопок контроллера цифровым контактам
int forward = 11;
int reverse = 10;
int rightTurn = 9;
int leftTurn = 8;
void setup () {
pinMode (forward, INPUT_PULLUP);
pinMode (reverse, INPUT_PULLUP);
pinMode (rightTurn, INPUT_PULLUP);
pinMode (leftTurn, INPUT_PULLUP);
mySwitch.enableTransmit(7);
Serial.begin (9600); // Только отладка
Serial.println ("Transmitting");
}
void loop () {
if (digitalRead(forward) == LOW) {
mySwitch.send(1, 24);
Serial.println ("Forward");
}
if (digitalRead(reverse) == LOW) {
mySwitch.send(2, 24);
Serial.println ("Reverse");
}
if (digitalRead(leftTurn) == LOW) {
mySwitch.send(3, 24);
Serial.println ("Left Turn");
}
if (digitalRead(rightTurn) == LOW) {
mySwitch.send(4, 24);
Serial.println ("Right Turn");
}
}
1 ответ
Лучший ответ:
Вы отправляете значения с вашего передатчика, когда нажимаете кнопку, но не когда отпускаете ее. Самым простым решением было бы отправлять состояние всех кнопок в каждой итерации, если передатчик имеет достаточную емкость. (Я думаю, что он имеет ее только для этих четырех значений)
Добавьте перечисление, чтобы сделать код более читабельным:
enum {
FORWARD_ON = 0,
FORWARD_OFF, // Будет 1.
BACKWARD_ON, // Будет 2 и так далее...
BACKWARD_OFF,
RIGHT_ON,
RIGHT_OFF,
LEFT_ON,
LEFT_OFF
};
Итак, функция отправки будет выглядеть так:
if (digitalRead(forward) == LOW)
mySwitch.send(FORWARD_ON, 24);
else
mySwitch.send(FORWARD_OFF, 24);
// И так для каждой кнопки...
Затем при приеме следует добавить некоторые переменные состояния и сохранить полученные значения:
int steer_right = 0;
int steer_left = 0;
// ...
loop() {
// ...
value = mySwitch.getReceivedValue();
switch (value) {
case RIGHT_ON:
steer_right = 1;
break;
case RIGHT_OFF:
steer_right = 0;
break;
case LEFT_ON:
steer_left = 1;
break;
case LEFT_OFF:
steer_left = 0;
break;
// ... (throttle)
default:
break;
}
// ...
}
Затем вы оцениваете то, что у вас получилось:
if (steer_right && !steer_left)
right();
else if (!steer_right && steer_left)
left();
else
straight();
// ... (газ)
Привет, это снова я, я немного запутался в части switch (значение). Мне следует объявить RIGHT_ON и RIGHT_OFF как переменные или перечислить их?, @Underhanded CODE
и еще, можно ли как-то ускорить скорость отправки?, @Underhanded CODE
Другой вопрос: он продолжает печатать, когда кнопка выключена. Я думаю, что это является причиной медленной отправки и получения данных. Можно ли как-то это предотвратить?, @Underhanded CODE
продолжает печатать что? ..... не печатать, когда кнопка не нажата (используйте оператор if
или оператор case
), @jsotola
- Сервопривод продолжает сбрасывать положение, когда нет разницы в полученном значении?
- Может ли arduino nano управлять двумя цепями
- Невозможно выйти из цикла while
- когда 3 компонента на Arduino nano работают вместе, один из них не работает
- Как заставить сервопривод вращаться на угол больше 180°
- 9 сервоприводов на Arduino Nano?
- Как повернуть серводвигатель на определенный угол?
- 6 + 1 двигательей подключенных к arduino uno?
не используйте такие утверждения, как «но это не работает»… в таких утверждениях нет полезной информации… такие утверждения, как «он продолжает поворачивать налево», на самом деле описывают то, что происходит, @jsotola