打造客厅“角落”PC续

前次说到打造了一台可以放在客厅塞在角落的PC(链接),这次是后面的花絮。

上次装完机后使用一直挺正常,直到后来忍不住跑了次prime95,core温度彪到了95度。虽然知道现在的CPU瓷实,不怕这个温度,可是这个温度时的CPU风扇温度稍微有点响。在咨询了team里面的装机达人以后,决定还是上第三方散热器。因为希望有比较好的散热效果,所以选择了热管散热器。

期间也考虑过水冷,现在水冷的部件都是一体化设计,而且体积小不占地方。不过最便宜的水冷一套也要400元,我不玩超频还是省下银子买套大菠萝吧。

由于是紧凑型卧室机箱对风扇高度的要求不能超过120米,所以塔式散热器一律都不能选了,比较了半天选择了Coolmaster的下压式散热器V400,整体高度不高但是配120mm风扇,很合我的心意。

热管式风扇将热量通过热管从底座带到散热片上,再通过风扇将热量吹走。

安装散热器却是十分麻烦。这个散热器需要将整个主板从机箱中卸下然后安装。为了避免以后加内存时麻烦,安装时选择了不挡住内存条的方向。据说热管最好不要被风扇直接吹到(风扇装在机箱前部),不过为了安装方便上的考虑,还是这样安装了。12寸散热器果然十分威猛。

装进机箱后接好所有电线(又看了遍说明书),上电后开机,似乎转得挺顺畅的。重开prime95,半小时后hwinfo 测得85度,比原来低了10度。效果比较满意。

最后顺便把连接显示器的线也整理了一下,主要是将线全部从架子的背面走线,并用理线带扎好,同时用HDMI线替换了原来的DVI线和音频线,这样理了一下以后架子显得整洁多了。上一张前后对比图。

Ivy bridge 装机记录(客厅角落空间PC)

家里原来的PC已经有六年了,正好这次Ivy Bridge上市,就打算装一台新机器。之前也为家里还需不需要台式机纠结过,不过为了处理照片和玩游戏还是果断装了。这次的目标是装一台能放在客厅角落不占地方的PC,同时在性能和静音间取得平衡,主要用途是处理照片和玩山口山和D3。

为什么要把PC放在客厅呢?因为之前在书房打游戏时太太意见很大,所以把PC放在客厅多少也方便用PC时说话。但是怎样把PC放在客厅又不占地方就变成伤脑筋的问题,因为客厅比较小,加一张电脑桌,哪怕是再小的也不现实,只有从客厅现有的格局入手,将角落空间变成PC使用空间。不用时又能很方便的收起将空间挪出。

首先是电脑的配置:

CPU: Core i7 3770

主板: Intel DH77EB MATX

硬盘: Intel SSD 520 240G

显卡: 待定

内存: 芝奇 1600 8Gx2 (F3-12800CL10S-8GBXL)

机箱: 银欣 GD05 (SST-GD05-A)

OS: 微软 Windows 7 家高版 (Home Advanced)

电源: 振华 金山冰蝶 550W (SF-550P 14XE(GX))

显示器(已有): EW2420+艾格升显示器支架

这套配置基本上还是兼顾了性能和能耗以及静音的,在机箱和显示器的选择上也考虑到了对空间的要求。显卡和散热器暂时没配。一来是Kepler的中低端显卡还未上市,用CPU自带的HD4000显示核心也能撑一段时间;二来对Stock散热器的性能到底怎样也不清楚,打算等熟悉了系统的发热情况再做打算。

上配件图

Intel Core i7 3770

虽然不是最高端的家用版CPU(Sandybridge-E六核),但是从主板大小和散热综合考虑,这颗4核Ivybridge已经很不错了。和3770K相比主频低了100MHz,但是多了VT-d技术。虽然说VT-d技术对家庭用户来说没用,不过对工程师而言还是有折腾的价值的。当然比3770K价钱也便宜一些,对不超频的用户来说是很合适的。

顺便要批评一下DHL,周末不送货害我没法周末装机,送货也不及时


Intel DH77EB MATX

本来打算买mini-itx的主板装迷你机箱的,研究了半天后发现迷你机箱的散热普遍都很难弄,电源也很难选。所以索性选了m-atx板配小型卧式机箱,散热和电源相对都比较好搞。

Intel 520系列SSD 240G

240G空间一半给windows一半给linux。从散热和噪音的角度暂时就不装机械硬盘了。家里有NAS作大容量存储,所以平时不用的数据可以倒到NAS上存放。据说下半年SSD价格要跳水,如果感觉不够用那就等以后再买一块了。

GSkill 8Gx2 1600,京东易迅看了半天这是最便宜的,以前三星海盗船金士顿的普条都用过,貌似没遇到过不稳定的情况,既然不超频就买根便宜点的吧,话说现在内存条外观越来越威武了,不知质量有没有变好。

