LattePanda 之深入学习 Firmata通讯

前言

原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正。

本文使用Markdown写成,为获得更好的阅读体验和正常的链接、图片显示,请访问我的博客原文:

http://www.cnblogs.com/sjqlwy/p/lattepanda_firmata.html

1、LattePanda与UP Board

由于Atom引出的GPIO接口较少,而且是1.8v电平,所以相关开发板都要使用额外的芯片进行拓展。胖哒板载一个Intel Atom z8350 处理器和实现Arduino 功能的Atmel Atmega32u4 微处理器。注意Atmega 32u4对应Lenoardo,拥有两个串口;ATmega328对应UNO R3,拥有一个串口。更多差异可以查看DFROBOT的《Arduino控制器选型指南》

而根据[胖哒官方文档](http://www.lattepanda.com/docs/#Hardware & Accessories)可知,MPU和MCU之间通讯使用Firmata协议,两者相当于独立运行的。同样采用Atom z8350的树莓派兼容开发板UP Board则采用不同的方案,它借助额外的Altera Max CPLD|FPGA拓展出40 Pin 树莓派兼容GPIO接口,直接使用mraa库、RPi.GPIO库(仅Python 2.x)进行控制,无缝整合RPi软硬件资源。那么到底孰优孰劣呢?初起和MOP在QQ群里讨论过一次,基本认同UP Board的技术方案更强一些,MPU和MCU结合更紧密。这里重新仔细对比一下(Altera Max V CPLD当做MCU)。

LattePanda UP Board
实时系统
MPU-MCU通讯 Firmata协议(UART) 未知(UART?)
额外GPIO实现 ATmega32u4 Altera Max V CPLD
MCU可编程
上位机直接控制MCU GPIO
ADC数量 12 1

另外还要注意,UP Board 使用Windows系统时树莓派兼容引脚的支持非常有限,例如 I2C, SPI, PCM, PWM, UART, ADC等功能只能在ubilinux环境下实现,而LattePanda则没有这种问题。

所以剧情发生了反转,我们有理由认为LattePanda的方案简单有效,兼容性更好。当然一些技术参数不得而知,例如ATmega32u4和Max V的性能对比、MPU-MCU传输速度等。

根据研扬官方人员的说法,板载Max V实现拓展GPIO接口功能之后,已经没有多少硬件资源可以可用了,以后暂时也不会释出相关代码。所以我们可以认为ATmega32u4强于Max V。另外还有一点很不爽,想要进行硬件调试需要购买他们那个罕见的转接线。。。另外Max V只能作为GPIO拓展用,无法再编程。

有兴趣的话可以去看看Udoo x86MinnowBoard 开发板的实现方案。

2、Firmata协议

作为一个业余爱好者,我们想要了解Firmata协议是什么,能做什么以及它的应用范围(优缺点),而不关心具体实现。

2.1 Firmata协议是什么

Firmata is a protocol for communicating with microcontrollers from software on a computer (or smartphone/tablet, etc). The protocol can be implemented in firmware on any microcontroller architecture as well as software on any computer software package.

Firmata是一套溝通協定,用於微控制器開發板(如Arduino)和主機電腦(如Windows、Linux、Mac OS X、Android、iOS)之間的溝通,採用MIDI訊息格式,但訊息內容的意義不同,藉由各種訊息來控制Arduino腳位、以及從Arduino回報狀態。 Via

借助Firmata协议,上位机可以通过多种编程语言访问MCU的硬件资源,大部分常用的功能都可以实现,最大的特色就是简单方便,但是也存在一些问题,其主要缺点在于由于上位机不是实时系统,导致MPU-(Firmata)-MCU不是实时的,同时这个通讯过程产生的延迟也使得它不适用于实时性要求高的场合如四轴飞行器控制。这就好比,飞机正在坠落,需要飞行员实时紧急拉起机头而不是报告给地面指挥等待进一步指示;非实时就是定期向地面控制台发送位置情况,飞行状况等。所以LattePanda的这种方式,它的主要应用方向可能在高级应用领域。

最后建议大家可以读一读WRTnode创始人罗未的文章嵌入式OS的现状、智能的物联网与未来的机器人,有些观点还是很不错的,另外推荐infoQ这个网站,许多文章质量很高。

实时系统

可以参考《什么是真正的实时操作系统》,讲得比较不错。Windows和大部分Linux发行版都是非实时系统,Arduino的实时性也不是很高(关于使用Arduino做开发的二三理解)。

实时系统指系统的计算正确性不仅取决于计算的逻辑正确性,还取决于产生结果的时间。如果未满足系统的时间约束,则认为系统失效。

2.2 Firmata 实战

2.2.1 Arduino端烧录固件

参考LattePanda官方文档使用 Arduino IDE 烧录StandardFirmata固件,等待提示烧录成功即可。

注意:为了方便下文部分使用Windows 7 64bit + Arduino UNO R3进行演示截图,但是会在LattePanda上重新验证,不一样的地方会标示下来。

注意:

  1. 随胖哒预置的Arduino IDE版本较低,会影响到Firmata协议版本,请下载并升级到最新版IDE再行烧录。当前IDE最新版 1.8.2.

  2. IDE中开发板型选择Arduino Leonardo,并设置正确的串口号(一般是COM3)。

  3. FirmataPlus是一个第三方增强固件,可以从这里下载,烧录方式见此。增加支持以下设备:

    1. HC-SR04 Sonar distance devices

    2. Rotary Encoder (not supported for FirmataPlus32u4)

    3. Stepper Motor Support

    4. Piezo tone generation

      如果使用Leonardo 和 Mega 2560,请烧录FirmataPlus32u4

关于节省空间的Tips

最新版Arduino IDE占用空间400+MB,其实我们只是烧录个Firmata小程序进去就行了,大可不必安装完整版的IDE。或者也可以使用Atom文本编辑器+PlatformIO IDE插件,这样可以支持更多的编程语言和更多地开发板(STM32、MSP430等)。

2.2.2 测试Firmata固件

两个小程序实现该功能,一是Firmata官方提供的firmata_test项目页面下载地址,最后更新2012年9月,不过还可以用。

【界面示意】首先选择正确的串口,然后将Pin 13 (build-in led pin) 设置为输出,点击按钮即可以设置板载led熄亮。同时接上一个LED模块和光敏电阻模块,就可以获得模拟和数字引脚数值了。当烧录plus固件时下方显示Firmmataplus.ino。

二是微软提供的Windows Remote Arduino Experience,同样免费,可以从Win10 Store下载。

支持蓝牙、USB线以及网络连接Arduino,然后直接控制相关引脚。详细可以阅读《控制Arduino的利器-Windows Remote Arduino》

注意

以上两个工具失败了,均无法识别 Leonardo (Atmega34u2),而UNO通过USB数据线与主机(Win7|Win10)连接后均可以正常识别读写,这估计也是胖哒官方文档没有提这个的原因。

2.2.3 从主机控制Arduino

虽然测试失败,但是并不能打消我们的积极性。关于如何从主机通过Firmata协议控制Arduino,Firmata官方给出了多种方案,可以看到Firmata支持多种语言编写的客户端库,其丰富程度和mqtt不相上下。

胖哒官方的例程是使用Microsoft Visual StudioIDE使用C#语言来进行编程,诚然,C#在Windows视窗编程方面如鱼得水,异常方便,但是有两点促使我剑走偏锋。

  • Visual Studio 方便好用但是体积太过庞大
  • C#不熟悉,反而对Python较了解

我们再回过头来看,发现Firmata有众多Python库支持:

在此我们选择后三者作为演示。

  • 下载Python 3.6.1 32 bit 并安装,注意在Advanced Options里勾选Add Python to environment variables
  • 如果没有添加Python到环境变量,可以手动添加或者重新运行安装包选择Modify
  • 新版安装包自带pip包管理软件,查询python 3.6 manuals可知安装模块命令为:python -m pip install SomePackage
  • 以管理员身份打开cmd,否则会提示无权在C盘操作,输入上述命令,安装pyFirmataPyMatapymata-aio备用。

pyFirmata示例:

#!/usr/bin/env python3

from pyfirmata import Arduino, util
from time import sleep

board = Arduino('COM12')
print("Start blinking D13")
while True:
    board.digital[13].write(1)
    sleep(2)
    board.digital[13].write(0)
    sleep(2)

效果是板载LED隔两秒循环熄亮。

PyMata示例:

#!/usr/bin/env python3
import time
import sys
import signal

from PyMata.pymata import PyMata

# Digital pin 13 is connected to an LED. If you are running this script with
# an Arduino UNO no LED is needed (Pin 13 is connected to an internal LED).
BOARD_LED = 13

# Create a PyMata instance
board = PyMata("COM5", verbose=True)

def signal_handler(sig, frame):
    print('You pressed Ctrl+C')
    if board is not None:
        board.reset()
    sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)

