roboforum.ru

Технический форум по робототехнике.

Настольный ведроид

Наше хобби — конструировать и программировать.
Демонстрация готовых роботов и устройств построенных своими руками.

Настольный ведроид

Сообщение stigmaster » 12 фев 2013, 20:56

Всем привет!
Давно читаю этот форум, пишу впервые.
Разрешите похвастаться своей первой поделкой на МК:

Изображение

Видео девайса в действии:
http://www.facebook.com/photo.php?v=153183284836831

Корпус - купленная на e-bay фигурка Андроида (пустая), а электронную начинку делал уже я.
Внутри девайса микрофон с самопальным операционным усилителем, attiny85 с кое-какой обвязкой, пьезопищалка, светодиод и серва. Когда девайс слышит громкий звук, он вертит головой и пищит морзянкой "Android rocks". Питается всё это безобразие от USB - девайс стоит на работе рядом с компом, и веселит народ реакцией на чих и матюки :D

Софт писал в Arduino IDE, получилось очень просто и прозрачно (дико удивился, что она умеет компилить под разные AVR-ки). Прошивал тоже Ардуиной.

Идея, если честно, не моя - в качестве основы я скопип*здил этот проект: http://www.instructables.com/id/Mechani ... id-Figure/
В отличие от прототипа, в моём ведроиде используется attiny85, 1 светодиод вместо 5, и платки не макетные, а травленые (ЛУТ пока не удается, маркером рисовал). В целом, мой получился не таким навороченным, зато гораздо более простым в изготовлении.
stigmaster
 
Сообщения: 36
Зарегистрирован: 30 сен 2011, 01:18
Откуда: Рига
прог. языки: Java, C++, Processing

Re: Настольный ведроид

Сообщение Radist » 12 фев 2013, 21:37

Отличный проект! :good:
Мне понравился.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Настольный ведроид

Сообщение AndreW82 » 12 фев 2013, 22:55

Прикольно! :good:
Аватара пользователя
AndreW82
 
Сообщения: 170
Зарегистрирован: 14 ноя 2012, 21:30
Откуда: Моск. обл.

Re: Настольный ведроид

Сообщение MegaBIZON » 13 фев 2013, 01:03

Приккольная штучкадрючка! :)
типа такой "...хто сдесь!?!?!"
.............солнце светит, птички поют, я - зелёный бамбук меня тянет к солнцуЯ - зелёный бамбук, я - зелёный бамбук , меня тянет к солнцу. Я - не огурчик и не лягушка, я - зелёный бамбук. Меня курят...............
Аватара пользователя
MegaBIZON
 
Сообщения: 6285
Зарегистрирован: 12 янв 2007, 00:34
Откуда: Масква

Re: Настольный ведроид

Сообщение stigmaster » 14 фев 2013, 12:53

Спасибо за положительные отзывы :good:
Кстати, такой вопрос знатокам:
Существует ли в природе звуковое реле более простой конструкции, чем то, которое я наколхозил для этого дроида?
Схема:
Изображение
stigmaster
 
Сообщения: 36
Зарегистрирован: 30 сен 2011, 01:18
Откуда: Рига
прог. языки: Java, C++, Processing

Re: Настольный ведроид

Сообщение elmot » 14 фев 2013, 15:54

Микрофон можно завести на АЦП и обрабатывать все программно в МК. Бывают МК со встроенными ОУ, там вообще не проблема.
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Настольный ведроид

Сообщение stigmaster » 14 фев 2013, 16:43

Позвольте тупой вопрос:

AnalogRead() возвращает значения от 0 до 1023 (это, насколько я понял, из-за 10-битной разрядности АЦП), и эти значения соответственно связаны с интервалом 0-5 вольт на пине, с которого мы читаем, так?

Но ведь электретный микрофон без усилителя просто не будет создавать напруги, которую можно было бы обработать программно... Когда я пробовал тупо воткнуть микрофон в макетку, AnalogRead возвращала значения в ~30-40 единиц при полной тишине, 35-45, если в микрофон говорить с небольшого расстояния, и порядка 100, если в него резко подуть. На источники звука, находящиеся на расстоянии более 30 см, реакции не было вообще.

А вот про МК со встроенными ОУ, если можно, поподробнее. AVR-ки такие бывают?
stigmaster
 
Сообщения: 36
Зарегистрирован: 30 сен 2011, 01:18
Откуда: Рига
прог. языки: Java, C++, Processing

Re: Настольный ведроид

Сообщение elmot » 14 фев 2013, 16:50

AVR - не знаю. видел в доке на stm32f3
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Настольный ведроид

