作者:mznewfacer (Wolf Geek) 时间:2011年 11月20日 转载需说明出处,谢谢
本人上学时学的都是软的,作为硬件白痴的我,还是决定接触些硬件吧,趁着现在有空。
其实想学点微控制器(Microcontroller)还是源于偶尔看到了国外Ye-Sheng Kuo, Sonal Verma, Thomas Schmid, and Prabal Dutta等人的hijiack项目,简要来说他们就是想通过设计的音频耳机硬件接口,来接受传感生活中的数字、模拟信号。这个方向未来一定是迫切的需要,我们已经看到了许多的应用,不管是sixsensth(虽然只是demo,两年多了也没传上去程序),iphone的siri,android 的ADK,当然Microsoft的kinect(也有与wp7的整合应用),很成功的Bump(不知微信的摇一摇何时能完美)。总之,人们需要与虚拟世界更多样的交互,我们需要的不仅仅是简单的鼠标、键盘、触摸屏,我们的生活中无时无刻都需要更直接的交互。天天喊着云计算,是啊,我们更需要更直接的收集生活中有意义的数据利用所谓(数据挖掘/机器学习/模式识别 , 这三者概念区别至今我笨的没搞清)来为我们生活的决策、联系,提供多种清晰的选择可能和服务。 就拿iphone来举例,如果像digifit ,AliveCor这种应用能够快点有医疗标准出来,可以对收集的血压心电等数据采集后实时分析,建立动态家庭医疗监护网络,相信会挽救不少人的性命。多的不扯了,作为小白的我,要脚踏实地,从最基础的开始。
回到hijiack项目,再简单说一下他们的设计思路,下图为系统架构图,
可以看到,从手机耳机端引出了四个线路,分别是左声道、右声道、公用信道信号、麦克风。右声道为能量收集电路(energy harvesting circuit)提供电源,左声道将手机输出的数据输入到微处理芯片。麦克风将微处理器的数据输入回手机上。手机和微处理器都采用了频移键控 (FSK)调制解调器。具体的设计细节,请参考http://www.eecs.umich.edu/~prabal/pubs/papers/kuo10hijack.pdf。
以下是其简单的示波应用硬件搭建图:
其中,微处理器是搭载了电阻式传感器的电位计,当电阻传感器改变时,我们会看到手机上变换的相应电压波形。这里使用的微处理器是德州仪器的MSP430F1611。
以下是他们项目的两个应用,左图为心电监护装置,右图为土壤湿度传感器。
以上就是他们做的移动传感项目,像这样的项目现在应该很多。当然,google也自从Android 3.1就引入了Android Open Accessory Development Kit(ADK),它就是推荐了Arduino作为外设选择。
Arduino目前的应用就很多,远程泡茶,触控门,无线监控小车都还比较有意思,最后我们来看看Arduino的hello world 程序。
1.首先,下载Arduino 0023,解压后直接能够运行。
2.将arduino 控制器用USB接入电脑(这里还用不上电源供电)。
3.安装驱动,安装成功后,会显示端口。
4.IDE上选择Tools->Board,控制器类型,在这里我用的就是Arduino Duemilanove Mega328。
5.配件安接
因为从原理图上可以看出13管脚与ATmega的引脚之间连接了一个1K的电阻,能够起到限流的作用,以保护二极管不被烧坏。发光二极管是有正负极性的,因此必须连接正确才能够让其正常发光。发光二极管腿比较长的一端是正极,需要接在Arduino数字I/O的13号管脚上;腿比较短的一端是负极,需要接在GND管脚上。
6.程序部分
好了,看看程序吧,
const unsigned int LED_PIN = 13;
const unsigned int PAUSE = 1000;
void setup() {
// 引脚 13是大多数arduino板子上接LED灯的引脚
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN, HIGH); // 打开LED灯
delay(PAUSE); // 等待
digitalWrite(LED_PIN, LOW); // 关闭LED灯
delay(PAUSE); // 等待
}
程序很简单,其中有两个函数setup()和loop()。setup()这个函数主要用来完成相应的初始化工作,在上面的例子中是将数字I/O的13号管脚设置为数字输出。loop()这个函数则是Arduino程序的主函数,相当于C语言中的main() 函数,一个Arduino程序要完成的主要功能都在该函数中实现,在上面的例子中是通过变换13号管脚的高低电平,并设置相应的延时,从而使发光二极管能够间歇性地不断亮灭。值得注意的是,HIGH时给LED灯供给5V电压,LOW则关闭。
7.上传用AVR-GCC编译后的程序到板子上,值得一提的是,编译后的文件,存储于C:\Users\newfacer\AppData\Local\Temp\build3206993456004941706.tmp目录下,
打开Blink.cpp可以看到,包含了 "WProgram.h"的头文件,其在Arduino IDE\arduino-0023\arduino-0023\hardware\arduino\cores\arduino 目录下,具体如何调用编译器以及函数的调用关系,有兴趣的可以自己搭建源代码环境,当然win下Cygwin,Java JDK,和ant是必须的,源码在这里下载。
另外,相关配置参数的位置都在preferences.txt文件中,我的在C:\Users\newfacer\AppData\Roaming\Arduino文件夹下面。
为甚么会这样,具体可以去看arduinoIDE\lib\preferences.txt 的内容说明,可以照着说明更改相关属性:
你可以更改这个配置文件以修改相关IDE编辑器的字体,硬件的板卡类型,控制台输出等等属性,但是当Arduino没运行的时候,改了才不会有问题。具体为什么会这样,就只好请你去看IDE的源码了,这里就不做多余解释了。
8.运行结果
当上传程序成功后,会发现发光二极管立即闪了一下,表明bootloader正常工作了。接着再过一段时间,会看到发光二极管间歇性地不断亮灭,这就表明第一个Arduino程序已经成功地运行起来了。
面包板的连接也好弄,看下正负极别接反了,当led灯的阳极通过限流电阻与板子上的数字I/O口相连,数字口输出高电平时,led接通,发光二极管发出亮光。这里二极管负极接GND,正极接PIN 4, 中间要加个220欧姆,让二极管在正常范围工作。当然程序也就要重新改动LED_PIN=4,编译后重新上传。
后记:
如果觉得没玩够的,其实一个LED灯还能玩点东西,摩斯电码。易懂的对照表是二叉树的结构,如下图
左子树为短.,右子树为长-。例如Wolf 为
· — —— — —· — · ·· · — ·
我们可以通过设置LED灯亮的长短来表示不同的字母。
附加资料:
1.对自己微控制器硬件详细接口感兴趣的,可以到官网上下载相关文档,我的板子在这里,其他的也可以在相应的地方找到。
2.Arduino与Processing的接口:processing-arduino.zip,processing在这就不多介绍了,其支持 Java 语言架构,创始人Ben Fry, Casey Reas 都是mit media laboratory aesthetics + computation group Laboratory 的成员,链接里相信有不少资料。