电子 – 折腾(存档) https://blog.sorz.org 已停止更新和维护。该页面为2018年3月创建的存档,其内容可能已过于陈旧、与现状不符,仅作为历史存档用作参考。 Sun, 14 Jan 2018 11:08:20 +0000 zh-CN hourly 1 https://wordpress.org/?v=4.9.4 室内空气监测 /p/air-mointor/ /p/air-mointor/#respond Sat, 28 Feb 2015 14:25:28 +0000 /?p=348022 GP2Y1010AU0F
左图[1] 是夏普的紧凑型光学灰尘密度传感器 GP2Y1010AU0F (PDF),淘宝三十元不到。

传感器内部有一个 LED,通过检测灰尘对光的反射的强度来估计空气中单位体积内灰尘的质量。
虽然因为无法区分灰尘颗粒的体积,无法直接推算出 PM2.5 数值,但我想它和 PM2.5 之间应该还是比较强的相关性的 来源请求

(嘛 30 块一个东西还是不要想太多比较好。

另一个传感器是 DHT22,淘宝大概 20 元一个。用于测量空气温度和湿度。

去年暑假我把这两个东西用了起来,监测室内空气状况并绘制图表然后显示在网页上。干嘛用?就是玩具,好玩嘛… 如果你也觉得有点意思,想搞个玩玩… 这篇文章也许可以用作参考。

事隔较久,一些细节记不太清了,可能会有些疏漏。相关代码在使用前记得改改文件名路径什么的。

读取传感器

这两传感器都不是面向一般用户的,没有 USB 这样方便的东西呢…
DHT22 是用一根线串行输入输出
GP2Y1010AU0F 输出的是模拟信号,要测量输出口的电压,根据电压来计算灰尘密度(如下图[2])。
电压——灰尘密度图示

DHT22 也许[3]能用 Cubieboard (山寨树莓派) 的 GPIO 来读取。
但 GP2Y1010AU0F 则需要测量电压(A/D),Cubieboard 不带此功能。

于是就用了 Arduino,先用它定时从传感器读取数据,然后通过串口(UART)发送给 Cubieboard
读取传感器的模块:DHT22.cpp DHT22.h, GP2Y1010AU0F.cpp GP2Y1010AU0F.h
每隔三秒读取一次两传感器,从串口输出 的 Arduino 代码:Sensors.ino

储存数据

数据通过 UART 传给了 Cubiebaord,接下来就是想怎么存怎么存啦。
这里按照传统来源请求用 RRDtool 来储存数据。简单方便[4]自带数据库顺带还能把画图给做了。

先用rrdtool create创建数据库:rrd-create.sh
别问我这些参数是啥意思,半年多过去了我早忘了(
RRDtool 也是挺坑的,参数多不说,写出来一点都不直观,不对手册根本不知道这都是些什么鬼(

arduino-uart.py 这个 Python 脚本将持续地从串口读取 Arduino 发来的数据,然后执行rrdtool update往数据库里喂数据。

呈现数据

使用rrdtool graph绘制折线图:graph.sh
./graph.sh 1d 绘制近一天的图像,./graph.sh 1w 绘制近一周的图像。
(输出和数据文件路径请修改开头的DIRDATA变量)

可以使用crontab -e或者 systemd-timer[5] 定时执行脚本更新图像。

再加个网页做索引:index.html
网页上方可选择查看近一天、一周、一个月的数据[6]。这样就基本完成啦。

完成

其实装好后我一直挺担心灰尘传感器的读数是否正确的,没法方法确认,读出来的 µg/cm³ 我也没啥概念。不过这幅大年三十的图看起来倒是挺像回事的:
灰尘折线图(图中数据单位有误,应为 µg/m³)

即使家里门窗紧闭,依然能看到中午一点和午夜的两条高峰。想必是受周边鞭炮燃放的影响吧。

附注

[1] 来源 iMall
[2] 来源 Datasheet PDF
[3] 我不太确定,因为 Cubieboard 的每一个 GPIO 口似乎只能在开机时设置为读或者写二选一,而 DHT22 的读写都在一根线上。也许能用两个 GPIO 口并加少许电路来实现?
[4] 好吧其实一点都不简单方便。
[5] systemd 用户请参考 Gist 中的.timer .service等文件。
[6] 需分别生成日、周、月的图片,参见 [4] 中的三个 .timer 文件。

]]>
/p/air-mointor/feed/ 0
Watchdog Timer on Cubieboard /p/cubieboard-watchdog/ /p/cubieboard-watchdog/#comments Sat, 04 Jan 2014 16:56:49 +0000 https://sorz.org/?p=347795 准备将 Cubieboard 留在家里,放在路由器边长期开着收收短信什么的。
有了 Watchdog Timer(看门狗计时器)一旦 Cubieboard 死机,系统将自动重启。重启由硬件实现,确保可靠性。

内核支持

需在编译 Linux 内核时开启 Watchdog Timer 支持、编译 sunxi watchdog 驱动

选项位于Device Drivers >> Watchdog Timer Support,勾选WatchDog Timer Driver CoreAllwinner A10/A13 Watchdog。可以考虑勾选Disable watchdog shutdown on close,选择后若 watchdog 进程意外结束也将触发重启,否则 watchdog 将随 watchdog 进程的关闭而关闭。[1]

CONFIG_WATCHDOG=y
CONFIG_WATCHDOG_CORE=y
CONFIG_WATCHDOG_NOWAYOUT=y
CONFIG_SUNXI_WDT=m

若驱动编译为内核模块,需要手动加载:

sudo modprobe sunxi_wdt

可在/etc/modules加入一行,系统启动时将自动加载:

sunxi_wdt

加载成功后可以看见/dev/watchdog。任意程序打开该文件将启动 watchdog,打开后必须定期“戳一下” (poking) 它,即往里写数据。[1]

安装用户空间程序

戳狗程序当然有现成的:

sudo apt-get install watchdog
sudo service watchdog start

可以留意下配置/etc/watchdog.conf,有检测负载、内存、网络和自定义检测命令等可选功能。

U-Boot 支持

上述方案中,watchdog 只会在系统正常启动,且正常加载 sunxi_wdt,且 watchdog daemon 正常运行后才会生效。若开启 U-Boot 内置的 watchdog 支持,可在系统引导失败时重启系统

这是可选项,我还没试过,只是看文档中有写。(嘛毕竟有山寨货了(见下文((

首先编译 u-boot-sunxi 时需启用CONFIG_WATCHDOG
其次修改boot.scr,在bootm这行之上加入watchdog 16。该文件在引导分区,若无需自行建立。
我还没试过,就不乱说了,请参考 u-boot-sunxi/wiki#bootscr-support 配置。

需要注意的是,A10 只支持最长 16 秒的间隔时间[2]。也就是说,从加载内核、挂载分区、一直到启动 watchdog daemon 必须在 16 秒内完成,否则将触发重启。

在此之前…

由于不知道 SoC 内置了 watchdog,我翻了些零件自己山寨了一个

山寨 Watchdog (左) 和 Cubieboard (右)

山寨 Watchdog (左) 和 Cubieboard (右)

洞洞板是以前焊的,其上是一块 ATmega16U,都闲置好久了;
左边方块是一个继电器和三极管二极管电阻之类的,通过 USB 口连接着 Cubieboard 的电源;
中间蓝线连着单片机与一 GPIO 口,用一个脚本周期性输出 0,1 来戳狗。

单片机检测到超时没戳时,给继电器通电几秒,就成了..

(说来 ATmega 也内置一个 Watchdog Timer…

[1] The Linux Watchdog driver API;
[2] Allwinner A10 User Manual v1.20 (PDF), P99 10.3.25. Watch-Dog Mode Register.

]]>
/p/cubieboard-watchdog/feed/ 4
MMA7455L + Python + Cubieboard /p/accel-py/ /p/accel-py/#respond Sat, 11 May 2013 17:11:22 +0000 http://sorz.org/?p=347656 MMA7455L (PDF) 三轴加速度传感器,可以使用 I2C 或者 SPI 总线连接。两者 Cubieboard 均有提供,虽然不懂有多大区别但是 SPI 要四根线好麻烦所以就用 I2C 了..(

与 Cubieboard 的连接参照 WikiPB18 (TWI1-SCK)PB19 (TWI1-SDA) 两根接在模块的 SCLSDI 口上,接好电源(3.3V)和地线,模块的 CS 也接在电源上(以使能 I2C)。官网 ubuntu 镜像默认启用 I2C-1,若未启用则需修改 Fex 文件:twi1_used = 1

可以使用 i2c-tools 确认连接正确。装好后输入i2cdetect -y 1,如果出现1d(MMA7455L 的地址),说明连接无误可以通讯。

在 Cubieboard 上使用 Python 读取加速度数值,代码在这:MMA7455L.py,目前实现功能有:

  • 读取 8 或 10 位的 X, Y, Z 轴加速度数值(-127 ~ 128 / -511 ~ 512);
  • 切换 ±2g, ±4g 和 ±8g(set_range());
  • 自动校准(set_offset()clear_offset())。

#!/usr/bin/env python
import smbus
import time


class Accel():
    def __init__(self, dev=1, g=2):
        self.bus = smbus.SMBus(dev)
        self.set_range(g)


    def write(self, register, data):
        self.bus.write_byte_data(0x1D, register, data)


    def read(self, data):
        return self.bus.read_byte_data(0x1D, data)


    def set_range(self, g):
        if g == 8:
            d = 0b01000001
        elif g == 4:
            d = 0b01001001
        elif g == 2:
            d = 0b01000101
        else:
            raise ValueError("Only 2, 4 or 8.")
        self.write(0x16, d)
        self.g = g


    def _get(self, addr):
        l = self.read(addr)
        h = self.read(addr + 1)
        d = h << 8 | l
        if d > 511:
            d -= 1024
        return d


    def get_x(self):
        return self._get(0x00)


    def get_y(self):
        return self._get(0x02)


    def get_z(self):
        return self._get(0x04)


    def clear_offset(self):
        self.write(0x10, 0)
        self.write(0x11, 0)
        self.write(0x12, 0)
        self.write(0x13, 0)
        self.write(0x14, 0)
        self.write(0x15, 0)
        time.sleep(0.1)


    def _set_offset(self, addr, zero):
        d = self._get(addr - 0x10)
        d = zero - d
        d = int(d * 2.5)
        d += 65536
        self.write(addr, d & 0xff) # Low
        self.write(addr + 1, d >> 8 & 0xff) # High


    def set_offset(self):
        self.clear_offset()
        self._set_offset(0x10, 0)
        self._set_offset(0x12, 0)
        if self.g == 4:
            zero = 32
        else:
            zero = 64
        self._set_offset(0x14, zero)
        time.sleep(0.1)


def main():
    mma = Accel(1)
    mma.set_offset()
    while True:
        x = mma.get_x()
        y = mma.get_y()
        z = mma.get_z()
        print("x =%4d ,y =%4d, z =%4d" % (x, y, z))
        time.sleep(0.1)


if __name__ == '__main__':
    main()

这块IC功能挺多的,先把好玩的给写了,以后有需要再改脚本。

P.s. 写校准时被坑了两次,MMA7455L 的 PDF 里不给计算方法,得下 AN3745 看。里面有两句话:

(…) values calculated in Step 2 must be multiplied by two.
Note that there will still be a bit of offset shift, and you may need to multiply by a bit more than two to exactly subtract the offset.

果断只看到前一句就乘 2 了,实际上反复测试要乘 2.5 才完美…
另外虽然 PDF 里写数据只有 10 位,但负数取补码时得按 16 位取,发 16 位才行…

]]>
/p/accel-py/feed/ 0
U盘无反应——换个晶振试试 /p/udisk-fixed/ /p/udisk-fixed/#respond Fri, 26 Aug 2011 08:18:51 +0000 http://xierch.tk/?p=347232 数学代课老师的山寨U盘坏了……
据说他已经坏了N个U盘了…山寨品质靠不住啊

U盘插入电脑后,U盘LED常亮,Windows 毫无无反应。没有出现任何声响、提示……设备管理器里啥也看不见…
拆开,检查了USB口接触良好,外观上也看不出什么异常……

Google 之,发现很多人表示(这里还有这里),晶振很容易坏…
短路晶振,U盘LED闪烁,电脑出现反应,提示无法识别USB设备…

嗯,于是翻出了古董64兆U盘,把那12MHz晶振换上去,OK
不过郁闷的是那古董U盘上的晶振体积太大..根本塞不进啊~ >_<

最重要的还是数据,数据恢复出来了就好

另外U盘也容易丢…所以还是在PC上留份备份吧……

]]>
/p/udisk-fixed/feed/ 0
M8耳机接口故障解决 /p/m8-ear-fault/ /p/m8-ear-fault/#respond Sun, 13 Mar 2011 01:31:59 +0000 http://xierch.tk/?p=347170 去年M8自带的EP20在陪某猩买MP3的时候丢掉了…
后来买了TP850,效果貌似略微逊于EP20,用了两个多月后一边没声。当时是保修三个月,于是返厂修了……

