LoRa RA-06 кто пользовался как подключить?

svidrak
Offline
Зарегистрирован: 20.01.2017

LoRa RA-06 кто пользовался как подключить? 
Купил модули подключаю по юарт через переходик юсб ттл 
в терминале команду ат и тишина.
может кто работал с ними ?

rkit
Offline
Зарегистрирован: 23.11.2016

У них SPi интерфейс, солнце.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

 PC connection module serial port RX0, TX0. The default model rate is 9600, stop bit 1, even parity.
Module operation mode:
When the module is powered on, it automatically enters the low-power operation mode. When the CPU is idle, it automatically shuts down, but the peripheral and IO ports are unchanged. Serial input AT command can wake up the CPU immediately, respond and process the command. After the task is processed, the CPU goes to sleep.
Try to enter a low-power sleep state when the CPU is idle. Low current operation is less than 350uA. Enter the command to enter deep sleep mode: AT + MODE = 1, at this time the power consumption reaches the minimum, and the current is 0.7uA. At this time, the timer is turned off, the module cannot perform any work, and the wake-up method: input arbitrary data into the serial port. AT + MODE = 2000, the module enters deep sleep mode, but when the timer is turned on, it will automatically wake up after 2000 milliseconds.

svidrak
Offline
Зарегистрирован: 20.01.2017

ra 06 spi i2c uart
ra 02  ra 01 spi

svidrak
Offline
Зарегистрирован: 20.01.2017

Спасибо проблема била в четности модуль ответил иду.

иду дальше копать документации 0 на эти модули нашел только на китайские и то там мало полезного 

У китайцев на сайте  ат команди 1.3 вер
у модуле Ra06 V2.1.1

svidrak
Offline
Зарегистрирован: 20.01.2017

ua6em пишет:

Может еще подскажете как через ардуино пообщаться с модулем? уже всю голову себе сломал через юсб ттл конвертер все ок. обмениваюсь данными между двумя модулями а к ардуину подключить не могу пробовал через делитель напряжения 2 резистора на сигнальные данные но модуль не принимает команды из ардуино(если ресетить то модуль посылает в порт инициализацию) . пробовал конфигурировать сериал интерфейс Serial 8Е1 не помогает может есть пример как отправлять ат команды или можете подсказать как ето реализовать а то я целый день просидел и толку 0.

Ни софт сериал ни аппаратный юарт на мега не могу достучаться до модуля подозреваю что снова дело где-нибудь в настройках сериала

мне нужно с помощью этих модулей передавать данные с метеостанции на дворе

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

на меге попробуй сериал 1, такого модуля под рукой нет обязано работать, для софтового есть библиотека поддерживающая настройку параметров...
 

// Define config for Serial.begin(baud, config);
#define SERIAL_5N1 0x00
#define SERIAL_6N1 0x02
#define SERIAL_7N1 0x04
#define SERIAL_8N1 0x06
#define SERIAL_5N2 0x08
#define SERIAL_6N2 0x0A
#define SERIAL_7N2 0x0C
#define SERIAL_8N2 0x0E
#define SERIAL_5E1 0x20
#define SERIAL_6E1 0x22
#define SERIAL_7E1 0x24
#define SERIAL_8E1 0x26
#define SERIAL_5E2 0x28
#define SERIAL_6E2 0x2A
#define SERIAL_7E2 0x2C
#define SERIAL_8E2 0x2E
#define SERIAL_5O1 0x30
#define SERIAL_6O1 0x32
#define SERIAL_7O1 0x34
#define SERIAL_8O1 0x36
#define SERIAL_5O2 0x38
#define SERIAL_6O2 0x3A
#define SERIAL_7O2 0x3C
#define SERIAL_8O2 0x3E

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

На каких то мегах был косяк с шелкографией обозначений RX... TX...

Вы бы хоть картинку показали вашего подключения !

svidrak
Offline
Зарегистрирован: 20.01.2017

ua6em
как библиотека называется? сегодня попробовал еще раз но без преобразователей уровней на меге если сконфигурировать порт модуль начал отвечать при этом на команды с сериал монитора не отвечает.
но если послать через serial.println("at") команду ат то модуль ответил
програма пример
как лучше организовать отправку модулю команд?
учитивая то что модулю нужно время несколько милисекунд на ответ?
 

