Связь Arduino UNO/Nano с модулем SP1ML-868

Добрый вечер, я пытаюсь установить последовательную связь между Arduino UNO / Nano (ATmega328P) и радиочастотным радиомодулем SP1ML-868 (http://www.st.com/en/wireless-connectivity/sp1ml.html). Я могу разговаривать с радио с помощью платы FTDI breakout, подключенной непосредственно к моему компьютеру, но я не могу сделать это с помощью Arduino.

Поскольку напряжение радиоприемника составляет 3,3 В, а Arduino - 5 В, я попытался использовать преобразователь логического уровня от Sparkfun в линиях RX / TX, но это тоже не сработало.

Есть какие-нибудь идеи относительно того, что я могу делать неправильно? Спасибо!

Обновление
Я смог поговорить с радио, загрузив пустой скетч в свой Arduino и используя только контакты RX / TX и микросхему FTDI на плате. Когда я настраиваю последовательный порт (т.е. Serial.begin), это больше не работает, что наводит меня на мысль, что проблема заключается в конфигурации ATmega USART. По какой-то странной причине это работает только тогда, когда Arduino RX подключен к модулю RX, а TX - к TX.

Как и было запрошено, ниже приведен простой последовательный эхо-код, который я использую, и изображение с проводкой. Это предполагает обычное соединение RX-> TX и наоборот. Питание модуля осуществляется по проводам под его разделительной платой (3,3 В).


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

void loop(){
  while(Serial.available() > 0){
    Serial.print((char)Serial.read());
  }
}

, 👍0

Обсуждение

Пожалуйста, отредактируйте свой вопрос, включив в него полный минимальный набросок, демонстрирующий проблему. Пожалуйста, отредактируйте свой вопрос, чтобы объяснить, как вы подключили модуль к плате Arduino., @per1234

@per1234 Там, это помогает?, @RenanGM


2 ответа


0

По какой-то странной причине это работает только тогда, когда Arduino RX подключен к модулю RX, а TX - к TX.

Это работает, потому что в этой конфигурации вы фактически используете свой Arduino в качестве USB-последовательного адаптера. Когда вы устанавливаете соединение RX-RX, TX-TX, вы не можете обмениваться данными между ATmega328P на вашем Uno, но вы также устанавливаете соединение RX-TX, TX-RX с чипом ATmega16U2 на вашем Uno, который используется в качестве USB-последовательного адаптера на плате.

Я чувствую, что проблематично пытаться использовать последовательный (контакты 0 и 1) для связи как с компьютером, так и с модулем. Вместо этого я бы рекомендовал использовать библиотеку SoftwareSerial для связи между Uno и модулем.

SoftwareSerial ненадежно работает на 115200, поэтому вам следует сначала использовать текущую рабочую проводку, чтобы настроить модуль для связи с более низкой скоростью передачи данных. 9600 вполне безопасен, но если скорость передачи данных является узким местом для вашего приложения, вы, вероятно, можете использовать более высокую скорость передачи данных.

Затем подключите модуль ко всем неиспользуемым контактам на вашем Uno, кроме 0 и 1.

Наконец, загрузите следующий код в Uno:

#include <SoftwareSerial.h>

SoftwareSerial SP1MLserial(10, 11); // RX, TX

void setup() {
  Serial.begin(115200);  // установите это значение на скорость передачи данных последовательного монитора
  SP1MLserial.begin(9600);  // установите это значение на скорость передачи данных модуля
}

void loop() {
  if (SP1MLserial.available()) {
    Serial.write(SP1MLserial.read());
  }
  if (Serial.available()) {
    SP1MLserial.write(Serial.read());
  }
}

Это эквивалент простого эхо-кода, который вы опубликовали выше, и его можно использовать для проверки того, что все работает, прежде чем переходить к более сложному коду. Я произвольно выбрал пин 10 для программного обеспечения Uno serial RX, контакт 11 для TX-pin, но вы можете изменить код на любой удобный для вас номер пин. Вы должны установить соединения с модулем как RX-TX, TX-RX.

,

Спасибо за ответ! Тем не менее, я попробовал ваши предложения, и это все еще не работает. Я посылаю команду модулю (например, "+++ \r", чтобы перейти в командный режим) и ничего не получаю взамен. Если это поможет, последовательная связь этого модуля осуществляется с помощью микроконтроллера STM32L1 ARM MCU, который подключается к радиостанции SPIRIT1 по протоколу SPI. Может быть, существует несоответствие между протоколом SoftwareSerial и тем, который используется в ARM?, @RenanGM


1

Это не ответ на мой вопрос как таковой, но я смог решить свою проблему.
Как упоминалось в моем комментарии к последнему ответу, последовательная связь модуля SP1ML обрабатывается через микроконтроллер ARM. Итак, я получил в свои руки Arduino Due, в котором есть микроконтроллер ARM Cortex M3, и загрузил последовательный эхо-код, аналогичный тому, который указан в моем вопросе, только теперь используя Serial3 для общения с модулем:


void setup(){
  Serial.begin(9600);    // Подключен к ПК
  Serial3.begin(115200); // Подключен к SP1ML, соединение Rx-Tx
}
void loop(){ if (Serial.available() > 0){ Serial3.write(Serial.read()); // Echo в SP1ML } if (Serial3.available() > 0){ Serial.write(Serial3.read()); // Эхо на последовательный монитор } }

Я попробовал точно такой же код на Arduino Mega (те же контакты, микроконтроллер ATmega2560), и это не сработало.
Очевидно, что микроконтроллеры очень разные, но я понятия не имею, что один работает, а другой нет. Дикое предположение состояло бы в том, что размеры слов разные. В Atmega размер слова равен 16 битам, а в ARM размер слова равен 32 битам.

,