Проблема с Arduino Nano Every и радиопередачей с использованием RH_RF69.h

Я оказываю некоторую помощь студентам, работающим на конкурсе Cansat.

Я пытаюсь подключить радиомодуль RFM69 к Arduino Nano Every.

Ничего не работает: компиляция самой простой программы:

#include <RH_RF69.h>

void setup() {}

void loop() {}

дает ответ:

[БлаБлаБла...]
статус выхода 1
Erreur de compilation pour la carte Arduino Nano Every

пока все работает на arduino M0 Feather Express или Arduino Uno.

Есть ли конкретная проблема с Nano Every?

Спасибо вам за вашу помощь.

Жан-Люк Оттингер

, 👍2

Обсуждение

БлаБла была бы здесь важна. и ссылка на библиотеку, потому что теперь не с чем работать, @Juraj

Большое спасибо за ваши ответы, я сократил Блаблабла, потому что он кажется очень длинным для первой точки зрения и представляет проблему библиотеки. Я проверю поддерживаемые платы. Но я думаю, что установка обеих библиотек для M0 feather и nano на один и тот же компилятор приведет к путанице. Все студенты (и я) - законченные новички! Кажется непривычным работать с разными процессорами для первой попытки. Я думаю, что куплю еще один uno. Так будет проще. (Мне это просто нужно для простой части приема). Файлы, которые вы показали, кажутся действительно полезными для проверки совместимости. Еще раз спасибо за y, @JL Ecole Decroly


2 ответа


1

Каждый Nano использует процессор ATmega4809, поэтому он отличается от большинства Arduino. Вполне возможно, что он не поддерживается библиотекой Radiohead.

Ошибка, которую вы сократили до [BlaBlaBla ...], возможно, даст больше информации об этом.

Полный список того, что поддерживается библиотекой Radiohead, находится здесь; вы должны проверить, есть ли там Arduino Nano Every или ATmega4809; в качестве альтернативы, все #defines для поддерживаемых плат находятся в заголовочном файле.

Если окажется, что ваша плата не поддерживается, вы можете спросить авторов библиотеки, не согласятся ли они поддержать ее, или вы можете использовать другую плату (я думаю, она должна работать с Arduino Nano 33 IoT, но, пожалуйста, сначала проверьте).

,

поэтому выберите Каждый и скомпилируйте, если вы знаете, какую библиотеку, @Juraj

@Juraj: У меня здесь нет библиотеки, и я не хочу устанавливать ее здесь. К вашему сведению: это вот что: https://www.airspayce.com/mikem/arduino/RadioHead/index.html . Другая версия здесь: https://github.com/PaulStoffregen/RadioHead, @ocrdu


0

Мне так и не удалось заставить это работать с библиотекой RadioHead, но мне удалось заставить его работать с библиотекой LowPowerLab RFM69. Я здесь не для того, чтобы спорить о том, какой из них лучше, просто указываю, какой из них я должен работать, не изменяя какой-либо код.

Использовалась среда VSCode на M2 Mac с последним подключаемым модулем PlatformIO.

Передатчик MCU = Arduino Nano Every (просто потому, что он у меня был) Радио = Adafruit RFM69HCW (915 МГц) Прорыв

Приемник MCU+Радио = Перо Adafruit RFM69HCW

В библиотеке LowPowerLab было два элемента, которые меня не устраивали. Во-первых, я пытался использовать другой вывод IRQ. Как только я узнал, что значение по умолчанию, определенное в RFM69.h, равно 2, все пошло легко, и я более или менее следовал всем примерам кода, которые не использовали конструкторы arg для радио.

Во-вторых, мне нужно было перезагрузить радио. Я получил это из примера кода adafruit (спасибо).

#define RFM69_RST     4
...
...
...
  pinMode(RFM69_RST, OUTPUT);
  digitalWrite(RFM69_RST, LOW);

  // manual reset
  digitalWrite(RFM69_RST, HIGH);
  delay(10);
  digitalWrite(RFM69_RST, LOW);
  delay(10);

Итак, вот мой рабочий код приемника (с кучей другого мусора)

#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RFM69.h>
#include <SPI.h>

#define SCREEN_WIDTH 128 // Ширина OLED-дисплея в пикселях
#define SCREEN_HEIGHT 32 // Высота OLED-дисплея в пикселях

// Объявление для дисплея SSD1306, подключенного к I2C (контакты SDA, SCL)
// Пины для I2C определяются Wire-библиотекой.
// На Arduino UNO: A4(SDA), A5(SCL)
// На Arduino MEGA 2560: 20(SDA), 21(SCL)
// На Arduino LEONARDO: 2(SDA), 3(SCL), ...
#define OLED_RESET     -1 // Номер вывода сброса (или -1, если общий вывод сброса Arduino)
#define SCREEN_ADDRESS 0x3C ///< См. спецификацию для адреса; 0x3D для 128x64, 0x3C для 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define NETWORKID     0   // Должен быть одинаковым для всех узлов
#define MYNODEID      3   // ID моего узла
#define FREQUENCY     RF69_915MHZ
#define RFM69_RST     4

