|
Программный UART на микрофонном входе |
|
|
|
Jan 20 2012, 16:51
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Есть идея реализовать прием данных через микрофонный вход телефона. Гораздо проще по ЮСБ, но мы не ищем легких путей =)) Интересует вот что: Частота дискретизации входного сигнала = 44100гц. Скорость передачи данных с микроконтроллера = 9600 бод/сек  На осциллограмме в VMLAB'е видно, что 1 пакет данных (10 бод) передается за 1мс. Длительность 1 бода = 100мкс. В документации на atmega16 указано, что внутренний usart делает замеры (отсчеты) 16 раз за 1 пакет. Почему - не помню, но мне голова подсказывает, что надо делать 20 замеров, 2 раза за один бод, учитывая старт-бит и стоп-бит. С другом собираемся поступить так: Оцифрованный сигнал с микрофона будет записываться в буфер определенной длинны. Далее, будет алгоритм выборки из этого буфера. Но, для более высокой точности необходимо "щупать" сигнал с частотой 20кГц. Не каждый УНЧ может похвастаться работой на такой частоте, а тем более микрофонный усилитель. То есть вряд ли получится каждый бод щупать по два раза. Отсюда вопрос: а что если "щупать" всего один раз? То есть изначально устройства будут как-то синхронизироваться между собой, на приемнике будет высчитываться длительность импульса, длительность всего пакета, и исходя из расчетов будет корректироваться шаг выборки из буфера? Какова вероятность приема с ошибкой? Какие есть алгоритмы исправления? И т.д.
Сообщение отредактировал Lost_Viking - Jan 20 2012, 16:56
|
|
|
|
|
Jan 20 2012, 19:35
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Цитата(andrewkrot @ Jan 20 2012, 23:03)  Наверное так мало сообщений потому что никто ничего не понял... Мега делает 16 замеров на 1 бит, а не на пакет. И что-то мне подсказывает, что с термином "бод" у Вас какая-то путаница в голове. Насчет терминологии: http://www.iknowit.ru/words/word15766.html , ну и т.д. по википедии. Но речь не о бодах. Если мега делает 16 замеров на 1 бит, то это еще хуже для меня =). Я собираюсь делать 1 замер на 1 бит. Вопрос пока таков: каков процент получения ошибочного результата при 1 замере на 1 бит?
|
|
|
|
|
Jan 20 2012, 20:10
|
Местный
  
Группа: Участник
Сообщений: 306
Регистрация: 11-11-04
Из: Москва
Пользователь №: 1 106

|
Цитата(Lost_Viking @ Jan 20 2012, 22:35)  Насчет терминологии: http://www.iknowit.ru/words/word15766.html , ну и т.д. по википедии. Но речь не о бодах. Все правильно там написано, а у Вас "Скорость передачи данных с микроконтроллера = 9600 бод/сек", т.е. скорость=скорость/время... Если хотите использовать микрофонный вход, то нужно использовать кодировку, обеспечивающую отсутствие постоянной составляющей. Например manchester или 8b/10b. Ну или как уже было сказано МОДЕМ. А по поводу 1 замера на 1 бит - вероятность появления ошибки стремится к 1, потому как невозможно обеспечить абсолютное равенство частот и фазовые соотношения в приемнике и передатчике. Да и АЦП у меги может только 15kSPS, так что 44100 не получится.
|
|
|
|
|
Jan 20 2012, 20:31
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Цитата(Taradov Alexander @ Jan 20 2012, 23:49)  В первую очередь ни один микрофонный вход ваш DC сигнал не пропустит, следоваткльно нужна несушая частота и демодулятор. Так что можете забывть об одном отсчете на бит и начинать читать пор модемы. А разве не достаточно делать замеры по пикам? То есть просто смотрим на пики, и всё? Кстати, если мне не изменяет память - я на микрофонный вход звуковухи подавал импульсы, и видел импульсы в программном осциллографе, который берет сигнал со звуковой карты. Или я что-то путаю?? Вот пример: http://biorezonans.3bb.ru/viewtopic.php?id=43Про модемы я бы начал читать, если был бы уверен, что иначе никак.
|
|
|
|
|
Jan 20 2012, 20:48
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Идея началась с этой статьи: http://www.eecs.umich.edu/~prabal/pubs/pap...kuo10hijack.pdfНа одной из диаграмм видно, что импульсы модулированы импульсами. Этот модулированный сигнал подается на вход телефона, где потом обрабатывается. Почему здесь применили модуляцию? Я думаю, что из-за того, что с выхода УНЧ сложно получить хорошие импульсы, и это тоже показано на одной из диаграмм. В результате двунаправленной передачи данных будет трудно добиться. Как я понял, импульсы все-таки на вход УНЧ подать можно. Да, там стоит разделительный конденсатор. Но, однако, как-то импульсы получают в программах!? Цитата(Taradov Alexander @ Jan 21 2012, 00:40)  А теперь представьте передачу не меандра, а последовательности символов 0x00 или 0xff, А об этом я не подумал. =))) Спасибо! Ха... Тогда придется разбираться с алгоритмами демодуляции FSK сигнала... Или , действительно, манчестером пользоваться. Цитата(Taradov Alexander @ Jan 21 2012, 00:40)  А потом в UART-е нормальный уровень - высокий, так что нужен как минимум инвертер, а то межсимвольный интервал точно убьется. Нормальный уровень - это постоянная составляющая что ли? Расскажите подробней, пожалуйста. Цитата(Taradov Alexander @ Jan 21 2012, 00:40)  Ну и засинхонизировать их тоже не так легко и особенно если поток не непрерывный. 16 точек на бит для того и берутся, что даже аппаратно синхронизация теряется очень быстро. Передача будет непрерывной. В том-то и проблема. Может кто-нибудь посоветовать алгоритм демодуляции FSK сигнала? Хотя бы с чего начать штудировать книгу "Цифровая обработка сигналов". Не зря же я ее два года назад купил =))
|
|
|
|
|
Jan 20 2012, 20:56
|

