Matrix Starter Kit/zh
From FriendlyELEC WiKi
1 打造NanoPi计算机
1.1 NanoPi门铃系统
一:NanoPi门铃系统介绍
- 使用Matrix Starter Kit套件的蜂鸣器、LED、声音传感器做一个门铃系统,当按键按下时,蜂鸣器会响起来,以及LED会闪烁;当声音传感器识别到声音时,蜂鸣器也会响起来。
- 如果需要更好的效果,可以发挥自己的想象力,按键在按下来的时候,蜂鸣器随机播放一首音乐。
二:Matrix配件
- 这里需要使用到Matrix的配件为LED、声音传感器、无源蜂鸣器,均可参考以下链接了解Matrix配件的使用:
NanoPi门铃系统 | NanoPi |
LED | [1] |
声音传感器 | [2] |
无源蜂鸣器 | [3] |
按键 | [4] |
三:下载Matrix源码
Matrix配件相关的代码是完全开源的,统一由一个仓库进行管理:git://github.com/friendlyarm/matrix.git
该仓库里不同的分支代表着Matrix配件所支持的不同开发板。
- nanopi分支包含了Matrix对NanoPi的支持;
- tiny4412分支包含了Matrix对Tiny4412的支持;
- raspberrypi分支包含了Matrix对RaspberryPi的支持;
四:连接使用
NanoPi门铃系统 | NanoPi |
LED | PIN12 |
声音传感器 | PIN7 |
无源蜂鸣器 | PIN22 |
按键 | PIN11 |
五:编译程序及使用
进入Matrix代码仓库,切换到nanopi分支
$ cd matrix $ git checkout nanopi
编译Matrix配件代码
$ make CROSS_COMPILE=arm-linux- clean $ make CROSS_COMPILE=arm-linux- $ make CROSS_COMPILE=arm-linux- install
注意:请确保你的主机PC当前使用的交叉编译器为NanoPi-Debian配套的arm-linux-gcc-4.4.3。
编译出来的库文件位于install/lib目录下,而测试程序则位于install/usr/bin目录下,模块Matrix-doorbell对应的测试程序为matrix-doorbell。
拷贝库文件和测试程序到NanoPi的文件系统上
$ cp install/usr/bin/* nanopi_rootfs/usr/bin/ $ cp install/lib/* nanopi_rootfs/lib/ -d
然后启动NanoPi,在Debian的shell终端中执行如下命令运行模块Matrixdoorbell的测试程序
$ matrix-doorbell
代码展示:
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> #include "libfahw.h" #define SOUND 0 #define BUTTON 1 static struct sensor sensor_dev[2] = { { GPIO_PIN1, IRQ_TYPE_EDGE_BOTH, }, { GPIO_PIN2, IRQ_TYPE_EDGE_FALLING, } }; int devFD = -1; int pwm_HZ = 1000; int pwm_duty = 500; int BUZZERpin = PWM_PIN1; int LEDpin = GPIO_PIN3; int stop = 0; void Stop(int signo) { stop = 1; } int doorbell_init() { //sensor init if ((devFD = sensorInit(sensor_dev, ARRAY_SIZE(sensor_dev))) == -1) { printf("Fail to init sensor sound\n"); return -1; } //LED init if ((exportGPIOPin(LEDpin)) == -1) { printf("exportGPIOPin(%d) failed\n", LEDpin); return -1; } if ((setGPIODirection(LEDpin, GPIO_OUT)) == -1) { printf("setGPIODirection(%d) failed\n", LEDpin); return -1; } return 0; } void doorbell_deinit() { sensorDeinit(devFD); PWMStop(BUZZERpin); unexportGPIOPin(LEDpin); } int doorbell_open() { if(setGPIOValue(LEDpin, GPIO_HIGH) == -1) { printf("setGPIOValue(%d) failed\n", LEDpin); return -1; } if (PWMPlay(BUZZERpin, pwm_HZ, pwm_duty) == -1) { printf("Fail to output PWM\n"); return -1; } return 0; } int doorbell_close() { if(setGPIOValue(LEDpin, GPIO_LOW) == -1) { printf("setGPIOValue(%d) failed\n", LEDpin); return -1; } if(PWMStop(BUZZERpin) == -1) { printf("Fail to stop PWM\n"); return -1; } return 0; } int main(int argc, char ** argv) { int sensor_state; char value[ARRAY_SIZE(sensor_dev)]; doorbell_init(); signal(SIGINT, Stop); printf("you can press ctrl+c to stop\n"); while(!stop) { sensor_state = sensorRead(devFD, value, ARRAY_SIZE(sensor_dev)); if(value[SOUND] || value[BUTTON]) { if(doorbell_open() == -1) { printf("fail to open doorbell\n"); return -1; } value[SOUND] = 0; value[BUTTON] = 0; usleep(1000*500); } if(doorbell_close() == -1) { printf("fail to close doorbell\n"); return -1; } } doorbell_deinit(); return 0; }