// SPIClassMegaAVR ccc(12, 13, 11, RFM69_CS, 0);
RFM69 radio;//(RFM69_CS, RFM69_INT, true, &SPI);

void setup() {
  Serial.begin(115200);

  // поместите сюда код установки для однократного запуска:
  // pinMode(LED, OUTPUT);
  // digitalWrite(LED, HIGH);

  pinMode(RFM69_RST, OUTPUT);
  digitalWrite(RFM69_RST, LOW);

  // ручной сброс
  digitalWrite(RFM69_RST, HIGH);
  delay(10);
  digitalWrite(RFM69_RST, LOW);
  delay(10);

  if(!radio.initialize(FREQUENCY, MYNODEID, NETWORKID)) {
    Serial.println(F("radio init failed"));
    for(;;); // Не продолжать, цикл навсегда
  }
  radio.setHighPower(); // Всегда используйте это для RFM69HCW


  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Не продолжать, цикл навсегда
  }
  display.clearDisplay();
  display.display();
  delay(2000); // Пауза на 2 секунды
  

  display.setTextSize(2);      // Обычный масштаб пикселя 1:1
  display.setTextColor(SSD1306_WHITE); // Рисуем белый текст
  display.setCursor(0, 0);     // Начинаем с верхнего левого угла
  display.cp437(true);         // Использовать полный 256-символьный шрифт «Кодовая страница 437»

  display.print(F("Kris"));
  // display.startscrollright(0x00, 0x0F);

  display.display();
  Serial.println("Starting up");
  // радио.spyMode(true);
}

bool displayOnTop = true;
void displayMsg(char* msg) {
  display.clearDisplay();
  if (displayOnTop) 
    display.setCursor(0,0);
  else
    display.setCursor(0, 16);
  displayOnTop = !displayOnTop;
  display.print(msg);
  display.display();
}

void loop() {
  
    if (radio.receiveDone()) // Есть!
  {
    // Распечатываем информацию:

    Serial.print("received from node ");
    Serial.print(radio.SENDERID, DEC);
    Serial.print(", message [");

    // Фактическое сообщение содержится в массиве DATA,
    // и имеет размер DATALEN байт:

    for (byte i = 0; i < radio.DATALEN; i++)
      Serial.print((char)radio.DATA[i]);

    // RSSI — это «индикатор силы принимаемого сигнала»,
    // меньшие числа означают большую мощность.

    Serial.print("], RSSI ");
    Serial.println(radio.RSSI);

    char rssi[12];
    sprintf(rssi, "RSSI: %d\0", radio.RSSI);
    displayMsg(rssi);

    // Отправляем ACK по запросу.
    // (Вам не нужен этот код, если вы не используете ACK.)

    if (radio.ACKRequested())
    {
      radio.sendACK();
      Serial.println("ACK sent");
    }
  }
}

#platformio
[env:nano_every]
platform = atmelmegaavr
board = nano_every
board_build.mcu = atmega4809
framework = arduino
lib_deps = 
    adafruit/Adafruit SSD1306@^2.5.7
    lowpowerlab/RFM69@^1.5.2
monitor_speed = 115200

а вот мой рабочий код передатчика (немного чище)

#include <Arduino.h>
#include <Wire.h>
#include <RFM69.h>
#include <SPI.h>


const int LED = 13;

#define NETWORKID     0   // Должен быть одинаковым для всех узлов
#define MYNODEID      4   // ID моего узла

// частота RFM69, раскомментируйте частоту вашего модуля:

#define FREQUENCY     RF69_915MHZ

#define RFM69_RST     4

RFM69 radio;

void notifyme() {
  Serial.println("I got the call!");
}

void setup() {
radio.setIsrCallback(notifyme);
  Serial.begin(115200);

  // поместите сюда код установки для однократного запуска:
  pinMode(LED, OUTPUT);
  digitalWrite(LED, HIGH);

  pinMode(RFM69_RST, OUTPUT);
  digitalWrite(RFM69_RST, LOW);

  // ручной сброс
  digitalWrite(RFM69_RST, HIGH);
  delay(10);
  digitalWrite(RFM69_RST, LOW);
  delay(10);

  pinMode(RFM69_INT, INPUT);

  if(!radio.initialize(FREQUENCY, MYNODEID, NETWORKID)) {
    Serial.println(F("radio init failed"));
    for(;;); // Не продолжать, цикл навсегда
  }
  radio.setHighPower(); // Всегда используйте это для RFM69HCW

  Serial.println("Starting up");
}


void loop() {
  if (!radio.sendWithRetry(3, "hello", 5, 1)) {
    Serial.println("Failed to send on radio");
    digitalWrite(LED, LOW);
  } else {
    Serial.println("message sent");
    digitalWrite(LED, HIGH);
  }
 
  delay(5000);
}

Имейте в виду, что я копипаст-воин с мышлением осла. Если я думаю, что это можно сделать, то я найду способ, но это не будет означать, что я что-то понимаю в этом. Имея это в виду, рад ответить на любые вопросы. :-)

,