Помогите разобраться с WTV020M1 шилдом

DDL
Offline
Зарегистрирован: 17.10.2015

Приобретен шилд ( http://1mdl.ru/shop/arduino_ardino_1/modul_audio_wtv020m01_v1_00/ ) был для озвучивания проектов на ардуино. Но некак не пойму как им упровлять с помощью Ардуино. Алгоритм примерно такой: Пины А0-А5 задаются на считывание. Если на пине А0 лог 1 то проигрываем трек №1 если после лог 1 следует лог 0 то проигрываем трек №2. Ну и по аналогу на всех следующих пинах. Информацию по шилду нашел только упровление спомощью кнопок но это не подходит(((

Если кто работал с ним подскажите пожалуйсто)

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Это не шилд, а модуль.

Подключение:

SD-карта должна быть не более 2 Гб, отформатирована в FAT16.

Файлы (максимум 512 файлов) должны быть в формате AD4, битрейт предпочитетельно 32 кГц, называния файлов 0000.ad4, 0001.ad4, 0002.ad4 (как конвертировать, примеры файлов). WAV и MP3 модуль не воспроизводит.

Питание модуля должно быть 3,3 В, при питании от 5 В карта памяти сразу умирает, модуль после пары таких включений тоже умирает.
Если Arduino 5-вольтовая, то сигнальные линии также должны подключаться через резисторы 470 Ом - 1 кОм (на схеме не показаны).

Ссылка на библиотеку.

Мануал на модуль.

Скетч

/*
 Example: Control a WTV020-SD-16P module to play voices from an Arduino board.
 Created by Diego J. Arevalo, August 6th, 2012.
 Released into the public domain.
 */

#include <Wtv020sd16p.h>

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.

/*
Create an instance of the Wtv020sd16p class.
 1st parameter: Reset pin number.
 2nd parameter: Clock pin number.
 3rd parameter: Data pin number.
 4th parameter: Busy pin number.
 */
Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin);

void setup() {
  //Initializes the module.
  wtv020sd16p.reset();
}

void loop() {
  //Plays synchronously an audio file. Busy pin is used for this method.
  wtv020sd16p.playVoice(0);
  //Plays asynchronously an audio file.
  wtv020sd16p.asyncPlayVoice(1);
  //Plays audio file number 1 during 2 seconds.
  delay(5000);
  //Pauses audio file number 1 during 2 seconds.  
  wtv020sd16p.pauseVoice();
  delay(5000);
  //Resumes audio file number 1 during 2 seconds.
  wtv020sd16p.pauseVoice();
  delay(5000);  
  //Stops current audio file playing.
  wtv020sd16p.stopVoice();
  //Plays synchronously an audio file. Busy pin is used for this method.  
  wtv020sd16p.asyncPlayVoice(2);
  delay(2000);   
  //Mutes audio file number 2 during 2 seconds.
  wtv020sd16p.mute();
  delay(2000);
  //Unmutes audio file number 2 during 2 seconds.
  wtv020sd16p.unmute();
  delay(2000);    
  //Stops current audio file playing.
  wtv020sd16p.stopVoice();
}

 

DDL
Offline
Зарегистрирован: 17.10.2015

Спасибо огромное!!!

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Гугл знает всё... ;)

DDL
Offline
Зарегистрирован: 17.10.2015

Небольшая опечатка в схеме(  7-ой и 10-й пины на модуле

DDL
Offline
Зарегистрирован: 17.10.2015

Собрал по схемке и загрузил библиотеку. Чудо динамик ожил поёт))) Как бы теперь запелить чтобы воспроизводился нужный трек по определённому действию?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

хех, вы ждете готового решения?

DDL
Offline
Зарегистрирован: 17.10.2015