振华金牌电源550W,泡易迅的时候发现了电源还有白牌铜牌银牌金牌白金牌之分,金牌的能量转换效率在90%以上。这个台湾电源品牌在玩家中口碑十分不错,我也就进一个试试。

银欣GD05机箱,说到角落空间,我是希望将机箱摆放在客厅杂物架的最下面的一格,所以必须是卧式机箱,而且对进深有异乎寻常的需求(30厘米)。但是mini itx机箱的散热太差撑不了3770和独立显卡,所以选了这款m-atx机箱,进深只有325mm,虽然比理想情况还多出25mm,不过也凑合了。

Windows 7 家庭高级版。为了16G内存不得不买家高版,普通版只支持到8G。本来打算688买的,京东正好在做活动,499就买到了。这个就是微软极其不厚道的一点了,H77芯片组最高支持到32G内存,但是想用到就必须买专业版。一来是我的硬件我做主,买个软件为什么还要限制我能用什么硬件;二来和Linux比起来,我付较多的钱还用到了较少的功能,这点让人感到极不爽。考虑到将来可能会升级到32G内存,应该Linux会是主要的折腾(照片处理+开发)用平台了。Windows只会用来娱乐+网银。

下面这个是去年买的,明基EW2420加艾格升支架。当时为了能把台式机放在客厅里动了不少心思,起初考虑买张迷你电脑桌,后来发现还是用支架装在杂物架上省地方。支架的灵活性很高,坐在两边的沙发上都能用,也方便以各种姿势用电脑(包括躺着)。架子的最下层是原来的PC,稍微大了些。

显示器的选择也是考虑到会另配支架,所以选择了没有升降底座的显示器笨球EW2420(相当于没有为高级底座花钱),出于重量考虑选择了LED背光的显示器,重四公斤。这款显示器虽然样子并不出众,但确是真8-bit广视角面板,相比许多伪专业显示器用6-bit面板抖动到8-bit来说,要厚道许多。显示器自带一个usb HUB,加小喇叭一对,适合对空间狭小的应用。

需要说的是最然显示器重量只有4kg,可是加上支架以后由于力矩的关系所以对接触杂物架的扭力还是挺大的,所有的重量都在杂物架上巴掌大的一点,支架展开后力矩也十分大,所以这样用了几个月后搁板的塑料扣具可耻的断了,最后搞了块铁片替换,貌似变牢了一些。如果有人想仿效的话一定要考虑到支撑强度。

艾格升支架特写,厂家后来还专门电话回访,问有什么可以改进的地方,可以说服务态度不错。

 

配件全家福:

装机费老鼻子劲了,毕竟上次装机还是五年半之前,还是去电脑城请人装的。在反复翻看说明书加趟汗之后,总算将所有元件都装到位,加电启动后没有任何火花出现。

开始装系统,这活我熟。

安装完毕,机箱的进深短了许多,虽然还有十公分左右凸出在外面,不过和架子的环境比起来已经很和谐了。基本上贴着架子坐没有问题。声音方面,待机时尚可,不知拷机时如何,到时候注意观察了。

Ok,本次角落空间大作战到此结束,下次装机可能又是六年后了。byebye

软件DIY的悲喜经历

我是一个软件DIY爱好者。软件DIY,指的是自行编写软件完成供个人使用的功能。和普通DIY一样,DIY的软件是给自己使用的,所以无论是时间成本还是经济成本都不太重要,同时在功能上也是以够用就好为准。如果你平时喜欢写个把脚本来完成生活中的需要,那么你也算是一个软件DIYer。

一点背景介绍,软件DIY一般使用脚本语言例如python, php, awk作为开发工具。开发过程大可不必像在公司里写代码那么严肃,或坐或躺皆可,写代码时喝咖啡提神也可,适量饮酒也可,完全没有在项目组里写代码那些顾忌。一个编辑器写代码,一个浏览器看手册是常见的开发模式。常常前一分钟在手册里看见一个用法,下一分钟就写进代码里了,边学边写,写完就忘是常见现象。当然软件可读性可维护性在DIY里也是不需要太多考虑的,很多“只写代码”(write only code)都是在DIY项目中出现的。可以想像,软件DIY是一种很好的头脑放松活动,特别适合那些被需求分析,架构设计,代码重构,安全分析,最终期限压得喘不过气的软件工程师们。

