Официальный сайт компании Arduino по адресу arduino.cc
Радиоуправление машинкой на 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