Радиоуправляемая машинка, которая возвращается в центральное положение, если не нажата левая или правая кнопка

Привет, я сейчас работаю над школьным проектом, моя единственная проблема в том, что я хочу, чтобы моя радиоуправляемая машина возвращалась в среднее направление (которое я установил на 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");
  }
}

, 👍0

Обсуждение

не используйте такие утверждения, как «но это не работает»… в таких утверждениях нет полезной информации… такие утверждения, как «он продолжает поворачивать налево», на самом деле описывают то, что происходит, @jsotola


1 ответ


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

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