Я с функциями не очень дружу(( Натолкните немного с чего начать. Примерно понемаю что нужно мониторить порты и на каком есть изменение тот трек и запускать. Но как ето записать пока незнаю(

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DDL пишет:

Я с функциями не очень дружу(( Натолкните немного с чего начать. Примерно понемаю что нужно мониторить порты и на каком есть изменение тот трек и запускать. Но как ето записать пока незнаю(

Начните с этого: http://people.toiit.sgu.ru/Sinelnikov/PT/C/Kern_Ritch.pdf

И с функциями подружитесь и как записать будете знать. 

DDL
Offline
Зарегистрирован: 17.10.2015

Спасибо) Литература действительно достойная. Будем изучать))

DDL
Offline
Зарегистрирован: 17.10.2015

Можете подсказать где порописать wtv020sd16p.asyncPlayVoice(5); что-бы проиграло трек 1 раз после включения ардуинки?

#include <Wtv020sd16p.h>

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.

Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin);

void setup() {
  //Initializes the module.
  wtv020sd16p.reset();
}

void loop() {
  wtv020sd16p.asyncPlayVoice(5);
  delay(5000);

По этому наброску трек с номером 0005.ad4 играется в цикле.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

строки 16-17 перенести после 12-й.

DDL
Offline
Зарегистрирован: 17.10.2015

Я сразу так и написал(( но тогда вообще не чего не происходит (молчит совсем).

Araris
Offline
Зарегистрирован: 09.11.2012

После ресета попробуйте секундную паузу сделать.

DDL
Offline
Зарегистрирован: 17.10.2015

Araris пишет:

После ресета попробуйте секундную паузу сделать.

Спасибо))) Пауза помогла) А то я сломал уже всю голову и сьел две плитки шоколада)

windows31
Offline
Зарегистрирован: 26.01.2016

Помогите, собрал по такой схеме 

При воспроизведении светодиод гаснет, в динамике какой то ели слышимый шум, голоса нет. Что может быть? 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

какие характеристики динамика? Файлы правильно сконвертировал в AD4?

windows31
Offline
Зарегистрирован: 26.01.2016

динамик 4 ома 3 вата, файл в AD4, у другого человека этот файл воспроизводится

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

Скетч бы еще не помешал.

У меня на некоторых уровнях громкости тоже хрипит.
И както 4ом 3вт мне кажется жестоко, попробуйте динамик сменить на менее мощьный.
у меня наушник обычный подсоединен 16 ом

windows31
Offline
Зарегистрирован: 26.01.2016
#include "DHT.h"//библиотека для работы датчика температуры и влажности
#define DHTPIN 6  //датчик подключен к пину 6
#define DHTTYPE DHT11 //тип датчика
#include <Wtv020sd16p.h> //библиотека работы модуля WTV020
 
int resetPin = 7; //подключение ножки сброса модуля к пину 7
int clockPin = 8; //подключение ножки тактового сигнала модуля к пину 8
int dataPin = 5;  //подключение информационного вывода модуля к пину 5
int busyPin = 4;  //подключение вывода "занятости" модуля к пину 4
Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin); //объявляем модулю, куда что подключили
int info;        //переменная для записи пришедшего в Serial-порт значения
DHT dht(DHTPIN, DHTTYPE);   //внутренняя функция библиотеки DHT в которую указывается тип и пин подключения датчика
 
void setup() {             //функция начальной настройки микроконтроллера (вызывается едноразово, при подаче питания)
  Serial.begin(9600);      //инициализируем Serial порт на работу со скоростью 9600 бод
  dht.begin();             //инициализируем датчик DHT22
  wtv020sd16p.reset();     //перед работой с модулем WTV020, его необходимо "сбросить"
 
void loop() {                          //циклическая функция
  if(Serial.available() > 0){          //если что-то пришло в Serial-порт
    info = Serial.parseInt();          //то записать это значение в переменную info
    switch(info){                      //проверяем содержимое info
      case 1:                          //если пришел код 1
        int temperature = dht.readTemperature(); //то записать в temperature значение температуры
        int humidity = dht.readHumidity();       //записать в humidity значениие влажности
        Serial.println(temperature);             //вывод значения температуры в Serial    
        Serial.println(humidity);                //вывод значения влажности в Serial
        temperature = temperature + 90;          //записи температурных значений (0-49 С) начинаются с 91го файла, поэтому прибавляем к значению температуры 90
        humidity = humidity - 5;                 //записи значений влажности (10-94%) начинаются с 5го файла, поэтому вычитаем от значения влажности 5
       /*
       Пример: Температура 2 градуса. Файл с записанным значением находится под номером 92.
       Что бы после обратиться к файлу 92, проведем операцию:
       temperature = temperature + 90;
       92 = 90 + 2;
       В результате переменная temperature будет равна 92
       */
        wtv020sd16p.playVoice(4);              //воспроизвести файл №4 с записью "информация с датчиков"
        delay(1900);                           //ждем 1,9 сек для воспроизведения*
        wtv020sd16p.playVoice(15);    //воспроизвести файл №temperature
        delay(10);                             //ждем 10 мс для воспроизведения*
        wtv020sd16p.playVoice(humidity);       //воспроизвести файл №humidity
        /* - задержки подобраны опытным путем, поскольку модуль при воспроизведении должен использовать
        выход busy, но, иногда, по неизвестным причинам, не делает этого (возможно мне просто попался такой модуль)*/
        delay(100); 
      break;   
    }         //скобка закрытия switch
  }           //скобка закрытия проверки Serial-порта
}             //закрытие циклической функции loop
Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

windows31 пишет:

#include "DHT.h"//библиотека для работы датчика температуры и влажности
#define DHTPIN 6  //датчик подключен к пину 6
#define DHTTYPE DHT11 //тип датчика
#include <Wtv020sd16p.h> //библиотека работы модуля WTV020

int resetPin = 7; //подключение ножки сброса модуля к пину 7
int clockPin = 8; //подключение ножки тактового сигнала модуля к пину 8
int dataPin = 5;  //подключение информационного вывода модуля к пину 5
int busyPin = 4;  //подключение вывода "занятости" модуля к пину 4
Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin); //объявляем модулю, куда что подключили
int info;        //переменная для записи пришедшего в Serial-порт значения
DHT dht(DHTPIN, DHTTYPE);   //внутренняя функция библиотеки DHT в которую указывается тип и пин подключения датчика

