[raspberry pi|arduino]用ssh远程烧写arduino

看标题,以为说的是树莓派(Raspberry Pi)Arduino,但实际上,更像是一篇介绍 Linux 的文字。随着将 arduino 开发的工具链,转移到 ubuntu,如今已经基本很少用windows了,这也就是越来越少挂QQ的原因之一,再加上研究清楚了下ArduinoISP,也就说再也不用依赖只能在windows下使用的USB-ISP编程器,回windows的机会就更少了。而 arduino 作为开源硬件的平台,似乎与生俱来地更适应在开源的操作系统上施展拳脚,而实践证明也正是这样。而在linux环境下呆的越久,似乎就越顺手,甚至都觉得装个中文版也没什么劲儿,这两天把手边的ubuntu也全部刷成英文原版。伴随着装逼感,成就感也越来越多。而回想其自己接触ubuntu都可以追溯到10.04版,那时有限的编程也都基于.Net Framework,工具链的问题,一直就是一个槛儿。而当渐渐发现.Net慢慢out,而开源软硬件、社区都在不断壮大时候,重新学习会让人收获更多。

真诚希望大家都慢慢转向linux系统,ubuntu是个很不错的选择,尤其是走IT这条路的。我自己到现在经历了几个阶段,

  1. 会安装系统,就操作系统而言,安装次数的多少和熟悉程度还是有一定正相关的广西。因为每次重装,就意味着重新配置工具链。而在这个过程中,相信linux和windows最大的差异就体现在,windows中会更多的是在四处下载各种软件最新版及其序列号,而linux的话,就没这个事情,所有的事情都可以在软件中心、终端中完成,而且没有破解这一说,因为完全没有这个必要。
  2. 熟悉图形界面,完成简单的日常事务。现在用浏览器做的事情越来越多了。微博原生就是网页的、qq也有webqq。而ubuntu里面自带firefox,要装chromium(linux版chrom)也非常简单,这些都比ie强得多,更不用说各种国产的浏览器外壳了。如果能这样进行一段时间,相信就会发现linux是一个安全,而且安静的工作环境,没有流氓软件以及各种弹窗。
  3. 转移工具链,这些其实不少很多哪怕在windows平台也也能做到,就比方说不用ie,Email客户端用thunderbird,IDE用eclipse之类。当这些环境在linux下也同样存在的时候,就不会那么陌生,而就我们现在玩的 arduino、processing 都是跨平台的开发工具(因为基于跨平台的java)。这个时候使用ubuntu就开始提升生产率了。相信在这样的环境下,会开始觉得linux的效率还是很高的。
  4. 如果上一步也进展一定时候的话,如果玩IT的,相信已经开始用终端/Terminal/命令行,开始做一些事情了。这个时候,相信就可以开始接触vi,以及shell,再进行学习,头也不会那么大。而文本界面,是linux原生的界面,可以说在X界面(桌面系统)上所能进行的所有操作,基本都可以通过命令行来实现。如果真的到了这一步,称呼为“高手”或者“大牛”,相信一点也不为过。(因为似乎他们就应该这样……)

我现在的话,刚刚开始第4阶段吧,路还很长。不过发展到嵌入式的linux系统的话,似乎图形界面已经显得臃肿而毫无必要了,所以希望自己能不断深入下去。开始使用命令,而且越来越喜欢终端的时候,有趣的事情就发生了。因为这些命令在其它linux系统下都能找到,安装上,对系统的配置也就显得没什么要求。比方说,嵌入式的linux系统。之前提到的《Rasperberry Pi & MK802》就是这样的典型而且流行的代表。而当它们链接到网络上的时候,如果可以登录或者访问,无非当作一台配置相对低一些的PC机就是了。(其实也不低,因为没有图形界面这个大包袱,执行效率可不低。)而要登录这些系统,最常用的方法,就是使用SSH。(今天我还重温了一下《Matrix 2: reload》,发现其中Trinity最后冲出去引爆发电厂,就是在用ssh,只不过她直接用root账户,而且知道密码……,有了root,自然就可以为所欲为了)

关于SSH的配置,也没那么悬乎。ubuntu自带 ssh-client,也就是说一开始就可以去访问别的主机。被访问的主机如果安装了ssh-server,就可以被访问。基本不需要什么特别的配置,局域网内的话,用

$ssh username@ip_address

比方说 ssh pi@192.168.1.101。有提示以后,输入用户密码就可以。登陆多了,每次都输入密码感觉烦了,就用ssh-key,这东西是成对出现的,把client的公共端保存到server的authorized_keys列表里面就可以了。以后每次登录自动匹配,就不用手动输入密码,安全性也高了许多,我在视频中就是这样,说登就登上去了。相关的教程,可以访问这里:https://help.ubuntu.com/community/SSH

