Подключаем RC машинку к Arduino и рулю

ОПИСАНИЕ


  • Руль, газ и тормоз (задний ход)
  • Передача по радио 433 MHz
  • FPV камера

ВИДЕО


КОМПОНЕНТЫ


Стараюсь оставлять ссылки только на проверенные крупные магазины, из которых заказываю сам. Также по первые ссылки ведут по возможности на минимальное количество магазинов, чтобы минимально платить за доставку. Если какие-то ссылки не работают, можно поискать аналогичную железку в каталоге Ардуино модулей. Также проект можно попробовать собрать из компонентов моего набора GyverKIT.

Видео

СХЕМЫ


ПРОШИВКА


#define RADIO_PIN 2     // пин радио
#define THROT_PIN A0    // газ
#define BRAKE_PIN A1    // тормоз
#define STEER_PIN A2    // руль

// пределы сигналов с датчиков
#define STEER_MIN 1023  // руль
#define STEER_MAX 0
#define THROT_MIN 330   // газ
#define THROT_MAX 0
#define BRAKE_MIN 190   // тормоз
#define BRAKE_MAX 1023

// пределы поворота серво
#define SERVO_MIN (90-40)
#define SERVO_MAX (90+40)

// пределы газа и тормоза
#define MOTOR_MAX 250
#define MOTOR_MIN 100

//
#define G433_SPEED 3000
#define G433_FAST
#include <Gyver433.h>
Gyver433_TX<RADIO_PIN> tx;  // указали пин

// формат пакета для отправки
struct Data {
  int16_t speed;  // -255.. 255
  uint8_t steer;  // 0..180
};

void setup() {
  Serial.begin(9600);
}

void loop() {
  // читаем сигналы с управления
  int steer = analogRead(STEER_PIN);
  int throt = analogRead(THROT_PIN);
  int brake = analogRead(BRAKE_PIN);

  // для отладки
  Serial.print(steer);
  Serial.print(',');
  Serial.print(throt);
  Serial.print(',');
  Serial.println(brake);

  // приводим
  steer = map(steer, STEER_MIN, STEER_MAX, SERVO_MIN, SERVO_MAX);
  throt = map(throt, THROT_MIN, THROT_MAX, 0, MOTOR_MAX);
  brake = map(brake, BRAKE_MIN, BRAKE_MAX, 0, MOTOR_MIN);

  // ограничиваем
  steer = constrain(steer, SERVO_MIN, SERVO_MAX);
  throt = constrain(throt, 0, MOTOR_MAX);
  brake = constrain(brake, 0, MOTOR_MIN);

  // готовим к отправке
  Data data;
  data.steer = steer;

  // газ минус тормоз
  // Допускает одновременное нажатие
  data.speed = throt - brake;

  // отправляем
  tx.sendData(data);

  // 100 раз в секунду
  delay(10);
}
#define RADIO_PIN 2   // пин радио
#define SERVO_PIN 5   // пин серво
#define MOTOR_A 3     // пин мотора
#define MOTOR_B 11    // пин мотора

// мин. скорость мотора (0-255)
// для большей резкости управления
#define MIN_DUTY 45

//
#define G433_SPEED 3000
#include <Gyver433.h>
Gyver433_RX<RADIO_PIN, 3> rx; // размер буфера 3 байта

#include <Servo.h>
Servo servo;

// формат пакета для приёма
struct Data {
  int16_t speed;  // -255.. 255
  uint8_t steer;  // 0..180
};

// мини "библиотека" мотора
class Motor {
  public:
    Motor(const uint8_t pinA, const uint8_t pinB, const uint8_t minD = 0) :
      _pinA(pinA), _pinB(pinB), _minD(minD) {
      pinMode(_pinA, OUTPUT);
      pinMode(_pinB, OUTPUT);
    }

    void run(int speed) {
      speed = constrain(speed, -255, 255);
      speed = (long)speed * (255 - _minD) / 255;

      if (speed > 0) {
        digitalWrite(_pinA, 1);
        analogWrite(_pinB, 255 - (speed + _minD));
      } else if (speed < 0) {
        digitalWrite(_pinB, 1);
        analogWrite(_pinA, 255 - (-speed + _minD));
      } else {
        digitalWrite(_pinA, 0);
        digitalWrite(_pinB, 0);
      }
    }

  private:
    const uint8_t _pinA, _pinB, _minD;
};

Motor motor(MOTOR_A, MOTOR_B, MIN_DUTY);

void setup() {
  Serial.begin(9600);

  // подрубаем серво
  servo.attach(SERVO_PIN);
  servo.write(90);

  // разгоняем ШИМ чтобы не гудело
  // Пины D3 и D11 - 8 кГц
  TCCR2B = 0b00000010;  // x8
  TCCR2A = 0b00000011;  // fast pwm
}

void loop() {
  // таймаут приёма данных
  static uint32_t tmr;
  // если сигнала с радио нет 200 мс
  // выключаем мотор
  if (millis() - tmr > 200) {
    motor.run(0);
    tmr = millis();
  }

  // приём по радио
  if (rx.tick()) {
    Data data;

    // если чтение без ошибок
    if (rx.readData(data)) {
      tmr = millis(); // сброс таймаута
      servo.write(data.steer);
      motor.run(data.speed);
      /*
        // для отладки
        Serial.print(data.steer);
        Serial.print(',');
        Serial.println(data.speed);
      */
    }
  }
}

Для работы прошивки нужны следующие библиотеки:

ПОДДЕРЖАТЬ


Вы можете поддержать меня за создание доступных проектов с открытым исходным кодом, полный список реквизитов есть вот здесь.

3.1/5 - (8 голосов)
Подписаться
Уведомить о
guest

32 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии