ITСooky

IT-рецепты съедобные и не очень!

Автоматизированный, роботизированный мобиль со своими песнями на Arduino!

дата 01.05.2016

Первый мобиль появился в Советском Союзе в конце 70-ых, и сразу снялся в фильме «Служебный роман» вот он на 26-ой минуте www.youtube.com/watch?v=cmylNwnR9qQ&t=26m4s потом его основательно подзабыли и вновь он появился, но уже в качестве аксессуара для детской кроватки.

itcooky_mobil_arduino_001

В магазинах продаются в основном аналоговые мобили движимые силой пружины, заводимые и запускаемые вручную. Есть электрические, но тоже запускаемые вручную и ограниченные в плане мелодий. Так что будем собирать мобиль, который активируется на плачь, сам крутить, сам играет какие хочешь мелодии и выключается ночью (тоже сам)!

Потребуется купить следующею — перечисляю и сразу разъясняю как с эти работать

Mp3 плеер — брал в от это за 184 рубля U-диск аудио воспроизведения микро-sd-карта mp3-аудиосистема мини модуль для пик для Arduino WTV020-SD-16P
Сразу надо сказать что Mp3 он играть не умеет.
itcooky_mobil_arduino_002
У него есть ряд серьезных, но устранимых недостаков:
— Играет только файлы какого-то экзотического формата AD4, есть конвертер скачать можно тут http://avrproject.ru/chasy-budilnik/USBRecordingNbk1.3.0.zip файлы надо называть 001 и так далее! А вот билиотека adatum.ru/podklyuchenie-muzykalnogo-modulya-s-sd-flash-kartoj-wtv020m01-k-arduino.html
— Нет настроек громкости, пробовал ставить резисторы, но проще готовить файлы нужно громкости в бесплатном аудио редакторе Audacity
— Дурацкие разъемы, в которых не держаться провода — заматал скотчем чтобы не выскакивали
— Карта памяти только на 2Gb, не проверял, к счастью была одна на 2Gb — они кстати уже не продаются!!! Карта должна быть отформатирована в FAT (а не в FAT32)!!!
itcooky_mobil_arduino_007

Двигатель и драйвер — брал сразу 5 штук за 684 рубля вот этих 5 шт. 5 В 28BYJ-48 шаговый двигатель + ULN2003 шагового двигателя модуля тест совета.
itcooky_mobil_arduino_003
Уже когда начал настраивать появились опасения что двигатель не сможет работать одновременно с mp3-плеером, что надо было брать более крутой драйвер — но нет все работает на альтернативной прошивке вот тут она в статье есть www.airspayce.com/mikem/arduino/AccelStepper/index.html

Сенсор света — аналоговый дешевый!
itcooky_mobil_arduino_004
Вообще можно было о них не писать, но они аналоговые — значит каждый надо калибровать.

Нет все таки надо пару слов написать. Эти photocell сильно отличаются по чувствительности, конкретно этот GL5539 какой то фиговый для темноты. Поставил сопротивление 100К (было 10К), шкала примерно в 5 раз увеличилась и стало легче настраивать на нужную темноту

Колонки — у меня валялись две пищалки(8 ом на 0.5w и 1w) от писишного корпуса — послушал их понравилась та что тяжелее!
itcooky_mobil_arduino_005
Отлично она вошла в крышку пищевого контейнера, сверху прикрыл её решеткой от кулира и пару слоев тряпок для протирания, удачно совпали по цвету с контейнером. Тут приглушил чуть звук положив бумагу в слои.

Датчик звука — брал вот этот за 94 рубля Звуковой детектор модуля тут кстати продаются шикарные черные ардуины, только вот посылке не всегда доходят из 3-х мне дошли 2 — деньги вернули!
itcooky_mobil_arduino_006
На датчике есть аналоговый и цифровой выход, использую аналоговый настроенный отверткой — он срабатывает на звук есть или нет!

И еще нужны:
— дюбиля для опор
— болты и гайки M3
— мини макетка (не стал паять)
— Arduino Uno R3
— резистор 100К
— два крючка шурупа

