Ключ LoRa Radio не взаимодействует с Adafruit Feather M0 LoRa
Я использую Adafruit Feather M0 с радиоприемником LoRa RFM9x для отправки данных на Ronoth LoStik (модель США), который взаимодействует с программой на настольном компьютере. Feather M0 использует библиотеку RadioHead для RH_RF95
для передачи данных на ключ. Проблема в том, что, хотя мои настройки одинаковы для обоих устройств (режим LoRa, 915 МГц, скорость кодирования 4/5, коэффициент распространения 7, полоса пропускания 500 кГц), я не могу заставить ключ получать какие-либо данные. Я могу заставить оба устройства инициализироваться просто отлично (ключ, который я пробовал использовать в собственном коде с помощью jSerialComm
, а также программа Microchip LoRa development suite), но они вообще не будут разговаривать друг с другом.
Вот мой код настройки для радиоприемника на стороне Feather M0:
RH_RF95 rf95(RFM95_CS, RFM95_INT);
Adafruit_BMP3XX bmp; // аппаратный датчик давления SPI
DFRobot_BMX160 bmx160; // Акселерометр I2C
TinyGPSPlus gps;
int16_t packetnum = 0; // счетчик пакетов, мы увеличиваем на xmission
void setup() {
Serial.begin(GPS_BAUD);
while (!Serial) {
// ждать
}
// Serial.println("тест");
rf_println("Arduino serial connected");
// Настройка PIN-режима радио
pinMode(RFM95_RST, OUTPUT);
digitalWrite(RFM95_RST, HIGH);
delay(100); // Задержка сброса RFM95
// ручной сброс
digitalWrite(RFM95_RST, LOW);
delay(10);
digitalWrite(RFM95_RST, HIGH);
delay(10);
while (!rf95.init()) {
rf_println("LoRa radio init failed");
rf_println("Uncomment '#define SERIAL_DEBUG' in RH_RF95.cpp for detailed debug info");
// в то время как (1);
}
rf_println("LoRa radio init OK!");
if (!rf95.setFrequency(RF95_FREQ)) {
rf_println("setFrequency failed");
// в то время как (1);
}
rf95.setModemConfig(RH_RF95::Bw500Cr45Sf128);
rf95.setTxPower(23, false);
Вы можете заметить, что я использую метод с именем rf_println
, в котором я одновременно отправляю сообщение и печатаю на последовательный вывод, если он включен:
void rf_print(char* message) {
#ifdef SERIAL_DEBUG
Serial.print(message);
#endif
// получить длину сообщения
int n = 0;
for (int i=0; i < 257; i++) { // максимальная длина сообщения = 256 + 1 байт
n++;
if (message[i] == 0) {
break;
}
}
rf95.send((uint8_t*) message, n);
}
void rf_print(double d, int n) {
char buf[255];
dtostrf(d, 3, n, buf);
rf_print(buf);
}
void rf_println(double d, int n) {
char buf[255];
dtostrf(d, 3, n, buf);
strcat(buf, "\n");
rf_print(buf);
}
inline void rf_println(char* message) {
rf_print(message);
rf_print("\n");
}
inline void rf_println() {
rf_print("\n");
}
Радиосообщения вообще не доходят до LoStik, даже в рекомендованном программном обеспечении Microchip. Что-то не так с моим установочным кодом? Есть ли какие-то особенности с устройствами, которые я не учел? Эта проблема действительно поставила меня в тупик, и мне нужно решить ее тем или иным способом, так как это касается проекта, который необходимо выполнить в течение следующих 3 недель, и это лишь одна из его частей.
РЕДАКТИРОВАТЬ: я знаю, что код на самом деле достигает метода rf95.send()
, потому что мне специально пришлось отлаживать эту функцию, чтобы заставить ее работать. У RadioHead, похоже, возникла проблема с методом waitPacketSent()
, который может привести к зависанию программы, если у нее не установлен тайм-аут, поэтому мне пришлось изменить эту строку в функции отправки. Так что по этой причине я не уверен на 100%, что библиотека RadioHead вообще работает должным образом с этим чипом. Версия библиотеки 1.67, на которую была дана ссылка на сайте Adafruit, была полностью заблокирована, она даже не могла вызвать конструктор RH_RF95, не вызывая зависания программы. Руководство выпущено в 2016 году, поэтому я не удивлюсь, если из-за этой проблемы произошли изменения в оборудовании или прошивке, а документы просто не обновлялись.
РЕДАКТИРОВАТЬ 2: я написал отдельный скетч и установил Feather M0 на постоянное recv
в разных частотных диапазонах, и запустил TX-развертку на LoStik в программном обеспечении Microchip, чтобы он охватывал каждую частоту / полосу пропускания. Я вытащил M0 из своего макета, поэтому никакие другие устройства не были подключены. Ничего никогда не проходило. Я действительно застрял здесь.
@Galen Nare, 👍0
1 ответ
Это лучше было бы использовать в качестве комментария, но ...
Просматривая список:
- Что заставляет вас думать, что во всем виноват RFM9X?
- Вы уверены, что у вас есть версия платы Adafruit M0 с частотой 900 МГц?
- Вы пробовали отправлять сообщение с ключа и получать его на стороне Arduino?
- Вы пробовали другой ключ (та же модель, просто другой модуль)? Если у вас более одного ключа, существует документация о том, как отправлять сообщения между ними. Вы пробовали это сделать?
- Не удается успешно реализовать синглтон
- rfm69 на M0 Express ... init() не работает
- C++ против языка Arduino?
- Как использовать SPI на Arduino?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: expected unqualified-id before 'if'
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
Почему понижающий голос? Если это потому, что на вопрос нет прямого ответа, то это только потому, что есть 2 устройства, которые не работают вместе. Код, кажется, в порядке. но ключ исключается как "работающий". Если можно проверить, что хотя бы одно устройство принимает / отправляет правильно, тогда можно погрузиться глубже., @Nick S.
Еще несколько замечаний: вы отправляете сообщения только в функции настройки? Если это так, возможно, стоит попробовать поместить rf95.send() (НЕ rfprint()!) В суперцикл (после всего кода инициализации) и отправить известное сообщение (например, "Привет, мир!") с некоторой задержкой, скажем, на секунду. Удалите весь остальной код (просто создайте новую программу для проверки только функциональности радиомодуля) и отключите все другие периферийные устройства (особенно датчик давления на шине SPI - это может привести к проблемам с RFM95, как указано в библиотеке)., @Nick S.
Не уверен, почему вы были отклонены, но чтобы ответить на ваши вопросы: 1) Я действительно понятия не имею, какое устройство действительно неисправно, я просто пытался выяснить, были ли какие-либо причуды между ними, которые могли вызвать это. У меня есть еще одна (идентичная) плата M0 на пути к проверке этой теории. 2) Да, он имеет ту же маркировку, что и модель 900 МГц, указанная на сайте Adafruit 3) Да, он также не прошел. 4) У меня нет другого ключа, он стоит 60 долларов, так что было бы разумнее купить просто еще один Feather M0 и посмотреть, могут ли чипы разговаривать друг с другом, вместо того, чтобы покупать еще один ключ. Я посмотрю, сработает ли это решение., @Galen Nare
Отредактировано, чтобы ответить на ваш вопрос "rf95.отправить"., @Galen Nare
Кроме того, я пропустил это раньше, но ни одно из других моих устройств на моей плате не использует SPI. Мой BMP3xx работает в режиме I2C, потому что я вообще не смог заставить SPI взаимодействовать (даже программное обеспечение) с BMP. Может ли это означать поджаренную шину SPI на M0? Все остальное, кажется, работает совершенно нормально., @Galen Nare
@GalenNare Хм, да, это странно. Пока вы не получите вторую плату M0 (если бы вы могли заказать партию, это было бы идеально), трудно сказать. Еще несколько мыслей: 1) Пробовали ли вы какие-либо другие датчики SPI-bsa с платой M0? Тот факт, что SPI, аппаратный или программный, не работает с датчиком BM3XX, может быть более показательным для самого датчика. Я предполагаю, что вы скопировали пин инициализации из примера на веб-сайте Adafruit, верно? 2) Есть ли у вас какой-либо логический анализатор, который вы могли бы подключить к этим выводам и наблюдать за сигналами, которые микроконтроллер посылает на радио?, @Nick S.
@GalenNare Я также пытался загрузить программное обеспечение Microchip, просто чтобы посмотреть, что доступно, но по какой-то причине оно не запустилось на моем компьютере. Другая мысль заключается в том, что вы должны убедиться, что отправляете и получаете сообщения в пакетном режиме. LoStick обладает возможностями быть частью сети LoRaWAN, в то время как Adafruit M0 RFM9X, похоже, этого не делает., @Nick S.
Я получил новый модуль Feather M0 LoRa, я не могу получить никаких данных для отправки между ними или с помощью ключа. Я даже использовал пример кода и точную версию библиотеки RadioHead, которую использовал Adafruit, но ни с той, ни с другой стороны ничего не проходит. Я все больше убеждаюсь, что библиотека RadioHead просто не подходит для этого чипа, и я в затруднении, потому что, похоже, никаких альтернатив нет., @Galen Nare
Хм... Действительно странно. Один быстрый вопрос: вы прикрепили антенны к платам M0? Если да, то хорошо, возможно, вам придется взглянуть на техническое описание радиоприемника и копнуть глубже. Если нет - это может быть объяснением. По какой-то причине я предположил, что антенна встроена в микросхему или корпус, но это не так. Я также предполагаю, что вы имеете в виду код, доступный на этой странице для стороны TX / RX, верно? https://learn.adafruit.com/adafruit-feather-m0-radio-with-lora-radio-module/using-the-rfm-9x-radio, @Nick S.
@GalenNare Есть какие-нибудь успехи?, @Nick S.
Я никогда не получал антенны в комплекте ни для одного чипа, но даже в этом случае я тестировал их, когда они находились буквально в нескольких дюймах друг от друга, так что это не должно было иметь значения. Возможно, скоро у меня появится возможность протестировать третий модуль Feather, но я не уверен., @Galen Nare
@GalenNare вы не получите антенны в комплекте - вам придется либо изготовить их самостоятельно, либо приобрести готовую. У Adafruit есть ссылка на это: https://learn.adafruit.com/adafruit-feather-m0-radio-with-lora-radio-module/antenna-options . Я настоятельно призываю вас включить антенны - в * крайне * маловероятном случае, если вам удастся передавать и принимать без антенн, я хотел бы знать, когда это произойдет. Я также хочу отметить, что, хотя я не думаю, что это произойдет для таких маломощных плат, как эти, при попытке передачи без подключенной антенны можно повредить передатчик., @Nick S.