Код правильный? Nrf24l01
Я новичок, поэтому извините, что написал это неправильно.
Этот фрагмент кода правильный? Если не где?
Передатчик:
#include <SPI.h>
#include "RF24.h"
int* Msg, mSg, msG;
RF24 radio(9, 10);
const uint8_t pipe = 1;
void setup() {
// put your setup code here, to run once:
radio.begin();
radio.setPALevel(RF24_PA_LOW);
radio.openWritingPipe(pipe);
}
void loop() {
// put your main code here, to run repeatedly:
Msg = analogRead(A1);
radio.write(Msg, sizeof(Msg));
mSg = analogRead(A2);
radio.write(mSg, sizeof(mSg));
msG = analogRead(A3);
radio.write(msG, sizeof(msG));
delay(100);
}
Получатель:
#include <SPI.h>
#include "RF24.h"
#define in1 2
#define in2 3
#define in3 4
#define in4 5
#define in5 A2
#define in6 A3
#define in7 A4
#define in8 A5
const int maxMsgLength = 64;
char Msg[maxMsgLength];
const int maxmSgLength = 64;
char mSg[maxmSgLength];
const int maxmsGLength = 64;
char msG[maxmsGLength];
RF24 radio(9, 10);
const uint8_t pipe = 1;
void setup() {
// поместите сюда код установки для однократного запуска:
Serial.begin(9600);
radio.begin();
radio.setPALevel(RF24_PA_LOW);
radio.openReadingPipe(1, pipe);
radio.startListening();
}
void loop() {
// поместите сюда ваш основной код для многократного запуска:
if (radio.available()) {
radio.read(Msg, maxMsgLength - 1);
radio.read(mSg, maxmSgLength - 1);
radio.read(msG, maxmsGLength - 1);
}
int xAxis = Msg;
int yAxis = mSg;
int YAxis = msG;
if (xAxis < 450) {
// Вперед
digitalWrite(in1, 1);
digitalWrite(in2, 0);
digitalWrite(in3, 1);
digitalWrite(in4, 0);
Serial.println("Forward");
}
else if (xAxis > 550) {
// Назад
digitalWrite(in1, 0);
digitalWrite(in2, 1);
digitalWrite(in3, 0);
digitalWrite(in4, 1);
Serial.println("Backward");
}
else {
// Останавливаться
digitalWrite(in1, 0);
digitalWrite(in2, 0);
digitalWrite(in3, 0);
digitalWrite(in4, 0);
Serial.println("Stop");
}
if (yAxis < 450) {
// Левый
digitalWrite(in5, 1);
digitalWrite(in6, 0);
Serial.println("Left");
}
else if (yAxis > 550) {
// Верно
digitalWrite(in5, 0);
digitalWrite(in6, 1);
Serial.println("Right");
}
else {
// Останавливаться
digitalWrite(in5, 0);
digitalWrite(in6, 0);
Serial.println("Stop");
}
if (yAxis < 450) {
// Флиппер вверх
digitalWrite(in7, 1);
digitalWrite(in8, 0);
Serial.println("Up");
}
else if (yAxis > 550) {
// Флиппер вниз
digitalWrite(in7, 0);
digitalWrite(in8, 1);
Serial.println("Down");
}
else {
// Останавливаться
digitalWrite(in7, 0);
digitalWrite(in8, 0);
Serial.println("Mid");
}
delay(250);
}
Изменить:
Передатчик:
#include <SPI.h>
#include "RF24.h"
int x, y, f;
RF24 radio(9, 10);
const uint8_t pipe = 1;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
radio.begin();
radio.setPALevel(RF24_PA_LOW);
radio.openWritingPipe(pipe);
}
void loop() {
// put your main code here, to run repeatedly:
x = analogRead(A1);
radio.write(x, sizeof(x));
y = analogRead(A2);
radio.write(y, sizeof(y));
f = analogRead(A3);
radio.write(f, sizeof(f));
delay(100);
}
Получатель:
#include <SPI.h>
#include "RF24.h"
#define in1 2
#define in2 3
#define in3 4
#define in4 5
#define in5 A2
#define in6 A3
#define in7 A4
#define in8 A5
int x;
int y;
int f;
RF24 radio(9, 10);
const uint8_t pipe = 1;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
radio.begin();
radio.setPALevel(RF24_PA_LOW);
radio.openReadingPipe(1, pipe);
radio.startListening();
}
void loop() {
// put your main code here, to run repeatedly:
if (radio.available()) {
radio.read(&x, sizeof(x));
radio.read(&y, sizeof(y));
radio.read(&f, sizeof(f));
}
if (x < 450) {
// Forward
digitalWrite(in1, 1);
digitalWrite(in2, 0);
digitalWrite(in3, 1);
digitalWrite(in4, 0);
Serial.println("Forward");
}
else if (x > 550) {
// Backward
digitalWrite(in1, 0);
digitalWrite(in2, 1);
digitalWrite(in3, 0);
digitalWrite(in4, 1);
Serial.println("Backward");
}
else {
// Stop
digitalWrite(in1, 0);
digitalWrite(in2, 0);
digitalWrite(in3, 0);
digitalWrite(in4, 0);
Serial.println("Stop");
}
if(x > 1023)x = 1023;
if(x < 0)x = 0;
if (y < 450) {
// Left
digitalWrite(in5, 1);
digitalWrite(in6, 0);
Serial.println("Left");
}
else if (y > 550) {
// Right
digitalWrite(in5, 0);
digitalWrite(in6, 1);
Serial.println("Right");
}
else {
// Stop
digitalWrite(in5, 0);
digitalWrite(in6, 0);
Serial.println("Stop");
}
if(y > 1023)y = 1023;
if(y < 0)y = 0;
if (f < 450) {
// Flipper Up
digitalWrite(in7, 1);
digitalWrite(in8, 0);
Serial.println("Up");
}
else if (f > 550) {
// Flipper Down
digitalWrite(in7, 0);
digitalWrite(in8, 1);
Serial.println("Down");
}
else {
// Stop
digitalWrite(in7, 0);
digitalWrite(in8, 0);
Serial.println("Mid");
}
if(f > 1023)f = 1023;
if(f < 0)f = 0;
Serial.println(x);
Serial.println(y);
Serial.println(f);
delay(250);
}
Спасибо за ваше время.
@Blaziken, 👍1
Обсуждение1 ответ
Лучший ответ:
Я вижу (как минимум одну) проблему.
Сначала удалите * из:
int* Msg, mSg, msG;
Потому что он должен хранить целые числа (числа), а не указатели на числа.
Кроме того, улучшите переменные. Эти почти идентичные имена сбивают с толку (назовите их x, y или z или другое имя).
То, что вы делаете, отправляете 3 целых числа как целые числа (это означает, что каждое целое число составляет 2 байта), поэтому вы отправляете 6 байтов.
Но в приемнике вы читаете символы, вы должны заменить это на:
- Замена
char
наint
для трех переменных на стороне получателя - Здесь также измените имена
- Удалите константы для длины (64)
Вместо этого читайте код по мере его написания:
целое xAxis; radio.read(&xAxis, sizeof(int));
& означает: адрес, функция чтения сохраняет значение в xAxis (поэтому вам не нужно копировать его впоследствии). Также распечатайте значение после чтения, чтобы вы могли его проверить.
Спасибо, эта программа работает. Но даже если джойстики находятся посередине, значение, отображаемое в последовательном мониторе, равно Forward, Left и Up (первые операторы if в каждом аргументе). потом тоже глючит передача., @Blaziken
Это зависит от полученных вами значений (вы проверяли значения x, y и zAxis?), @Michel Keijzers
Ценности приходят безумно разные, @Blaziken
Когда джойстик вытянут вверх, значения идут как 129, 0, 0, затем 0, 129, 0, а затем 0, 0, 129. Но когда он вытянут назад, значения равны 16382, 0, -13872 и так далее., @Blaziken
Добавляется, если (x/y/f < 0)x/y/f = 0; и если (x/y/f > 1023)x/y/f = 1023;, @Blaziken
Хорошо, также я думаю, что даже тогда радиосвязь в порядке, включая разбор данных в переменные ... Так что остается (если еще не решено) ввод с джойстика., @Michel Keijzers
Я проверил входы джойстика в другой программе только для печати значений джойстиков. Значение джойстика по умолчанию — 500, максимальное — 1023, минимальное — 0., @Blaziken
Значения джойстика в порядке на стороне передатчика. Но я не уверен в приемнике., @Blaziken
Спасибо, Мишель. Теперь код работает нормально, но редко глючит. Я забыл добавить &x, &y и &f в передатчик., @Blaziken
- Проблема с NRF24L01
- Проблемы передачи NRF24L01 между Arduino UNO и Arduino Nano
- Проблемы nRF24l01+. Данные принимаются как 0
- Как подключить NRF24L01 к Wemos D1 R2
- Подключение Saleae Logic 8 к MISO (контакт 12) на Uno 3 с NRF24L01+ останавливает программу
- NRF24L01 PA+LNA с Arduino
- nRF24L01+ Невозможно установить адрес
- nrf24l01+ противоречит самому себе?
Он ведет себя не так, как вы хотите? Потому что мы этого не знаем. И если он ведет себя не так, как вы хотите, точно опишите, что вы ожидаете и что замечаете., @Michel Keijzers
Итак, я хочу, чтобы он брал значения с джойстиков и отправлял их на **сторону получателя**. Там должны быть приняты **значения джойстиков**, и _l298n_ должен вести себя соответственно. Если джойстик потянуть вверх, моторы должны двигаться вперед и наоборот. То же самое с осью X, если джойстик потянуть за левую сторону, двигатель должен вращаться в **левую сторону.**, @Blaziken
Ок... а ваша программа так себя ведет? Если да, то зачем задавать вопрос? Если нет, опишите, что вы видите и чего ожидаете., @Michel Keijzers
Так программа себя так не ведет., @Blaziken
Значения джойстика не передаются и на приемнике значения отображаются как 0., @Blaziken
Вы пробовали пример RF24 по умолчанию?, @Michel Keijzers
Да, пример по умолчанию работает нормально., @Blaziken
Попробуйте удалить указатель (*) в int* Msg, mSg, msG;. В общем, используйте print, чтобы распечатать все переменные, чтобы точно определить проблемы., @Michel Keijzers
Вы имеете в виду * <- этот символ., @Blaziken
Да: удалите это *, @Michel Keijzers
Все еще не работает, @Blaziken
Затем попробуйте распечатать операторы., @Michel Keijzers
Согласно коду, последовательный монитор приемника показывает Stop, Left и Up., @Blaziken
Не могли бы вы объяснить передачу целых чисел с помощью rf24., @Blaziken
Пришла ошибка, что print не является членом библиотеки RF24., @Blaziken
Я создал ответ (это не значит, что все в порядке, но должен дать вам совет и решение), @Michel Keijzers