Arduino Pro Micro, получить данные с контакта Tx?

У меня есть Sparkfun Arduino Pro Micro с ATmega32u4 и Модуль Bluetooth Roving Networks RN32

Теоретически я должен иметь возможность припаять Rx Bluetooth к Tx на Arduino и наоборот, и я должен получить последовательную связь через Bluetooth.

Конечно, нет. Тем не менее, в качестве первого вопроса: как заставить Arduino передавать данные через вывод Tx?

Я без проблем загрузил это в Arduino:

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

void loop(){
  Serial.print("HelloWurld");
}

Однако, когда я подключаю оскоп, я не вижу сигнала по линии Tx. Нада. Я вижу данные, поступающие через USB в COM-порт моего компьютера, но не через контакт Tx.

Как заставить Arduino выводить последовательные данные на вывод Tx?

, 👍8

Обсуждение

У вас есть питание?, @TheDoctor

И земля на прицел, подключенный к земле Arduino?, @TheDoctor

Да, на него подается +5 В, а прицел находится на контакте заземления Arduino. Как передать последовательные данные через контакт TX (digital0)? Я знаю, что это проблема с кодом, @user3320919

Ваш код выглядит нормально, @TheDoctor

Спасибо, но тогда мы оба не правы. Когда я помещаю этот код в Arduino, а затем проверяю вывод TX (цифровой 0), я вообще ничего не вижу, он просто плоский. Однако в моей программе последовательного порта на моей машине с Windows я вижу сообщение «helloWurld». Меня пока НЕ ЗАБОТИЛА программа serialport. Мне нужно, чтобы данные выходили из контакта TX, а НЕ USB. Имеет ли это смысл?, @user3320919

Вы пробовали пин 1?, @TheDoctor

Это контакт RX, и да, я пробовал каждый контакт, чтобы увидеть выходы. Все контакты на плате молчат, контакты на чипе слишком малы, чтобы их можно было прощупать, не говоря уже о пайке., @user3320919

У меня ничего не выходит из контакта TX. Сфера настроена просто отлично. Я могу без проблем перевести вывод TX с +5 на 0 в качестве проверки работоспособности. Переключение в циклическом вызове Arduino занимает около 2 мс. Вот код: void setup(){ Серийный.начать(9600); pinMode(5,ВЫХОД); } недействительный цикл () { Serial.print("HelloWurld"); аналоговая запись (0,1); аналог записи (0,0); } Это просто подливка для пульсации контакта TX. Под цифровым разъемом вы имеете в виду контакты на боковой стороне платы или контакты на самом чипе atmega? Большое спасибо за вашу помощь, я ценю это., @user3320919

Ах, может быть, отсюда и путаница. Это НЕ стандартная UNO, это плата SparkFun, которая ведет себя как единое целое. Я тоже пытаюсь обратиться к SparkFun за помощью. На ваш комментарий: Вы имеете в виду линию TX чипа ATMEGA? Я пытаюсь понять, как я могу получать данные, выходящие из контакта TX, не видеть колебания 5 В, а затем также передавать данные через USB на мой компьютер. Извини, я правда просто не понимаю. Большое спасибо за Вашу помощь., @user3320919


5 ответов


Лучший ответ:

19

Похоже, у вас есть плата в стиле «профессионально-микро», в которой USB-связь напрямую поступает от основного процессора ATmega32u4, а не генерируется в виде последовательных данных, а затем перенаправляется на отдельный USB-последовательный преобразователь, как на традиционных Arduino. Ваш вопрос мог бы быть решен намного быстрее, если бы вы четко указали тип используемой вами платы словами, а не только в виде ссылки на продукт (поэтому я отредактировал это в вашем вопросе).. р>

Согласно документации для официальной Arduino Pro Micro:

Последовательный: 0 (RX) и 1 (TX). Используется для приема (RX) и передачи (TX) последовательных данных TTL с использованием аппаратных возможностей последовательного интерфейса ATmega32U4. Обратите внимание, что в Micro класс Serial относится к связи USB (CDC); для последовательного интерфейса TTL на контактах 0 и 1 используйте класс Serial1.

Поэтому для генерирования вывода на аппаратном UART вам необходимо изменить все вхождения Serial на Serial1

void setup(){ 
    Serial1.begin(9600);
}

void loop(){
    Serial1.print("HelloWurld");
}

Данные передачи будут поступать с контакта 21 ATmega32u4, который обозначен как «D1» (цифровой контакт 1) в заголовках. Если вы хотите исследовать это, это будет лучшее место для этого.

Если вы хотите передавать данные с другого контакта, который не подключен к UART ATmega32u4 (как подсказывает ваш пример с цифровым контактом 5), вы должны вместо этого использовать SoftwareSerial или аналогичная реализация для побитовой передачи последовательных данных из вывода ввода-вывода общего назначения.

