CyberVoice – для ARDUINO и не только

renoshnik
Offline
Зарегистрирован: 11.04.2013

!!!  это НЕ реклама  !!!  модули 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

 

Это просто пример ! Кому нужны такие часы могут сами добавить в программу функции коррекции времени и будильник …

access
Offline
Зарегистрирован: 10.05.2017

эх, найти бы набор этих слов файлами, может есть у кого?

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

access пишет:

эх, найти бы набор этих слов файлами, может есть у кого?

дык сам озвучь в гугле переводчике.

access
Offline
Зарегистрирован: 10.05.2017

а чем писать? чет я усложняю, гугл помог))

renoshnik
Offline
Зарегистрирован: 11.04.2013

Не знаю, но я выбрал этот модуль из-за "человеческого" голоса...

Синтезаторы уже надоели...