极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20164|回复: 2

教你如何使用pcDuino做香蕉钢琴

[复制链接]
发表于 2014-1-7 11:18:45 | 显示全部楼层 |阅读模式
如何使用pcDuino做香蕉钢琴呢?Arduino是通过模拟USB HID(Human Interface Device)的方法来实现的,而在强大的pcDuino上面直接通过模拟键盘的输入就可以实现。


一:如果模拟键盘输入?

(1)设备有着自己特殊的按键键码,我需要将一些标准的按键,比如0-9,X-Z等模拟成标准按键,比如KEY_0,KEY-Z等,所以需要用到按键模拟,具体方法就是操作/dev/input/eventX文件,向它写入个input_event结构体就可以模拟按键的输入了。我们可用通过 $cat /proc/bus/input/devices可以查看到当前input子系统下面的所有event设备,我们找到键盘:

(2)访问由kbd驱动在input子系统中注册的event事件文件,即读写 “/dev/input/event3″。在/usr/include/linux/input.h中有定义了event事件的结构体,API和标准按键的编码等。我们需要将要写入的按键编码填充到结构体中,然后写入键盘或者鼠标的事件设备驱动文件中。下面介绍下event事件结构体:

struct input_event {

struct timeval time;

__u16 type;

__u16 code;

__s32 value;

}

type(事件的类型):

EV_KEY,:按键事件,如键盘的按键(按下哪个键),鼠标的左键右键(是非击下)等;

EV_REL,:相对坐标,主要是指鼠标的移动事件(相对位移);

EV_ABS,:绝对坐标,主要指触摸屏的移动事件,但好像这个不能用在鼠标上面,也就是说无法通过这个来获取鼠标的绝对坐标(鼠标是一个相对位移的设备)。

code(事件的代码):

如果事件的类型代码是EV_KEY,该代码code为设备键盘代码。代码植0~127为键盘上的按键代码,0×110~0×116为鼠标上按键代码,其中0×110(BTN_ LEFT)为鼠标左键,0×111(BTN_RIGHT)为鼠标右键,0×112(BTN_ MIDDLE)为鼠标中键。其它代码含义请参看/usr/include/linux /input.h文件,该文件中会定义相应的宏来代表不同的按键。如果事件的类型代码是EV_REL,code值表示轨迹的类型。如指示鼠标的X轴方向REL_X(代码为0×00),指示鼠标的Y轴方向REL_Y,指示鼠标中轮子方向REL_WHEEL。

value(事件的值):

如果事件的类型代码是EV_KEY,当按键按下时值为1,松开时值为0;如果事件的类型代码是EV_ REL,value的正数值和负数值分别代表两个不同方向的值。例如:如果code是REL_X,value是10的话,就表示鼠标相对于上一次的坐标,往x轴向右移动10个像素点。

二:示例代码

#include <core.h>

#include <stdio.h>

#include <string.h>

#include <linux/input.h>

#include <fcntl.h>

#include <sys/time.h>

#include <unistd.h>

int InData1 = 0;

int InData2 = 0;

int InData3 = 0;

int InData4 = 0;

int InData5 = 0;

int TouchSensitivity1 = 38;

int TouchSensitivity2 = 800;

void simulate_key(int fd, int kval)

{

struct input_event event;

gettimeofday(&event.time, 0);

event.type = EV_KEY;

event.value = 1;

event.code = kval;

write(fd, &event, sizeof(event));

event.type = EV_SYN;

event.value = 0;

event.code = SYN_REPORT;

write(fd, &event, sizeof(event));

memset(&event, 0, sizeof(event));

gettimeofday(&event.time, 0);

event.type = EV_KEY;

event.value = 0;

event.code = kval;

write(fd, &event, sizeof(event));

event.type = EV_SYN;

event.value = 0;

event.code = SYN_REPORT;

write(fd, &event, sizeof(event));

}

void setup()