Профессионал
    
Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202

|
QUOTE (Lost_Viking @ Jan 20 2012, 23:48)  Нормальный уровень - это постоянная составляющая что ли? Расскажите подробней, пожалуйста. Да, уровень сигнала когда ничего не передается. Стартовый бит определяется переходом в низкий уровень. QUOTE (Lost_Viking @ Jan 20 2012, 23:48)  Передача будет непрерывной. В том-то и проблема. Тогда точно про модемы читать, в непрерывном потоке вы с ходу даже стартовый бит так не найдете. Еще учитывайте, что это уже не стандартный UART, а свое изобретение, следовательно нагрузка на микроконтроллер увеличивается из-за необходимости програмно модулирвать сигнал. Ну и скорости большой тоже не поучится, хорошо если 1 кБод выйдет в итоге.
|
|
|
|
|
Jan 20 2012, 21:24
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Цитата(Taradov Alexander @ Jan 21 2012, 00:56)  Да, уровень сигнала когда ничего не передается. Стартовый бит определяется переходом в низкий уровень. Понятно Цитата(Taradov Alexander @ Jan 21 2012, 00:56)  Тогда точно про модемы читать, в непрерывном потоке вы с ходу даже стартовый бит так не найдете. Есть алгоритмы... но они жуткие все =) Цитата(Taradov Alexander @ Jan 21 2012, 00:56)  Еще учитывайте, что это уже не стандартный UART, а свое изобретение, следовательно нагрузка на микроконтроллер увеличивается из-за необходимости програмно модулирвать сигнал. Ну и скорости большой тоже не поучится, хорошо если 1 кБод выйдет в итоге. Где-то читал, что таким методом на вход УНЧ можно передавать до 2400 бод . Была где-то в интернете таблица с частотами для единиц и нулей, и с максимальной скоростью при этих частотах. Мне нужно выжать 4000бод . Вроде бы это реально. Вот, например, сайт хорошего проекта: http://www.eecs.umich.edu/~prabal/projects/hijack/Цитата: Цитата Data. The HiJack communications layer offers two data transfer schemes. The first allows 300 baud data transfer using Bell 202 FSK signaling. The second offers 8.82 kbaud using a Manchester-encoded, direct-digital communication using hardware accelerators on the HiJack microcontroller and a software-defined, digital radio modulator/demodulator on the phone. The first scheme is described in the ISLPED'10 Design Contest entry (below). The second scheme is described in the DEV'10 paper below. При помощи FSK они получили 300бод. Затем получили 8.82кбод при помощи кодирования Манчестером. Кстати, нашел еще информацию о прямом соединении http://web.media.mit.edu/~nanwei/MAS836-20...aafi_MAS836.pdf
|
|
|
|
|
Jan 20 2012, 22:09
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Цитата(Taradov Alexander @ Jan 21 2012, 01:48)  А вообще - пошлите манчестер с МК и запишите. А там видно будет. Да, надо попробовать. Цитата(Taradov Alexander @ Jan 21 2012, 01:48)  Только не понятно зачем это нужно. Здесь все конкретно расписано: http://electronix.ru/forum/index.php?showtopic=98362Скорость передачи данных я взял исходя из максимальных оборотов спортивного мотоцикла. А это около 10000 об/мин. Округлим до 12000, получим 2000 оборотов в секунду. То есть 2000 значений разрежения в секунду для одного цилиндра. 4 цилиндра = 8000 значений. Ну, итого примерно 64000 бит в сек. Огог! Что-то я раньше другое насчитывал... Но можно уменьшить скорость передачи, засчет усреднения значений, и передачи уже усредненного значения. То есть берутся 4 значения, усредняются (или же фильтруются), и передается всего лишь одно усредненное значение. Итого, можно понизить скорость передачи в n раз. При этом реакция устройства ухудшится. Но в данном случае - это не так важно. Можно усреднять динамически - на малых оборотах не усреднять, а на высоких усреднять очень глубоко. И, действительно, интересует именно совместимость с разными устройствами.
Сообщение отредактировал Lost_Viking - Jan 20 2012, 22:26
|
|
|
|
|
Jan 31 2012, 16:05
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Несколько лет назад делал радиомодем с примерно похожими требованиями к скорости передачи и полосе пропускания: 1200/2400/4800 бод FSK и 9600 PI/4-QPSK в полосе 7кГц. Т.е. - поток данных с UART кодировался-модулировался и подавался на звуковой вход радиостанции с полосой 7кГц. Проект давно уже работает и продаётся. Так вот, чтобы вы примерно оценили требования к аппаратуре и ПО: я писал его на асме на TI-шном C5502. Никакой ARM7/ARM9 не потянул-бы требумое количество математики (уж не говоря о меге  На 9600 QPSK загрузка процессора составляла около 30% при непрерывном потоке данных полным дуплексом (при тактовой ==220МГц и работе только из внутренней ОЗУ). По стоимости комплектации примерно укладывается в ваши требования: кроме DSP остальное железо ерунда - кодек да гальваническая трансформаторная развязка, флешка I2C, имп.источник питания+несколько LDO и сторожевик. Кодек - на частоте 48000кГц. Ну и основные затраты конечно - уйма потраченного времени  Примерно на приёме был такой тракт (всё программно): полосовой КИХ-фильтр, DC-delete-фильтр, эквалайзер (для корректировки АЧХ тракта), передискретизатор (частота была не совсем 48000, а близкая к ней), далее - разбиваем на квадратуры (умножаем сигнал на sin и cos), далее - ФНЧ на каждую квадратуру и в конце - квадратурный демодулятор. Всё - половина работы по приёму выполнена  В этой точке получаем примерно то, что вы нарисовали на осциллограмме (для QPSK - две таких осциллограммы параллельно). Осталось только засинхронизироваться и преобразовать поток сэмплов в биты, а биты - в байты - это примерно еще половина работы приёмника (как оказалось - более сложная чем первая половина). Если это реализуете, то передатчик будет - плёвое дело, не забудьте только внести в передаваемый сигнал предискажения для корректировки АЧХ. Еще вам надо будет продумать предварительное кодирование, чтобы в передаваемых данных не было длинных последовательностей 0 или 1. А также защиту от ошибок (какой-нить CRC). Ну и канальный уровень протокола передачи. Да - и для дуплекса нужна 4-проводка, а по 2-проводке - только полудуплекс. Думаю - за годик командой при наличии свободного времени и желания можно уложиться  ИМХО: для вашей задачи больше подойдёт канал bluetooth если уж не хотите USB-COM за 200руб в бук воткнуть.
|
|
|
|
|
Feb 10 2012, 08:42
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Цитата(jcxz @ Jan 31 2012, 20:05)  Да - и для дуплекса нужна 4-проводка, а по 2-проводке - только полудуплекс. Думаю - за годик командой при наличии свободного времени и желания можно уложиться  ИМХО: для вашей задачи больше подойдёт канал bluetooth если уж не хотите USB-COM за 200руб в бук воткнуть. Спасибо за подробный ответ. Но мы остановились на манчестере. У нас пока нет задачи делать туда-сюда =)) Нам надо только с устройства в телефон передавать. После того, как мы еще раз все пересчитали, мы пришли к выводу, что нужно плясать от экрана. Точнее - от глаз. Мы делаем, грубо говоря, интерфейс для человека. По этому нам нужно всего лишь обеспечить поступленние пакетов с частотой 25Гц. Так как мы делаем под 4 цилиндра, то нужно нам 100Гц. 100Гц*8 = 800бит/сек, или 1600манчестер-бит в сек. Плюс старт/стопы. Ну и т.д. В общем, уже реализовали передачу. Друг пишет на андроиде прием. Если у кого есть соображения как старт/стоп (ну или разделитель между пакетами) лучше закодировать - буду рад их выслушать =) Да, и еще. На осциллограме на телефоне видно, что импульс, пройдя через все тракты телефона, имеет затянутый фронт и срез. Можно ли это дело математикой поправить? Это оффтопик, по этому киньте ссылку плиз. p.s. немного не в тему, но... нам надо еще находить экстремумы для каждого сигнала с каждого датчика. киньте ссылкой плиз, хотя бы в раздел, где обсуждается вся эта канитель.
Сообщение отредактировал Lost_Viking - Feb 10 2012, 08:45
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|