13354浏览
查看: 13354|回复: 17

[项目] 【转载】基于arduino 控制的语音控制调节台灯

[复制链接]
本帖最后由 大连林海 于 2015-2-8 09:40 编辑

语音控制调节台灯实现了全语音控制,它可以根据不同的语音命令作出开关和不同的动作,我们的台灯可以完成上、下、左、右、开、关、摇头、点头、跳舞的动作。其次,为了实现台灯的功能我们需要机械臂,一个Arduino控制板,一个扩展板,一个语音控制模块,一个升压模块,一个LED灯和电池。最后就是将这些零零散散的东西组装起来并编写程序,反复调试,直至它可以根据我们的命令准确无误的完成各种动作。

硬件完成的总效果图



换个角度

霸气的灯头部分

使用的是DFROBORT的mega1280和语音控制模块,最上面是V5扩展模块

使用的升压模块,给12V的LED供电

关灯后~

测试实际使用时的照明效果

一个比较“销魂”的角度

最后是程序源代码~
  1. #include "Voice.h" //申明语音识别库文件
  2. #include"Servo.h"
  3. Servo servo1;    //duoji1
  4. Servo servo2;    //duoji2
  5. Servo servo3;    //duoji3
  6. #define SUM 28 //定义待识别的单词数量
  7. uint8 nAsrStatus=0; //申明语音模块工作状态
  8. int ledPin=6;
  9. int power1=20;
  10. int power2=20;
  11. int a=70,b=70,c=100;
  12. char sRecog[SUM][80] =    //定义识别单词“拼音”内容的数组
  13. {"qian","hou","zuo","you","shang","xia","kai","kaideng","fuwei","guan","guandeng","yi","er","san"};
  14. char flag;//定义向上位机发送字符命令的变量
  15. //根据单词数组的元素号,执行相应命令
  16. void finally (unsigned char n)
  17. {
  18. switch(n)
  19. {
  20. case 0:
  21. b=b+power1;
  22. c=c+power1;
  23. if(b<145)
  24. servo2.write(b);//前进
  25. else
  26. servo2.write(b=b-power1);
  27. if(c>50)
  28. servo3.write(c);
  29. else
  30. servo3.write(c=c-power1);
  31. break;
  32. case 1:
  33. b=b-power1;
  34. c=c-power1;
  35. if(b>20)
  36. servo2.write(b); //后退
  37. else
  38. servo2.write(b=b+power1);
  39. if(c<160)
  40. servo3.write(c);
  41. else
  42. servo3.write(c=c+power1);
  43. break;
  44. case 2:
  45. a=a-power2;
  46. if(a>0)
  47. servo1.write(a=a); //左转
  48. else
  49. servo1.write(a=a+power2);
  50. break;
  51. case 3:
  52. a=a+power2;
  53. if(a<150)
  54. servo1.write(a); //右转
  55. else
  56. servo1.write(a=a-power2);
  57. break;
  58. case 4:
  59. c=c+power1;
  60. if(c<160)
  61. servo3.write(c);//起
  62. else
  63. servo3.write(c=c-power1);
  64. break;
  65. case 5:
  66. c=c-power1;
  67. if(c>50)
  68. servo3.write(c);//xia
  69. else
  70. servo3.write(c=c+power1);
  71. break;
  72. case 6:
  73. servo1.write(a=70);//Begin
  74. servo2.write(b=70);
  75. servo3.write(c=100);
  76. digitalWrite(ledPin, HIGH);   // sets the LED on
  77. break;
  78. case 7:
  79. servo1.write(a=70);//Begin
  80. servo2.write(b=70);
  81. servo3.write(c=100);
  82. digitalWrite(ledPin, HIGH);   // sets the LED on
  83. break;
  84. case 8:
  85. servo1.write(a=70);//Begin
  86. servo2.write(b=70);
  87. servo3.write(c=100);
  88. digitalWrite(ledPin, HIGH);   // sets the LED on
  89. break;
  90. case 9:
  91. servo1.write(a=70); //停止
  92. servo2.write(b=30);
  93. servo3.write(c=50);
  94. digitalWrite(ledPin, LOW);    // sets the LED off
  95. break;
  96. case 10:
  97. servo1.write(a=70); //停止
  98. servo2.write(b=30);
  99. servo3.write(c=50);
  100. digitalWrite(ledPin, LOW);    // sets the LED off
  101. break;
  102. case 11:     //jiangnanSTYLE
  103. servo1.write(a=70);
  104. servo2.write(b=70);
  105. servo3.write(c=100);
  106. for(int j=0;j<5;j++)
  107. {
  108.   digitalWrite(ledPin, HIGH);   // sets the LED on
  109.   delay(1000);
  110.   digitalWrite(ledPin,LOW);   // sets the LED off
  111.   delay(1000);
  112. }
  113. digitalWrite(ledPin, HIGH);   // sets the LED on
  114. for(a;a>=30;a=a-5)
  115. {
  116.   servo1.write(a);
  117.   delay(100);
  118. }
  119. delay(1000);
  120. for(int i=0;i<3;i++)
  121. {
  122.   for(c;c<115;c=c+5)
  123.   {
  124.     servo3.write(c);
  125.     delay(100);
  126.   }
  127.   for(c;c>85;c=c-5)
  128.   {
  129.     servo3.write(c);
  130.     delay(100);
  131.   }
  132. }
  133. delay(500);
  134. for(a;a<=120;a=a+5)
  135. {
  136.   servo1.write(a);
  137.   delay(100);
  138. }
  139. delay(1000);
  140. for(int i=0;i<3;i++)
  141. {
  142.   for(c;c<115;c=c+5)
  143.   {
  144.     servo3.write(c);
  145.     delay(100);
  146.   }
  147.   for(c;c>85;c=c-5)
  148.   {
  149.     servo3.write(c);
  150.     delay(100);
  151.   }
  152. }
  153. servo1.write(a=70);
  154. servo2.write(b=70);
  155. servo3.write(c=100);
  156. for(int i=0;i<5;i++)
  157. {
  158.   for(b,c;b<105;b=b+5,c=c+7)
  159.   {
  160.     servo2.write(b);
  161.     servo3.write(c);
  162.     digitalWrite(ledPin, HIGH);   // sets the LED on
  163.     delay(50);
  164.     digitalWrite(ledPin, LOW);    // sets the LED off
  165.     delay(50);
  166.   }
  167.   for(b,c;b>55;b=b-5,c=c-7)
  168.   {
  169.     servo2.write(b);
  170.     servo3.write(c);
  171.     digitalWrite(ledPin, HIGH);   // sets the LED on
  172.     delay(50);
  173.     digitalWrite(ledPin, LOW);    // sets the LED off
  174.     delay(50);
  175.   }
  176. }
  177. servo1.write(a=70);
  178. servo2.write(b=70);
  179. servo3.write(c=100);
  180. digitalWrite(ledPin, HIGH);   // sets the LED on
  181. break;
  182. case 12:     //yaotou
  183. servo1.write(a=70);
  184. for(int i=0;i<5;i++)
  185. {
  186.   for(a;a>35;a=a-5)
  187.   {
  188.     servo1.write(a);
  189.     delay(100);
  190.   }
  191.   for(a;a<105;a=a+5)
  192.   {
  193.     servo1.write(a);
  194.     delay(100);
  195.   }
  196. }
  197. servo1.write(a=70);
  198. break;
  199. case 13:    //diantou
  200. servo3.write(c=100);
  201. for(int i=0;i<3;i++)
  202. {
  203.   for(c;c<115;c=c+5)
  204.   {
  205.     servo3.write(c);
  206.     delay(100);
  207.   }
  208.   for(c;c>85;c=c-5)
  209.   {
  210.     servo3.write(c);
  211.     delay(100);
  212.   }
  213. }
  214. servo3.write(c=100);
  215. break;
  216. default:
  217. break;
  218. }
  219. }
  220. //识别到声音,产生一个触发中断
  221. void ExtInt0Handler ()
  222. {
  223. Voice.ProcessInt0();//执行中断服务子程序
  224. }
  225. //初始化
  226. void setup()
  227. {
  228.   servo1.attach(3);
  229.   servo1.write(70);
  230.   servo2.attach(5);
  231.   servo2.write(70);
  232.   servo3.attach(8);
  233.   servo3.write(100);
  234.   pinMode(ledPin, OUTPUT);      // sets the digital pin as output
  235.   digitalWrite(ledPin, HIGH);   // sets the LED on
  236.   Voice.Initialise(MIC);//初始化语音模块
  237.   attachInterrupt(0,ExtInt0Handler,LOW);
  238. }
  239. //主程序
  240. void loop()
  241. {
  242. uint8 nAsrRes;
  243. nAsrStatus = LD_ASR_NONE;
  244. while(1)
  245. {
  246. //当语音模块处于各状态,执行相应工作
  247. switch(nAsrStatus)
  248. {
  249. case LD_ASR_RUNING:
  250. case LD_ASR_ERROR:
  251. break;
  252. case LD_ASR_NONE:
  253. {
  254. nAsrStatus=LD_ASR_RUNING;
  255. if (Voice.RunASR(SUM,80,sRecog)==0)
  256. {
  257. nAsrStatus= LD_ASR_ERROR;
  258. // Serial.println( "ASR_ERROR");
  259. }
  260. //Serial.println( "ASR_RUNING.....");
  261. break;
  262. }
  263. //识别到单词是设定单词
  264. case LD_ASR_FOUNDOK:
  265. {
  266. //Serial.print( "ASR_FOUN ONE: ");
  267. //提取所识别到的单词是数组的第几个元素
  268. nAsrRes =Voice. LD_GetResult();
  269. //根据数组元素号,执行相应命令
  270. finally(nAsrRes);
  271. nAsrStatus = LD_ASR_NONE;
  272. break;
  273. }
  274. //识别到单词“不是”设定单词
  275. case LD_ASR_FOUNDZERO:
  276. {
  277. //Serial.println( "ASR_FOUND ZERO");
  278. nAsrStatus = LD_ASR_NONE;
  279. break;
  280. }
  281. default:
  282. {
  283. nAsrStatus = LD_ASR_NONE;
  284. break;
  285. }
  286. }// switch
  287. delay(100);    //yanshi 0.5s
  288. }// while
  289. }