{

for(int i = 6; i <= 12; i++)

{

pinMode(i, OUTPUT);

}

}

void loop()

{

int fd_mouse ;

int fd_kbd ;

int i = 0;

fd_kbd = open(“/dev/input/event1″, O_RDWR);

if(fd_kbd <= 0)

{

printf(“Can not open keyboard input file\n”);

while(1);

}

while(1)

{

InData1 = analogRead(A1);

InData2 = analogRead(A2);

InData3 = analogRead(A3);

InData4 = analogRead(A4);

InData5 = analogRead(A5);

if(InData1 <= TouchSensitivity1)

{

digitalWrite(7, HIGH);

simulate_key(fd_kbd, KEY_S);

delay(500);

InData1 = 2000;

InData2 = 2000;

InData3 = 2000;

InData4 = 2000;

InData5 = 2000;

}

else digitalWrite(7, LOW);

if(InData2 <= TouchSensitivity2)

{

digitalWrite(8, HIGH);

simulate_key(fd_kbd, KEY_D);

delay(500);

InData1 = 2000;

InData2 = 2000;

InData3 = 2000;

InData4 = 2000;

InData5 = 2000;

}

else digitalWrite(8, LOW);

if(InData3 <= TouchSensitivity2)

{

digitalWrite(9, HIGH);

simulate_key(fd_kbd, KEY_F);

delay(500);

InData1 = 2000;

InData2 = 2000;

InData3 = 2000;

InData4 = 2000;

InData5 = 2000;

}

else digitalWrite(9, LOW);

if(InData4 <= TouchSensitivity2)

{

digitalWrite(10, HIGH);

simulate_key(fd_kbd, KEY_G);

delay(500);

InData1 = 2000;

InData2 = 2000;

InData3 = 2000;

InData4 = 2000;

InData5 = 2000;

}

else digitalWrite(10, LOW);

if(InData5 <= TouchSensitivity2)

{

digitalWrite(11, HIGH);

simulate_key(fd_kbd, KEY_H);

delay(500);

InData1 = 2000;

InData2 = 2000;

InData3 = 2000;

InData4 = 2000;

InData5 = 2000;

}

else digitalWrite(11, LOW);

delay(100);

}

}

三:测试工具

(1)pcDuino和TouchkeyUSB shield:

(2)测试线和香蕉(5根):

(3)如果你使用的显示器不带扬声器,那么你还需要一个usb声卡和一个音箱(或者耳机),使用音箱需要修改pcDuino的音频输出,下面教你如何修改pcDuino的默认音频输出:

(a)查看系统的声卡:

ubuntu@ubuntu:~$ aplay -l

**** List of PLAYBACK Hardware Devices ****

card 0: Device [Generic USB Audio Device], device 0: USB Audio [USB Audio]

Subdevices: 0/1

Subdevice #0: subdevice #0

card 1: sun4isndhdmi [sun4i-sndhdmi], device 0: SUN4I-HDMIAUDIO sndhdmi-0 []

Subdevices: 1/1

Subdevice #0: subdevice #0

(可以看出我的系统有两个声卡)

(b)设置系统声卡为USB声卡:

$vim /etc/asound.conf

内容为:

default.pcm.card 0

default.pcm.device 0

default.ctl.card 0

(因为USB声卡是card 0,需要改为HDMI输出,则修改为card 1即可)

(c)重新pcDuino,就修改完成。$ sudo reboot

接线图:

四:测试运行

(1)先在pcDuino上安装scratch:$sudo apt-get install pcduino-scratch:

(2)将附件上已将画好的scratch工程下载到pcDuino,并且打开banana paino工程:

(3)输入指令:$sudo arduino 打开arduino IDE,输入测试代码、运行:

(4)运行效果图:

五:附件下载

(1)TestCode

(2)banana_piano


回复

使用道具 举报

发表于 2014-4-16 22:45:48 | 显示全部楼层
GOOD ,VERY GOOD
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 08:30 , Processed in 0.036985 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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