我在网上看到一款日本设计师Yang Ze-Siao设计的日伞夜灯DSNL(见图4.1)。它采用了多功能太阳能电池板和发光二极管融合设计,白天用伞遮挡太阳,同时存储太阳能;晚上可以当作照明灯具使用。我看到后非常喜欢,萌生了自己也动手改造伞的想法。
图4.1 日本设计师设计的日伞夜灯DSNL
在下雨的夜晚,城市里的人们行走的脚步总是急匆匆的,特别是来到一个陌生的环境,如果急切地低头看手机寻找方向,面对来往的车辆,多少会有些危险。于是我想到了用电子罗盘和LED灯带组合设计一款能在夜间指引方向的指南伞,它能快速地给行人指引方向,也可以给夜间行驶的车辆以灯光的提示,保证出行的安全。
设计思路相对于一个特定的区域,地理北极的朝向是恒定的。利用这个原理,我们读取电子罗盘的6轴矢量参数,经过一定的公式转化,将地理北极的方向用航向角(水平面上地理北极与电子罗盘标定的x轴的夹角)表示。将伞的360°等分为10份,即以每36°代表一个方位并用3颗灯珠表示(见图4.2)。最后将实时的地理北极方向用该方位的灯带表示出来。所需硬件清单见表4.1。
图4.2 以每36°代表一个方位并用3颗灯珠表示
表4.1 所需硬件清单
制作过程1. 测试电子罗盘
先测试电子罗盘的功能,将6轴矢量数据转化为航向角,在串口中打印出来。水平放置芯片,观察x轴是否与北方重叠。360°转动电子舵盘,观察串口数值的返回过程。
测试代码请到qq群657864614下载,具体为umbrella文件夹下的el-compass_test.ino。测试时需导入LSM303DLH库。
对于Arduino Pro mini而言,它默认的I2C接口为A4(SDA)、A5(SCL)。因为Arduino Pro mini不具备USB转换芯片,因此用户无法直接用USB线来烧录程序,需要FTDI才能烧入程序和进行串口调试。FTDI下载器的驱动已经集成在Arduino IDE的drivers目录下,无须另外下载。安装驱动时,请选择从FTDI USB Drivers文件夹中安装。
电子罗盘相关语句分析
1.语句:Wire.begin( )
说明:开启I2C总线(主设备)。因为LSM303DLH是通过I2C和Arduino进行通信的。
2.语句:LSM303DLH compass
说明:初始化电子罗盘,建立一个类型为LSM303DLH、名称为compass的对象。对象的名字可自行更改。
3.语句:compass.read()
说明:读取LSM303DLH的6轴参数,并将它们赋值给compass.m.x/y/z(3个矢量方向的磁场值)、compass.a.x/y/z (3个矢量方向的加速度值),便于我们后面调用这些参数。
4.将弧度值转化为0°~360°
int compass_angle=round(atan2(H_y,H_x)*180/PI);//转化为角度
if(compass_angle<0)compass_angle =360;//转化为0°~360°
测试效果:
根据电子罗盘上标注的3个地磁矢量的方向水平放置芯片,观察串口的返回值,x轴方向与地磁北极重合时,串口返回0;逆时针转动芯片,正西方返回90,南方返回180;返回值会不断变大,直到360。
2. RBG灯带的焊接和使用
以3颗LED灯为一组,对灯带进行裁剪(见图4.3)。
拼接时留意选取灯带的正确方向(见图4.4)。
在灯带上焊接导线,并用热熔胶封闭接口(防水,见图4.5),完成后如图4.6所示。
图4.3 裁剪
图4.4 拼接时留意选取灯带的正确方向
图4.5 焊接导线并用热熔胶封闭接口
图4.6 焊接导线后的效果
对灯带进行编号:从灯带上与控制板连接的第一颗LED算起,每3颗LED灯编为一组,从LEDs_0、LEDs_1依次编到LEDs_9。
按照图4.7连接电路,然后下载测试程序,具体文件为umbrella文件夹下的LED_strip_test.ino。测试时需导入Adafruit_NeoPixel库。
图4.7 灯带测试电路连接示意图
灯带程序相关语句分析
1.语句:Color(uint8_t r, uint8_t g, uint8_t b)
说明:显示灯珠的颜色,3个参数分别表示红、绿、蓝三色的亮度;取值范围是0~255。例如红色为Color(255,0,0),蓝色为Color(0,0,255),紫色为Color(255,0,255)。
2.语句:setPixelColor(uint16_t n, uint32_t c)
说明:设置某一颗灯珠的颜色,其中n为灯珠的编号(第一颗灯珠为0,按顺序依次为1、2、3……),c为灯珠的颜色参数,即Color(uint8_t r, uint8_t g, uint8_t b)。
测试效果:
通过改变测试程序loop()中colorwipe()函数中的参数a和b来控制点亮不同编组的灯珠(见图4.8)。例如想点亮LEDs_0灯组,则写:
void loop(){
colorWipe(Color(255,0,0),0,3, 50);
clear(100);}
图4.8 测试灯带
3. 对芯片做去针脚处理并焊接所需的接线
为了能美观,用电烙铁加焊锡将针脚去掉(见图4.9),改为直接焊接接线(见图4.10)。
图4.9 需要去掉的针脚
图4.10 直接焊接导线
对Arduino控制器去针脚,但保留用于程序烧写和串口调试的针脚(见图4.11)。
图4.11 Arduino需要保留的针脚
4. 连接各个元器件,并安装到伞内
参照图4.12和表4.2连接元器件,并安装到伞内(见图4.13~图4.15)。灯带部分做了一定的防水,芯片部分只用黑胶布封上。之前想过在伞柄上增加一个装置,撑开伞后灯就自动亮了,可惜还没设计成功,后续会改进。
图4.12 电路连接示意图
表4.2 接线表格
图4.13 将元器件安装到伞内
图4.14 将灯带安装到伞内
图4.15 指南伞外观