复制代码

接下来是上视频短片~









Eric  初级技神

发表于 2015-2-8 19:04:48

我觉得稍微改动一下,把语音识别改成蓝牙模块,然后用手机自带的语音识别功能,再用蓝牙传输给arduino,这就更能耍酷了,哈哈哈哈
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2015-2-8 19:17:59

Eric 发表于 2015-2-8 19:04
我觉得稍微改动一下,把语音识别改成蓝牙模块,然后用手机自带的语音识别功能,再用蓝牙传输给arduino,这就更 ...

用一个APP 像蓝牙小车那样的控制 速度快点的话 还可以跳舞 不过要把下边固定住
回复

使用道具 举报

Eric  初级技神

发表于 2015-2-8 19:22:39

大连林海 发表于 2015-2-8 19:17
用一个APP 像蓝牙小车那样的控制 速度快点的话 还可以跳舞 不过要把下边固定住 ...

对滴对滴~打孔上螺丝,简单粗暴
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2015-2-8 19:26:24

Eric 发表于 2015-2-8 19:22
对滴对滴~打孔上螺丝,简单粗暴

怎么感脚固定上之后变成 探照灯呢{:3_43:}
回复

使用道具 举报

Eric  初级技神

发表于 2015-2-8 19:28:51

大连林海 发表于 2015-2-8 19:26
怎么感脚固定上之后变成 探照灯呢

