Matrix Starter Kit/zh
From ARMWorks
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;
}