Схема
itcooky_mobil_arduino_008

Вот так все выглядит в сборе
itcooky_mobil_arduino_009

Удалось все воткнуть в одну макетку
itcooky_mobil_arduino_010

Трудне всего пришлось с крепежом мотора… вот так это у меня выглядит
itcooky_mobil_arduino_011

Весит все на крючке, место крепления выбрано чтобы ровно висел(угадал со второго раза). Еще заметил что если пиать все от порта питания ардуино то она греется, поэтому питаю от зарядки USB.
itcooky_mobil_arduino_012

Код

#include <AccelStepper.h>
#include <Wtv020sd16p.h>
#include <EEPROM.h>
 
// n - number of songs to play
int n = 5; 
// nos - number of songs in playlist
int nos = 30; 
int resetPin = 2;  // The pin number of the reset pin.
int clockPin = 3;  // The pin number of the clock pin.
int dataPin = 4;  // The pin number of the data pin.
int busyPin = 5;  // The pin number of the busy pin.
const int IN1 = 6;
const int IN2 = 8;
const int IN3 = 7;
const int IN4 = 9; 
int s = 0; 
int v = 0; 
int r = 1;
int music = nos;
int t = 10000;
int al = 30;
unsigned long m = t;
int soundDetectedPin = 10;
//light
int lt = 5;
const int pl = A0;
int raw = 0;
boolean day = true;
//const int stepsPerRevolution = 2048; // шагов за один оборот
 
//Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4); 
AccelStepper stepper (8, IN1, IN2, IN3, IN4);
 
Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin);
  
void setup() {
  wtv020sd16p.reset();
   stepper.setMaxSpeed(1000);
   stepper.setSpeed(500);        
//Serial.begin(9600);  
  pinMode (soundDetectedPin, INPUT) ;
delay(3000);
byte xx[] = {EEPROM.read(1), EEPROM.read(2)};
int *y = (int *)&xx;
music = y[0];
}
  
void loop() {
  raw = analogRead( pl );
   
if (raw < lt) {
 day = false;
v = 0;
s = 0;
}  
 
if (raw > lt) {
 day = true;
} 
//Serial.println(raw);   
//Serial.println(v);
//Serial.println(digitalRead (soundDetectedPin)); 

  if ((digitalRead (soundDetectedPin) == 1) && (day == true)) {
  v = v + 1;
  delay(150);
}
 
if ((millis() - m > t) && (s == 0) && (day == true)) {
if (v > al) {
s = n;} 
v = 0;
m =  millis();
}  
   
   
if ((s > 0) && (day == true)) { 
  r = random(1,3);
music = music + r;

  if (music > nos) {
    music = 1;
  }
//Serial.println(music);   
 
wtv020sd16p.asyncPlayVoice(music);
 
  delay(15);
  while (digitalRead(busyPin) == HIGH) {
   stepper.runSpeed();
  }
  delay(10);
  s = s - 1;
 byte *x = (byte *)&music;
EEPROM.write(1, x[0]);
EEPROM.write(2, x[1]);
}
 
}

n — количество песен играющихся за один раз
nos — сколько всего песен
lt — порог света, ниже которого следующая песня играть не будет, вот с этим осторожно — надо тестировать на месте, помоему еще и от питания зависит
t — время через которое проверяется количество срабатывание звукового датчика
al — максимальное число после которого начинается играть музыка

Номер последней композиции пишется в память, даже после потери питания начинает играться от неё.
Песни как бы играются случайно — но генератор случайных чисел работает очень плохо, поэтому играется последня плюс 1,2 или 3. Если число больше nos играется 1!

Видео как это работает!

UPD: Все таки у аудио модуля плохие ножки, держатся только в макетке, её и засунул внутрь!
itcooky_mobil_arduino_013

Хотел сделать из всего модуль с коннекторами, но что-то пошло не так — звук идет, мотор включается но через пару секунд(по разному) Ардуино перезагружается… видимо самопайный модуль жрет мощность которой не хватает под нагрузкой… эх…
itcooky_mobil_arduino_014