极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7336|回复: 0

基于Cubieboard的小钢琴

[复制链接]
发表于 2014-8-1 15:14:58 | 显示全部楼层 |阅读模式
本文摘自:cubie官网论坛   http://forum.cubietech.com/forum.php?mod=viewthread&tid=2993&extra=page%3D1



AD按键+蜂鸣器——小钢琴

硬件:CT+DVK570

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

#include <stdio.h>                                                                    
#include <sys/types.h>                                                               
#include <sys/stat.h>                                                                 
#include <fcntl.h>                                                                    
#include <linux/input.h>                                                              
#include <string.h>                                                                  
#include <stdlib.h>                                                                  
#include <errno.h>                                                                    
#include <unistd.h>                                                                  
#include <sys/ioctl.h>                                                               

/*音阶频率转换*/                                                                                      
#define PWM_PERIOD1 "echo 2093hz > /sys/class/pwm-sunxi/pwm0/period"                                 
                                                                                      
int main(int argc, char **argv)                                                      
{                                                                                    
        int fd;                                                                       
        int ret;                                                                     
        int count;                                                                                                                           
        char devname_head[20] = "/dev/input/";                                       
        char dev_name[20];                                                            
        struct input_event *key_ev;                                                   
                                                                                      
        if(argc < 2)  {                                                               
                printf("Please input 'test_key event*'\n");                           
                exit(1);                                                              
        }                                                                             
        else  {                                                                       
                strcpy(dev_name, devname_head);                                       
                strcat(dev_name, argv[1]);    }                                       
                                                                                      
        fd = open(dev_name, O_RDONLY);                                                
                                                                                      
        if(fd < 0) {                                                                  
                perror("error to open /dev/input/event*\n");                          
                exit(1);                                                              
        }                                                                             
                                                                                      
        key_ev = malloc(sizeof(struct input_event));                                 
        memset(key_ev,0,sizeof(key_ev));                                             
                                                                                      
        while(1)                                                                  
        {                                                                             
                ret = read(fd,key_ev,sizeof(struct input_event));                     
                if(ret < 0)                                                           
                {                                                                     
                        printf("read error\n");                                       
                        exit(1);                                                      
                }                                                                     
                                                                                      
                if(key_ev->type != EV_KEY)      continue;                             
                else                                                                  
                {                                                                     
                        switch(key_ev->code)                                          
                        {   
/*按键1被按下,蜂鸣器发do的音。按键1被释放时,蜂鸣器停止发声。注:key_ev->code为115时触发按键1。key_ev->value为1时;按键被按下,key_->value不为1时,按键被释放。*/                                       
                                case 115:                                             
                                        if(1==key_ev->value)                          
                                        {                                             
                                                system(PWM_PERIOD1);                  
                                                usleep(500*500);                     
                                        }                                             
                                        else                                          
                                        {                                             
                                                system(PWM_PERIOD20);                 
                                                usleep(500*500);                     
                                        }                                             
                                break;                                                                                                                                   
                                case 114:                                             
                                                                     
                                break;                                                                                                                             
                                case 139:                                             
                                                                     
                                break;                                                                                                                                             
                                case 217:                                             
                                                                              
                                break;                                                                                                                                          
                                case 102:                                             
                                          
                                break;                                                                                                                                       
                                case 1:                                               
                                                                                                                  
                                break;                                                                                                                                      
                                case 28:                                                                                       
                                                                                      
                                break;                                                                                                
                                default:                                             
                                                                                      
                                break;                                                
                    }                                                                 
                }                                                                     
        }                                                                             
        close(fd);                                                                    
        return 0;                                                                     
}                                    


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



回复

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 20:18 , Processed in 0.040435 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表