ОПИСАНИЕ
- Руль, газ и тормоз (задний ход)
- Передача по радио 433 MHz
- FPV камера
ВИДЕО
КОМПОНЕНТЫ
Стараюсь оставлять ссылки только на проверенные крупные магазины, из которых заказываю сам. Также по первые ссылки ведут по возможности на минимальное количество магазинов, чтобы минимально платить за доставку. Если какие-то ссылки не работают, можно поискать аналогичную железку в каталоге Ардуино модулей. Также проект можно попробовать собрать из компонентов моего набора GyverKIT.
- Машинка мини https://ali.ski/BlpO1
- Машинка DICKTATOR https://ali.ski/NrkHtK
Arduino Nano ATMega328: купить в РФ, aliexpress, aliexpress, искать
- Радио 433 МГц https://ali.ski/QP32g
- Макетная плата https://ali.ski/F_Oz_
Сервопривод: aliexpress, aliexpress, искать
- Драйвер слабый https://ali.ski/_dR-t
- Драйвер TA6586 https://ali.ski/05sNE
- Повышайка 5V https://ali.ski/gKUwO
Видео
- FPV приёмник https://ali.ski/qGvDE_
- Камера tx01 https://fas.st/oqHaon
- Камера tx02 https://fas.st/hzxgQQ
- FPV шлем https://ali.ski/Qmwe_
СХЕМЫ
ПРОШИВКА
Максимально подробный гайд по началу работы с платой и загрузке прошивки для проекта находится ЗДЕСЬ. Изучи его внимательно, прежде чем писать на форум или в группу ВК!
#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); */ } } }
Для работы прошивки нужны следующие библиотеки:
ПОДДЕРЖАТЬ
Вы можете поддержать меня за создание доступных проектов с открытым исходным кодом, полный список реквизитов есть вот здесь.