哈哈哈,在DIY眼里就这玩意,放到别的领域,那些大牛们就能用更多的思维为它来重新定义名称喽~
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2015-2-8 19:29:51

Eric 发表于 2015-2-8 19:28
哈哈哈,在DIY眼里就这玩意,放到别的领域,那些大牛们就能用更多的思维为它来重新定义名称喽~ ...

diy  我们玩得开心 放在应用上 我们这名字略显不前卫
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2015-2-8 19:29:53

Eric 发表于 2015-2-8 19:28
哈哈哈,在DIY眼里就这玩意,放到别的领域,那些大牛们就能用更多的思维为它来重新定义名称喽~ ...

diy  我们玩得开心 放在应用上 我们这名字略显不前卫
回复

使用道具 举报

Youyou  初级技匠

发表于 2015-2-8 22:32:41

不太推荐LED当台灯,毕竟这种冷光源和我们习惯的生物光相差太多,久而久之,必定对眼睛有一定损伤。
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2015-2-8 22:34:30

Youyou 发表于 2015-2-8 22:32
不太推荐LED当台灯,毕竟这种冷光源和我们习惯的生物光相差太多,久而久之,必定对眼睛有一定损伤。 ...

那就让他改一个名字 钟楼上的探照灯{:3_48:}
回复

使用道具 举报

Youyou  初级技匠

发表于 2015-2-8 22:38:08

大连林海 发表于 2015-2-8 22:34
那就让他改一个名字 钟楼上的探照灯

这个好{:3_48:}
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2015-2-8 22:38:59


用远程app控制 就不用在前面看着移动了 可以暖暖的在屋里看了
回复

使用道具 举报

Ricky  NPC

发表于 2015-2-8 23:24:08

加个leapmotion,控制效果更佳。
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2015-2-8 23:24:46

Ricky 发表于 2015-2-8 23:24
加个leapmotion,控制效果更佳。

这是什么?分享讲解一下
回复

使用道具 举报

Phoebe  高级技匠

发表于 2015-2-9 18:04:48

哈哈,皮克斯台灯,还能语音控制,挺逗;P
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2015-2-9 18:15:14

Phoebe 发表于 2015-2-9 18:04
哈哈,皮克斯台灯,还能语音控制,挺逗

一切尽在 do it{:3_61:}
回复

使用道具 举报

hnyzcj  版主

发表于 2015-2-9 19:40:43

回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2015-2-9 20:17:45

hnyzcj 发表于 2015-2-9 19:40
http://baike.baidu.com/link?url=UBnWf2Sa0gTmyKYt2nWded3-hIak3G5N3NbfVW71supEFLX0FEYorVsyrw1IrZRaFe ...

学习啦 陈老师什么时候做一个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail