编写第一个 Arduino 程序

来源:互联网 发布:cf总是网络异常 编辑:程序博客网 时间:2024/05/22 02:02

点亮 LED

上一节介绍了 Ardunio UNO 的硬件结构,这一节将会写一个 UNO 的 “hello word” 程序,在软件领域通常会以输出 “hello word” 作为开始,而在硬件领域通常是以点亮 LED 灯作为开始。

搭建环境

首先,在编写程序之前,需要下载编译环境和安装驱动。这里以mac为例,具体的下载过程可以参考官方的Getting Started w/ Arduino on Mac OS X。从官方下载IDE时可能需要先捐献才能下载,为了表示对IDE的支持,我捐献了两美元。当然如果你没有信用卡或者其他的合适的支付手段,这里提供一个第三方的下载平台。按照上述方法安装完毕之后,需要再安装串口驱动,下载链接。驱动安装完毕之后,可以检查驱动是否安装成功。插上连接线,输入ls /dev/tty.*

这里写图片描述

这里是“/dev/tty.usbmodem1421”,驱动安装成功。

更改配置

在编写程序之前,还需要更改一些配置项:

第一步,选择对应的开发板,这里选用的是 UNO 开发板。

这里写图片描述

第二部,选择对应的下载端口,上面打印的端口是“/dev/tty.usbmodem1421”,这里选择它。

这里写图片描述

编写程序

Ardunio 采用自己的一套语言规范,程序可以被分解为三个主要部分:结构、值(变量和常量)以及函数。
一般结构中包含两个函数:“setup()”、“loop()”。“setup()” 是在“sketch”开始时被调用的,用于初始化变量、管脚、开始使用库文件等等。这个函数只会在开发板上电或复位时被调用一次。而“loop()”函数则是在“setup()”函数执行完毕后,一直循环执行。点亮 LED 的思路是只需要在程序开始时,将 LED 置于点亮状态。上一章可以看到,UNO 开发板的13管脚连接在 LED 的灯的一端,而 LED 的灯另一端连接到了低电平,也就是说,只需在初始化时,给13管脚上赋上高电平便可完成操作。

// the setup function runs once when you press reset or power the boardvoid setup() {  // initialize digital pin 13 as an output.  pinMode(13, OUTPUT);  // turn the LED on (HIGH is the voltage level)   digitalWrite(13, HIGH);}// the loop function runs over and over again forevervoid loop() {}

编译下载到 UNO 板中,Done,效果如下:

这里写图片描述

Nodejs 点亮 LED

现如今,绝大多数嵌入式设备选用的是 C/C++ 语言,对于一些实时性较高的语言则选用汇编语言。但是随着硬件设备的性能提升,越来越有可能选用自己熟悉的语言进行编程,比如java、C#、javascript、python等。目前,在一些高端的微处理器(如树莓派)上已经可以使用这些语言进行编程,大多数 MCU (绝大多数8/16位芯片)的编译环境都是将 C 语言编译成16进制文件烧录到芯片中执行。所以,当选用一个自己熟悉的语言在低端芯片中编程时,可能无法借助现有的编译器完成。本文以 Ardunio UNO (8位芯片)为例,用 Javascript 编写一个硬件的“Hello World”(点亮LED)程序。

下载程序

MCU 下载程序需要软硬件共同支持,一般会使用现成的 IDE 工具,极少会关注到这些。那么将一段程序下载到 MCU 中需要哪些支持呢?这里以 Ardunio UNO 为例进行讲解。将一段程序下载到 Ardunio UNO ,Ardunio UNO 依靠 ATmega32U4/ATmega16U2(不同版本的 UNO 使用的芯片不同,高版本的有所升级)等 进行下载。而 ATmega32U4/ATmega16U2 等是 USB 接口芯片,是将 PC 发送的信号传递到 UNO 主芯片的中枢。从第一章的电路图可以看出,ATmega16U2 芯片可以将 USB 信号转换为 ISP、串口信号等,而这里是将其转化为串口信号下载到主芯片(不同厂商、不同芯片支持不同的下载方式)。另一方面,不同平台电脑也会装上对应的驱动(第一章安装环境中有提到),ATmega16U2 内置 Bootloader ,按照特定的协议与 PC 通信。这里特别提一下,ATmega16U2 系列芯片支持固件升级,需要借助官方提供的软件Flip对其升级,对应的固件megaUSB_DFU_Bootloaders都是16进制文件。下图是 ATmega16U2 等硬件及 Boot 处理流程:

这里写图片描述

Firmata 协议

Arduino IDE 是不支持 Javascript 语法的,这里无法使用 Arduino IDE 进行 Js 编程。首先,需要用 js 编写程序,然后将 js 程序写入到 arduino 中。这里需要一个协议来支持 PC 与 MCU 的通信。而 Arduino IDE 本身集成 Firmata 协议(准确的说是 Firmata 从 Aduino 抽离出来的)。这里首先需要做的事讲 Firmata 协议的 Arduino 实现烧写到芯片中。然后,用 js 实现 Firmata 协议,PC 通过 Firmata 协议控制 Arduino.

烧写 Firmata 协议

Arduino IDE 本身是集成了 Firmata,只需要找到这个程序,烧写到 arduino 中即可,具体位置如下图:

这里写图片描述

PC 端程序

首先,要实现 PC 与 MCU 的 Firmata 协议,这里直接借助 firmata.js,firmata.js 实现了用 PC 端用 js 与 MCU 的 Firmata 通信。在这个基础上,编写“Hello World”。连接 USB 线,找到对应的设备端口ls /dev/tty.usb*

这里写图片描述

编写程序,当 PC 和 MCU 与连接成功之后,将 Arduino 的13(连接LED)管脚置为高电平。将刚才显示的设备端口写到以下程序中:

var Board = require("firmata");var board = new Board("/dev/tty.usbmodem1421");board.on("ready", function() {  // Arduino is ready to communicate console.log('connet'); board.digitalWrite(13, 1)});                                                                                       

如图,连接成功,开发板 LED 点亮:

这里写图片描述

上面就实现了用 js 控制硬件,当想用 js 编写复杂的程序是,也可以依赖一些现成的 js 库,这里推荐一个 johnny-five。同样,用其他的语言也可以实现,只需要使用 Firmata 对应的实现。Firmata client libraries,这个文档中列出各种语言对 Firmata 实现的库。

2 0