Код правильный? 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);
}

Спасибо за ваше время.

, 👍1

Обсуждение

Он ведет себя не так, как вы хотите? Потому что мы этого не знаем. И если он ведет себя не так, как вы хотите, точно опишите, что вы ожидаете и что замечаете., @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


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