当然,任何自由都是有代价的。和其它DIY项目相比,软件DIY有一个很不同的地方。其它DIY产品所存在的环境—-我们所身处的这个宇宙以及其中的物理规律,是几乎保持不变的。如果你DIY了一只怀表,你可以很放心的使用它几十年,中途所需要的只是定期上油和替换磨损部件,仅此而已。而软件所存在的环境—-操作系统,运行环境,系统库,软件依赖,底层硬件……等等,无时无刻不在发生变化。也许在某次升级系统后,你的某个软件就没法使用了。如果你使用的是某个商业软件或者维护良好的社区软件,那么很简单,升级到最新版就行了。可是你猜怎么着?没人维护你写的软件。所以你只能掏钱雇一个程序员来维护这个软件—-而且还是你自己写的!—-或者自己拿起键盘来重新维护它。这当然也不容易,可能最近你工作很忙又没空;也可能你最近不那么在状态;或者你转职后写不了程序了。这时你就会开始后悔为何当初不写注释了。

讲讲我经历的DIY软件的悲惨经历:

1. 花了一周时间写了红外线USB遥控器的用户级驱动,两年后系统升级时系统库接口变更,不得不在看电影前花两个小时按照新接口把程序重写了一遍。

2. 捣腾USB收音机,网上找到的程序都是v4l的—-我的系统是v4l2的,在看了两天v4l和v4l2接口区别后改写编译了程序,之后每次升级系统时都要神经质的检查下v4l2有没有升级。

3. 写了从verycd上自动查指定剧集更新并自动添加到emule下载的脚本,结果verycd洗手不干了,辛辛苦苦写好的脚本也就此废掉。

4. 为7寸安卓平板专门做了一个百度输入法皮肤,横屏输入时流畅无比。结果百度输入法升级后原本的皮肤不能用了!别人下载的皮肤都高高兴兴的升级了!没人帮我升级皮肤!现在安卓平板上输入就变成了个悲剧。只有等待下一个长假了。

5. 为XBMC写了插件,结果Python升级后不能用了,只好自己一行行改缩进。

当然,成功的经历也有:

1. 为《骑马与砍杀》开发汉化框架并做了第一版汉化。成功的找到了愿意维护框架和字体文件的爱好者。现在这个社区很好的运作着,还成为游戏在国内的销售代理,从此买来游戏就有汉化用了。

2. 在rawtherapee中做了一个auto distortion correction的插件,成功提交补丁,从此这个功能从bug到图标都有人帮忙维护。

3. 根据NAS自己改的一个卧室小音响兼闹钟兼收音机,用了五六年了,因为不升级系统,所以几乎不需要维护。

所以对于一个软件DIY爱好者来说,要想免除未来维护的烦恼,出路无非是三条:

1. 找到愿意维护的下家,将软件开源,这样自然会有人免费进行维护。

2. 将代码反馈回mainstream,成功提交补丁是针对开源软件DIY的唯一出路。否则就自己一版一版的改下去吧。

3. 永不升级系统,只要你能忍住不用系统其它cutting edge的功能,不升级系统也就降低了需要维护的概率。

软件DIY是一种不错的业余消遣,可是如果控制不好也容易变成时间上的无底洞,希望此文可以对各位有所借鉴,节省各位的时间。

豪斯医生的除虫之道