而登录以后,其实就和用自己主机的命令行没有什么差别,各种命令都能用了,和那台主机有没有安装显示器,有没有键盘鼠标,都没什么关系,也管不着。

在介绍一下个人理解的arduino开发环境。首先,Arduino使用的都是开源的开发工具,内核,就是 avr-lib, avr-gcc 和 avrdude,以及编整的一个 Arduino 的程序框架,配合使用processing(基于java)。avr-lib是avr编程底层函数库,avr-gcc是编译器,avrdude是下载工具。如果只是在文本界面玩的话,processing那部分可以忽视。而如果我们在我们的开发平台上(ssh-client)已经完成了编译的工作,那么在 raspberry pi / mk802 上,就只需要完成下载的工作,而下载的工作只需要avrdude。avrdude的参数部分,包括了烧写arduino所需要的所有参数,包括 芯片型号、下载器、端口号、传输速率、flash(经由avr-gcc编译而得的hex文件)。友情提示:arduino UNO 使用的是 optiboot 作为 bootloader,而这个bootloader为了瘦身的需要,精简了许多功能,只能进行flash的烧写。而如果要烧写 eeprom, fuse的话,还是需要个专门的下载器,比方说一开始提到的ArduinoISP。不过,如果 raspberry pi / mk802 先接一个ArduinoISP再接一个Arduino开发板的话,那样就更完美了。无非是avrdude的参数需要进行相应的调整。关于 avrdude,最好的资料,就是它的使用手册

具体的过程,大家可以看视频演示。其实也就是把一些常用的linux工具和arduino串起来,玩点小花样。同样的事情,在windows下应该也能做到,不过估计要装几个软件,而在ubuntu上进行操作,感觉就是非常稀松平常的事情。

分享一些经验:

  1. 手头有2款无线网卡,TL-WN722N 150MTL-WN821N 300M,实践证明,722N的效果还不错,而821N根本就没法用。实现了wifi连接,RPi就能和Arduino放在一起,塞到个小盒子里,做个智能家具的服务器,感觉也不错。好在对于MK802就完全不用担心这些。
  2. 供电问题,要让PRi正常运转,还是需要一个稳定的电源,手边1A的电源,可以保证PRi和722N正常运行,而如果再加上Arduino UNO,电源就显得比较紧张。一开始,我也确实都是把722N和UNO直接接在板载的2个USB口上,但是明显感觉网络连接就很不稳定,经常掉线。将UNO改为带有独立电源USB HUB 供电,情况得到明显改善。
  3. 要得到编译出来的hex文件,建议把ADE中编译、下载的详情输出打开,可以找到编译结果hex文件所在的临时目录。如果用eclipse的话,相对好找得多,就在工程文件夹的release文件夹内。
  4. 视频中演示的内容,在安装有Lubuntu的MK802的上也测试成功。

希望本文能给大家带来关于ubuntu、raspberry pi、ssh的一些感性认识。

测试使用的,PRi供电电源,Arduino UNO,由圣源电子提供。

特别感谢:@stanleyhuangyc,小Sunny

关于aGuegu

向着更高的逼格
此条目发表在Ubuntu | Linux, 硬件 | Hardware分类目录,贴了, , , , , , 标签。将固定链接加入收藏夹。
  • ono

    搜索raspberry pi进来的, 结果博主你全篇都在balabala linux = =. 对raspberry pi感兴趣, 不过初版问题不少, 而且arm11 700MHz性能低了些, 限制了应用场景, 我还是等下一版吧.

    • 也可以玩玩MK802看看呀,性能强不少。玩RPi躲不开linux哈~

  • 单纯avr的话,eslipse的avr插件也很好用。
    之前折腾了一下mega128:jtag调试
    写了这个 http://zodiac1111.github.com/blog/2012/11/19/avr-jtag-debug-with-eclipse-on-linux/

    • 链接是你的博客吗?蛮好的,是的话我加个友链过去。不过我自己很少片上调试呢,都是直接看运行效果的。

  • Pingback: [arduino]ArduinoISP, Hex & Bootloader | Agu's Mill 古作坊()

  • pizzro

    阿古,我的测试的时候会出现这种情况。是怎么回事
    root@raspberrypi:~# avrdude -p m328p -c arduino -P /dev/ttyUSB0 -b 115200
    avrdude: stk500_getsync(): not in sync: resp=0x00

    avrdude done. Thank you.

    • 先检查arduino在PC上是不是可以正常下载吧。然后,我觉得你的端口号有问题,先在pi这边看看你的arduino所在接口是不是ttyUSB0咯,一般来说,UNO的串口转USB芯片是ATmega8/16u2,会显示为ttyACM0

  • 我很好奇阿古若是设计PCB的话Linux有什么软件,另外开源社区是否有较好的CAD解决方案呢?

    • 设计PCB不是我的专业哈,团队里面有专门作这个的,linux的话,似乎能用eagle