Lora модули e32-868t20d, E32-433T20DC и иже с ними..
- Войдите на сайт для отправки комментариев
Вс, 25/10/2020 - 23:12
Lora модули e32-868t20d краткое описание и работа с ними
Lora модули e32-868t20d краткое описание и работа с ними
Опс, первый пост получился коротким и без возможности редактирования :( Как бы его удалить?
Посвящу некоторую толику своего времени описанию моего знакомства с Lora модулем E32-868T20D на чипе SX1276. Необходимость приобретения и освоения данного модуля было вызвано желанием создать условно бесплатное по связи устройство, обеспечивающее сигнализацию и охрану на личном хозяйственном обЪекте типа "сарай кирпичный" неподалеку от места проживания ~ 600м, в условиях городской застройки средней плотности. Пока там стоит GSM сигналка реализованная на основе Ардуино и SIM800C. Но за услуги мобильного оператора как известно надо регулярно отстегивать кровно заработанные..
// демонстрация работы с Lora модулем e32-868t20d // запись и чтение параметров модуля, передача в эфир тестовой строки // FreeGnuPnu Licensing from Domosed version 0.0.0.1 #include <SoftwareSerial.h> #define pinM0 10 // на пин M0 #define pinM1 11 // на пин M1 #define pinAUX 12 // на пин AUX SoftwareSerial LoraUART(8, 9); // RX, TX UART к Lora E32 void setup() { pinMode( pinM0, OUTPUT); // пин управления режимом работы модуля pinMode( pinM1, OUTPUT); // пин управления режимом работы модуля pinMode( pinAUX, INPUT); // контрольный пин AUX c Lora Serial.begin( 9600); // порт отладки LoraUART.begin( 9600); // порт Lora digitalWrite( pinM0, HIGH); // перевод в режим sleep для настройки digitalWrite( pinM1, HIGH); // .. while ( !digitalRead( pinAUX)); // ожидание готовности Lora Serial.println( "Lora ready -> settings"); // настройка E32 LoraUART.write(byte (0xC0)); // HEAD сохранить настройки при выключении ( 0xC0) LoraUART.write(byte (0x0)); // ADDH верхний байт адреса модуля LoraUART.write(byte (0x0)); // ADDL нижний байт адреса модуля LoraUART.write(byte (0x1A)); // SPEED параметры и скорость UART и AIR LoraUART.write(byte (0x07)); // CHAN рабочий канал ( частота = 862 + 0x07 = 869 МГц) // 10 mW, FEC on, Fixed mode on, 250ms wake up, push-pull IO LoraUART.write(byte (0b1000111)); // OPTION режим передачи, мощность while ( !digitalRead( pinAUX)); // ожидание готовности Lora Serial.println( "Settings Ok"); } void loop() { while ( !digitalRead( pinAUX)); // ожидание готовности Lora LoraUART.write(byte (0xC1)); // запрос параметров 3 раза 0xC1 LoraUART.write(byte (0xC1)); LoraUART.write(byte (0xC1)); while ( !digitalRead( pinAUX)); // ожидание готовности Lora Serial.print( "Read settings -> "); while ( LoraUART.available()){ char inByte = char (LoraUART.read()); Serial.print ( inByte, HEX); // вывод в терминал конфигурации модуля } Serial.println(" ok"); delay( 2000); digitalWrite( pinM0, LOW); // перевод в режим normal digitalWrite( pinM1, LOW); // .. tr1: // передача данных while ( !digitalRead( pinAUX)); // ожидание готовности Lora Serial.println("Lora ready Ok"); Serial.println("Lora send testing string"); LoraUART.print("Test Ok :)"); // отправка тестовой строки delay(5000); goto tr1; }// тестирование приемника с Lora модулем e32-868t20d на дальность // запись и чтение параметров модуля, прием с эфира тестовой строки // подсчет принятых пакетов и ошибочных // FreeGnuPnu Licensing from Domosed version 0.0.0.1 #include <SoftwareSerial.h> #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED ширина #define SCREEN_HEIGHT 32 // OLED высота #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); #define pinM0 10 // на пин M0 Lora #define pinM1 11 // на пин M1 Lora #define pinAUX 12 // на пин AUX Lora #define pinLed 13 // светодиод #define pinBuzz 7 // пищалка SoftwareSerial LoraUART(8, 9); // RX, TX UART к Lora E32 char testStr[] = "Test Ok :)"; void setup() { // настройка модуля Serial.begin( 9600); if(!display.begin( SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32 Serial.println( F("SSD1306 init failed")); for(;;); // Don't proceed, loop forever } display.setTextSize(2); display.setTextColor(WHITE); pinMode( pinM0, OUTPUT); // пин управления режимом работы модуля pinMode( pinM1, OUTPUT); // пин управления режимом работы модуля pinMode( pinAUX, INPUT); // контрольный пин AUX c Lora LoraUART.begin( 9600); // UART Lora 9600 bps digitalWrite( pinM0, HIGH); // перевод в режим sleep для настройки digitalWrite( pinM1, HIGH); // .. while ( !digitalRead( pinAUX)); // ожидание готовности Lora Serial.println( "Lora ready -> settings"); // настройка E32 LoraUART.write(byte (0xC0)); // HEAD сохранить настройки при выключении ( 0xC0) LoraUART.write(byte (0x0)); // ADDH верхний байт адреса модуля LoraUART.write(byte (0x0)); // ADDL нижний байт адреса модуля LoraUART.write(byte (0x1A)); // SPEED параметры и скорость UART и AIR LoraUART.write(byte (0x07)); // CHAN рабочий канал ( частота = 862 + 0x07 = 869 МГц) // 10 mW, FEC on, Fixed mode on, 250ms wake up, push-pull IO LoraUART.write(byte (0b1000111)); // OPTION while ( !digitalRead( pinAUX)); // ожидание готовности Lora display.clearDisplay(); display.setCursor(0,0); display.println( "SetOk"); display.display(); delay( 2000); } void loop() { uint16_t nPacket = 0, // принято пакетов nBroken = 0; // битых пакетов byte i; bool fComplete; // пакет без ошибок while ( !digitalRead( pinAUX)); // ожидание готовности Lora LoraUART.write(byte (0xC1)); // запрос параметров LoraUART.write(byte (0xC1)); LoraUART.write(byte (0xC1)); display.clearDisplay(); display.setCursor(0,0); display.println( "Config"); while ( !digitalRead( pinAUX)); // ожидание готовности Lora while ( LoraUART.available()){ byte inByte = byte (LoraUART.read()); display.print( inByte, HEX); // вывод на экран конфигурации модуля } display.display(); delay( 2000); display.clearDisplay(); display.setCursor(0,0); display.println( "Receiving"); display.display(); delay( 2000); digitalWrite( pinM0, LOW); // перевод Lora в режим normal digitalWrite( pinM1, LOW); display.clearDisplay(); rec1: // loop приёма fComplete = true; display.setCursor(0,0); while ( !digitalRead( pinAUX)); // ожидание готовности Lora if ( LoraUART.available()) { nPacket++; i = 0; display.clearDisplay(); tone( pinBuzz, 500, 300); // пищалка } while ( LoraUART.available()){ char inByte = char (LoraUART.read()); display.print( inByte); // вывод на экран принятого if ( testStr[i++] != inByte) // проверка целостности пакета fComplete= false; digitalWrite( pinLed, HIGH); // светодиод } if ( !fComplete) { // битый пакет nBroken++; tone( pinBuzz, 200, 300); } display.setCursor(0,16); display.print( nPacket); display.setCursor(64,16); display.print( nBroken); display.display(); digitalWrite( pinLed, LOW); goto rec1; //display.invertDisplay( false); }Второй передатчик-приемник, повторитель..
// Ведущий приемопередатчик с Lora модулем e32-868t20d // циклически посылает тестовую строку, ждет ответа // подсчитывает принятые пакеты // FreeGnuPnu Licensing from Domosed version 0.0.0.1 #include <SoftwareSerial.h> #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED ширина #define SCREEN_HEIGHT 32 // OLED высота #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); #define pinM0 10 // на пин M0 Lora #define pinM1 11 // на пин M1 Lora #define pinAUX 12 // на пин AUX Lora #define pinLed 13 // светодиод #define pinBuzz 7 // пищалка SoftwareSerial LoraUART(8, 9); // RX, TX UART к Lora E32 char testStr[] = "Test Ok :)"; void setup() { // настройка модуля Serial.begin( 9600); if(!display.begin( SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32 Serial.println( F("SSD1306 init failed")); for(;;); // Don't proceed, loop forever } display.setTextSize(2); display.setTextColor(WHITE); pinMode( pinM0, OUTPUT); // пин управления режимом работы модуля pinMode( pinM1, OUTPUT); // пин управления режимом работы модуля pinMode( pinAUX, INPUT); // контрольный пин AUX c Lora LoraUART.begin( 9600); // UART Lora 9600 bps digitalWrite( pinM0, HIGH); // перевод в режим sleep для настройки digitalWrite( pinM1, HIGH); // .. while ( !digitalRead( pinAUX)); // ожидание готовности Lora Serial.println( "Lora ready -> settings"); // настройка E32 LoraUART.write(byte (0xC0)); // HEAD сохранить настройки при выключении ( 0xC0) LoraUART.write(byte (0x0)); // ADDH верхний байт адреса модуля LoraUART.write(byte (0x0)); // ADDL нижний байт адреса модуля LoraUART.write(byte (0x1A)); // SPEED параметры и скорость UART и AIR LoraUART.write(byte (0x07)); // CHAN рабочий канал ( частота = 862 + 0x07 = 869 МГц) // 10 mW, FEC on, Fixed mode on, 250ms wake up, push-pull IO LoraUART.write(byte (0b1000111)); // OPTION while ( !digitalRead( pinAUX)); // ожидание готовности Lora display.clearDisplay(); display.setCursor(0,0); display.println( "SetOk"); display.display(); delay( 2000); } void loop() { uint16_t nPacket = 0, // принято пакетов nLost = 0; // битых пакетов uint32_t curTime; byte i; bool fComplete; // пакет без ошибок while ( !digitalRead( pinAUX)); // ожидание готовности Lora LoraUART.write(byte (0xC1)); // запрос параметров LoraUART.write(byte (0xC1)); LoraUART.write(byte (0xC1)); display.clearDisplay(); display.setCursor(0,0); display.println( "Config"); while ( !digitalRead( pinAUX)); // ожидание готовности Lora while ( LoraUART.available()){ byte inByte = byte (LoraUART.read()); display.print( inByte, HEX); // вывод на экран конфигурации модуля } display.display(); delay( 2000); display.clearDisplay(); display.setCursor(0,0); display.println( "Run Leader"); display.display(); delay( 2000); digitalWrite( pinM0, LOW); // перевод Lora в режим normal digitalWrite( pinM1, LOW); display.clearDisplay(); fComplete = true; label1: // loop приёма передачи display.clearDisplay(); display.setCursor(0,0); if ( fComplete) display.print( "Send Data"); else { display.print( "Lost"); display.setCursor(80,0); display.print( nLost); display.setCursor(0,16); display.print( "Replay"); } display.display(); while ( !digitalRead( pinAUX)); // ожидание готовности Lora LoraUART.print("Test Ok :)"); // отправка тестовой строки delay( 500); nPacket++; while ( !digitalRead( pinAUX)); // ожидание готовности Lora curTime = millis(); while ( !LoraUART.available()) { // нет данных приема if ( (millis() - curTime) > 5000) { // нет ответа 3 сек tone( pinBuzz, 100, 500); // пищалка - потеря fComplete = false; nLost++; goto label1; } } digitalWrite( pinLed, HIGH); // светодиод display.clearDisplay(); display.setCursor(0,0); fComplete = true; tone( pinBuzz, 500, 300); // пищалка - ок while ( LoraUART.available()){ char inByte = char (LoraUART.read()); // чтение данных c Lora display.print( inByte); // вывод на экран принятого } display.setCursor(0,16); // вывод числа пакетов и потерянных пакетов display.print( nPacket); display.setCursor(64,16); display.print( nLost); display.display(); digitalWrite( pinLed, LOW); delay( 4500); goto label1; }// Ведомый приемопередатчик с Lora модулем e32-868t20d // принимает пакет и отправляет обратно // FreeGnuPnu Licensing from Domosed version 0.0.0.1 #include <SoftwareSerial.h> #define pinM0 10 // на пин M0 Lora #define pinM1 11 // на пин M1 Lora #define pinAUX 12 // на пин AUX Lora #define pinLed 13 // светодиод SoftwareSerial LoraUART(8, 9); // RX, TX UART к Lora E32 char testStr[] = "Test Ok :)"; void setup() { // настройка модуля Serial.begin( 9600); pinMode( pinM0, OUTPUT); // пин управления режимом работы модуля pinMode( pinM1, OUTPUT); // пин управления режимом работы модуля pinMode( pinAUX, INPUT); // контрольный пин AUX c Lora LoraUART.begin( 9600); // UART Lora 9600 bps digitalWrite( pinM0, HIGH); // перевод в режим sleep для настройки digitalWrite( pinM1, HIGH); // .. while ( !digitalRead( pinAUX)); // ожидание готовности Lora Serial.println( "Lora ready -> settings"); // настройка E32 LoraUART.write(byte (0xC0)); // HEAD сохранить настройки при выключении ( 0xC0) LoraUART.write(byte (0x0)); // ADDH верхний байт адреса модуля LoraUART.write(byte (0x0)); // ADDL нижний байт адреса модуля LoraUART.write(byte (0x1A)); // SPEED параметры и скорость UART и AIR LoraUART.write(byte (0x07)); // CHAN рабочий канал ( частота = 862 + 0x07 = 869 МГц) // 100 mW, FEC on, Fixed mode on, 250ms wake up, push-pull IO LoraUART.write(byte (0b1000100)); // OPTION while ( !digitalRead( pinAUX)); // ожидание готовности Lora Serial.println( "SetOk"); delay( 300); } void loop() { bool fRec=false; // пришел пакет uint16_t nPacket = 0; // принято пакетов byte i=0; // счетчик принятых байт while ( !digitalRead( pinAUX)); // ожидание готовности Lora LoraUART.write(byte (0xC1)); // запрос параметров LoraUART.write(byte (0xC1)); LoraUART.write(byte (0xC1)); Serial.print( "Config "); while ( !digitalRead( pinAUX)); // ожидание готовности Lora while ( LoraUART.available()){ int inByte = int (LoraUART.read()); Serial.print( inByte, HEX); // вывод конфигурации модуля } delay(300); Serial.println( " "); Serial.println( "Run Slave"); digitalWrite( pinM0, LOW); // перевод Lora в режим normal digitalWrite( pinM1, LOW); delay(300); label1: // loop приёма передачи fRec = false; i = 0; // сброс счетчика байт приема while ( !digitalRead( pinAUX)); // ожидание готовности Lora while ( LoraUART.available()){ char inByte = char (LoraUART.read()); // чтение данных c Lora Serial.print( inByte); // вывод принятого testStr[i] = inByte; // заполнение буфера приема i++; fRec=true; digitalWrite( pinLed, HIGH); // светодиод } while ( !digitalRead( pinAUX)); // ожидание готовности Lora if ( fRec) { // если принято, отправка обратно Serial.println( " -> send"); for ( byte k=0; k<i; k++) { LoraUART.write( testStr[k]); } } digitalWrite( pinLed, LOW); goto label1; }При включенном FEC ,принятые битые пакеты данных отбрасываются. Всё тривиально, но авось кому пригодиться :)
иногда лучше жувать, чем выкладывать такой код...
Апологетам программистской изящности Не заткнуть Истинный источник кондового, можно сказать, народно-рабочекрестьянского кода. Хе-хе..
Самое главное - это решение ГКРЧ! Зачёт!
Код, стыдливо припрятал в спойлеры, пардон с первого раза не получилось :-}
Самое главное - это решение ГКРЧ! Зачёт!
это что?
Самое главное - это решение ГКРЧ! Зачёт!
это что?
а это разрешение на использование оного девайса
а это разрешение на использование оного девайса
это что, заслуга нашего ТС?
Если чо - я поставил плюсик Деду за его оценку кода... имел удовольствие насладится еще до того, пока ТС его не убрал.
а это разрешение на использование оного девайса
это что, заслуга нашего ТС?
Если чо - я поставил плюсик Деду за его оценку кода... имел удовольствие насладится еще до того, пока ТС его не убрал.
код в стиле аля ардуино, это жеж не музыка, тут вникать долго надо, чтобы понять, что что-то не так, это там сразу слышно как ноты и длительности слажал )))
Кстати, вчера один мальчик 17 лет на ТВ показал возможности радиолюбительского уха, выделение разговора одного из 20-ти одновременно говорящих (работа в пайлапах она такая, да еще когда английский не твой родной) )))
Фото картонной коробки тоже убрать? C=:-)
Фото картонной коробки тоже убрать? C=:-)
намедни солнце вошло в зодиакальный знак Скорпиона, со всеми вытекающими )))
Перед сборкой готового устройства замерил токи потребления модуля E32-868T20D в разных режимах. Измерял падение напряжения на сопротивлении 1Ом, включенном в разрыв положительного провода цепи питания модуля. Приятного просмотра.. Есть неувязка с даташитом..
Хотя возможен температурный дрейф нуля осциллографа.
так это же классика:
И теперь ближайшие 30 дней все жители Вселенной будут брать с них пример!
Владеть, так всем миром!
Воевать, так до полной победы!
Любить, так до потери пульса!
Ревновать, ненавидеть... буквально каждой клеточкой!
Жертвовать - всем!
Терпеть - до последнего вздоха!
Не доверять, так никому!
Скорпион - это максималист!
То хорошо, что хорошо заканчивается ;)
В Е32 стоят SX1276.
С модулями на SX1276 типа RA-01,RA-02 проще работать напрямую через SPI.
Atmega328 на платах приемника и передатчика (условно приемник- передатчик). Начинал с НС-12-не то.
Заказал модули Е32. Попробовал -чет не хватает. И дороговасто.
Заказал RA-01, RA-02 , попробовал - то что нужно.
В условиях плотной городской застройки и наличия всяких помех уверенный прием до 300 метров за бетонными зданиями , в подвалах и т.д.
Пульт для испытаний. Испытывал с такими антенками как на пульте.
Привет всем, народ прошу помощи разобраться с кодировкой (или настройкой) модуля E32433T30D суть проблемы в следующем -отправляю с ком порта компьютера текстовое сообщение на модуль E32433T30D на втором модуле Tx-Rx замкнуты в ответ приходит абракадабра, со скоростями все в порядке, что и где искать не знаю. такое чувство что сами модули что то кодируют. мож кто нибудь сталкивался с аналогичной проблемой?
Начните с того, что определите, что именно отправляется и что принимается. "Абракадабра" - это, мягко говоря, не очень конкретно.
Спасибо за отклик, проблема в следующем:
отправляю в в ком порт компьютера (usb-uart CH340) сообщение "test" на модуль E32 433T30D,
второй модуль Rx-Tx замкнут в ответ прилетает вместо "test" "WV‘."
случайно заметил закономерность странную
если перед сообщение " 0test" (пробел0test) то в ответ приходит что то более вменяемое ".test."
Кто нибудь сталкивался с такой проблемой?
Lora модули не имеют возможности работы в дуплексном режиме, только полудуплекс или симплекс. Даже если на модуле подобном E32-433T30D имеется MCU.
Замыкание TX-RX в данном случае не означает немедленную передачу данных по приему и приводит к сбою логики работы MCU.
Так что все ручками ( дуинками) - сначала принимаем, потом отправляем.
читал на других форумах и смотрел видно там все так и работает
даже если принимать и передавать в ардуино результат тот же все голову уже разбил себе
вот если сообщение начинается с пробела затем ноль то все идет как нужно
что за херь не пойму ни как
Значит где то, кто то накосячил.
Для начала, модули перед обменом должны иметь идъентичные настройки ?
Далее алгоритм работы определяемый в скетче ?
1 - Аппаратные проблемы - исправность, подключение, питание и тп?
да я сбрасываю модули к заводским настройкам на скрин шоте выше видно видно
правда использую ардуино в режиме TTL переходника но видно что настройки меняются и сохраняются
затем один модуль подключаю к переходнику USB-UART (CН340) там настройки порта те же что и модулей
второй модуль
1 вариант Rx-Tx замкнут
2 подключен к ардуине Serial
3 подключен к ардуине softserial
4 подключен к USR WIFI232 602 через виртуальный порт тоже на ком
И везде один и то же результат
Есть два идентичных модуля из топика на 433, купленные, правда, в разных магазинах. Версии и настройки совпадают, поле ключа в настройках отсутствует. Подключены к ESP8266 и ESP32, используется Arduino IDE и библиотека https://github.com/xreef/LoRa_E32_Series_Library.
Передавать без искажений не хотят, начиная с базовых примеров. Искажения присутствуют как с выключенным, так и с включенным FEC. При передаче одинаковых символов искажения выглядят как сдвиг на константу, общее количество выведенных символов оказывается в полтора-два раза меньше, чем переданных. Передаются исключительно алфавитные символы и цифры.
В каком направлении искать проблему, чтобы не сразу к логическому анализатору и SDR? Существуют ли какие-либо средства для быстрого тестирования подобных модулей (заведомо исправные конвертеры есть, через приложение от производителя модули реконфигурируются тоже внешне корректно)? Если у кого есть опыт работы с SPI-версиями модулей, хотелось бы узнать, насколько сильно влияет навесной монтаж пигтейла на дальность работы модуля и какие библиотеки лучше использовать?
Доброго времени суток. Интересует решилась ли Ваша проблема с передаче данных без искажений через E332 ?
Доброго времени суток. Интересует решилась ли Ваша проблема с передаче данных без искажений через E332 ?
Почитал ветку - вы задали в теме с десяток вопросов, при этом ни разу не показали и строчки кода. Вы так уверены в том. что все правильно отправляете и принимаете и косячат именно модули?
В любом случае, без двух скетчей - отправки и приема - тут говорить вообще не о чем, по-моему