CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 9193|回复: 7

【人人都会做】基于Cubieboard的小钢琴

[复制链接]
发表于 2014-7-19 10:56:16 | 显示全部楼层 |阅读模式
AD按键+蜂鸣器——小钢琴

硬件:CT+DVK570

主要的编程思想:
1.更改蜂鸣器的频率,根据音阶频率表编写相应的歌曲。
2.AD按键与蜂鸣器频率的结合。

源码:
  1. #include <stdio.h>                                                                    
  2. #include <sys/types.h>                                                               
  3. #include <sys/stat.h>                                                                 
  4. #include <fcntl.h>                                                                    
  5. #include <linux/input.h>                                                              
  6. #include <string.h>                                                                  
  7. #include <stdlib.h>                                                                  
  8. #include <errno.h>                                                                    
  9. #include <unistd.h>                                                                  
  10. #include <sys/ioctl.h>                                                               

  11. /*音阶频率转换*/                                                                                      
  12. #define PWM_PERIOD1 "echo 2093hz > /sys/class/pwm-sunxi/pwm0/period"                                 
  13.                                                                                       
  14. int main(int argc, char **argv)                                                      
  15. {                                                                                    
  16.         int fd;                                                                       
  17.         int ret;                                                                     
  18.         int count;                                                                                                                           
  19.         char devname_head[20] = "/dev/input/";                                       
  20.         char dev_name[20];                                                            
  21.         struct input_event *key_ev;                                                   
  22.                                                                                       
  23.         if(argc < 2)  {                                                               
  24.                 printf("Please input 'test_key event*'\n");                           
  25.                 exit(1);                                                              
  26.         }                                                                             
  27.         else  {                                                                       
  28.                 strcpy(dev_name, devname_head);                                       
  29.                 strcat(dev_name, argv[1]);    }                                       
  30.                                                                                       
  31.         fd = open(dev_name, O_RDONLY);                                                
  32.                                                                                       
  33.         if(fd < 0) {                                                                  
  34.                 perror("error to open /dev/input/event*\n");                          
  35.                 exit(1);                                                              
  36.         }                                                                             
  37.                                                                                       
  38.         key_ev = malloc(sizeof(struct input_event));                                 
  39.         memset(key_ev,0,sizeof(key_ev));                                             
  40.                                                                                       
  41.         while(1)                                                                  
  42.         {                                                                             
  43.                 ret = read(fd,key_ev,sizeof(struct input_event));                     
  44.                 if(ret < 0)                                                           
  45.                 {                                                                     
  46.                         printf("read error\n");                                       
  47.                         exit(1);                                                      
  48.                 }                                                                     
  49.                                                                                       
  50.                 if(key_ev->type != EV_KEY)      continue;                             
  51.                 else                                                                  
  52.                 {                                                                     
  53.                         switch(key_ev->code)                                          
  54.                         {   
  55. /*按键1被按下,蜂鸣器发do的音。按键1被释放时,蜂鸣器停止发声。注:key_ev->code为115时触发按键1。key_ev->value为1时;按键被按下,key_->value不为1时,按键被释放。*/                                       
  56.                                 case 115:                                             
  57.                                         if(1==key_ev->value)                          
  58.                                         {                                             
  59.                                                 system(PWM_PERIOD1);                  
  60.                                                 usleep(500*500);                     
  61.                                         }                                             
  62.                                         else                                          
  63.                                         {                                             
  64.                                                 system(PWM_PERIOD20);                 
  65.                                                 usleep(500*500);                     
  66.                                         }                                             
  67.                                 break;                                                                                                                                   
  68.                                 case 114:                                             
  69.                                                                      
  70.                                 break;                                                                                                                             
  71.                                 case 139:                                             
  72.                                                                      
  73.                                 break;                                                                                                                                             
  74.                                 case 217:                                             
  75.                                                                               
  76.                                 break;                                                                                                                                          
  77.                                 case 102:                                             
  78.                                           
  79.                                 break;                                                                                                                                       
  80.                                 case 1:                                               
  81.                                                                                                                   
  82.                                 break;                                                                                                                                      
  83.                                 case 28:                                                                                       
  84.                                                                                       
  85.                                 break;                                                                                                
  86.                                 default:                                             
  87.                                                                                       
  88.                                 break;                                                
  89.                     }                                                                 
  90.                 }                                                                     
  91.         }                                                                             
  92.         close(fd);                                                                    
  93.         return 0;                                                                     
  94. }                                    
复制代码
1.创建一个命为”piano.c”的文件:vim piano.c
2.将源码拷贝到文件里(PS:由于字数关系,我只给出了部分源码)
3.编译源码:gcc piano.c -o piano
4.短接上 ADKEY 跳线帽,在终端上输入:./piano event*
注意:
1)这里的 event*是多少,要根据自己的实际情况,具体查看
/dev/input 目录:ls /dev/input/;
2)如果没有加载按键驱动,请执行:modprobe sun4i-keyboard
5.在DVK570中随意按下一个按键,蜂鸣器便会发出相应音符的声音。此时,你便可以开始弹奏属于你的音乐篇章。
音阶频率表:http://wenku.baidu.com/view/b3921b22192e45361066f5b3.html?re=view
演示:http://www.meipai.com/media/68851860
回复

使用道具 举报

发表于 2014-7-19 12:51:43 | 显示全部楼层
tks for sharing               
回复 支持 反对

使用道具 举报

发表于 2014-7-19 15:15:11 | 显示全部楼层
有点意思。。。
回复 支持 反对

使用道具 举报

发表于 2014-7-22 10:27:45 | 显示全部楼层
不错啊。快点来首小苹果。
回复 支持 反对

使用道具 举报

发表于 2014-7-28 20:34:49 | 显示全部楼层
板子上烧的是什么系统呢?
回复 支持 反对

使用道具 举报

发表于 2014-7-29 12:00:19 | 显示全部楼层
提有意思的,看了这个帖子,立马想尝试一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-1 09:35:36 | 显示全部楼层
chuang 发表于 2014-7-28 20:34
板子上烧的是什么系统呢?

here
http://dl.cubieboard.org/parteners/waveshare/Image/
回复 支持 反对

使用道具 举报

发表于 2014-12-23 19:44:23 | 显示全部楼层
可以用A20做吗?
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2024-11-22 20:43 , Processed in 0.024524 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部