#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[4];
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_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
//должна быть одинакова на приёмнике и передатчике!
//при самой низкой скорости имеем самую высокую чувствительность и дальность!
radio.powerUp(); //начать работу
radio.stopListening(); //не слушаем радиоэфир, мы передатчик
}
void loop() {
int x1Val, y1Val, x2Val, y2Val;
x1Val = analogRead(A0);
y1Val = analogRead(A1);
x2Val = analogRead(A2);
y2Val = analogRead(A3);
transmit_data[0] = map(x1Val, 0, 1023, 0, 255); //считываем и обрезаем показания с джостика 1 оси X
//Serial.print(" | ");
//Serial.print(x1Val, DEC);
transmit_data[1] = map(y1Val, 0, 1023, 0, 255); //считываем и обрезаем показания с джостика 1 оси Y
//Serial.print(" | ");
//Serial.print(y1Val, DEC);
transmit_data[2] = map(x2Val, 0, 1023, 0, 255); //считываем и обрезаем показания с джостика 2 оси X
//Serial.print(" | ");
//Serial.print(x2Val, DEC);
transmit_data[3] = map(y2Val, 0, 1023, 0, 255); //считываем и обрезаем показания с джостика 2 оси Y
//Serial.print(" | ");
//Serial.println(y2Val, DEC);
Serial.print(transmit_data[0]); Serial.print(" | "); Serial.print(transmit_data[1]); Serial.print(" | "); Serial.print(transmit_data[2]); Serial.print(" | "); Serial.print(transmit_data[3]); Serial.println(" | ");
radio.write(&transmit_data, sizeof(transmit_data)); //отправляем получившийся массив
}
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9,10); // "создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги
byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"}; //возможные номера труб
byte recieved_data[4];
void setup(){
Serial.begin(9600); //открываем порт для связи с ПК
pinMode(4, OUTPUT);
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(5, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(6, 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_1MBPS); //скорость обмена. На выбор 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(4, HIGH);//STBY
//Serial.print(recieved_data[0]); Serial.print(" | "); Serial.print(recieved_data[1]); Serial.print(" | "); Serial.print(recieved_data[2]); Serial.print(" | "); Serial.println(recieved_data[3]);
// int x1p = constrain(map(recieved_data[1], 128, 255, 0, 255), 0, 255); //обрезаем и переворачиваем значения
// int x1b = constrain(map(recieved_data[1], 128, 0, 0, 255), 0, 255); //обрезаем и переворачиваем значения
// int y2r = constrain(map(recieved_data[2], 122, 255, 100, 1), 0, 100); //обрезаем и переворачиваем значения
// int y2l = constrain(map(recieved_data[2], 122, 0, 100, 1), 0, 100); //обрезаем и переворачиваем значения
//
// int stl = constrain(map(recieved_data[2], 123, 255, 0, 255), 0, 255); //обрезаем и переворачиваем значения
// int str = constrain(map(recieved_data[2], 122, 0, 0, 255), 0, 255); //обрезаем и переворачиваем значения
//
//Serial.print(x1p); Serial.print(" | "); Serial.print(x1b); Serial.print(" | "); Serial.print(y2r); Serial.print(" | "); Serial.print(y2l); Serial.println();
// int spr = constrain(x1p * y2r / 100, 0, 255); //скорость правого колеса
// int spl = constrain(x1p * y2l / 100, 0, 255); //скорость левого колеса
// int bspr = constrain(x1b * y2r / 100, 0, 255); //скорость правого колеса назад
// int bspl = constrain(x1b * y2l / 100, 0, 255); //скорость левого колеса назад
//Serial.print(stl); Serial.print(" | "); Serial.print(str); Serial.println();
//Serial.print(recieved_data[2]); Serial.println();
int FB=recieved_data[0];
int LR=recieved_data[2];
Serial.println(LR);
if ((FB>=0) && (FB<=150))//движение НАЗАД
{ if ((LR>=180) && (LR<=255)){ // и поворот направо
digitalWrite(A1, LOW);
digitalWrite(A0, LOW);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
analogWrite(6, 1023); }
else if ((LR>=0) && (LR<=150)){ //и поворот налево
digitalWrite(A1, LOW);
digitalWrite(A0, HIGH);
analogWrite(5, 1023);
digitalWrite(7, LOW);
digitalWrite(8, LOW); }
else{ // и просто НАЗАД
digitalWrite(A1, LOW);
digitalWrite(A0, HIGH);
analogWrite(5, 1023);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
analogWrite(6, 1023);
}
}
else if ((FB>=190) && (FB<=255)) //движение ВПЕРЕД
{ if ((LR>=180) && (LR<=255)){ // и поворот направо
digitalWrite(A1, LOW);
digitalWrite(A0, LOW);
digitalWrite(7, !LOW);
digitalWrite(8, !HIGH);
analogWrite(6, 1023); }
else if ((LR>=0) && (LR<=150)){ //и поворот налево
digitalWrite(A1, !LOW);
digitalWrite(A0, !HIGH);
analogWrite(5, 1023);
digitalWrite(7, LOW);
digitalWrite(8, LOW); }
else{ // и просто Вперед
digitalWrite(A1, !LOW);
digitalWrite(A0, !HIGH);
analogWrite(5, 1023);
digitalWrite(7, !LOW);
digitalWrite(8, !HIGH);
analogWrite(6, 1023);
}
}else
{ if ((LR>=180) && (LR<=255)){ // Разворот налево
digitalWrite(A1, HIGH);
digitalWrite(A0, LOW);
analogWrite(5, 1023);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
analogWrite(6, 1023);
}
else if ((LR>=0) && (LR<=150)){ //Разворот направо
digitalWrite(A1, LOW);
digitalWrite(A0, HIGH);
analogWrite(5, 1023);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
analogWrite(6, 1023);
}
else{ // стоп
digitalWrite(A1, LOW);
digitalWrite(A0, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
}
}
}
да, выдает как надо значения по каждой оси каждого джостикавот эта строка в передатчике
Не вижу в приёмнике чтение элементов 1 и 3 принятого массива данных.да, выдает как надо значения по каждой оси каждого джостика
да, я забыл указать, что выводил значения принятых элементов 1 и 3 приемником в монитор порта, они при отклонении джостиков по соответствующим осям не меняются, в отличие от 0 и 2Не вижу в приёмнике чтение элементов 1 и 3 принятого массива данных.
Именно так, вне зависимости от того, используются ли данные, приходят изменяемые значения только X (или 0 и 2 элементы массива), Y приходят как константы вне зависимости от положения джойстика.Да, данные recieved_data[1] и recieved_data[3] никак не используются.
Сразу после приема данные закомментирована такая строка
//Serial.print(recieved_data[0]); Serial.print(" | "); Serial.print(recieved_data[1]); Serial.print(" | "); Serial.print(recieved_data[2]); Serial.print(" | "); Serial.println(recieved_data[3]);
Я так понимаю машинку к компу подключали и смотрели что приходит ? получается теряется где то в воздухе ? (несмотря на то, что часть данных не используется далее)
Здесь ничего не скажу, я с радиоуправлением впервые сталкиваюсь и немного нуб в этом... просто скопировал часть кода про радиоуправление у автора, уже писал об этомЕще один вопрос. как выбирали канал передачи ?
uint8_t RF24::read_payload(void* buf, uint8_t len)
{
uint8_t status;
uint8_t* current = reinterpret_cast<uint8_t*>(buf);
uint8_t data_len = min(len,payload_size);
uint8_t blank_len = dynamic_payloads_enabled ? 0 : payload_size - data_len;
//printf("[Reading %u bytes %u blanks]",data_len,blank_len);
csn(LOW);
status = SPI.transfer( R_RX_PAYLOAD );
while ( data_len-- )
*current++ = SPI.transfer(0xff);
while ( blank_len-- )
SPI.transfer(0xff);
csn(HIGH);
return status;
}
transmit_data[0] = map(analogRead(A0), 0, 1023, 0, 255); //считываем и обрезаем показания с джостика 1 оси X
//Serial.print(" | ");
//Serial.print(x1Val, DEC);
transmit_data[1] = map(analogRead(A0), 0, 1023, 0, 255); //считываем и обрезаем показания с джостика 1 оси X
//Serial.print(" | ");
//Serial.print(y1Val, DEC);
transmit_data[2] = map(analogRead(A1), 0, 1023, 0, 255); //считываем и обрезаем показания с джостика 1 оси Y
//Serial.print(" | ");
//Serial.print(x2Val, DEC);
transmit_data[3] = map(analogRead(A1), 0, 1023, 0, 255); //считываем и обрезаем показания с джостика 1 оси Y
//Serial.print(" | ");
//Serial.println(y2Val, DEC);
transmit_data[4] = map(analogRead(A2), 0, 1023, 0, 255); //считываем и обрезаем показания с джостика 2 оси X
//Serial.print(" | ");
//Serial.print(x1Val, DEC);
transmit_data[5] = map(analogRead(A2), 0, 1023, 0, 255); //считываем и обрезаем показания с джостика 2 оси X
//Serial.print(" | ");
//Serial.print(y1Val, DEC);
transmit_data[6] = map(analogRead(A3), 0, 1023, 0, 255); //считываем и обрезаем показания с джостика 2 оси Y
//Serial.print(" | ");
//Serial.print(x2Val, DEC);
transmit_data[7] = map(analogRead(A3), 0, 1023, 0, 255); //считываем и обрезаем показания с джостика 2 оси Y
//Serial.print(" | ");
//Serial.println(y2Val, DEC);