Arduino开发板实验一:数字输入输出

最近有很多朋友关心小爱的进展,真是非常感谢。这段时间我主要在研究小爱的制作方案,大致的工作分为几个部分:机械设计,电子电路,嵌入式开发和人工智能几个部分。

为了确定最终的方案,我最近总在淘宝上晃悠,劲头跟美女购物狂们逛商场有一拼。前一段时间无意中看到了一个叫Arduino的东西,貌似还挺好用,暂定以这个板子为基础来开发电子电路和嵌入式的部分。我以前没有接触过嵌入式开发,如果路过的朋友有更好的方案,请一定要吱一声,谢谢 :)

昨天淘宝的Arduino板子终于到了,型号是Arduino MEGA ATmega1280-16AU AVR(完全不清楚不同型号之间有什么区别),秀一下样子:

Arduino 开发板

Arduino 开发板

今天进行了第一个小实验,跟大家分享一下。实验的目的是实现一个简单的功能,外接一个开关,通过打开或者关闭开关,来控制一个小灯的亮和灭
电子专业的老婆冷笑飘过,这个实验太简单了吧,用传统电路甚至更简单,一个开关直接切断电路即可(传说中的手电筒)。不过我通过这个小实验了解了一个重要信息:原来嵌入式开发可以直接对CPU的管脚直接进行读写,0就是低电压,1就是高电压。以前一直使用高级语言,读CPU的某个脚电压貌似非常遥远。

第一步:到Arduino官网下载Arduino开发IDE和相关驱动
下载完一看,这个软件是绿色的,并且绿的相当彻底,里面还包含了板子的驱动,双击打开就可以使用,我在Windows7,Server2008以及Vista下都用的挺好。

第二步:用USB线连接Arduino板子和电脑,发现驱动可以被自动识别,然后添加了一个USB UART的设备。查看一下这个设备的COM端口号,后面需要用到:

查看COM端口号

查看COM端口号

第三步:
双击运行arduino.exe,第一次使用前,需要设置设备端口号和板子的型号,看下面的抓图:

设置主板型号,我这个是Mega

设置主板型号,我这个是Mega

选择刚才看到的端口号

选择刚才看到的端口号

第四步:接线
为了做这个小实验,我还真拆了家里一个手电筒(真是败家)。文档里说开发板有个LED小灯接在13号管脚,据说术语叫做Pin13,所以就不需要外接小灯了。开关的两个脚一个接地(GND),另一个随便接某个管脚。考虑到13这个数字不吉利,我特地选了一个44号管脚避个邪。看下图:

接了个开关,红色灯是13号LED

接了个开关,红色灯是13号LED

第五步:写代码

int ledPin=13;
int buttonPin=44;

void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop()
{
  digitalWrite(buttonPin, HIGH);
  digitalWrite(ledPin, digitalRead(buttonPin));
  delay(100);
}

经常搞windows软件开发的朋友可能有点迷糊,这个程序入口在哪里,出口在哪里?事实上这个程序是被Arduino的IDE封装了,它的规则就是先定义几个变量,然后在setup里做几个设置,最后就孜孜不倦的反复跑loop里面的程序。我猜想应该有些中断机制来执行一些特殊处理,这个以后再慢慢学。看来单片机的程序通电以后就没打算让它歇着,高级语言的程序员需要适应一下。
接下来的程序就很好解释了:
pinMode 用于设置管脚的用途,输入还是输出
digitalWrite 用于把某个管脚的电压设置成High还是LOW
digitalRead 用于读取某个管脚的电压状态,返回的也是HIGH或LOW

有一句 digitalWrite(buttonPin, HIGH); 需要解释一下。我希望44号管脚当开关打开时是1,开关闭合是是0。但是请注意第一次闭合以后,这个管脚电压降到0,它不会自动升到1。为了让下次开关打开的时候管脚电压置1,我在每次循环前都给它设置初始值1。画了一个非常丑的电路图:

电路图

电路图

第六步,编译并上传代码

用IDE中的Verify来编译代码,然后用Upload上传。选的44号辟邪管脚果然有效,代码直接编译通过上传成功(真相是确实太简单了)。结果就不给大家贴图了,没啥好看的。不过好人做到底,虽然Arduino的IDE按钮都有提示,我还是画了个说明:

Arduino 0017的菜单

Arduino 0017的菜单

总结:这虽然是个很简单的实验,但是对于一个像我这样没有接触过嵌入式的程序员来说,还是有很多的知识点。我相信有很多和我一样的人,想做机器人但是觉得无从下手,希望这些学习经验有所帮助。高手们就请优雅的飘过吧 :)