豪斯医生的除虫之道
电视剧《豪斯医生》终于要告一段落了。从第一季一直看到第八季,这可能是我除了《成长的烦恼》以及《神探亨特》以外又一部看全了的美剧。(当然像《英雄》《终结者编年史》这样半途而废的不算)
豪斯医生对我的吸引力,是在于其推理的内核。剧中豪斯所破解的种种病因,对我来说可以说是半点不懂。解释病因时如果没有那些动画,翻成中文我也不懂他在说什么。而那些医学名词,除了记住几个LP, CPR, Steoroid, kee-mo之类的词供以后装逼时用以外,也没剩下什么。但是电视剧本身推理的脉络,还是很清晰的:病人得了怪病,医生提出种种假设并去现场一一求证。医生钻进各种死胡同,最后灵光乍现破解案件。由于我对医术不懂,所以不好妄言这是不是本格推理,不过如果是找日本编剧写剧本的话,豪斯高太郎恐怕要在恍然大悟后在聚光灯下转向观众说:病人得的是xx病无疑了,那么我是怎样知道病人得的是xx病呢?电视机前的观众朋友们,我们一会见~~
撇开此剧的本格内核不说,豪斯医生诊断病情的方法竟也暗合我等软件工程师炼化代码中性命交关之头等大事–debugging.
Debugging相信当过软件工程师的朋友们都不陌生,那真是程序员的噩梦。记得我刚学写程序的时候,第一个稍有规模的程序(走迷宫),写好后调了一个礼拜才调通。相信各位的办公室中也常常流传着“某某bug过了半年才调出来”这样的传说。debugging是项目计划中最容易忽略的一部分,也是最不好估计的一部分。有多少程序员为了程序中的一个错茶不思,饭不想。也有的朋友因为承受不了半年调不出一个bug的压力,放弃了程序员这份职业。
豪斯医生的诊断思想却可以给debugging一个方法上的指导。豪斯的differential diagnosis,是一种系统的诊断病人病情的方法。他的方法有以下几个特点:
1. 根据症状列出可能的病因,并一一排除之。
豪斯医生诊断的阵势一向是把症状一一列在白板上,然后由众小强逐一提出能解释这些症状的病因,然后再逐一排除不能完美解释症状的病因。如果遇到不能确定的情况,则由众小强去做各种测试来验证。所以第一次会议后众小强验血的验血,拍片子的拍片子—-我多么希望我debug的时候也能有这么大阵势啊。
debugging也是这样,程序员首先要尽可能的收集和程序有关的信息,比如断点状态,程序log,错误表现等等。根据收集到的结果来对错误的原因做出各种猜测。如果不能够确定的,则会对代码进行单步或者插入更多调试信息等方法来排除错误猜想。
注意这一步的关键是排除,而不是证明。我们做的各种试验,目的是为了能够排除我们的某个猜想。关于一个错可以有各种猜测,但是只有一个是正确的(也可能一个都没有),这个阶段我们不是要选定一个方向深研进去,而是设计一个试验能够验证这些方法是否正确。所以要首先动手去排除那些容易排除的原因。我常常看到一些程序员盯着某个最可能的原因研究了很久,其实在第一阶段排除干扰,确定不是各种简单错误才是重要的。
2. 调查病人的居住环境
这也是豪斯医生的老套路了,每集都会派两个小强到病人的住所去收集各种病人用过的东西来确定病人有没有可能接触了某些有害物质。程序员在debug之前也应该确定一下程序的执行环境有没有奇怪之处。很多时候程序的错误是因为没有考虑到某种特殊的外部条件,如果程序员可以在不同环境下跑一跑程序,也许很快就能发现错误的根源。
3. 发现病因,再治疗症状
记得豪斯医生中有一段戏,13怀疑病人得的是A或B病,这两种病都能用某药治疗,于是建议用该药。但是豪斯不同意,因为这样虽然治好了病人,但是“我们还是不知道她得了什么病”。
好吧,作为一个医生这样想真的很变态,但这是一个很好的debugging思想。debug的时候要找到的是 root cause,而不是仅仅把出错的症状绕过就了事了。一个程序员应该像推理小说中的名侦探一样,犯人,手法,证据,一样都不能少,否则是不能把众人召集起来做出破案宣言的。
4. 争分夺秒
豪斯面对的是一个随时都会咽气的病人,程序员面对的是一个随时可能推迟发布的产品。从这点来讲,程序员的压力并不比医生小。每个花了半年才调出的错误可能都伴随着一颗已经逐渐变得冰凉的客户的心。一个优秀的除错大师,不仅仅在于能调出多古怪刁钻的bug,也在于能多快的调出一个bug。对于小bug要秒杀,对于困难的bug则要有系统性的方法来应付。
5. 寻求灵感
Debug这件事,程序员的阅历越丰富,越容易想到错误的原因。平时应该多参加各种闲聊,也许某人对中东局势无意中的一句评论就能瞬间点醒梦中人。豪斯医生虽然有前面这些强大的工具,可是真正解谜那一瞬间都是在干别的事中得到的。所以平时多积攒些人品,关键时刻才有可能瞬间爆发。

Proxy 杂症一则

今天忽然发现连不上公司VPN了,按照惯例在chrome中把proxy设为direct connection,但仍旧连不上,试了好几次都这样。

忽然想起前两天升级 chrome  browser 到 release 18,顺便把proxy switchy换成了v18兼容的proxy switchy sharp?  难道是因为proxy switchy修改的是全局proxy而proxy siwtchy sharp修改的是局部proxy?

进入IE设置想修改一下全局proxy试一下,却发现被系统管理员限制了设proxy的选项. 怒!难道以后都没法连公司vpn了?可以不用在家干活了?

开始疑惑为啥原本chrome browser里的proxy switchy能修改全局proxy? 明明跟我一样的权限啊?

眼前一亮,开regedit,寻找预设proxy字串,在ie设置里面找到,清除之,重新打开VPN客户端。搞定!

结论:Win7的policy设置还真的只是个摆设。

升级光纤后补,设置二级路由

自从上次升级光纤并修改网络拓扑之后,发现有了新问题,家里有台电脑怎么都上不了网。上网一查,发现是电信的光纤路由限制最多四台电脑上网。说起来这个限制并不太合理,很多人家里都是人手一台笔记本,加上智能手机或者tablet在家也通过wifi连接,很容易就能超限。像我这样家里还有媒体服务器和网络媒体播放器的,一个家里有七八个mac地址是很平常的事,所以一定要想办法把这个限制绕过去。解决办法是用超级用户帐号登陆电信的路由器关掉路由功能。可是卧室有台媒体播放器只能连在电信路由器上,怎么办?

研究了网上一些文章,很多人都提示可能是因为电信路由器对dhcp分配和DNS设置了限制,所以还是需要用自己的路由器分配ip地址和DNS服务器地址。。在咨询网络达人以后,决定还是使用二级路由的方法。

