Добрый день! Хочу сделать эхолот с визуализацией на базе маленького Arduino, подключаемого к портативному компьютеру. Технически это выглядит так - генерируем импульсы частотой 0.5 - 1 мгц и слушаем ответы. Хочу провести тест хотя бы в ванне с водой, так что запредельные мощности импульсов пока не нужны. Вопрос - можно ли средствами Arduino генерировать сигналы такой частоты? Насколько чувствительны его аналоговые входы и могут ли они работать с такой частотой (для прослушивания ответов)?
К сожалению, это не подходит - они уже использовали готовый эхолот, который работает сам по себе и просто выдает в порт данные измерений. Я же хочу сделать эхолот самостоятельно из двух пьезоизучателей и работать с ними напрямую... Как генерировать 1 мгц импульсы я уже нашел: http://forum.arduino.cc/index.php/topic,122065.0.html
Тогда импульсы будут идти постоянно, разве требуется именно это? Или нужно выдать импульс заданной длительности, а потом посчитать длительность отраженного импульса? Посмотрите примеры использования дальномера - может, там ответ?
Да, импульсы будут идти постоянно - один пьезоэлемент постоянно излучает эти зондирующие импульсы, а второй - слушает в паузах. Тут проблема в том, что подводные эхолоты работают на частотах несколько сотен килогерц (так принято, чтобы разрешающая способность была выше - рыбы и тому подобное), плюс скорость звука в воздухе примерно 400 метров в секунду, а в воде - примерно полтора километра. А обычные примеры с дальномерами не очень подходят, т.к. дальномеры в воздухе работают на частотах килогерц 40, скорость звука в несколько раз меньше и они обычно все вычисления проводят внутри себя. Т.е. нам нужно не только генерировать импульсы на частоте несколько сотен килогерц, но и оцифровывать аналоговый вход на такой же частоте и потом визуализировать.
C частотой импульсов 1Гц контроллер не успеет ничего сделать, у него тактовая всего 16МГц. Можете циклограмму сигналов нарисовать с желаемыми временами?
Могу так написать - скорость звука 1500 метров за секунду, т.е. 1.5 мм за миллисекунду. Давайте попробуем излучать тон 500 кгц в течение двух миллисекунд, уходить на паузу в 500 миллисекунд и повторять цикл излучения. В это же время другим пьезоэлемнтом слушаем все что происходит - начинаем слушать сразу же после окончания излучающего импульса и слушаем до начала следующего. Полученный сигнал отображаем в виде вертикальной полоски, где самый высокий принятый уровень будет самым ярким участком, а остальные - более тусклыми, там должно быть не менее 500 сэмплов. И так делаем до бесконечности. По сравнению с эхолотом Pulse тут все нужно делать быстрее примерно в 5 раз.
Излучать импульсы с желаемой частотой несложно. Только как их обрабатывать? Если выдать сразу пачку импульсов, всегда есть вероятность, что по дороге туда и обратно кто-то из них перегонит соседа и мы получим искаженную картинку. В моем понимании смысл эхолокации заключается в том, чтобы оценивать время, затраченное в пути каждым импульсом. Т.е. интервал выдачи импульсов должен быть не меньше времени, которое требуется на путешествие до самой отдаленной точки и обратно. Поправьте меня, если я понимаю неверно.
Все правильно, поэтому мы излучаем импульсы короткими всплесками, они короткие - за время излучения импульса звук успет пройти буквально несколько миллиметров. Затем мы слушаем достаточно длительное время, за которое импульс успеет отразиться от дна нашей ванны, уйти вверх и затухнуть. Полученные эхосигналы визуализируем, при этом мы не просто вычисляем время возврата импульса от дна тестовой ванны, а отображаем все артефакты - в воде может что-то плавать (рыбы, водоросли, мусор). Давайте чтобы не путаться, снизим скважность импульсов и будем излучать 10 раз в секунду, за это время звук в воде пройдет 150 метров и гаратнированно будет рассеян, так что помех от других импульсов не возникнет. Т.е. arduino может осуществлять сэмплирование своего аналогового входа раз в миллисекунду?
Только как тут поможет аналоговый вход? Импульс можно засечь и цифровым входом. Какие преимущества даст аналоговый? Тогда эти артефакты и будут "дном". Либо обратно придет двойной сигнал - отражение от дна и отражение от рыбы, например. Нет?
Аналоговый выход позволит получить градации уровня, ну например - дно у нас будет яркое, а плывущая рыба или водоросль - серая, т.к. они отражают хуже чем дно. А в случае цифрового у нас будет яркая линия - дно и над ней такая же яркая точка - рыба.
Кстати, вот тут пишут, что 10.000 сэмплов в секунду это слишком мало, можно осуществлять считывание гораздо чаще: http://forum.arduino.cc/index.php?topic=112819.0;wap2
для ATmega328: http://forum.amperka.ru/threads/Два-микрофона-Положение-диктора-в-пространстве.281/page-2 подробнее в даташите
Ужос, прости господи. Делают по сути софтовый ШИМ, но для дерганья пина используют digitalWrite. Спрашивается, зачем, если выше уже включили вывод таймера на пин со скважностью 9/255 и частотой МК. Вот дальше так и пишет некто Nick Gammon. Кстати, на днях восстанавливал тиньку45 подав на PB3 8МГц с другой тиньки45, на другой фьюз указал, выводить такт на ногу PB3. Интересно, если два таймера взять и одним несущую частоту формировать, а другим импульсы для эхолота формировать, включая выключая вывод на пин с первого таймера, а в цикле слушать эхо. Так может что то типа сонара выйти? Ведь по сути математики сложной не надо.
Так, допустим нам удалось сэмплировать данные с частотой 100 килогерц. При скорости звука 1.5 км в секунду (в воде) максимальное разрешение будет 1.5 сантиметра. Для эхолота вполне ок, но если в свободное от поисков рыбы время пытаться использовать девайс в качестве дефектоскопа - разрешения не хватит. Можно ли взять быстродействующий АЦП, им оцифровывать на 1 мегагерце и обрабатывать? Или arduino в принципе не позволит оперировать такими частотами?
Ардуино позволит, но ардуиновские либы без допила не позволят. В смысле надо тайммеры настраивать и отказываться от всяких digitalWrite и analogRead. Простой DDRB = _BV(PB4) и PORTB = _BV(PB4) | _BV(PB3) Гдето так. А АЦП если и после настроек не пройдет по скорости, то тогда внешнее искать, а это другие цены, похоже. А вообще что мешает на какой нить тиньке45 сделать сонар?
Вот тут интересный момент Т.е. разработчики ардуино установили частоту ADC для обеспечения максимально возможной точности преобразования.
А что такое тинька45? И кстати, бывают ли для арудин шилды с быстрыми ADC/DAC конвертерами? Есть же АЦП с подходящим быстродействием за 2 доллара: https://www.sparkfun.com/products/219
МК ATtiny45. Проще чем ATMega328P, которая на арудино уно, но тоже кое чего может. Вообще не надо искать ADC/DAC для ардуины. Надо просто искать ADC/DAC с нужными параметрами. Вот тут например гляньте уровень цен а АЦП и ЦАП. А то сейчас конденсатор сам по себе продают за 30 центов, е на платке с трехконтактным шнурочком и надписью Для ардуины за 3 бакса продают ЗЫ А по вашей ссылке вроде МК PIC а не ADC. Таки в ней 8 канальный АЦП, но это уже не тот глобус
Мне кажется все как-то усложняете. Я бы сделал так : 1. Прикидываем какая максимальная глубина водоема, допустим 150 метров, соответственно эти сто пятьдесят метров звук пройдет за 150/1500= 0.1 сек, 100 миллисекунд, это будет у нас переменная Interval, то есть интервал между импульсами. 2. Для отсчета времени используем переменную Millis(). 3. BeginPoint- переменная, в которой храниться время начала импульса, то есть когда мы "пикнули" в воду. 4. Делаем импульс, одновременно с этим запускаем счетчик, который будет использоваться для отображения, допустим на экране LCD. То есть на каждое прохождение цикла прибавляем единицу к переменной Depth (эта переменная будет у нас отображаться по оси Y на LCD экране), экран лучше брать с хорошим разрешением, чтобы по оси Y было больше точек, тогда красивей картина будет. 5. "Слушаем" импульсы. Пришел какой-то отраженный звук, его просто фиксируем в при каждом прохождении цикла, пока он (звук) будет слышен. Ставим точку на экране в тот момент, когда мы "слышим" отраженный звук. То есть если будет долгий импульс(то есть получается "пачка" отражений), то на экране будет небольшой столбик. 6. Слушаем дальше, при фиксировании звука делаем так же, как и в пункте 5. 7. Проверяем, если Millis()-BeginPoint > Interval (то есть с начала импульса до момента "сейчас" прошло более 100 миллисекунд), то возвращаемся к пункту 3 (то есть начинаем снова "излучать в эфир"), обнуляем счетчик глубины (Depth). , иначе возвращаемся к пункту 5 (слушаем дальше). Вроде как-то вот так ) Какие моменты не понятны, спрашивайте. з.ы. На Ардуино только начал осваиваться,дальше мигания диодом еще не ушел )))) просто раньше немножко программированием занимался.