# Set digital pin 13 to be an output port
board.set_pin_mode(BOARD_LED, board.OUTPUT, board.DIGITAL)

time.sleep(2)
print("Blinking LED on pin 13 for 10 times ...")

# Blink for 10 times
for x in range(10):
    print(x + 1)
    # Set the output to 1 = High
    board.digital_write(BOARD_LED, 1)
    # Wait a half second between toggles.
    time.sleep(.5)
    # Set the output to 0 = Low
    board.digital_write(BOARD_LED, 0)
    time.sleep(.5)

# Close PyMata when we are done
board.close()

效果是隔0.5秒熄亮一次,循环10次。可见简单功能用pyFirmata库就可以,复杂功能如完整的I2C传感器支持或者需要最新版协议相关特性,可以使用PyMata或者pymata-aio。注意以上均不需要管理员权限,直接从IDLE里面打开,按F5执行即可。

拾遗

  1. 由于需要插键盘鼠标显示器来操作,而这办公室键盘手感不给力,建议还是用VNC控制胖哒吧,参考LP官方文档安装tightVNC和相关加速插件,建议Host和Client都使用TightVNC可以获得更好的兼容性、运行效率以及文件传输功能
  2. 传输文件、文本原本想在host上搭建FTP服务器,后来想起免费绿色的小软件Dukto,非常好用。
  3. 可能我的笔本真的老了,编译Arduino Sketch的速度竟然比不上LattePanda,泪目
  4. 推荐Atom编辑器+Platform IO 插件取代Arduino IDE
  5. 下一篇就将介绍编写图形界面,获取当前天气飞行条件

参考阅读

2020年7月23日 更新

firmata_test 不再更新,Windows 可用,Linux不可用

posted @ 2017-04-09 23:01  思兼  阅读(9296)  评论(0编辑  收藏  举报