1. 将自己的无线路由器WRT54G设回gateway模式,开启dhcp,并将网段改为192.168.0.*,无线路由器的WAN口接在电信路由器的LAN口上。此时家庭网络出现两个子网:192.168.1.x是电信的子网LAN1,192.168.0.x是WRT54G的子网LAN2,LAN2通过LAN1中的一个网口连接互联网。

2. 将无线路由器的WAN口设为static IP, 设成一个预设的ip地址192.168.1.y。并手动设定DNS server地址。

3. LAN2中static ip的电脑都修改网段为192.168.0.xxx,并修改脚本中server的ip地址(当初写脚本的时候没考虑到修改网段的问题啊!)

4. 此时LAN2中的电脑都能连接互联网,但卧室中的媒体播放器ip地址为192.168.1.xxx,无法和其它机器互联,怎么办?我需要媒体播放器连接服务器的icecast端口来听广播,所以只需要能连接这一个端口就行了。

5. 无线路由器的IP table中增加一项,将发送给192.168.1.*的包通过WAN口转发给LAN1。并设置8000端口转发给LAN2中的媒体服务器。

6. 修改LAN1中媒体播放器的脚本,将原本连接媒体服务器改为连接192.168.1.y。这样LAN1听广播的功能也就实现了。

不清楚电信封四台以上机器的方法,所以还不太清楚这个办法是否有效,要观察一段时间才知道。如果不行的话只能去要电信路由器的超级用户密码了。

升级光纤,不花一分钱修改网络拓扑

小区的ADSL要升级成光纤了。很早就期盼这个消息,无奈小区的光纤改造迟迟没有完成,现在终于改造好了。国庆前电信公司就联系我要安装光纤,但是国庆节那一天安装时出了问题,原来ADSL的线无论如何都抽不动,电信公司的人说,小区物业不上改明线(我也不愿意)于是电信公司的人就回去了。

当时因为是早上9点,脑子一直昏昏沉沉的。等一杯咖啡下肚,忽然想起,电信的人搞不定线路,物业应该能行啊,于是打电话给物业,物业的人告诉我说,他们会打电话给电信帮我搞定这件事。于是我就等电信给我电话了。

之后就一直在想,如果线真的进不来,那么怎么办?因为家里有一个Atom Media Center兼NAS+Download Station,一个台式机,还有一个link station放在卧室当闹钟和流媒体客户端,加上无线设备若干。静态ip和动态ip都有,家里的网络拓扑虽说不复杂,可也算是牵一发而动全身了。如果不能把光纤拉到现有的路由器位置(所有房间的网线都汇到客厅一角),那么连线就比较麻烦了。

想了好几个不同的解决方案,一个是把无线路由器和光猫放在外面的弱电箱里或者放在门口的位置,然后把所有设备通过无线上网。这是最简单的连接方式,可是免不了要给PC机买usb无线网卡,再加上为了保证内网速度而升级成802.11n的费用,凭空就多了差不多一千大洋的开销。

因为打听到电信还会送一个无线路由器,所以就想到了第二个方案是利用media center上自带的无线网卡,连上电信送的无线路由器。然后把media center设置成网关,转发内网所有的包。无线设备则可以通过原来的无线路由器连接上网,这样可以保持所有内网设备的互连接性,然后所有设备通过网关,穿过54M的无线链接上网。这样至少在电信把上网带宽升级到50M之前,外网访问是不会有瓶颈的。而内网还可以继续通过百兆网络连接。

这样合计完了后,就等电信给我打电话,可是电信老也不给我打。过了两天,发现家里的宽带变成4M的,于是觉得要是不升级其实也没什么,4M带宽其实已经很够了。其实要搞什么光纤入户嘛,光纤统统连到楼下的弱电房,统一用网线给信号岂不是更方便,家里还能少一个设备少一根线。

结果享受了4M宽带没几天,电信又给我打电话了,预约周六来装宽带。这次来了后依旧拉不动电话线。但是四处转了转,在卧室门后一个空的接线盒里拉出了一根网线,原来是长城宽带的网线!我都不记得这个空盒子了,只记得当初装修时为了隐藏这根网线还专门买了个空的插座盖盖在上面,没想到这个就是长城宽带的网线啊。于是通过这个口把光纤拉进了卧室。拉好线以后安装工人就走了,说下午会有人过来安装设备。

原来的方案二应该还是能用的,但因为卧室有一个网络接口,就在想能不能利用这个网口避免无线桥接。想法是光猫放在卧室里,然后通过网线和客厅的无线路由器连接,这样路由器拨号后就能上网了,几乎所有的设备连接方式都不变。唯一的问题是卧室有一个link station,用来当闹钟和网络收音机的,因为光猫上只有一个网口,所以link station必须改成无线上网了。但应该不太难搞定,买个usb wifi卡就行了。这样合计着,我就先去网上搜usb无线网卡了。