现在已经过保,忽然音乐严重失真,人声几乎没了……在接头上用力按才能恢复…
由于一直在想“这次不知道能用多久”..所以直接就认为是耳机头坏了..没有继续测试就拆了..
结果发现是M8耳机接口问题!一阵蛋疼…试过用纸巾清洁耳机接口,插头上镀锡..都没用..
换了一个耳机插头,可以了..

几天后,旧病复发了…在网上找到了这篇文章,成功解决!
具体方法是:用牙签塞入耳机接口最外面一个金属触点背后,将触点翘起…

这是很常规的方法,但是由于其他触点都很难接触到,于是想到就直接放弃了…
还好只是最外面一触点的问题……

#update110313: 只需要拿个尖头小钳子即可将里面几个触点拉出。这样解决问题更彻底了。
另外,这样还可以解决死都不外放的问题

P.s 班上已经两位童鞋(要)买M9了!一位已经到手,另一位已经预定…叫我这个M8用户情何以堪啊……
M9的摄像总算是正常些了,720P,30Fps 。光线暗时(比如日光灯提供照明的教室内),依然保持流畅,但是色彩还原却变得很惨…基

]]>
/p/m8-ear-fault/feed/ 0
为 WN322G+ 无线网卡加装菱形定向天线 /p/usbwifimast/ /p/usbwifimast/#respond Tue, 21 Sep 2010 22:45:42 +0000 /USBWiFiMast.html 实际上是十几天前(2010-9-11)做的…

