Аудио Термометр

Макетная плата

Существует как минимум 2 способа подключения периферии к любому смартфону — это блютуз и usb. Дополнительно можно рассматривать wifi, nfc, ик-порт. Сейчас наибольшей популярностью пользуется конечно же блютуз. Этот протокол стандартизирован, он удобный, беспроводной и распространенный, достаточно прост в применении. Так же ведутся работы над LE Bluetoooth с низким энергопотреблением. С usb всё намного хуже, так как не каждый смартфон поддерживает функцию двухсторонней передачи данных, кроме того, если понадобится сделать своё usb-устройство, то придется долго разбираться как его зарегистрировать и прочее.

Иногда не требуется вся мощь технологии блютуз, но тогда что использовать вместо него для подключения к смартфону различной периферии, будь то специальные сенсоры, считыватели кредитных карт, измерители скорости ветра или термометр? Как это ни странно, звучит — использовать аудиовход! В нашем распоряжении будет чудесный аналоговый интерфейс, без каких либо протоколов передачи данных. Можно будет отправлять обычный модулированный сигнал. Как ни парадоксально, но это именно то, что нужно для большинства проектов по созданию периферии для смартфонов.

Image for post

Не мы первые додумались до такого решения, уже существует несколько проектов на основе аудиовхода — это pressy(просто кнопка), kinsa — термометр, vaavud — измеритель скорости ветра. Кроме того существует библиотека для установления соединения между Arduino и андроидом по типу модема.

  • Передача данных — бинарный протокол
  • Термометр
  • Осцилограф
  • Измерение скорости ветра
  • Велокомпьютер без gps
  • Различные сенсоры

Мы же в итоге остановились на идее термометра.

  • Простота — нет накладных расходов на упаковку пакетов данных, передачу данных по среде передачи, восстановление ошибок. Если надо отправить один символ, то нет необходимости отправлять целый пакет в несколько байт, шифровать его и распаковывать.
  • Энергосбережение — в отличие от блютуза, не требуется так много энергии для передачи данных, установление и поддержания связи. Хотя с учетом Bluetooth LE, тут конечно можно поспорить.
  • Plug-and-play — для пользователя в конечном итоге такие устройства будут очень простыми. Необходимо только подключить периферию и всё. Не надо устанавливать соединение, проводить авторизацию и прочие ритуалы для настройки блютуза или wifi.
  • Совместимость — аудиоразъем есть на каждом смартфоне. В отличие от usb-host, который есть только на некоторых устройствах.
  • Нет никакого, даже самого простого стандартного метода для передачи бинарных данных, поэтому всё придется писать с самого начала самому. Например, сделать обыкновенный модем, для передачи бинарных данных. Придется самим вручную исправлять помехи и восстанавливать данные.
  • Низкая скорость, так как есть ограничение в 44100Гц частоты дискретизации.
  • Расхождение технических показателей аудио интерфейса. Амплитуды выходных сигналов на разных устройствах могут отличаться.

Тем не мене, если вам понадобилась передача данных, то логичнее использовать блютуз, а если нужен просто аналоговый вход, то лучше аудио интерфейса ничего не найти.

Однако, перед использованием этого интерфейса придётся решить ряд технических проблем.

Первая проблема заключается в том, что большинство смартфонов рассчитаны на то, что к аудио разъёму может подключаться только гарнитура. И вы сможете отправить или получить какой-то сигнал через аудио разъём только если смартфон будет уверен, что к нему подключена гарнитура. Как этого добиться?

Image for post

Давайте посмотрим, как устроена телефонная гарнитура. Она состоит из штекера с 4-мя контактами, к двум нижним подключены левый и правый наушник, их сопротивление колеблется от 16 до 40 Ом. К верхнему контакту подключен микрофон, его сопротивление примерно 1.5 кОм, а третий снизу контакт — это заземление. Поэтому, в теории, чтобы смартфон принял наше устройство за гарнитуру, необходимо заменить наушники и микрофон резисторами с эквивалентными сопротивлениями. На практике оказалось, что достаточно заменить микрофон резистором на 1.5 кОм.