Например (на основе этого примера):

SoftwareSerial mySerial(4, 5); // RX, TX

void setup(){ 
    mySerial.begin(9600);
}

void loop(){
    mySerial.print("HelloWurld");
}
,

Хорошо подмечено, Крис! +1, @Ricardo

о, мои дни... как новичок в ардуино, это различие между ATmeta32u4 и ATmega328 сбивает с толку... мне потребовалось три дня, чтобы понять... тот факт, что я пробовал тот же код в коде ATmega328 на 32u4, не помог. _Миллион благодарностей_ Крис Стрэттон., @sumitkm


5

Плата Bluetooth использует 3,3 В, а не 5 В в соответствии с техническое описание.

Поэтому вам нужно сдвинуть уровень напряжения между ним и платой Arduino (что составляет 5 В). Обратите внимание, что в спецификации показано, как это можно легко сделать с помощью двух резисторов (R1 и R2 в типовой схеме приложения, стр. 5).

Также на модуле bluetooth интерфейс RS232 имеет 4 контакта:

  • UART_TX
  • UART_RX
  • UART_CTS
  • UART_RTS

UART_CTS должен быть равен 0, чтобы устройство считывало входящие байты. Обычно это делается с помощью внутреннего подтягивающего резистора, но вы должны убедиться, что вы не подключили этот контакт к +V.

Наконец, убедитесь, что скорость передачи модуля правильно установлена на 9600 бод, как и в вашей программе.

,

Я в курсе всего этого, спасибо вам все равно. Однако моя проблема гораздо более фундаментальна. Мне нужно получить данные из контакта TX, чтобы я мог подключить к нему bluetooth. Если я не могу получить данные с контакта на плате Arduino, Bluetooth бесполезен. Как получить последовательные данные с платы arduino? Штыри USB отлично отправляют последовательные данные, но я не могу заставить другие контакты выводить данные. Нужно ли припаивать контакты USB для передачи данных в Bluetooth? Большое спасибо за любую помощь, я очень ценю это, @user3320919


3

Просто подключите последовательные контакты модуля Bluetooth к соответствующим контактам Pro Micro: TX к RX и RX к TX. Я надеюсь, что это может помочь кому-то.

Затем найдите такие данные:

void setup(){ 
   Serial1.begin(9600); // Инициализация аппаратного последовательного порта на контактах 0 и 1 — Bluetooth
   Serial.begin(9600); // Инициируем виртуальный последовательный порт — машина

   Keyboard.begin(); // Инициализация HID — Клавиатура
}

void loop(){
   if (Serial1.available() > 0) {

     char myData = Serial1.read()

     // Отправляем данные с Bluetooth/датчика на машину — виртуальный последовательный порт
     Serial.println(myData); 

     // Эмулировать HID-устройство — клавиатура
     if ( myData == 0x7F ) { // Обнаружение кода клавиши возврата Android
        Keyboard.write(0xB2); // Преобразование полученного символа кода в код клавиши PC/Linux ascii для клавиши возврата. Это может меняться между различными ОС!
     }

     else {
        Keyboard.write(myData); 
     }

   }
}
,

1

Вы также можете попробовать библиотеку "SoftwareSerial". Таким образом, вы можете использовать практически любые контакты для последовательной связи. На самом деле у вас может быть пара последовательных портов.

Пожалуйста, прочитайте о библиотеке SoftwareSerial. У него есть некоторые ограничения.

,

4

Итак, я наткнулся на эту тему, имея аналогичную проблему, но с модулем HC-05. Поэтому, поскольку у меня слишком много свободного времени во время финалов (нет, нет), я решил создать небольшой репозиторий на github, который может когда-нибудь кому-нибудь помочь. https://github.com/Sackhorn/HC-05-Pro-Micro-Hookup

Код:

//Написано для pro micro
//Это оказалось полезным
//http://arduino.stackexchange.com/questions/1471/arduino-pro-micro-get-data-out-of-tx-pin
//https://forum.sparkfun.com/viewtopic.php?f=32&t=38889&sid=8178cdb38005ff33cc380a5da34fb583&start=15

void setup()
{
  pinMode(9, OUTPUT);  
  digitalWrite(9, HIGH); 
  Serial.begin(9600);
  Serial1.begin(38400);
}

void loop()
{

  //Serial1 — это физические последовательные соединения на контактах TX и RX.
  if (Serial1.available()) Serial.write(Serial1.read());

  // Serial, насколько я понимаю, это виртуальное соединение с компьютером через USB
  if (Serial.available()) Serial1.write(Serial.read());
}

,

Хорошее использование Serial и Serial1. Я разместил редактирование с вашим кодом и диаграммой., @Dave X