完成效果图:

改造后无线网卡的侧面
↑侧面

改造后无线网卡 顶部
↑顶部菱形天线

改造后无线网卡 底部
↑底部贴着的可怜的 TP-Link WN322G+ Ver1.0

如图所示,粗制滥造…
底板是仁爱英语听力磁带外包装剪下包上锡箔纸制成…忘了接地了…
馈线为双绞线中抽出铜丝,外包锡箔纸接地…谐振什么的完全没有..
做完时刚好固体胶用完,便将其盖子抓来作天线底座…
对于那 Φ1.5mm 铜丝,30W电烙铁表示压力很大……

虽然有以上种种囧处…但效果还是比想象中的要好很多的:
改装无线网卡测试效果

用本本自带的无线网卡,只能看到四五个网络….
换上改造后的无线网卡,对准窗外,能收到二十多个网络,还能直接连上几个未加密的网络……

关于菱形天线的制作,可以参考这篇文章,简单地说就是用铜线折个菱形,菱形边长为波长的 1/4,再乘上铜线的缩小系数。
按照网上的一些资料Φ1.5mm 铜丝缩短系数为 0.96。这样算起来,菱形边长为 29.39cm。
再如第二副图所示,一边焊馈线,一边接地(即焊在馈线屏蔽层上)即可。