void setup() {             //функция начальной настройки микроконтроллера (вызывается едноразово, при подаче питания)
  Serial.begin(9600);      //инициализируем Serial порт на работу со скоростью 9600 бод
  dht.begin();             //инициализируем датчик DHT22
  wtv020sd16p.reset();     //перед работой с модулем WTV020, его необходимо "сбросить"
} 

void loop() {                          //циклическая функция
  if(Serial.available() > 0){          //если что-то пришло в Serial-порт
    info = Serial.parseInt();          //то записать это значение в переменную info
    switch(info){                      //проверяем содержимое info
      case 1:                          //если пришел код 1
        int temperature = dht.readTemperature(); //то записать в temperature значение температуры
        int humidity = dht.readHumidity();       //записать в humidity значениие влажности
        Serial.println(temperature);             //вывод значения температуры в Serial    
        Serial.println(humidity);                //вывод значения влажности в Serial
        temperature = temperature + 90;          //записи температурных значений (0-49 С) начинаются с 91го файла, поэтому прибавляем к значению температуры 90
        humidity = humidity - 5;                 //записи значений влажности (10-94%) начинаются с 5го файла, поэтому вычитаем от значения влажности 5
       /*
       Пример: Температура 2 градуса. Файл с записанным значением находится под номером 92.
       Что бы после обратиться к файлу 92, проведем операцию:
       temperature = temperature + 90;
       92 = 90 + 2;
       В результате переменная temperature будет равна 92
       */
        wtv020sd16p.playVoice(4);              //воспроизвести файл №4 с записью "информация с датчиков"
        delay(1900);                           //ждем 1,9 сек для воспроизведения*
        wtv020sd16p.playVoice(15);    //воспроизвести файл №temperature
        delay(10);                             //ждем 10 мс для воспроизведения*
        wtv020sd16p.playVoice(humidity);       //воспроизвести файл №humidity
        /* - задержки подобраны опытным путем, поскольку модуль при воспроизведении должен использовать
        выход busy, но, иногда, по неизвестным причинам, не делает этого (возможно мне просто попался такой модуль)*/
        delay(100); 
      break;   
    }         //скобка закрытия switch
  }           //скобка закрытия проверки Serial-порта
}             //закрытие циклической функции loop

 

 

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

А по хрипу, попробуйте всетаки динамик менее мощный.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

убери все, что не относится к звуковому модулю и прверь.

windows31
Offline
Зарегистрирован: 26.01.2016

Все то же самое, небольшой писк в начале и шипение, это все ели слышно

Afftar
Offline
Зарегистрирован: 21.05.2016

Tomasina пишет:

Питание модуля должно быть 3,3 В, при питании от 5 В карта памяти сразу умирает, модуль после пары таких включений тоже умирает.
Если Arduino 5-вольтовая, то сигнальные линии также должны подключаться через резисторы 470 Ом - 1 кОм (на схеме не показаны).

 

