Прошу помощи в написании прошивки! Проблема такая: есть джойстик (один потенциометр). Нужно управлять мотором через NRF24 одним мотором через драйвер, на основе вот этого моего бреда:
Прошивка передатчика
#include <SPI.h> // библиотека для работы с шиной SPI
#include "nRF24L01.h" // библиотека радиомодуля
#include "RF24.h" // ещё библиотека радиомодуля
RF24 radio(9, 10);
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
byte transmit_data[1];
void setup() {
Serial.begin(9600); //открываем порт для связи с ПК
radio.begin(); //активировать модуль
radio.setAutoAck(0); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 0); //время между попыткой достучаться, число попыток
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openWritingPipe(address[0]); //мы - труба 0, открываем канал для передачи данных
radio.setChannel(0x60); //выбираем канал (в котором нет шумов!)
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() {
transmit_data[0] = map(analogRead(A1), 0, 1023, 0, 255); //считываем и обрезаем показания с джостика
radio.write(&transmit_data, sizeof(transmit_data)); //отправляем получившийся массив
}
Прошивка приёмника
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(8,9); // "создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги
byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"}; //возможные номера труб
byte recieved_data[1];
int fspeed;
int bspeed;
int motor;
const int in1 = 2; // direction pin 1
const int in2 = 4; // direction pin 2
const int ena = 3; // PWM pin to change speed
void setup()
{
Serial.begin(9600); //открываем порт для связи с ПК
pinMode(in1, OUTPUT); // connection to L298n
pinMode(in2, OUTPUT); // connection to L298n
pinMode(ena, OUTPUT);
radio.begin(); //активировать модуль
radio.setAutoAck(0); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0,15); //(время между попыткой достучаться, число попыток)
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openReadingPipe(1,address[0]); //хотим слушать трубу 0
radio.setChannel(0x60); //выбираем канал (в котором нет шумов!)
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) ); //читаем присланный массив
if (radio.available())radio.read(recieved_data, 1);
if (recieved_data[0] >=128 && recieved_data[0] <=189)motor = recieved_data[0], fspeed = map(motor, 255, 201, 0, 255),forward(fspeed);
if (recieved_data[0] >=201 && recieved_data[0] <=255)motor = recieved_data[0], bspeed = map(motor, 189, 128, 0, 255),backward(bspeed);
if (recieved_data[0] >190 && recieved_data[0] <200)motor = recieved_data[0], stop();
}
}
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);
}
void stop()
{
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
analogWrite(ena, 0);
}
Прошивка передатчика
#include <SPI.h> // библиотека для работы с шиной SPI
#include "nRF24L01.h" // библиотека радиомодуля
#include "RF24.h" // ещё библиотека радиомодуля
RF24 radio(9, 10);
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
byte transmit_data[1];
void setup() {
Serial.begin(9600); //открываем порт для связи с ПК
radio.begin(); //активировать модуль
radio.setAutoAck(0); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 0); //время между попыткой достучаться, число попыток
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openWritingPipe(address[0]); //мы - труба 0, открываем канал для передачи данных
radio.setChannel(0x60); //выбираем канал (в котором нет шумов!)
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() {
transmit_data[0] = map(analogRead(A1), 0, 1023, 0, 255); //считываем и обрезаем показания с джостика
radio.write(&transmit_data, sizeof(transmit_data)); //отправляем получившийся массив
}
Прошивка приёмника
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(8,9); // "создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги
byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"}; //возможные номера труб
byte recieved_data[1];
int fspeed;
int bspeed;
int motor;
const int in1 = 2; // direction pin 1
const int in2 = 4; // direction pin 2
const int ena = 3; // PWM pin to change speed
void setup()
{
Serial.begin(9600); //открываем порт для связи с ПК
pinMode(in1, OUTPUT); // connection to L298n
pinMode(in2, OUTPUT); // connection to L298n
pinMode(ena, OUTPUT);
radio.begin(); //активировать модуль
radio.setAutoAck(0); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0,15); //(время между попыткой достучаться, число попыток)
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openReadingPipe(1,address[0]); //хотим слушать трубу 0
radio.setChannel(0x60); //выбираем канал (в котором нет шумов!)
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) ); //читаем присланный массив
if (radio.available())radio.read(recieved_data, 1);
if (recieved_data[0] >=128 && recieved_data[0] <=189)motor = recieved_data[0], fspeed = map(motor, 255, 201, 0, 255),forward(fspeed);
if (recieved_data[0] >=201 && recieved_data[0] <=255)motor = recieved_data[0], bspeed = map(motor, 189, 128, 0, 255),backward(bspeed);
if (recieved_data[0] >190 && recieved_data[0] <200)motor = recieved_data[0], stop();
}
}
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);
}
void stop()
{
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
analogWrite(ena, 0);
}
Изменено: