arduino语音识别模拟键盘

博客分类: 技术 阅读次数: 🤔

arduino语音识别模拟键盘

show show

硬件准备

uno 接线方式①:用zener(齐纳稳压管), 使用2个1/2W以下3.6V的稳压管在D+ 和D-线上接线方式②:在5V BUS上串接2个二极管1N4148, 利用1N4148的压降,将电压从5V降到约3.6V
接线方式③:用LM1117将5V降到3.3V(不推荐)

四线USB

普通USB
红色为VCC正极接5V
黑线为负极接地DND
白线为Data- 负电压数据线 接上拉电阻1.5k ohm和68ohm
绿线为Data+ 正电压数据线接68ohm

arduino 接线电路图

| 语音模块 LD3320 |328P引脚 |Ardiuno 2560引脚 |leonardo | (AVR_ATmega32U4) |
MISO |···········D12 |···········D50 |···········D14 | MOSI |···········D11 |···········D51 |···········D16 |
SCK |···········D13 |···········D52 |···········D15 |
NSS |···········D4 |···········D4 | ···········D4 |
RS |···········D9 |···········D9 | ···········D9 |
IRQ |···········D2 |···········D2 |···········D2 |
WR |···········GND |···········GND |···········GND |

注意: 如果使用mega2560板,须先将ld3320.h文件中SPI pins部分进行修改 , 把10,11,12,13(默认为uno的SPI引脚),改为53,51,50,52(mega2560中的SPI引脚): // define software SPI pins /** SPI chip select pin */ uint8_t const LD_CHIP_SELECT_PIN = 53;//uno 10 /** SPI Master Out Slave In pin */ uint8_t const SPI_MOSI_PIN = 51;//uno 11; /** SPI Master In Slave Out pin */ uint8_t const SPI_MISO_PIN = 50;//uno 12; /** SPI Clock pin */ uint8_t const SPI_SCK_PIN =52;//uno 13; #endif // SOFTWARE_SPI

软件准备

arduino ide 搭建(请自行百度)
先下载ld3320 库文件,并复制到arduino的libraries文件夹下
LD3320库文件点这里
keyboard.h这个库文件一般IDE默认下载的实例里面有

硬件准备

LD3320 语音识别模块 如图

arduino leonardo(或者其他32u4芯片系列的arduino)
LED灯
面包板
杜邦线

接线

这边没有找到合适的图片所以文字表达,大家应该也ok吧
连接 LD3320 语音模块到arduino leonardo
3.3V – VCC
GND – GND
MISO – D12
MOSI – D11
SCK – D13
NSS – D4
RST – D9
IRQ – D2
WR – GND

语音识别模块测试

代码如下,烧录arduino leonardo

#include <ld3320.h>
 
VoiceRecognition Voice;                         //声明一个语音识别对象
 
#define Led 8                                   //定义LED控制引脚
 
void setup() 
{
    pinMode(Led,OUTPUT);                        //初始化LED引脚为输出模式
    digitalWrite(Led,LOW);                      //LED引脚低电平
     
    Voice.init();                               //初始化VoiceRecognition模块   
    Voice.addCommand("kai deng",0);             //添加指令,参数(指令内容,指令标签(可重复))
    Voice.addCommand("guan deng",1);            //添加指令,参数(指令内容,指令标签(可重复))
    Voice.start();//开始识别
}
void loop() {
  switch(Voice.read())                          //判断识别
  {
    case 0:                                     //若是指令“kai deng”
    digitalWrite(Led,HIGH);                 //点亮LED
        break;
    case 1:                                     //若是指令“guan deng”
    digitalWrite(Led,LOW);//熄灭LED
        break;   
    default:
        break;
  }
}  

以上代码测试
如果 开灯口令能点亮LED说明LD3320语音模块通了

keyboard.h模拟键盘

接下研究下KEYBORAD代码
arduino leonardo可以直接用arduino的keyboard实例
所谓keyboard库,功能就是将arduino 模拟成一个usb键盘。
Api如下

Keyboard.begin()
Keyboard.end()
Keyboard.press()
Keyboard.print()
Keyboard.println()
Keyboard.release()
Keyboard.releaseAll()
Keyboard.write() 

Keyboard. press (键值); 输入:键值

    Keyboard. press(‘A’);
    Keyboard. press(KEY_LEFT_GUI);//左win

实际输出: 模拟usb键盘上键值所对应按键被按下

Keyboard.release(键值) 输入:键值

    Keyboard.release(‘A’);
    Keyboard.release(KEY_LEFT_GUI);//左win

实际输出: 模拟usb键盘上键值所对应按键被松开

输入键值与按键的对应关系见键值表

PS:Keyboard. press()和Keyboard.release()请成对使用,防止出现按键被按下没有松开的情况

Keyboard.print(character);//模拟键盘敲出一个字符
Keyboard.print(characters);//模拟键盘敲出一串字符的过程

输入:字符或字符串

Keyboard.print(“A”);
Keyboard.print(“ABCDE”);

实际输出 模拟在usb键盘上敲出单个字符或字符串的过程

Keyboard.println(character)// 模拟键盘敲出一个字符并添加换行的过程
Keyboard.println(characters)// 模拟键盘敲出一串字符并添加换行的过程

实际输出
| 模拟在usb键盘上敲出单个字符或字符串并添加换行的过程

Keyboard.releaseAll()

实际输出:释放所有按键;

语音模拟键盘

#include <Keyboard.h>
#include <ld3320.h>
#include <PinMap.h>
VoiceRecognition Voice;  //声明一个语音识别对象
bool lastCapsLockState;
 
void setup() {
  // initialize control over the keyboard:
  Keyboard.begin();
  TIMSK0 = 0;
  Voice.init();                               //初始化VoiceRecognition模块
  //add fun
  Voice.noiseTime(0x10);
  Voice.voiceMaxLength(0x14);
  Voice.micVol(0x55);
 
  Voice.addCommand("zhuo mian", 0);            //添加指令,参数(指令内容,指令标签(可重复))
  Voice.addCommand("hong", 0);
  Voice.addCommand("tui chu", 1);
  Voice.addCommand("xia ye", 2);
  Voice.addCommand("shang qu", 3);
  Voice.addCommand("di bu", 4);
  Voice.addCommand("zui shang", 5);
  Voice.addCommand("liu lang qi", 6);
  Voice.addCommand("guan bi", 7);
  Voice.addCommand("xian shi", 8);
  Voice.addCommand("qie huan", 9);
  Voice.addCommand("shui jiao", 10);
  Voice.addCommand("fang da", 11);
  Voice.addCommand("bi ge", 11);
  Voice.addCommand("suo xiao", 12);
  Voice.addCommand("si mou", 12);
  Voice.addCommand("mi ma", 13);
  Voice.addCommand("en", 14);
  Voice.addCommand("oh", 14);
  Voice.addCommand("pi", 14);
  Voice.addCommand("kiu", 14);
  Voice.addCommand("wu", 14);
  Voice.addCommand("a", 14);
  Voice.addCommand("ei", 14);
  Voice.addCommand("si", 14);
  Voice.addCommand("jie suo", 15);
  Voice.start();//开始识别
}
 
void loop() {
  switch (Voice.read())                         //判断识别
  {
    case 0:                                     //若是指令“ei”
      Keyboard.press(KEY_LEFT_GUI);//左win
      Keyboard.press('d');
      break;
    case 1:                                     //若是指令“B”
      Keyboard.press(KEY_ESC);
      //Keyboard.print("You pressed the button ");
      //    Keyboard.print(counter);
      //    Keyboard.println(" times.");
      break;
    case 2:
      Keyboard.press(KEY_PAGE_DOWN);
      break;
    case 3:
      Keyboard.press(KEY_PAGE_UP);
      break;
    case 4:
      Keyboard.press(KEY_END);
      break;
    case 5:
      Keyboard.press(KEY_HOME);
      break;
    case 6:
      Keyboard.press(KEY_LEFT_GUI);//左alt
      Keyboard.press('2');
      break;
    case 7:
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press(KEY_F4);
      break;
    case 8:
      Keyboard.press('f');
      break;
    case 9:
      Keyboard.press(KEY_LEFT_ALT);//左alt
      Keyboard.press(KEY_TAB);
      break;
    case 10:
      Keyboard.press(KEY_LEFT_GUI);//左win
      delay(500);
      Keyboard.press('l');
      Keyboard.release(KEY_LEFT_GUI);
      Keyboard.release('l');
      break;
    case 11:
      Keyboard.press(KEY_RIGHT_CTRL);
      Keyboard.print('+');
      break;
    case 12:
      Keyboard.press(KEY_RIGHT_CTRL);
      Keyboard.print('-');
      break;
    case 13:
      Keyboard.println("12312311");
      break;
    case 14:
      ;
      break;
    case 15:
      Keyboard.press(KEY_RETURN);
      break;
    default:
      break;
      delayMicroseconds(20000);
  }
  Keyboard.releaseAll();
  Keyboard.end();//结束键盘通讯
}

下图语音操作对照


以上实例说明键盘和语音指令都是可以自由修改的
所以大家可以发挥下脑洞,我个人还完成了一个语音识别控制智能家居
大家也可以到我的github上fork star
github主页

参考

LD3320语音模块测试
arduino模拟键盘

联系方式

Any question connect me.
ccwanyuan2014@163.com
提issue

转载请注明

转载自chanjeff123.github.io