CyberVoice – для ARDUINO и не только
- Войдите на сайт для отправки комментариев
!!! это НЕ реклама !!! модули CyberVoice я НЕ продаю !!!
бороздя просторы интернета в поисках профильной информации, я наткнулся на сайт производителей этих модулей.
http://www.cybervoice.inf.ua/prod_16d.html
По описанию производителя в модуле записано 810 звуковых (речевых) сообщений в качестве 16 бит, 32 кГц . Посмотреть таблицу слов можно по ссылке.
http://www.cybervoice.inf.ua/doc/%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0%20WU02RU.pdf
Надеюсь услышать звуки в хорошем качестве…
Также на борту имеется усилитель мощностью 3 Вт, и все это питается напряжением 5 Вольт. Подробнее документацию можно посмотреть тут.
http://www.cybervoice.inf.ua/doc/Doc_5s.pdf
В общем, немного подумав и изучив выше приведенные мануалы, я заказал этот модуль. Через несколько дней получил конверт…
https://www.youtube.com/watch?v=82WQx3wSA0c
В мануале указано, что модуль можно проверить, используя терминальную программу, которая есть на сайте производителя. Схема подключения в инструкции есть, видео работы с терминалом есть на сайте…
https://www.youtube.com/watch?v=mqubPGE6gLM
Но самой программы НЕТ !!!
Пришлось связаться с производителем (ответили быстро) и получить эту программку… Теперь она есть у меня по ссылке.
https://drive.google.com/file/d/0B8MrxcpVmXk7SllNVWw4NXI1LVU/view?usp=sharing
Также производитель мне подтвердил, что можно не заморачиваться с приведенной схемой (паять транзисторный ключ) а можно просто использовать переходник USB UART.
+++++====+++++
Для примера решил сделать говорящие часы. Не бог весть, что, но понять, как работать с этим модулем вполне можно. Для начала, из перечня семплов модуля, выбрал необходимые и для удобства создал свою таблицу звуков.
В таблице сделал перевод значений в десятичные значения.
скетч выглядит так
#include <Wire.h> #include "RTClib.h" #include <LiquidCrystal_I2C.h> RTC_DS1307 rtc; char daysOfTheWeek[7][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; LiquidCrystal_I2C lcd(0x27,16,2); String String00 = ""; String String01 = ""; byte Sec, Min, Hrs, Day, Mnt; int Yer; byte vS0, vM0, vH0, vS1, vM1, vH1, Hv, Mv; boolean voise = true; boolean volume = true; byte db, vlm; void setup() { // DDRD = B11111000; // назначает выводы со 0 по 2 входными с 3 по 7 выходными // PORTD = B00000000; // устанавливает LOW на цифровых выводах с 0 по 7 DDRB = B000000; // назначает вывод с 8 по 13 входными PORTB = B111111; // устанавливает HIGH на выводах с 8 по 13 // DDRC = B000000; // назначает выводы с 14 по 19 входными // PORTC = B011111; // устанавливает HIGH на выводах с 14 по 19 (на 19 LOW) Serial.begin(9600); rtc.begin(); lcd.init(); lcd.backlight(); lcd.clear(); } void loop() { DateTime now = rtc.now(); Yer = now.year(); Mnt = now.month(); Day = now.day(); Hrs = now.hour(); Min = now.minute(); Sec = now.second(); String00 = ""; String00 += (" "); if (InRange(Hrs)) {String00 += ("0");} String00 += (Hrs); String00 += (":"); if (InRange(Min)) {String00 += ("0");} String00 += (Min); String00 += (":"); if (InRange(Sec)) {String00 += ("0");} String00 += (Sec); String01 = ""; if (InRange(Day)) {String01 += ("0");} String01 += (Day); String01 += ("."); if (InRange(Mnt)) {String01 += ("0");} String01 += (Mnt); String01 += ("."); String01 += (Yer); String01 += (" "); String01 += (daysOfTheWeek[now.dayOfTheWeek()]); LCDinf (); // если на Arduino 08 Ц ATmega pin 14/0 лог 0 if (((PINB&(1<<0)) == 0) && (voise == true)) { voise = false; delay(500); Voise (); } if (((PINB&(1<<0)) != 0) && (voise == false)) { voise = true; } // если на Arduino 09 Ц ATmega pin 15/1 лог 0 if (((PINB&(1<<1)) == 0) && (volume == true)) { volume = false; delay(500); Volume (); } if (((PINB&(1<<1)) != 0) && (volume == false)) { volume = true; } } void Volume () { if (db > 15) { db = 0; } if (db == 0) { vlm = 143; } if (db == 3) { vlm = 142; } if (db == 6) { vlm = 141; } if (db == 9) { vlm = 140; } if (db == 12) { vlm = 137; } if (db == 15) { vlm = 136; } delay(50); // ***** синхро байт Serial.write(85); // 55 delay (5); // ***** команда изменени¤ громкости Serial.write(vlm); delay (5); // ***** команда на завершение передачи Serial.write(0); delay (10); // Stop lcd.clear(); String00 = ""; String00 += (" volume -"); if (InRange(db)) {String00 += ("0");} String00 += (db); String00 += (" db"); String01 = ""; LCDinf (); delay (1500); lcd.clear(); db = db + 3; } void Voise () { // ********** число часов ********** Hv = 116; vH0 = Hrs; vS0 = 255; vH1 = 0; if (Hrs > 20) { vH0 = 20; vS0 = 0; vH1 = (Hrs - 20); } // ********** "„ј—ќ¬" ********** if (Hrs == 21) { Hv = 114; } if (Hrs == 23 || Hrs == 22 || (Hrs >= 2 && Hrs <= 4)) { Hv = 115; } // ********** число минут ********** Mv = 119; vM0 = Min; vS1 = 255; vM1 = 0; if (Min == 1) { vM0 = 37; } if (Min == 2) { vM0 = 39; } if (Min == 30) { vM0 = 21; } if (Min == 40) { vM0 = 22; } if (Min == 50) { vM0 = 23; } if (Min > 20 && Min < 30) { vM0 = 20; vS1 = 0; vM1 = (Min - 20); if (vM1 == 1) { vM1 = 37; Mv = 118; } if (vM1 == 2) { vM1 = 39; Mv = 118; } } if (Min > 30 && Min < 40) { vM0 = 21; vS1 = 0; vM1 = (Min - 30); if (vM1 == 1) { vM1 = 37; Mv = 117; } if (vM1 == 2) { vM1 = 39; Mv = 118;} } if (Min > 40 && Min < 50) { vM0 = 22; vS1 = 0; vM1 = (Min - 40); if (vM1 == 1) { vM1 = 37; Mv = 117; } if (vM1 == 2) { vM1 = 39; Mv = 118; } } if (Min > 50) { vM0 = 23; vS1 = 0; vM1 = (Min - 50); if (vM1 == 1) { vM1 = 37; Mv = 117; } if (vM1 == 2) { vM1 = 39; Mv = 118; } } // ********** "ћ»Ќ”“" ********** if ((Min == 1)) { Mv = 117; } if ((Min >= 2 && Min <= 4) || (vM1 == 3) || (vM1 == 4)) { Mv = 118; } // ************************************************** // ************************************************** // врем¤ vH0 vH1 часов vM0 vM1 минут = 7 семплов // ***** синхро байт Serial.write(85); // 55 delay (5); // ***** количество семплов дл¤ воспроизведени¤ Serial.write(7); // 07 delay (5); // Tbyte // "врем¤" Serial.write(1); delay (5); Serial.write(9); delay (5); // * часы * Serial.write(0); delay (5); Serial.write(vH0); delay (5); // * часы после 20 * Serial.write(vS0); delay (5); Serial.write(vH1); delay (5); // "часов" Serial.write(0); delay (5); Serial.write(Hv); delay (5); // * минуты * Serial.write(0); delay (5); Serial.write(vM0); delay (5); // * минуты после 20 * Serial.write(vS1); delay (5); Serial.write(vM1); delay (5); // "минут" Serial.write(0); delay (5); Serial.write(Mv); delay (5); // ***** команда на завершение передачи Serial.write(0); delay (10); // Stop voise = false; } void LCDinf () { lcd.setCursor(0,0); lcd.print(String00); lcd.setCursor(0,1); lcd.print(String01); String00 = ""; String01 = ""; } bool InRange(int value) { return (value >= 0) && (value < 10); }
Управляются часы двумя кнопками:
— запускает голосовое воспроизведение текущего времени (часы и минуты)
— устанавливает уровень громкости воспроизводимого сигнала (шесть значений)
Можно посмотреть, как это все работает:
https://www.youtube.com/watch?v=6ajYJ5Yk4kM
Это просто пример ! Кому нужны такие часы могут сами добавить в программу функции коррекции времени и будильник …
эх, найти бы набор этих слов файлами, может есть у кого?
эх, найти бы набор этих слов файлами, может есть у кого?
дык сам озвучь в гугле переводчике.
а чем писать? чет я усложняю, гугл помог))
Не знаю, но я выбрал этот модуль из-за "человеческого" голоса...
Синтезаторы уже надоели...