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

2015-02-082.1万
AI 快速预览详细 收起
本文介绍了如何使用Arduino控制板和语音模块制作一个全语音控制的台灯。硬件包括DFRobot的mega1280控制板、语音控制模块、V5扩展模块、升压模块和LED灯。通过编写程序,可以实现多种动作,如开关、上下左右移动、摇头、点头、跳舞等。该项目适用于STEM教育场景,适合儿童科学实验和少儿编程入门。


语音控制调节台灯实现了全语音控制,它可以根据不同的语音命令作出开关和不同的动作,我们的台灯可以完成上、下、左、右、开、关、摇头、点头、跳舞的动作。其次,为了实现台灯的功能我们需要机械臂,一个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. }
复制代码

接下来是上视频短片~









创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(4)
phoebe.wang40
phoebe.wang40
哈哈,皮克斯台灯,还能语音控制,挺逗;P
qq815076543322
qq815076543322
作者
回复phoebe.wang40
一切尽在 do it
R2D2
R2D2
加个leapmotion,控制效果更佳。
qq815076543322
qq815076543322
作者
回复hnyzcj
学习啦 陈老师什么时候做一个
共3条回复,已加载2条,点击查看更多共3条回复,已加载全部
Youyou
Youyou
不太推荐LED当台灯,毕竟这种冷光源和我们习惯的生物光相差太多,久而久之,必定对眼睛有一定损伤。
qq815076543322
qq815076543322
作者
回复Youyou
用远程app控制 就不用在前面看着移动了 可以暖暖的在屋里看了
Youyou
Youyou回复qq815076543322
这个好
共3条回复,已加载2条,点击查看更多共3条回复,已加载全部
我爱小宇宙
我爱小宇宙
我觉得稍微改动一下,把语音识别改成蓝牙模块,然后用手机自带的语音识别功能,再用蓝牙传输给arduino,这就更能耍酷了,哈哈哈哈
qq815076543322
qq815076543322
作者
回复我爱小宇宙
diy 我们玩得开心 放在应用上 我们这名字略显不前卫
qq815076543322
qq815076543322
作者
回复我爱小宇宙
diy 我们玩得开心 放在应用上 我们这名字略显不前卫
共6条回复,已加载2条,点击查看更多共6条回复,已加载全部
- 没有更多了 -