Почему Bluetooth не может получать последовательные данные с телефона Android, но может отправлять последовательные данные с Bluetooth на телефон Android?
Я могу получать последовательные данные с моего телефона, но не могу отправлять последовательные данные на arduino с помощью bluetooth. Я могу видеть свой ввод с последовательного монитора на моем Android, но не наоборот. Я использую модуль Bluetooth ARF7044A, если это имеет значение. Любая помощь будет оценена по достоинству.
Arduino для Android: работа
Android на Arduino: не работает.
Вот код:
char state;
void setup()
{
pinMode(8, OUTPUT);
Serial.begin(9600);
}
void loop()
{
if(Serial.available())
{
state = Serial.read();
Serial.println(state);
}
if (state == 'a')
{
digitalWrite(8, HIGH);
}
else if(state == 'b')
{
digitalWrite(8,LOW);
}
}
@Hanafi Mokhri, 👍1
Обсуждение2 ответа
Лучший ответ:
Ваша ошибочная попытка переключения уровня с Bluetooth TX на Arduino RX является корнем вашей проблемы.
Контакты 0 и 1 также подключены к встроенному чипу интерфейса USB через пару резисторов 1 кОм. Эти резисторы выполняют две функции:
- Чтобы «ослабить» драйвер интерфейса UART чипа USB (на самом деле он нужен только для соединения TX -> Arduino RX чипа USB), и
- Чтобы защитить как чип USB, так и основной микроконтроллер от повреждения, следует установить два подключенных контакта на противоположные уровни, что приведет к протеканию больших токов через оба выходных драйвера.
Вывод TX чипа USB активно управляется HIGH все время, когда он неактивен (глупая конструкция Arduino, он должен быть Hi-Z, когда порт не открыт), а вывод RX подтягивается внутренним подтягивающим резистором в чипе USB. Кроме того, когда используется Serial
Arduino, вывод TX Arduino активно управляется HIGH, когда он неактивен (или LOW при передаче бита "1").
Фактическая схема, которая у вас есть, выглядит примерно так:
Передача от Arduino к модулю BT достаточно проста — «высшая» точка схемы — это вывод TX Arduno с напряжением 5 В в режиме ожидания. Ток течет через R2 к выводу USB RX и через R5 к выводу BT RX, а часть тока отводится на землю, что вам и нужно для смещения уровня.
Однако связь в другом направлении отличается, поскольку в вашей схеме есть две сбалансированные «высокие» точки — одна на USB TX и одна на Bluetooth TX — и тот факт, что в обеих ветвях есть резисторы 1 кОм, означает, что ни один из передатчиков не «сильнее» другого. Это означает, что когда BT TX имеет НИЗКИЙ уровень (0 В), на выводе Arduino RX у вас около 2,5 В (5 В на двух резисторах 1 кОм = 2,5 В в центральном отводе — см. здесь).
Поскольку 2,5 В не входят ни в диапазоны HIGH, ни в диапазон LOW напряжения Arduino (которые больше 3,5 В для HIGH и меньше 1,5 В для LOW при работе от 5 В), вход полностью игнорируется.
3,3 В, передаваемые модулем Bluetooth, немного ниже официального порога для сигнала HIGH на Arduino, но на практике он обычно обнаруживается нормально. Поэтому удалите резисторную цепь с контакта TX Bluetooth и подключите ее напрямую к Arduino. Поскольку входное пороговое напряжение является функцией напряжения питания (0,7 * Vcc), надежность его работы во многом зависит от вашего источника питания. Если вы обнаружите, что это не так, вам следует использовать сдвиг уровня вверх. Существуют простые двунаправленные сдвигатели уровня на основе MOSFET, доступные по низкой цене, которые являются лучшим решением, чем резисторы, и обеспечат правильную работу в обоих направлениях, сдвигая высокое напряжение на низкое и низкое напряжение на высокое. Они хороши для низкочастотной связи, такой как UART. Если вам нужна более высокая частота или вы обнаружили, что простой преобразователь на основе MOSFET вам не подходит, то вам может подойти микросхема 74HCT08 или аналогичная (обязательно используйте диапазон HCT, а не HC) или специальная микросхема смещения уровня.
Для надежного решения необходимо переместить устройство Bluetooth на контакты, отличные от цифровых 0 и 1, и использовать программный последовательный экземпляр для связи с ним.
Цифровые контакты 0 и 1 предназначены для связи с главным компьютером, и последовательный USB-чип постоянно подключен к ним, даже если вы не пытаетесь связаться с компьютером.
На многих платах имеется последовательный резистор, который позволяет внешней цепи перегружать последовательный USB-порт, но ваш неправильно задуманный преобразователь уровня имеет достаточное сопротивление, чтобы сделать это.
К счастью, хотя это и не продумано, смещение уровня все еще связано с идеей, что сторона Arduino имеет более высокое напряжение, поэтому, хотя это и добавляет некоторую нагрузку к Bluetooth, в основном это просто добавляет последовательное сопротивление. Если бы вывод Arduino был обычным высокоомным, это, вероятно, все еще работало бы. Но вместо этого это тот, который USB-последовательный порт пытается контролировать через свой собственный резистор сопоставимого значения, и результатом является недопустимый логический уровень или перетягивание каната, в котором выигрывает USB-последовательный порт.
- Модуль Bluetooth HC-05 мигает красным светом - Arduino Uno
- Отправка целого числа> 1 байта с Android на Arduino через последовательный порт
- Неверные данные, полученные в Arduino по bluetooth
- Bluetooth: прочитайте предоставленное пользователем значение, а затем получите время с телефона Android.
- Можно ли измерить скорость акселерометром? Насколько точно?
- Модуль Bluetooth HC-05 возвращает закодированные данные
- Отправка шестнадцатеричных данных последовательно и получение их обратно
- Мой модуль Bluetooth HC-05 не работает
Пожалуйста, покажите нам вашу проводку., @chrisl
@chrisl Привет, я добавил проводку в пост., @Hanafi Mokhri
Мне кажется, что это та же проблема, с которой я столкнулся некоторое время назад (https://arduinoprosto.ru/q/26873/sending-data-using-bluetooth-spp-c-module-without-a-breakout-board). В моем случае Bluetooth-устройство SPP-C смогло получить данные от моего компьютера, но в обратном направлении связь не работала., @Kwasmich
@Kwasmich привет, спасибо. Я думаю, что проблема в моем телефоне на Android. Ладно, попробую другой телефон., @Hanafi Mokhri
Если присмотреться: вам также не нужен делитель напряжения на Uart_tx. Другой вариант подойдет, поскольку вы хотите использовать вывод Arduino 5 В TX на выводе Uart_rx 3,3 В. Но у вас уже есть выход 3,3 В на вашем Uart_tx, и дальнейшее его деление до 2,2 В будет слишком низким для вывода Arduino RX, чтобы распознать сигнал., @Kwasmich
@Kwasmich делитель не работает как делитель с показанными резисторами в обратном направлении. Однако он работает с выходом последовательного порта USB., @Chris Stratton
Обратный порядок делает это еще хуже. У вас соотношение 1:3 вместо 2:3. Таким образом, из ваших 3,3 В только 1,1 В достигает контакта RX. Просто напрямую соедините Uart_tx и Arduino RX. 3,3 В не повредят контакт, устойчивый к 5 В., @Kwasmich