关于 TP-Link WN322G+ Ver1.0 USB无线网卡外接天线的焊接,可参考这篇文章
WN322G 1.0 外接天线焊接图示
图片作者:nick668

另外,这个型号的无线网卡还有一种 Ver2.0 版,有些不同,焊接方式请参考这里

最后,本文有许多外链,这些外链随时可能失效…
如果失效,可以联系我,我将提供可能的帮助。

]]>
/p/usbwifimast/feed/ 0
[DIY]基于18650铁锂电池的USB充电器 /p/diycharger/ /p/diycharger/#respond Tue, 17 Aug 2010 07:06:33 +0000 /DIYCharger.html 暑假早些时候买了些元件,准备装一个手机等设备的后备电源…原本是为了去 YACA 时用的..但是没赶上…

前几天又买了几样东西,最终在今天搞定它了…
4枚铁锂电池:1200mAh×4=4800mAh

学次某论坛的风格,“不多说,先上图”:
为手机电池充电中
↑ 为手机电池充电中…

两节 18650 电池为并联…通过开关可以单独控制每接的通断…

本来是想用 BL8530-502RN 作升压的,可是那东西太小太小,受焊接技术限制无法使用.. -_-||
于是第二次又我花了 ¥10 买了这个现成的升压板…

宣传上这个5v升压板只要0.9v即可工作..问题是这铁锂放到2v就极限了…再放下去就过放影响寿命了..
我又忘了买保护板… -_-|| 还在考虑在现有材料下这个问题怎么解决….