不一会安装人员来了,带来了一个光猫和一个—-无线AP?! 一问之下才知道现在华为的光猫HG8240内置一个四口的路由器,带三个LAN口,一个IP tv口,和两个电话口,客户端免拨号,无线功能则通过一个无线AP完成。(说明书上说也有光猫无线路由3合1的HG8245)

真是计划没有变化快啊,这样卧室的link station也许就能直接连接在8240的LAN口上,另外一个LAN口接到客厅的无线路由器,这样不用多花一分钱就搞定了所有设备的物理连接,还白得了一个闲置的无线AP。但是网络拓扑发生了变化,原来的无线路由器不再需要拨号了。

按照最新的方案连接好了所有的设备,整理好连线后,欣喜的发现内网已经可以完全互连了,而且所有静态IP的设备已经可以上外网了,但是无线设备上不了外网。于是连进无线路由器查看设置。发现无线路由器的IP 192.168.1.1和电信提供的路由器IP地址冲突,于是修改成另一个IP。但发现无线设备还是上不了网,主要是dhcp拿不到dns server地址。接下来把无线路由器的网关功能关闭,改成路由功能。重启各个设备后所有设备都能上网且能相互连接。

于是家里的网络拓扑变成了二级路由设置,一台设备连接在一级路由上,其它所有设备连接在次级路由上。拓扑结构的修改没有花一分钱。虽然不太明白为啥这样就能连接成功(上大学时网络课一听就想睡觉),但又能上网了还是很好的。上网速度变成了10M,开网页感觉到了略微的加快,但上传还是坑人的512K,在高清电视上高清视频聊天就不用想了,等待电信以后再增加带宽把,听说今年E9用户都会升级成20M呢,期待中。

红外遥控发射器(补)

先上张电路图。pcspkr就是PC机上小喇叭的线,当设定为某个频率时,会发出该频率的[0,+5v]方波信号。当在相应寄存器中写入0时,该引脚无信号。这样只要控制该寄存器值就能控制红外遥控信号的发出了。红外遥控器有一个基准频率,一般为36KHz或者38KHz,视具体的电视机而定,当频率偏离该值时,遥控距离迅速减小(猜测是因为无法达到足够的共振频率)。

image

上次软件篇中提到不能驱动pcspkr发出大于32khz的信号,事实证明这是pcspkr kernel module的一个限制。

http://lxr.free-electrons.com/source/drivers/input/misc/pcspkr.c

 50         if (value > 20 && value < 32767)
 51                 count = PIT_TICK_RATE / value;

这样pcspkr不能发出低于20HZ或者超过32767HZ的声音。严格的说这不算是一个bug,因为这已经属于人耳无法听到的范畴了,但是对想要发出高频红外信号的我来说,却是不小的困惑。

继续研究后,发现Linux下可以通过直接对端口读写来绕过这个限制。这样只需要在应用程序中使用pcspkr.c驱动中的这一小段code就行了。大概曾经在DOS下写过pc小喇叭程序的朋友应该都很熟悉这段code.

 55         if (count) {
 56                 /* set command for counter 2, 2 byte write */
 57                 outb_p(0xB6, 0x43);
 58                 /* select desired HZ */
 59                 outb_p(count & 0xff, 0x42);
 60                 outb((count >> 8) & 0xff, 0x42);
 61                 /* enable counter 2 */
 62                 outb_p(inb_p(0x61) | 3, 0x61);
 63         } else {
 64                 /* disable counter 2 */
 65                 outb(inb_p(0x61) & 0xFC, 0x61);
 66         }

在调试中发现红外发射管的发射强度比较弱(用摄像头和电视遥控器比较结果),于是把电阻换成47欧姆的了!这样最大电流是80毫安,但是因为方波信号的duty cycle是1/2,所以平均电流是40毫安,小于手册的最大持续电流,应该是安全的。PCSPKR只能发出方波信号,这种情况下反而成为一种优点了。

关于遥控器的代码,可以到lirc的网站上去下一个各种remote的网站的大集http://www.lirc.org/remotes.tar.bz2,只要你的遥控器不是太冷门,一般总能找到遥控器的代码。关于遥控器的编码格式可以从这篇博客入门http://jimlu.spaces.live.com/blog/cns!9B1C2AEA8D078F9A!609.entry?sa=211980024,lirc的文档中也能找到不少资料。

参考了下lirc的网站,各种home brew的红外接收发射方案都有,有用串口或者并口的,比较夸张的是通过声卡的line in接口做红外接收的信号分析的。不过貌似用pcspkr的没有,算是pc控制红外发射的一种新方法,呵呵。

最后放上程序,虽然不是通用的,不过稍加修改应该可以适用各种情况。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/io.h>
#include <sys/ioctl.h>
#include <linux/kd.h>
#include “cycle.h”
#define PIT_TICK_RATE 1193182ul
#define PULSE_FREQ 38000

