用 Node 控制 Arduino

news/2024/6/18 12:19:08

why node?

现在,js 语言已经在服务端有了一定的应用,有人也想到了用 Node 去控制硬件设备,Node也很早就退出了 armv6、armv7、armv8 三个版本,而树莓派基于 armv7 架构,也就是说我么可以轻松的使用 Node 在树莓派端编程。推出了,甚至有一些开发板直接可以编译 js 文件。

绝大多数嵌入式设备选用的是 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 实现的库。

更多内容可访问:

  • 编写第一个 Arduino 程序

  • learn-iot


http://www.niftyadmin.cn/n/4076678.html

相关文章

浅谈ASP编程的思路与纠错

对于用ASP技术编程的初学者来说,无从下手是第一感觉,笔者曾经有这么一段经历。经过一番"磨难"以后,你就会找到灵感。现将本人编程中积累的一些经验,拟成本文,奉献给读者。 1 首先要学习一些例子程序。 接到…

Identity Server 4 预备知识 -- OAuth 2.0 简介

OAuth 2.0 简介 OAuth有一些定义: OAuth 2.0是一个委托协议, 它可以让那些控制资源的人允许某个应用以代表他们来访问他们控制的资源, 注意是代表这些人, 而不是假冒或模仿这些人. 这个应用从资源的所有者那里获得到授权(Authorization)和access token, 随后就可以使用这个acce…

Java 创建 ARM 虚拟机磁盘类型选择的问题

问题描述 在Azure 门户创建 ARM 虚拟机时,我们直接可以选择虚拟机的磁盘类型,但是在 Azure Management Libraries for Java 的 API 中我们无法找到直接设置磁盘类型的 API.默认创建的磁盘类型是 HDD,如何通过 API 设置磁盘类型? 问…

toast的简单用法

2019独角兽企业重金招聘Python工程师标准>>> 废话不多说,直接上代码: /*** toast自带的设置图片类型的方法** param view*/ public void btn1(View view) {Toast toast Toast.makeText(MainActivity.this, "带图片的toast", Toast…

Mac登录项损坏了该怎么办

苹果电脑的登录项坏了怎么办,这些无效的登录项实际上在应用程序被删除的时候就没有用了,那么我们要将这些失效的链接删除应该怎么做呢? 这个有两种方法可以删除一个是手动一个是使用软件。 1.如何智能清理mac登陆项? 使用cleanmym…

在ASP中过滤用户输入 提高安全性

安全对于所有应用程序来说都是十分重要的。一个简单应用程序里的某个失误都会造成对数据库或者其他企业资源未经授权的访问,因此安全尤其重要。一种常用的攻击方法是将命令嵌入到用户的回应里,而从用户输入里过滤掉这些非法的字符就能够防止这种攻击。 允…

通过 Powershell 来替换 ARM 模式下虚拟机的网络接口

需求描述 客户在部署完 ARM 模式的虚拟机以后,由于误操作在虚拟机内部禁用了网卡导致远程访问虚拟机受到限制,以下是通过 Powershell 命令来替换原有虚拟网络接口实现虚拟网卡重置功能。 Note 本文只限于 ARM 模式下的虚拟机,经典模式的虚拟机…

Microsoft Visual Studio 发展历史

Microsoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软…