Следующий вопрос заключается в том, как модифицировать эту схему, чтобы она приносила какую-то пользу.

Самый простой вариант — это добавить в схему ключ параллельно резистору, который будет замыкать микрофон на землю. Смартфон распознаёт это действие как нажатие кнопки гарнитуры. Программа, запущенная на смартфоне может перехватить это событие и каким-то образом его интерпретировать. Например, универсальная кнопка Pressy работает по такому же принципу. Конечно, это довольно примитивный инструмент, который подойдёт только для самых простых устройств.

Image for post

Следующая схема значительно сложнее в реализации. В этой схеме аудио кабель используется как полнодуплексный канал связи, к которому подключается полноценное цифровое устройство. Телефон принимает данные на вход микрофона и отправляет их через выход наушников. Это универсальная схема, поскольку она позволяет подключить к телефону различные сложные цифровые устройства, однако проектирование такого устройства связано с большими трудностями, поскольку придётся разработать собственный протокол обмена данными между телефоном и цифровым устройством.

Следующий вариант схемы немного проще. Телефон генерирует звуковой сигнал и отправляет его на выходы гарнитуры. Сигнал проходит через какую-то электрическую схему, некоторым образом изменяется и подаётся на вход микрофона. Телефон принимает изменённый сигнал и каким-то образом его интерпретирует. Такая схема идеальна для проектирования различных аналоговых датчиков, так как в схеме будет присутствовать элемент, изменяющий, например, сопротивление, в зависимости от некоторых условий. Поэтому для проектирования аудиотермометра такая схема подходит лучше всего.

Теперь возникает вопрос, как на основе данной схемы реализовать термометр. Для нашей схемы отлично подойдёт термистор, элемент, меняющий сопротивление в зависимости от температуры. В итоге получаем следующую схему.

Image for post

Ко входу микрофона подключен резистор на 1.5 кОм, к левому каналу подключен резистор сопротивлением 10 кОм, к правому каналу подключен термистор. К земле — резистор 220 Ом.

На левый и правый каналы подаётся синусоидальный сигнал частотой 4 кГц, в противофазе. Сигналы, проходя через термистор и резистор, суммируются и направляются на вход микрофона. Соответственно, при температуре в 25 градусов сопротивления на левом и правом каналах будут равны, поэтому при суммировании каналы дадут сигнал с близкой к нулю амплитудой. При повышении температуры сопротивление на одном из каналов будет падать, поэтому амплитуда суммы сигналов будет расти.

Image for post

Но, к сожалению, не всё так просто. Такое решение обладает целым рядом недостатков. Во-первых, у каждого устройства своя громкость, поэтому при одинаковой температуре разные телефоны могут показать разные значения. Во-вторых, падении температуры ниже 25 градусов амплитуда сигнала на выходе снова будет расти. Ну и, в-третьих, амплитуду сигнала необходимо перевести в градусы Цельсия.

Для того, чтобы свести недостатки к минимуму, система измерения температуры была немного переделана. Теперь программа автоматически подстраивает громкость на каждом канале таким образом, чтобы амплитуда выходного сигнала всегда была нулевая. Температуре же теперь соответствует разница амплитуд на двух каналах. Для автоматической подстройки амплитуд сигналов применяется система обратной связи.

Image for post

В начале, как и раньше, мы отправляем сигнал в противофазе с одинаковой амплитудой на левый и правый каналы. После того, как на входе, с некоторой задержкой, появилась сумма этих сигналов, мы анализируем амплитуду суммы и принимаем решение, на каком из каналов необходимо уменьшить или увеличить громкость. После этого на выход отправляются сигналы с изменённой амплитудой, и программа вновь ждёт на вход сумму этих сигналов. Чтобы гарантировать, что амплитуда суммы сигналов изменилась именно за счёт изменений на входе, а не за счёт изменения температуры, на выход отправляется синхроимпульс частотой 6 кГц, и система анализирует амплитуду суммы сигналов только после того, как получит синхроимпульс.