int console_fd;
struct remote_space_enc {
    int header[2];
    int one[2];
    int zero[2];
    int predata;
    int predata_bits;
    int trail[2];
    int toggle_bit_mask;
};

struct remote_space_enc panasonic_tv =
    {
        {3430, 1700},
        {440, 1320},
        {440, 440},
        0x400401,
        24,
        {400,74158},
        0x0,
    };

inline void vsleep (usec)
{
    ticks tick1 = getticks(), tick2;
    while(1) {
        tick2 = getticks();
        if (elapsed(tick2, tick1) > usec*1600) {
            break;
        }
    }
}

inline void _0 ()
{
    /* disable counter 2 */
        outb(inb(0x61) & 0xFC, 0x61);

}

inline void _1 ()
{
    int count = PIT_TICK_RATE/PULSE_FREQ;
    /* set command for counter 2, 2 byte write */
    outb(0xB6, 0x43);
    /* select desired HZ */
    outb(count & 0xff, 0x42);
    outb((count >> 8) & 0xff, 0x42);
    /* enable counter 2 */
    outb(inb(0x61) | 3, 0x61);
}

inline void pulse(int usec)
{
    _1();
    vsleep (usec);
}

inline void space(int usec)
{
    _0();
    vsleep (usec);
}

inline void send_bits (int one[2], int zero[2], int code, int width)
{
    int i;
    int mask;

    mask = 1<<(width-1);

    for (i=0;i<width;i++) {
        if (code & mask) {
            pulse (one[0]);
            space (one[1]);
        } else {
            pulse (zero[0]);
            space (zero[1]);
        }
        mask = mask >> 1;
    }
}

inline void send_code (struct remote_space_enc * remote, int code, int width)
{
    send_bits(remote->header, remote->zero, 1, 1);
    send_bits(remote->one, remote->zero, remote->predata, remote->predata_bits);
    send_bits(remote->one, remote->zero, code, width);
    send_bits(remote->trail, remote->zero, 1, 1);
}

int main(int argc, char** argv)
{
    int j;
    int len;
    int code;
    if (argc<=1) {
        printf (“Must supply the signal you want to send\n”);
        exit (1);
    }
    console_fd = open (“/dev/console”, O_WRONLY);
    if (console_fd == -1) {
        printf (“open console file handle failed\n”);
        exit (1);
    }
    ioperm (0x42, 2, 1);
    ioperm (0x61, 2, 1);
     len = strlen(argv[1]);
    code = 0;
    for (j=0;j<len;j++) {
        if (argv[1][j] >= ‘0’ && argv[1][j] <= ‘9’) {
            code = (code << 4) + argv[1][j] – ‘0’;
        } else if (argv[1][j] >= ‘a’ && argv[1][j] <= ‘f’) {
            code = (code << 4) + argv[1][j] – ‘a’ + 10;
        } else if (argv[1][j] >= ‘A’ && argv[1][j] <= ‘F’) {
            code = (code << 4) + argv[1][j] – ‘A’ + 10;
        } else {
            break;
        }
    }
    send_code (&panasonic_tv, code, j*4);
    _0();
    close (console_fd);
    printf (“\n”);
    return 0;
}

红外遥控发射器(软件篇)

搞定了硬件电路的问题,接下来就要考虑怎么跟电脑连接了。红外遥控器一般是在一个高频信号(36KHz)上加载一个低频的调制信号,所以实际上我们用的遥控器都会利用一个晶振来产生载波信号。像下面这个图这样这种电路看起来就已经很复杂了,以我现在的电焊水平是没办法应付的。

image

因为是通过电脑控制发射遥控信号,所以我预备通过电脑来控制所有的高低频发射,所以在硬件篇里面的硬件只有两个元件。那么接下来就是通过电脑的哪个外设接口来控制的问题。

一开始考虑用COM口。COM口是标准的可编程外部接口,比特率达到112Kbps,完全能够通过对COM口编程达到驱动红外发射二极管的目的,不过在和同事讨论的时候发现COM口至少有两个问题:

1. COM口的0和1分别是正负电平,虽然二级管能够承受一定的反向电压,但是理想的情况还是没有反向电压的好。

2. COM口的TX信号电压不定,根据手册是5V到9V不等,也就是说稳流电路需要有自适应性。另外如果电压是9V的话,反向电压就超过反向工作电压一倍不到,需要并联一个电阻来匹配反向电压。

于是把目光移到了主板上的另外一个部件,pc speaker上。http://en.wikipedia.org/wiki/Pc_speaker PC speaker是一个典型的方波发生器,只需要写入跟频率倒数有关的数字就能够产生高频方波信号。它的电压也是标准的5V,而且信号是在5V和0V之间变化,和二极管正好匹配。编程也比较方便。

