Радиоуправление машинкой на NRF24L01+ (Arduino Nano)
- Войдите на сайт для отправки комментариев
Вс, 15/12/2019 - 21:06
Всем привет! Обычно на форумах никогда не писал, но обратился из-за отчаяния и поэтому прошу о помощи. Имеется база машинки, но нет управления (совсем). И решил собрать сам на модулях NRF24L01 и на Arduino Nano. Управлять буду двумя джойстиками: одной сервой и одним коллекторным мотором (при помощи драйвера L298N). Я в этом деле новичок и не до конца понимаю почему не работает. Скечти компилируются, заливаются, но модуль не принимает отправленные данные (попросту - не общаются). Вот скетчи:
ТХ: (передатчик)
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(7,8);
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
const int potpin_1 = 5; // вперёд, назад
const int potpin_2 = 4; // право, лево
byte button = 2;
byte transmit_data[3]; // массив, хранящий передаваемые данные
boolean butt_flag = 0;
boolean butt;
boolean led_flag = 0;
unsigned long last_press;
void setup()
{
Serial.begin(9600);
pinMode(button, INPUT_PULLUP);
radio.begin(); //активировать модуль
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток)
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openWritingPipe(address[0]); //мы - труба 0, открываем канал для передачи данных
radio.setChannel(0x71); //выбираем канал (в котором нет шумов!)
radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
//должна быть одинакова на приёмнике и передатчике!
//при самой низкой скорости имеем самую высокую чувствительность и дальность!!
radio.powerUp(); //начать работу
radio.stopListening(); //не слушаем радиоэфир, мы передатчик
}
void loop()
{
butt = !digitalRead(button);
if (butt == 1 && butt_flag == 0 && millis() - last_press > 100) {
butt_flag = 1;
led_flag = !led_flag;
digitalWrite(transmit_data[0], led_flag);
last_press = millis();
}
if (butt == 0 && butt_flag == 1) {
butt_flag = 0;
}
transmit_data[1] = analogRead(potpin_1);
transmit_data[2] = map(analogRead(potpin_2), 0, 1023, 0, 180);
Serial.println(transmit_data[2]);
delay(30);
}
RX: (приемник)
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h>
RF24 radio(7, 8);
byte recieved_data[3]; // массив принятых данных
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
int data;
int fspeed; // forward speed
int bspeed; // backward speed
const int in1 = 3; // управление двигателем 1
const int in2 = 4; // управление двигателем 1
const int ena = 5; // ШИМ для пропорциональной скорости машинки
byte mosfet = 13;
byte servo = 6;
Servo myservo;
void setup()
{
Serial.begin(9600);
pinMode(mosfet, OUTPUT);
pinMode(in1, OUTPUT); // подключаем к L298n
pinMode(in2, OUTPUT); // подключаем к L298n
pinMode(ena, OUTPUT); // подключаем к L298n
myservo.attach(servo);
radio.begin(); //активировать модуль
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток)
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openReadingPipe(1, address[0]); //хотим слушать трубу 0
radio.setChannel(0x71); //выбираем канал (в котором нет шумов!)
radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
//должна быть одинакова на приёмнике и передатчике!
//при самой низкой скорости имеем самую высокую чувствительность и дальность!!
radio.powerUp(); //начать работу
radio.startListening(); //начинаем слушать эфир, мы приёмный модуль
}
void loop() {
byte pipeNo;
while ( radio.available(&pipeNo)) { // слушаем эфир со всех труб
radio.read( &recieved_data, sizeof(recieved_data) ); // читаем входящий сигнал
digitalWrite(mosfet, recieved_data[0]);
if (recieved_data[1] >=1 && recieved_data[1] <=480)
{
data =recieved_data[1];
bspeed = map(data, 480, 1, 0, 255);
backward(bspeed);
}
if (recieved_data[1] >=495 && recieved_data[1] <=1022)
{
data = recieved_data[1];
fspeed = map(data, 495, 1022, 0, 255);
forward(fspeed);
}
if (recieved_data[1] >481 && recieved_data[1] <500)
{
data = recieved_data[1];
stop();
}
myservo.write(recieved_data[2]);
Serial.println(recieved_data[2]);
delay(20);
}
}
void stop()
{
analogWrite(ena, 0);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
}
void forward(int fspeed)
{
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(ena, fspeed);
}
void backward(int bspeed)
{
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(ena, bspeed);
}
Выкиньте джойстики и моторы из кода. Передатчик передает цифру "8", приемник её ловит и печатает. Справитесь?
А зачем две темы? У Вас две машинки?
А зачем две темы? У Вас две машинки?
Та то первая тема неудачная, неправильная.
В каком смысле выкинуть и откуда?
Короче, выяснил проблему... Один из модулей оказался нерабочим (не определяется и не видит каналы вокруг)
А так всё хорошо начиналось...
Все рекомендации применили?
http://arduino.ru/forum/programmirovanie/nrf24l01?page=2#comment-31054