>

开源我的fpm skill库

2016-11-28 by Stavros

无责任提供, 地址是https://github.com/tomzbj/fpm_skills, 请大家随意取用. 不定期更新.

部分由Tariel和Kurapica制作的封装没有放进来, 如果有需要请自行联系他们二位.

ps. 请先下载根目录的fpm.il并替换fpm目录的同名文件. 这个明文fpm.il由minux提供, 我添加了对槽孔的支持, 以及修正了若干bug, 比如双排简牛的缺口方向搞反, 四脚贴片有源晶振的管脚顺序错误之类.

read more

一键切换屏幕分辨率

2016-11-17 by Stavros

现在大家的桌面都是1920x1080或者2560x1440之类高分辨率了。但是有时候还不得不临时调到较低的分辨率,比如遇到需要像素级精确定位的时候,遇到百度网盘或者微信PC版这样字体又小又不能调大的软件的时候,等等。桌面右键然后改分辨率还是太麻烦了,用完了还得改回来。

有没有办法一键切换分辨率呢?没找到现成的工具,自己写一个。程序如下:

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance,
            LPSTR lpszArgument, int nFunsterStil) 
{ 
    DEVMODE dm;

    EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm);
    if(dm.dmPelsHeight == 1080) {
        dm.dmPelsHeight = 720;
        dm.dmPelsWidth = 1280;
    }
    else {
        dm.dmPelsHeight = 1080;
        dm.dmPelsWidth …
read more

卡片手电 & STLINK转接板 & 迷你电源

2016-09-22 by Stavros
  1. 卡片手电
    做了个和银行卡一样大的手电. 最厚处厚5.5mm, 因此可以和其他的卡一起塞在钱包里.
    本来用AMC7135作为驱动, 结果这东西太娇气, 一不小心就烧坏, 于是干脆直接用电阻限流了, 好象效果也差不多.
    效果见图:

  2. STLINK转接板
    JLINK和STLINK提供的都是20pin的标准JTAG口. 但是20pin实在太占地方了, 自己做板一般只用4pin或者5pin的SWD接口, 所以做了这个转接小板, 如图:

  3. simple power
    可以方便地从一节18650得到3.3V, 2.8V, 2.4V, 2.0V, 1.8V和1.5V共6种电压. 之前用SEPIC电路做过一个, 发现DC-DC还是干扰太大, 所以这次用了线性稳压, 干扰能小点.
    只用一个按键开关, 长按为开/关机, 短按为在不同电压之间切换, 用6个LED来指示各档输出电压.

read more

修复宜家LED灯一则

2016-03-16 by Stavros

宜家买的LED灯不亮了。把线剪断,两边分别一测,发现LED是好的,电源适配器无输出,只得再给它做个驱动。

LED需要恒流驱动,直接接个恒压输出的适配器上去是不行的,要么不亮,要么烧坏。串个电阻行不行呢?行是行,不过电阻会很热。这个LED灯是3W的,工作电流1A,接到5V电源上就需要串联2欧的电阻,电阻的发热量达到2W。这么做显然太不优雅。

幸好手里还有若干LED驱动IC:华润的PT4115,用它可以顺便把调光功能也加上。画了个电路图如下:

其中R1用于设定LED工作电流,公式为$I_{\rm LED} = \frac{0.1}{R_1}$. 电位器R2用于调光,从几百欧到几十kΩ的都可以用,这里用了拨轮式的音量电位器,好处是阻值按指数变化,这样LED亮度也按指数变化,会感觉实际亮度变化比较自然。

LDO XC6206用于给PT4115的调光脚供电,用输出2.5V或3.3V的LDO都行。PT4115允许的输入电压范围是6~30V,但注意XC6206的输入电压最高只能到7V,因此只能用6~7V的电源供电。如果需要用更高输入电压的电源,可以把XC6206换成HT7133、MIC5207之类 …

read more

利用Makefile实现avr-size -C的效果

2016-01-03 by Stavros

GNU工具链里的size大家应该都用过, 它可以显示elf/obj/exe/dll等可执行文件里各个段的大小, 非常方便. 加-A和-B参数分别是按sysv和berkeley格式显示, 默认带-B参数.

avr-gcc里的avr-size则又增加了一个-C的选项, 可以显示单片机flash和ram的占用比例, 需要同时用--mcu参数指定avr单片机的型号, 效果是这样的:

avr-size -C --mcu=attiny26 main.elf
AVR Memory Usage
----------------
Device: attiny26

Program:    1316 bytes (64.3% Full)
(.text + .data + .bootloader)

Data:         23 bytes (18.0% Full)
(.data + .bss + .noinit)

是不是很方便? 可惜arm-gcc里的size并没有这个选项, 于是从avr转到stm32之后, 常常会感觉到不方便.

后来发现, 只要在Makefile里all目标后面加上几行, 也能达到同样目的. 需要你的工具链里有sed和bc, sed用来从size的结果里截取包含数据的第二行 …

read more

最近的三个制作:酒酿机、6F22充电器、太阳能充电器

2015-08-15 by Stavros
  1. 酒酿机

    做酒酿(醪醩)需要保持40度左右的温度发酵。正好家里有个最便宜的小熊酸奶机,不带控温功能的,能否用它来改装成酒酿机呢?

    把小熊酸奶机拆开一看,里面简单得一塌糊涂:铝板上装了个PTC电阻,直接接220V电源,作为发热器,旁边甩了两条线出来接前面板的指示灯。可以说毫无技术含量。于是把这些东西都拆掉,换成前几天做的PID控温电路。控温板上加了两个两位LED数码管,分别显示设定温度和实测温度,两个按键开关用来控温。加热器还是IRF530+LM35的配置。控温范围从35度到65度。

    发酵碗里装满水,放个温度计,开机一晚上实测……发现碗里的水温最终会比发热板的实测温度低15~20度。大概是因为发热板外面隔了一层塑料板,发酵碗又是一层塑料,两层塑料的热阻太大了。幸好温度已经能满足做酒酿的要求了。

    下次打算把LM35的引线接长一些,粘在发热板以外的塑料侧壁上,避免从发热板直接传导热量到LM35,这样效果也许会好些?

  2. 6F22充电器

    手里有两个可充电的6F22,但是一直没有好用的充电器。以前买过一个,拆开一看,里面实在是惨不忍睹,只好扔了。

    自己做了一个,电路图如下:

    从USB输入的5V电压,用TP7660二倍压得到10V,再通过100欧电阻限流后给6F22充电。TL061接成比较器,一个输入端接电池正极,另一个输入端接100欧电阻和1k电阻分压得到的约9 …

read more

PID控温实验

2015-07-13 by Stavros

做了个PID温控器,原理图如下:

电源电压首先流经0.33欧的取样电阻R1,然后给加热器供电。加热器用随便一个TO220封装的N沟道MOS管就行,LM35用来测温。高端电流检测虽然麻烦些,但这样加热器的连线可以更简单,四条线就够了。

LM35输出的电压值经Mega48 AD转换后得到温度值。Mega48输出一路PWM经低通滤波后与取样电阻R1上的电压比较后控制MOS管的电流。之后用简单的PID算法即可实现控温了。

把MOS管和LM35用导热胶粘在一块95mm x 66mm的散热片上,实测用12V 2A的电源供电时,开环加热可以达到44度左右。启用PID控温后,可以在室温~44度之间把温度控制到设定值正负0.1度。

之后在这个基础上可以做很多东西了,比如酸奶机、酒酿机、煮温泉蛋机等等。

read more

最近的三个制作

2015-05-21 by Stavros
  1. 彻底榨干6F22的剩余电量

    从万用表里拆下来的6F22常常还有许多电量没有用掉, 直接扔掉比较可惜. 把它DC-DC降压后给单片机之类供电, 还能再撑一段时间.

    电路如图, 就是AOZ1016的标准电路. 在它的EN脚对地接一个22uF的电解电容, 再对电源和对地各接一个轻触开关, 便实现了软开关. EN脚的输入电流极小, 靠22u电解就能维持工作几十分钟. EN脚拉低时, AOZ1016消耗电流仅1μA左右, 完全可以忽略不计了. DC-DC降压到3.68V左右, 再由XC6206稳压到3.3V.

  2. 继续试验简易FM无线话筒

    话筒信号放大后直接推动与晶振串联的变容二极管, MMBT2222或S9018接成电容三点式振荡器, 谐振在晶振的三倍频上. 可惜这种方式能得到的频偏还是太小, 用收音机只能收到很微弱的信号. 下次试试锁相环调频吧.

  3. RF功率计

    几年前Tariel/BH1PHL送了我一个50欧 100W的RF电阻, 一直没用上.

    这次用它做了个假负载+功率计, 从RF电阻上取电压, 检波、滤波后分压, 用mega48的adc采样, 显示在0801液晶屏上.

    一开始检波二极管用的是2SC1622的BC结, 结果实测在50M时功率严重偏小, 144M和430M就一点功率也测不到了. 换成1N60之后一切正常. 估计是因为2SC1622的结电容太大?

    但是1N60耐压太低, 只有50V, 这样只能测到峰值25V的RF电压, 换算成功率只有6.25W了. 下次还是得用先衰减再测的方案.

read more

小台钟

2015-05-02 by Stavros

用手里闲置的Attiny24+LCD0801屏做了个小钟, 如图:

用一节600还是800mAh的手机电池供电, 充满电可以工作半个月.

原理图:

其中LCD用的是0801, 和1602接口完全一样, 加了一块之前做的串口转换小板. 由于是3.3V供电, LCD的V0脚需要接入负压, 这里负压用MCU的一路PWM经负倍压整流产生. 晶振用什么频率其实都无关紧要, 只要是个整数, 并且按一定的分频规则能凑出2Hz的频率就行了.

源程序:

tiny24_clock_src.7z

改天再给它加个太阳能电池, 这样也许就再也不用充电了.

read more

在stm32上使用二进制字库的简单方法

2015-03-13 by Stavros

标题其实可以写成"在可执行程序里嵌入二进制资源的方法", 不过这个题目大了点, 还是原样吧.

以前如果我们用到不带字库的点阵LCD, 一般都是把字库按16进制写成一个大数组, 再和其他源程序一起编译. 有没有方便一点的办法呢?这里给出两个方案.

  1. 使用objcopy把字库转成目标文件(.o/.obj)

    假设我们需要嵌入的是5x7的ascii点阵字库, 文件名是asc5x7.bin.

    在arm-gcc环境下, 命令如下:

    arm-none-eabi-objcopy -B arm -I binary -O elf32-littlearm --rename-section .data=.rodata asc5x7.bin asc5x7.o
    

    需要注意的是, objcopy生成的.o文件默认是把数据放在.data段的. 因此这里需要加个--rename-section的选项, 把.data改成.text或者.rodata, 不然单片机可怜的一点点RAM根本不够用. 如果是在PC上运行, 这里改不改就无所谓了, 不过内存还是能省点就省点的好.

    在.o里会生成三个符号: _binary_asc5x7_bin_start, _binary_asc5x7_bin_end, binary_asc5x7_bin_size.

    在程序里这么调用 …

read more