long lastcmd = millis();
void setup() {
  Serial.begin(9600, SERIAL_8E1);
  Serial2.begin(9600, SERIAL_8E1);
  Serial.println("AT");
  do {
    Serial2.println("AT");
  } while (Serial.find("+OK") == -1);     // Не пускать дальше, пока модем не вернет ОК
  Serial.println("AT+FREQ=473000000");
  do {
    Serial2.println("AT+FREQ=473000000");
  } while (Serial.find("+Frequency") == -1);     // Не пускать дальше, пока модем не вернет ОК
  do {
    Serial2.println("AT+RATE=8");
  } while (Serial.find("+OK") == -1);     // Не пускать дальше, пока модем не вернет ОК
  Serial.println("AT+TADDR=100");
  do {
    Serial2.println("AT+TADDR=100");
  } while (Serial.find("+OK") == -1);     // Не пускать дальше, пока модем не вернет ОК
  Serial.println(" AT+ADDR=124");
  do {
    Serial2.println(" AT+ADDR=124");
  } while (Serial.find("+OK") == -1);     // Не пускать дальше, пока модем не вернет ОК
/*
  Serial.println("AT+FREQ?");
  Serial2.println("AT+FREQ?");
  Serial2.println("AT+RATE?");
  Serial.println("AT+TADDR?");
  Serial2.println("AT+TADDR?");
  Serial.println(" AT+ADDR?");
  Serial2.println(" AT+ADDR?");
  Serial2.println("AT+RECV=1");       // Запускаем прием
*/
Serial2.println("AT+RECV=1");       // Запускаем прием
}

void loop() {
  if ( Serial2.available()) // Ожидаем прихода данных (ответа) от модема…
    Serial.write(Serial2.read()); // …и выводим их в Serial
     if ( Serial.available()) // Ожидаем прихода данных (ответа) от модема…
    Serial2.write(Serial.read()); // …и выводим их в Serial

}

KOmandir, подключение перехресное тх до рх

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

смысла использовать софтовый сериал когда хардовых масса портов нет никакого, если после отладки программы захочется двигаться в сторону более лёгкого камня, то переносим на 328PB, если и после этого захочется большего, тогда можно пробовать софтовую библиотеку, но там всё очень непросто, на гитхабе ua6em я собрал некоторое количество работающих...
Да, настраивать порт монитора как 8E1 нет никакого смысла, если модуль подключен к другому порту

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018
  Serial.println("AT");
  do {
    Serial2.println("AT");
  } while (Serial.find("+OK") == -1);

А зачем вы заваливаете Serial2 выводом ничего не значащих данных ??? Выведите один раз до цикла и гоняйте пустой цикл ожидая ответа ...

И да - для Serial2 достаточно Serial2.begin(9600) (или любая другая скорость) это же всего лишь общение платы с компом ...

Разве на меге Serial (без номера) не подключен через USB-UART к выходу USB ??? Нарисуйте уже схему в конце концов ... Если вы цепляете LoRa на Serial, который также подключен к USB-UART или к другому чипу Atmega (в зависимости от версии МЕГА), то они будут конфликтовать !!! Вы закорачиваете выход TX LoRa на выход TX чипа USB-UART. Неужели что бы это понять - надо увидеть белый дым ???

Цепляйте LoRa на Serial1, 2 или 3, а монитор будет на Serial (который 0) и будет счастье ...

svidrak
Offline
Зарегистрирован: 20.01.2017

ua6em пишет:

смысла использовать софтовый сериал когда хардовых масса портов нет никакого, если после отладки программы захочется двигаться в сторону более лёгкого камня, то переносим на 328PB, если и после этого захочется большего, тогда можно пробовать софтовую библиотеку, но там всё очень непросто, на гитхабе ua6em я собрал некоторое количество работающих...
Да, настраивать порт монитора как 8E1 нет никакого смысла, если модуль подключен к другому порту

Суть какая у меня есть уже сделанная метеостанция которая состоит из 3 модулей основной базовая станция на 2560 на ней висит дисплей датчики влажности wi fi sd карта для лога итд , и два внешних модуля на ардуино нано на них так же датчики осадков температуры итд.
Связь раньше я сделал на nrf24l01, но она не стабильно работает слишком мал радиус действия, поэтому решил перейти на лора.
На меге я буду использовать хардверный сериал а на нано надо софтовый.
порт монитора  8E1 ставил для пробы потому что не отвечает на команды, которые я ввожу в монитор порт.

Komandir пишет:

А зачем вы заваливаете Serial2 выводом ничего не значащих данных ??? Выведите один раз до цикла и гоняйте пустой цикл ожидая ответа ...

этот скеч написан для пробы будет ли модуль отвечать

Komandir пишет:

И да - для Serial2 достаточно Serial2.begin(9600) (или любая другая скорость) это же всего лишь общение платы с компом ...

недостаточно если не сконфигурировать порт модуль не принимает команды

Komandir пишет:

Цепляйте LoRa на Serial1, 2 или 3, а монитор будет на Serial (который 0) и будет счастье ...

я в курсе что  сериал 0 поключен к юсб.
модуль подключеен к сериал 2
схема 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Со схемой стало понятней !!!

do {

Serial2.println("AT");

} while (Serial.find("+OK") == -1);

Тогда что делает этот код ? Бомбит LoRa и ждет ответ от компа через монитор ???

Может так надо ?

Serial2.println("AT");

while (!Serial2.find("+OK") );