为铁锂电池充电中
↑ 为18650铁锂充电中…(里面是我的蓝色铁锂电池)

本来是想把充电部分也塞入第一副图中的黑色电池盒中的…
受技术限制…塞不下…无奈只好用硬纸板卷了一个充电器出来… -_-||

顶部本来是想做一个塞子盖住电池的..但塞子容易掉又麻烦..刚好电池顶部有缝,直接将导线插进去就好了..
接触比想象中的要好,倒着放置也照样冲…(导线为 RJ45 双绞线里拆出来的… -_-||)

LED为红绿双色,本来是红色充电绿色充满,齐亮为没放电池的…但是我给焊反了… -_-||||

底部是一个平放着的 CN3060,发热量真的很大..所以也没全包起来..

CN3060
↑ 这便是刚刚所说的 CN3060..铁锂电专用充电IC…
(我承认导线那样卷纯属闲着蛋疼…)

为手机充电中的特写镜头
↑ 特写…那颗LED其实不是工作灯,是低压警告灯.. -_-|||
本来是为 3.7v 的锂电设计的,警告电压刚好是 3.2v..也就是铁锂的电压…不知道能否改成 2.5v 警告?

主要物品花费:

名称 单价 数量 单位 价格
18650 磷酸铁锂电池 1200mAh ¥7.50 4 ¥30.00
18650 电池盒 2并 ¥7.90 1 ¥7.90
3v 转 5v 升压板 ¥10.00 1 ¥10.00
CN3060 充电集成电路 ¥2.75 1 ¥2.75
6位拨动开关 ¥1.30 1 ¥1.30
合计 ¥51.95

一些说明:

1、选用铁锂电池是因为它安全,而且耐文明用语..
如果用离聚合物,体积会减小,容量会大幅提升,而且成本也会有所降低…

2、当然,还有双色 LED、1kΩ 电阻、10μF 电容、导线、焊锡、卡纸什么的…
这些加起来也没几分钱..我就不一一列出来了…

3、都是淘宝买的..需要的话自己去找..要列出来就有软文嫌疑了…

Ps. 我还入手了三枚 8mm 0.5W 的高亮白色 LED。我只给他加了 250mW 而已,真文明用语地亮啊!!

]]>
/p/diycharger/feed/ 0