对 “Arduino开发板实验一:数字输入输出” 的 28 条 评论

  1. xhh 说:

    不知道这个板子提供在Linux系统下编程不?

  2. 支持啊,基于java的,一般都支持linux,呵呵
    我其实是在这里看看教程,第一页就发现了“Driver Install for Linux”
    http://www.ladyada.net/learn/arduino/lesson0-lin.html

  3. tell 说:

    有支持以太网口的开发板推荐吗?
    我想通过网络可以远程控制机器人。。 要求不是那么太自动

    • darkorigin 说:

      arduino有带以太网络的版本
      也有插接模块支持以太网络(5100和28j60)。 更有支持无线的版本
      数据模块还有其他方案。。。比如蓝牙和基于其他技术的无线方案

      强大。。。。。

  4. to: tell

    我在考察小爱方案的时候,就是看上Arduino的扩展性很好,它有很多奇奇怪怪的扩展卡。你说的以太网口也有,随便搜了一下,就找到一个:
    http://hi.baidu.com/mrmobilerobot/blog/item/732667f363000559352accdc.html

    其实我觉得支持Wifi的可能更好,毕竟少一根线方便多了
    参考一下吧:)

  5. dot 说:

    44比13好不了多少

  6. zeus 说:

    哥,你任重道远啊!

  7. galaxy 说:

    貌似只要将44pin内部的上拉电阻使能就可以了吧?
    不需要每次都将其致高

  8. lifanxi 说:

    感谢楼上的galaxy,花了60分钟让我理解了上拉电阻,下拉电阻,高阻态。
    按我们的推理,似乎
    digitalWrite(buttonPin, HIGH);
    不用写在loop里,应该放到setup中的
    pinMode(buttonPin, INPUT);
    后面就可以。
    因为设为INPUT后,digitalWrite的功能就不是输出了,而是用来设置使能上拉电阻。
    楼主可不可以帮忙验证一下?

  9. 楼上两位好兴致,看时间都是半夜活动
    “上拉电阻使能”这个术语我还不太清楚,听你们的描述,是否相当于一个内阻非常大的”电池”?
    当Pin接地时,输出电压就变成0,接地一断开,电压就自动恢复到1 ?
    如果这样的话,那确实设置一次即可
    晚上回家试试 :)

  10. xiaoding 说:

    我高中课外科技活动玩过一阵子机器人。 当时接触到MIT的媒体实验室有人开发过一款教学用的单片机板子,名字叫做 HandyBoard, 基于Motorola(现在是Freescale了)的 68HC11 单片机制作,在pc机上有handyboard c语言可以往里面灌程序,貌似还是很方便的,应该也符合楼主的要求。

    另外,国内的上海广茂达公司推出过大学和中学的教学机器人,方案也是从HandyBoard演化而来,你可以看看。 (他们做的成品就比较贵了,一两千的样子,我们当时都是学校购买)

  11. becky 说:

    TO 10:
    广茂达的机器人类似于乐高的机器人,DIY的乐趣更是远逊于乐高NXT。
    我觉得既然要DIY机器人,基于嵌入式系统上自行搭建电路和机械结构,的确自由度更大一些。

  12. Acen 说:

    楼主,我对你这个项目很感兴趣。不过这里提个小建议,要不把博客模板改改,让它能直接点击回复,而且嵌套显示,看着方便些。WP默认模板是支持这个的。

  13. 流浪的星星 说:

    看完楼主的作品和大家的回复之后像吃过一顿美味大餐一样,值得回味。
    希望楼主带领我这样的菜菜鸟,多组织一些高手过来,把这个博客做成中国科技第一博,哈哈。

  14. lechie 说:

    风趣幽默,13和44,哈哈哈,我超级喜欢博主的写作风格和技术水平啊!赞

  15. blind cat 说:

    今天刚到的板子,64位的win7竟然没有相应的驱动,折腾了半天后,只好在虚拟机里装了个win2003才用上。开始跟博主学习啦:)

  16. blind cat 说:

    今天终于在64位windows7装上了驱动,有需要的同学从这里下载吧:
    http://www.ftdichip.com/Drivers/CDM/CDM20802%20WHQL%20Certified.zip

  17. Android GNSX 说:

    博主多写点Arduino的东西吧:P
    貌似这几篇关于Arduino就这一篇我能看懂,博主的文章通俗易懂,但是我基础还是太薄弱了。

  18. Chaer 说:

    您好,去年开始看您的blog,一直关注,也想做一切关于电路的小实验。
    不过我是电路小白,想请教您,最近刚入手arduino。然后在做实验时发现,arduino的干扰好严重啊,我用串口读取i/o 针脚的数值,(什么电路也没有加,只是读取)发现会自己跳动。数值是00011然后不断循环。请问是arduino的正常现象还是我的板子有问题?

    • Arduino的I/O读取还是比较准确的,应该是你的电路有点问题。我不知道如果模拟输入的管脚放空会怎么样。我曾经用电位器控制过电机转速,是很平稳的

      • Chaer 说:

        哎,我这下摸不到头脑了。
        我把i/o也放空了,还写了这段程序。
        void setup()
        {
        pinMode(10,INPUT);
        digitalWriter(10,LOW);
        //如果改成digitalWrite(10,HIGH);就不会了。
        Serial.begin(9600);
        }
        void loop()
        {
        Serial.println(10);
        }

        这段代码读出来的数值也是不停跳动的。
        不过我发现如果是上拉电位倒是很稳定。不知道有没有人也试过耶。

  19. qykings 说:

    我想做你那个4轴飞行器,现在只会代码,其它的知识感觉还差很远,有什么书可以推荐一下啊,

  20. gougou 说:

    用了这个板之后要怎么接线,跟原本的电路图不符了?

发表评论

可以使用下列 XHTML 标签:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>