Ошибка порядка контактов Arduino SoftwareSerial Rx / Tx?

Я пишу код для запуска на ATtiny, запрограммированном Arduino в качестве интернет-провайдера. ATtiny предназначен для отправки AT-команд по последовательному каналу на модуль Bluetooth RN42.

Поскольку у ATtiny нет UART, я использую SoftwareSerial на контактах 0 и 1. Казалось логичным поместить Tx на контакт «Data Out» / MISO, а Rx — на контакт «Data In» / MOSI. В документации сказано объявить это как SoftwareSerial mySerial(Rx, Tx); но я обнаружил, что это работает, только если вы объявите его наоборот, например, SoftwareSerial mySerial(Tx, Rx);

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

Код и распиновка


person Matt K    schedule 23.08.2017    source источник
comment
Посмотрите схему в этом сообщении. Как вы понимаете, MOSI — это выходной контакт с точки зрения мастера. Таким образом, одно простое объяснение состоит в том, что веб-страница, которую вы нашли, документирует, что она используется в качестве подчиненного устройства. Трудно сказать, было ли это задумано, не используйте снимок экрана для документирования своего вопроса, если вы также можете указать URL-адрес.   -  person Hans Passant    schedule 23.08.2017
comment
Да, я понимаю вашу точку зрения. Хотя, если подумать, имеет ли значение, для чего можно использовать контакты, SoftwareSerial немного сломан, поэтому они просто используются как GPIO?   -  person Matt K    schedule 23.08.2017


Ответы (1)


Я понял свою ошибку, я без необходимости устанавливал pinMode для контактов Rx и Tx. Это сбило меня с толку, так как я думал, что установка вывода Rx в положение OUTPUT не сработает, хотя на самом деле это работает, поэтому я выводил данные на свою линию Rx и получал их на линии Tx! Ответ заключается в том, чтобы не назначать направление и просто позволить SoftwareSerial обрабатывать выводы. Передайте параметры в порядке (Rx, Tx).

Вот мой более чистый код, который работает намного лучше:

#include <SoftwareSerial.h>

const int Rx = 0;                           // pin 5 on ATtiny - DI/MOSI
const int Tx = 1;                           // pin 6 on ATtiny - DO/MISO
const int ButtonIn = 2;
const int OK_LED = 4;
int buttonState = 0;
SoftwareSerial serialBT(Rx, Tx);

void setup() 
{
  pinMode(ButtonIn, INPUT);
  pinMode(OK_LED, OUTPUT);
  serialBT.begin(9600);
}

void loop() 
{
  buttonState = digitalRead(ButtonIn);
  if (buttonState == 0)
  {  
    serialBT.print("$");                    // $$$ enters RN42 command mode
    serialBT.print("$");
    serialBT.print("$");
    delay(3000);

    serialBT.println("R,1");
    digitalWrite(OK_LED, HIGH);
    delay(5000);
    digitalWrite(OK_LED, LOW);
  }
}
person Matt K    schedule 23.08.2017
comment
Обратите внимание, что через некоторое время вы сможете принять свой собственный ответ. ;) - person Bence Kaulics; 25.08.2017