Если LoRa висит на Serial2, то конечно инициализировать надо Serial2.begin(9600, SERIAL_8E1);

Что бы исключить разночтения:

#define LoRa  Serial2     // Выбираем порт где физически висит LoRa
long lastcmd = millis();
void setup() {
  Serial.begin(9600);
  LoRa.begin(9600, SERIAL_8E1);
  Serial.println("AT");
  LoRa.println("AT");
  while (!LoRa.find("+OK"));     // Не пускать дальше, пока модем не вернет ОК
  Serial.println("AT+FREQ=473000000");
  LoRa.println("AT+FREQ=473000000");
  while (!LoRa.find("+Frequency"));     // Не пускать дальше, пока модем не вернет ОК
  LoRa.println("AT+RATE=8");
  while (!LoRa.find("+OK"));     // Не пускать дальше, пока модем не вернет ОК
  Serial.println("AT+TADDR=100");
  LoRa.println("AT+TADDR=100");
  while (!LoRa.find("+OK"));     // Не пускать дальше, пока модем не вернет ОК
  Serial.println(" AT+ADDR=124");
  LoRa.println(" AT+ADDR=124");
  while (!LoRa.find("+OK"));     // Не пускать дальше, пока модем не вернет ОК
  /*
    Serial.println("AT+FREQ?");
    Serial2.println("AT+FREQ?");
    Serial2.println("AT+RATE?");
    Serial.println("AT+TADDR?");
    Serial2.println("AT+TADDR?");
    Serial.println(" AT+ADDR?");
    Serial2.println(" AT+ADDR?");
    Serial2.println("AT+RECV=1");       // Запускаем прием
  */
  Serial.println("AT+RECV=1");
  LoRa.println("AT+RECV=1");       // Запускаем прием
}

void loop() {
  if (LoRa.available()) // Ожидаем прихода данных (ответа) от модема…
    Serial.write(LoRa.read()); // …и выводим их в Serial
  if (Serial.available()) // Ожидаем прихода данных (ответа) от модема…
    LoRa.write(Serial.read()); // …и выводим их в Serial
}

 

svidrak
Offline
Зарегистрирован: 20.01.2017

да туплю, сначала не обратил на это внимание но такой пример как вы написали тоже не работает программа зависает рандомно после 2 -3 команды вычислил что модуль имеет задержку где-то 100-200 миллисекунд.
вот через функцию сделал начальная инициализация занимает 3-4 сек довольно долго отвечающий модуль.

#define LoRa  Serial2 // указываем сериал для обмена 

String _response = "";                      // Переменная для хранения ответа модуля

void setup() {
  Serial.begin(9600, SERIAL_8E1);
  Serial2.begin(9600, SERIAL_8E1);
  //  sendATCommand("AT+B9600", true);
  do {
    Serial.print("AT");
    _response = sendATCommand("AT", true);
    //    _response.trim();                    // Убираем пробельные символы в начале и конце
    Serial.print(_response);
  } while (_response.indexOf("OK") == -1);     // Не пускать дальше, пока модем не вернет ОК
 _response = sendATCommand("AT+FREQ=473000000", true);
 Serial.print(_response);
 _response = sendATCommand("AT+RATE=8", true);
 Serial.print(_response);
 _response = sendATCommand("AT+TADDR=100", true);
 Serial.print(_response);
_response = sendATCommand("AT+ADDR=124", true);
 Serial.print(_response); 
_response = sendATCommand("AT+RECV=1", true);
 Serial.print(_response); 
}

void loop() {
  if (LoRa.available()) // Ожидаем прихода данных (ответа) от модема…
    Serial.write(LoRa.read()); // …и выводим их в Serial
  if (Serial.available()) // Ожидаем прихода данных (ответа) от модема…
    LoRa.write(Serial.read()); // …и выводим их в Serial

}

String sendATCommand(String cmd, bool waiting) {
  String _resp = "";                          // Переменная для хранения результата
  LoRa.println(cmd);                          // Отправляем команду модулю
  if (waiting) {                              // Если необходимо дождаться ответа...
    _resp = waitResponse();                   // ... ждем, когда будет передан ответ
  }

  return _resp;                               // Возвращаем результат. Пусто, если проблема
}

String waitResponse() {                       // Функция ожидания ответа и возврата полученного результата
  String _resp = "";                          // Переменная для хранения результата
  long _timeout = millis() + 1000;            // Переменная для отслеживания таймаута (2 секунды)
  while (!LoRa.available() && millis() < _timeout)  {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
  if (LoRa.available()) {                     // Если есть, что считывать...
    _resp = LoRa.readString();                // ... считываем и запоминаем
  }
  else {                                      // Если пришел таймаут, то...
    _resp = "ERROR";
    Serial.println("Timeout...");       // ... оповещаем об этом и...
  }
  return _resp;                               // ... возвращаем результат. Пусто, если проблема
}