Для того, чтобы не пытаться переводить шумы, помехи, синхроимпульс в температуру, необходимо проверять какой частоты сигнал пришел на вход. Для этого вычисляется спектр входящего сигнала с помощью быстрого Фурье преобразования. Если частота гармоники с наибольшей амплитудой в спектре совпадает с частотой генерируемого сигнала, то мы получили полезную информацию. Иначе — помехи или синхроимпульс. Тогда игнорируем эти данные. Выводим информацию о том, что невозможно определить температуру.

Вывод формулы для значения температуры. Термисторы характеризуются рядом параметров, такими, как максимальный допустимый ток, точность, сопротивление при определённой температуре (как правило, при 25°С). Одним из параметров, характеризующим степень изменения сопротивления в зависимости от температуры является коэффициент температурной чувствительности, обозначаемый B. Этот коэффициент рассчитывается на основе значений сопротивления при двух конкретных значениях температур. Во многих случаях этими температурами выбираются 25°С и 100°С. Коэффициент B измеряется в Кельвинах и вычисляется по следующей формуле: B=ln(R1)ln(R2)1/T11/T2B = \frac{ln(R_1) - ln(R_2)}{1 / T_1 - 1 / T_2} где R1 и R2 - значения сопротивлений при температурах соответственно T1 и T2, выраженных в Кельвинах. Из этой формулы следуют и обратные: T1=1ln(R1)ln(R2)B+1T2)T_1 = \frac{1}{\frac{ln(R_1) - ln(R_2)}{B} + \frac{1}{T_2})}

Термисторы обладают высокой степенью нелинейности параметров, и термисторы различных моделей, даже при одинаковых значениях параметра B25/100 могут по разному изменять сопротивление в зависимости от температуры. Поэтому формула может лишь приблизительно оценить температуру.

Производители термистров всегда прилагают таблицы с зависимостями сопротивления от температуры.

Таким образом для определения температуры достаточно знать значение сопротивления термистора и коэффициент B. В нашем случае мы не можем снимать непосредственно значение напряжения с термистора, используя, например, схему делителя напряжения, поэтому необходимо каким-то образом выразить значение сопротивления через амплитуды выходных сигналов на левом и правом каналах. Логично предположить, что отношение A1A2=R1R2\frac{A_1}{A_2} = \frac{R_1}{R_2}, где R1R_1 - сопротивление термистора. Тогда получаем формулу: T=1/((ln(R2A1/A2)ln(R1))/B+1/T1)T = 1 / ((ln(R_2 * A_1/ A_2) - ln(R_1)) / B + 1 / T_1). В нашем случае получаем T=1/((ln(10000Al/Ar)ln(10000))/4300+1/298)T = 1 / ((ln(10000 * Al/ Ar) - ln(10000)) / 4300 + 1 / 298), где B = 4300К, T1 = 298К, R1 = 10000 Ом, R2 = 10000 Ом

Как итог наших теоретических исследований, представим андроид-приложение аудиотермометр. Оно определяет температуру с точностью до 1 градуса, немного инертно но в целом дает реальную температуру. Конечно если задаться целью получить строго значение температуры с точностью до сотых долей, то лучше использовать диоды или еще лучше, готовые термометры, которые посылают значение температуры каким-то сигналом и считывать его аудио входом. Тем не менее с научной и практической точки зрения можно с уверенностью утверждать, что можно выделить некоторое множество проектов, которые было бы удобнее всего реализовывать именно через аудио интерфейс на смартфоне. Такие решения будут изящнее и миниатюрнее, удобнее в использовании, чем сторонние платы, подключаемые через блютуз или usb к смартфону. Существующие финансово успешные проекты подтверждают это.

  1. How do volume control headphones work?
  2. Minimodem — general-purpose software audio FSK modem
  3. Audio Jack Modem for iPhone and Android
  4. Why The Best Way Into Your Customer’s iPhone Is The Headphone Jack
  5. Простыми словами о преобразовании Фурье

Авторы статьи: Ilya Siganov и Кирилл Лейфер

Исходный код приложения