Matrix - Ball Rolling Switch/zh

From FriendlyELEC WiKi
Revision as of 08:05, 24 December 2015 by Jjm (Talk | contribs) (与NanoPi 2连接使用)

Jump to: navigation, search

English

1 介绍

BAll Rolling Switch
  • Matrix-BAll Rolling Switch是一个滚珠开关模块,电气特性与水银开关近似,解决了水银开关易破损、氧化、漏气、寿命短、污染环境等弊端。
  • 开关本身无方向,360°任何一个方向倾斜到一定的角度(15°-45°)时,就会产生一个开关信号,信号传入施密特触发器反向后输出。

2 特性

  • GPIO
  • 体积小巧
  • 2.54mm排针接口
  • PCB尺寸(mm):16x16

BAll Rolling Switch-01.PCB

  • 引脚说明:
名称 描述
S 数字GPIO
V 电源5V
G

3 工作原理

3-Pin 2.54mm排针,V接电源,G接地,S为模块数字信号输出,当开关倾斜,开关内的金属球珠滚动到开关一侧,导通触点时,开关输出高电平到施密特触发器,再通过触发器内部的逆变器反向,模块输出低电平;当开关内的金属球珠滚动到开关的另一侧,断开触点时,滚珠开关输出低电平到施密特触发器,触发器内部的逆变器反向,此时,模块输出高电平。

4 下载Matrix源码

Matrix配件相关的代码是完全开源的,统一由一个仓库进行管理:git://github.com/friendlyarm/matrix.git
该仓库里不同的分支代表着Matrix配件所支持的不同开发板。

  • nanopi分支用于支持NanoPi;
  • nanopi2分支用于支持NanoPi 2;
  • tiny4412分支用于支持Tiny4412;
  • raspberrypi分支用于支持RaspberryPi;

在主机PC上安装git,以Ubuntu14.04为例

$ sudo apt-get install git

克隆Matrix配件代码仓库

$ git clone git://github.com/friendlyarm/matrix.git

克隆完成后会得到一个名为matrix的目录,里面存放着所有Matrix配件的代码。

5 与NanoPi 2连接使用

5.1 硬件连接

参考下图连接模块Matrix-BAll Rolling Switch和NanoPi2:
matrix-BAll Rolling Switch_nanopi2

连接说明:

Matrix-BAll Rolling Switch NanoPi2
S Pin7
V Pin4
G Pin6

5.2 编译测试程序

进入Matrix代码仓库,切换到nanopi2分支

$ cd matrix
$ git checkout nanopi2

编译Matrix配件代码

$ make CROSS_COMPILE=arm-linux- clean
$ make CROSS_COMPILE=arm-linux-
$ make CROSS_COMPILE=arm-linux- install

注意:请确保你的主机PC当前使用的交叉编译器为NanoPi 2配套的arm-linux-gcc-4.9.3。
编译成功后库文件位于install/lib目录下,而测试程序则位于install/usr/bin目录下,模块Matrix-BAll Rolling Switch对应的测试程序为matrix-BAll Rolling Switch。

5.3 运行测试程序

将带有Debian系统的SD卡插入一台运行Linux的电脑,可以挂载SD卡上的boot和rootfs分区。
假设rootfs分区的挂载路径为/media/rootfs,执行以下命令将Matrix的硬件驱动、库文件和测试程序拷贝到NanoPi 2的文件系统上。

$ cp modules /media/rootfs/ -r
$ cp install/lib/* /media/rootfs/lib/ -d
$ cp install/usr/bin/* /media/rootfs/usr/bin/

将SD卡重新插入NanoPi 2,上电启动,在Debian的shell终端中执行以下命令运行模块Matrix-BAll Rolling Switch的测试程序。

$ matrix-BAll Rolling Switch

运行效果如下:
matrix-BAll Rolling Switch_result
可以看到LED在不停地闪烁。

5.4 代码展示

int main(int argc, char ** argv) 
{
    int ledPin = GPIO_PIN(7); 
    int i = 0;
    int ret = -1;
 
    if ((ret = exportGPIOPin(ledPin)) == -1) {   
        printf("exportGPIOPin(%d) failed\n", ledPin);
    }
    if ((ret = setGPIODirection(ledPin, GPIO_OUT)) == -1) {
        printf("setGPIODirection(%d) failed\n", ledPin);
    }
 
    for (i = 0; i < LED_BLINK_TIMES; i++) {
        if (i % 2) {
            ret = setGPIOValue(ledPin, GPIO_HIGH);
        } else {
            ret = setGPIOValue(ledPin, GPIO_LOW);
        }
        if (ret == -1) {
            printf("setGPIOValue(%d) failed\n", ledPin);
        }
        printf("LED blinking times %d\n", i);
        sleep(1);
    }
    unexportGPIOPin(ledPin);
    return 0;
}