Сообщение Duhas » 15 фев 2013, 05:46

stigmaster писал(а):Позвольте тупой вопрос:

AnalogRead() возвращает значения от 0 до 1023 (это, насколько я понял, из-за 10-битной разрядности АЦП), и эти значения соответственно связаны с интервалом 0-5 вольт на пине, с которого мы читаем, так?... AVR-ки такие бывают?


вообще в АВР можно выбирать опорное напряжение. покопайтесь в настройках для аналог рид, если они существуют. дело в том что ардуино умеет меньше чем АВР )
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: Настольный ведроид

Сообщение Madf » 15 фев 2013, 12:52

Почитайте датащит к тиньке85: "2 Differential ADC Channel Pairs with Programmable Gain (1x, 20x)" + как сказали ранее, можно менять опорное напряжение.
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

Re: Настольный ведроид

Сообщение stigmaster » 15 фев 2013, 12:58

Спасибо, попробую на досуге :)
Если по дефолту там х1, то двадцатикратного усиления, по идее, должно хватить с головой.
stigmaster
 
Сообщения: 36
Зарегистрирован: 30 сен 2011, 01:18
Откуда: Рига
прог. языки: Java, C++, Processing

Re: Настольный ведроид

Сообщение elmot » 15 фев 2013, 15:45

stigmaster писал(а): AnalogRead возвращала значения в ~30-40 единиц при полной тишине,

Возможно надо поставить RC фильтр, чтобы изъять постоянную составляющую
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Настольный ведроид

Сообщение Duhas » 27 фев 2013, 06:17

точнее просто разделительный конденсатор...
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: Настольный ведроид

Сообщение elmot » 27 фев 2013, 09:55

ну типа того
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Настольный ведроид

Сообщение stigmaster » 07 июн 2013, 11:19

Наконец-то сподобился опробовать полученные тут советы касательно АЦП.
Пока что попробовал сделать следующее:

Сначала, не мудрствуя лукаво, подцепил микрофон прям на аналоговый вход Дуни. Вход притянул к земле. Результат УГ - в полной тишине serial monitor показывает значения в районе 600, на звуки не реагирует, на постукивание по микрофону реагирует еле-еле (в пределах 10 единиц).
Если я правильно понял, для начала нужно было попробовать аппаратно изъять эти 2 с фигом вольта (600 единиц на АЦП) перед тем, как заводить микрофон на вход.
Подключил микрофон, как показано на этой схеме (только C1 поставил керамический): Изображение
ОК, стал получать на мониторе значения в интервале примерно [0-10].
Нагуглил, что Ардуина позволяет менять опорное напряжение АЦП. Программно доступны 1.1 в, 2.5 в, и 5 в, так что установил 1.1 в.
Код анализа громкости:
Код: Выделить всёРазвернуть
const int sampleWindow = 50; // Sample window width in mS (50 mS = 20Hz)
unsigned int sample;

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


void loop()
{
   unsigned long startMillis= millis();  // Start of sample window
   unsigned int peakToPeak = 0;   // peak-to-peak level

   unsigned int signalMax = 0;
   unsigned int signalMin = 1024;

   // collect data for 50 mS
   while (millis() - startMillis < sampleWindow)
   {
      sample = analogRead(0);
      if (sample < 1024)  // toss out spurious readings
      {
         if (sample > signalMax)
         {
            signalMax = sample;  // save just the max levels
         }
         else if (sample < signalMin)
         {
            signalMin = sample;  // save just the min levels
         }
      }
   }
   peakToPeak = signalMax - signalMin;  // max - min = peak-peak amplitude
   double volts = (peakToPeak * 1.1) / 1024;  // convert to volts

   Serial.println(volts);
}


В итоге, при громких хлопках стал получать значения от 0 до 0.03 вольт (~0-30 единиц из 1024 на serial monitor, если не конвертить в вольты).
Проблема в том, что система вообще не реагирует на источники звука, находящиеся более чем в 2 метрах от неё, а на более близком растоянии реагирует только на очень громкие звуки. Короче, всё-таки, сигнал ещё слишком слаб, чтобы можно было говорить о нормальной программной обработке. Мне почему-то кажется, что и 20-кратное усиление АЦП, упомянутое выше, тут не поможет - усиливать надо раз эдак в 100.

Возможно,я где-то фундаментально накосячил - буду признателен, если ткнёте носом :)
stigmaster
 
Сообщения: 36
Зарегистрирован: 30 сен 2011, 01:18
Откуда: Рига
прог. языки: Java, C++, Processing

След.

Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10