Подскажите пожалуйста, сигнальные линии - это все что из ардуины выходят, кроме питания и земли? 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Да

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DDL пишет:

всю голову и сьел две плитки шоколада)

Ничего себе, как жизнь-то поменялась! Мы как-то пивом обходились :)

Afftar
Offline
Зарегистрирован: 21.05.2016

Добрый день.

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

Я думал сделать проверку того что трек играет, но не нашёл такой функции в библиотеке(

#include <Wtv020sd16p.h>

int resetPin = 3;  // The pin number of the reset pin.
int clockPin = 4;  // The pin number of the clock pin.
int dataPin = 5;  // The pin number of the data pin.
int busyPin = 6;  // The pin number of the busy pin.
int photocellPin = A1; // сенсор и понижающий резистор на 10 кОм подключены к a1
int photocellReading; // данные считываемые с аналогового пина
 
Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin);
 
void setup() {
  //Initializes the module.
  wtv020sd16p.reset();
}
void loop() {
  
photocellReading = analogRead(photocellPin);

Serial.print("Analog reading = ");

Serial.print(photocellReading); // аналоговые значения

 if (photocellReading < 800) {

Serial.println(" - Bright");
wtv020sd16p.stopVoice();

} else {

Serial.println(" - Very bright");
//wtv020sd16p.asyncPlayVoice(1);
}

delay(1000);

}

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

светодиод во время трека горит/гаснет? Если да, то можно сигнал с 15 вывода считывать - это и будет индикатор воспроизведения - как погас - значит сразу делаем stopVoice.

По второй хотелке аналогично - stopVoice если превышен заданный порог.

Afftar
Offline
Зарегистрирован: 21.05.2016

к сожалению светодиод никак не реагирует на треки(

 

Afftar
Offline
Зарегистрирован: 21.05.2016

Разобрался. Реально чото запупил)

Ввел переменную х и состояние сохранял в нее 

#include <Wtv020sd16p.h>

int resetPin = 3;  // The pin number of the reset pin.
int clockPin = 4;  // The pin number of the clock pin.
int dataPin = 5;  // The pin number of the data pin.
int busyPin = 6;  // The pin number of the busy pin.
int photocellPin = A1; // сенсор и понижающий резистор на 10 кОм подключены к a0
int photocellReading; // данные считываемые с аналогового пина
int x = 0;
Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin);
 
void setup() {
  //Initializes the module.
  wtv020sd16p.reset();
}
void loop() {
  
photocellReading = analogRead(photocellPin);

Serial.print("Analog reading = ");

Serial.print(photocellReading); // аналоговые значения

 if (photocellReading < 800) {

Serial.println(" - Bright");
Serial.println(x);
wtv020sd16p.stopVoice();
x = 0;
} else { 
  if ( x == 0) {
Serial.println(" - Very bright");
Serial.println(x);
wtv020sd16p.asyncPlayVoice(2);
x = 1;
  } else  {
    Serial.println(" - Very busy");
    Serial.println(x);
    }
  }

delay(1000);

}

 

std
Offline
Зарегистрирован: 05.01.2012

Что за чудо SD карта если не секрет, что прочиталась этой тварью? :)

У меня их было сцуко 5 (пять, Карл!), и ни одна не алё. Флешки к ним с того же магазина 128 М, специально под них. Питание 3.3. Сигналы 3.3. И всё им побоку, что с кнопок, что по его подобию Serial. Пришлось уходить в самопальные проекты вроде TMRh20PCM.

Afftar
Offline
Зарегистрирован: 21.05.2016

ну я его запустил с третьего подхода, но честно говоря ардуина китайская вся так пускается)))

у меня 2 Gb Silicon Power - достал из старого филипса)

больше такую лажу не куплю)

Salomon
Offline
Зарегистрирован: 29.10.2016

Господа, приветствую!

Есть крайне неприятная неприятность, в моем случае все воспроизводится, звук шикарный , всё супер-кроме одного!!

Задача проста как апельсин-нажали кнопку-один трек, отпустили-переключился на другой, но не сразу , а доигрывает, asyncPlayVoice(2) работать категорически отказывается, stopVoice() туда же-никак не реагирует(

работает только playVoice( игрался целый вечер с delay-результата нуль

может кто сталкивался, помогите советом(