好吧,我承认这是典型的Cowboy Programming,是不符合Code Craft精神的。不过作为业余爱好,还是能少花些力气就少花些力气吧。

先确认PC小喇叭是有声音的以后,把昨天做好的电源组件接到了pc小喇叭上,然后让它发出beep后用数码相机观测,O yeah,成功工作了。其实这样是小有点冒险的,因为不知道pc speaker PIN的输出功率是多少,不过当我打开机箱看到pc小喇叭上写着8欧姆0.5w的字样后就很放心了。

然后就是一些基本的计算,我的电视机兼显示器是Philips的,采用RC5编码,高频信号为36KHz,算下来应该把pcspkr编程为33就可以达到这个频率,可是实际上发现一旦频率大于32khz红外发射管就不亮,不知道是因为什么原因,可能是红外LED管不能工作在这么高的频率下,也可能是pc spkr针脚实际上不能输出这么高频的方波信号,回头改回pc spkr再试一下。好在32khz也能认出来,但是识别距离就变得比较近了,只有离几厘米的距离才能认出。

具体驱动pc spkr的方法参见这个链接:http://tldp.org/LDP/lpg/node83.html

RC5的标准参见这个链接http://en.wikipedia.org/wiki/RC-5,具体的参数可能随不同遥控器而不一样,比如我的遥控器的01信号间隔就是780us而不是上面讲的889us。遥控器信号的获得是利用我的一个usb红外遥控接收器,以前做过一个mce遥控器的libusb app,程序里面有很多调试信息可以打。通过对比标准philips遥控器和红外发射管产生的调试信息,可以逐渐找到合适的信号。

最终结果:我可以通过这个发射器控制电视机的音量啦!这里就不上图了。我的最终目的是要能够通过这个发射器把客厅的电视机和htpc结合起来,通过mce的遥控器来直接控制电视机,这样就能扔掉电视机的遥控器了。随着技术问题的解决,剩下的就只是具体的调试问题了,实践证明通过pc speaker当作遥控器的信号发生器是完全可行的,虽然还不太完美,不过是可以用的。软件篇到此为止,谢谢围观!

类固醇计划 — 准备活动

类固醇计划的准备活动开始,就从这种常见的耳麦入手。家里有一个旧的耳麦,想改成无需头戴的坐式麦克风,于是就破坏性的把话筒线和麦克风拆下来了。

P1090803

拆下来的麦克风头就是下面图片这种,叫驻极体咪头,其实里面的核心部件就是一个永久带电荷的电容器,通过声音驱动电容器两极板间距离变化,产生电流输入pc的话筒线,具有灵敏度高的特点,据说里面还有个放大电路,没拆开来研究过。

image

电子产品这类东东拆了才发现成本真的好低 。其实很多时候钱都是付在品牌和质量控制上了。我记得有个音响网站专放拆机高清图,反正有几个品牌的东东压根就没往那边送过。

这个是以前买的一个无线键盘鼠标的接收器,当时还算是个新鲜玩意。工包的花了三百多,而且还中看不中用。现在用的无线键鼠才80多块,比这个好用多了。我打算把这个接收器改造成一个桌式话筒。说起来整天在会议室看着专业的会议系统话筒要想心里不长草是不可能的,姑且仿制一个吧。

P1090817

为了方便制作还买了万用表和烙铁,家里这两样东西还是应该常备的,比如检测电池还有没有电本来都是通过替换法,现在用万用表量下就精确多了。

P1090807 P1090808

咪头装进去以后,果然声音有点小。按照同事的说法,声音“像从很远处传过来”。这是正常的,因为耳麦上的话筒本来就是为了在嘴边拾音设计的,灵敏度达不到桌面拾音的要求。做了下实验,离开二十厘米左右,在录音软件里面就基本是一条直线了。

上网查了下,咪头也有高灵敏度的,价钱和低灵敏度差不多,也就是五毛到一块的水平,不过在类固醇计划正式开始前,还是探索下能不能通过物理方法增加灵敏度。

理论上咪头就是把声音的机械能转化为电能,声音是一种纵波,能够驱动电容极板间距离变化,只要能最大限度的驱动电容极板运动,那么就能增加电信号的幅度。不过咪头被一个铁壳盖着,看不出内部结构是怎样的,只能稍微尝试一下了。

在实验了几种材料以后选用了这个,通过一面塑料片以较大面积拾取声波振动能量,并且把机械能转给咪头内的电容变成电能,理论上就是这样了,实践的结果是有明显效果。

P1090810

最后就是这样个东东,效果只能说勉强达到要求,现在这个麦克风放在桌面上能够拾取到说话声,也不算轻,但是稍微有点闷,还算可以使用。网上十块钱买的高灵敏度话筒比这个做得好多了。不过别着急,类固醇计划还没开始呢。

P1090818