Контроллер радиоуправляемой машины с использованием библиотеки RC-switch

схема

(Новичок в ардуино) Привет, у меня есть проект, который включает в себя создание радиоуправляемой машины, которая использует радиочастотный модуль 433 МГц и Arduino Nano с серводвигателем и ультразвуковым датчиком парковки.

У меня проблемы с кодом как на передатчике, так и на приемнике, Вот код передатчика.

 #include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
// Назначение кнопок контроллера цифровым контактам
 const int forward = 8;
 const int reverse = 9;
 const int rightTurn = 10;
 const int leftTurn = 11;

 int Fwd = 0
 int Bwd = 0
 int Lt  = 0
 int Rt  = 0

void setup () {
  pinMode (forward, INPUT);
  pinMode (reverse, INPUT);
  pinMode (rightTurn, INPUT);
  pinMode (leftTurn, INPUT);
  mySwitch.enableTransmit(7);
  Serial.begin (9600);         // Только отладка
  Serial.println ("Transmitting");
}

void loop () {
  Fwd = digitalRead(forward);
  Bwd = digitalRead(reverse);
  Rt  = digitalRead(rightTurn);
  Lt  = digitalRead(leftTurn);

  if (Fwd == HIGH) {
    mySwitch.send('1');
    Serial.println ("Forward");
    delay(100);
  }

  if (Bwd == HIGH) {
    mySwitch.send('2');
    Serial.println ("Reverse");
    delay(100);
  }

  if (Rt == HIGH) {
    mySwitch.send('3');
    Serial.println ("Left Turn");
    delay(100);
  }

  if (Lt == HIGH) {
    mySwitch.send('4');
    Serial.println ("Right Turn");
    delay(100);
  }
}

А вот и код для приемника

#include <RCSwitch.h>
#include <Servo.h>

const int IN1 = 3;
const int IN2 = 4;
const int trigPin = 5;
const int echoPin = 6;
int distance = 0;

RCSwitch mySwitch = RCSwitch();
Servo myservo;

void setup () {
  mySwitch.enableReceive(2);
  myservo.attach(7);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(trigPin, OUTPUT); // Устанавливает trigPin как выход
  pinMode(echoPin, INPUT); // Устанавливает echoPin как вход
  Serial.begin (9600);    // Только отладка
  Serial.println ("Receiver Ready");
}

void loop () {
 if (mySwitch.available()) {

    int value = mySwitch.getReceivedValue();

      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(" ");
    }

}

void forward () {
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, HIGH);
}
long duration;
int value = mySwitch.getReceivedValue();
void backward () {
  if ((distance > 10)&& (value == '2'))
  {
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, LOW);
  }
  else if ((distance < 10)&& (value == '2'))
  {
  digitalWrite (IN1, HIGH);
  digitalWrite (IN2, LOW);
  }
  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("Distance: ");
  Serial.println(distance); //distance — это возвращаемое целое число,
}

void right () {
  myservo.write(0);
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, HIGH);
}

void left () {
  myservo.write(90);
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, HIGH);
}

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

, 👍1


1 ответ


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

0

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

Подтягивающий или стягивающий резистор определяет конкретное значение для пина, если кнопка не нажата (LOW или HIGH). Значение такого резистора не критично, если только это не слишком большая нагрузка. Выберите какое-нибудь значение в килоомах (например, 10 кОм).

Но для этого вам не нужны внешние резисторы. Atmega328, который является сердцем Arduino Nano, уже имеет встроенные подтягивающие резисторы для каждого цифрового выходного контакта. Вы можете активировать их с помощью

pinMode(pin_number, INPUT_PULLUP);

В этом случае вам придется изменить операторы if, чтобы проверять LOW вместо HIGH и подключить кнопку к земле вместо 5 В, поскольку при использовании подтягивающего резистора в состоянии покоя вывод будет подтянут к 5 В, а затем кнопка сможет подтянуть его к земле.

,