前言

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

本文使用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. 下一篇就将介绍编写图形界面,获取当前天气飞行条件

参考阅读

LattePanda 之深入学习 Firmata通讯的更多相关文章

  1. Android学习——蓝牙通讯

    蓝牙蓝牙,是一种支持设备短距离通信(一般10m内,且无阻隔媒介)的无线电技术.能在包括移动电话.PDA.无线耳机.笔记本电脑等众多设备之间进行无线信息交换.利用“蓝牙”技术,能够有效的简化移动通信终端 ...

  2. ASP.NET Core SignalR :学习消息通讯,实现一个消息通知

    什么是 SignalR 目前我用业余时间正在做一个博客系统,其中有个功能就是评论通知,就是假如A用户评论B用户的时候,如果B用户首页处于打开状态,那么就会提示B用户有未读消息.暂时用SignalR来实 ...

  3. LattePanda 项目之 P2.2 起飞条件检测系统(CLI & GUI)

    前言 原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正. 本文使用Markdown写成,为获得更好的阅读体验和正常的链接.图片显示,请访问我的博客原文: http://www.cnblog ...

  4. STM32学习笔记(十) CAN通讯测试(环回模式)

    1.CAN通讯的理解 想学习CAN通讯,那么要对通讯协议有一定的认知.通讯协议是指通信双方对数据传送控制的一种约定.约定中包括对数据格式,同步方式,传输速度,传送步骤,检纠错方式以及控制字符定义等问题 ...

  5. DICOM医学图形处理:storescp.exe与storescu.exe源码剖析,学习C-STORE请求(续)

    转载:http://blog.csdn.net/zssureqh/article/details/39237649 背景: 上一篇博文中,在对storescp工具源文件storescp.cc和DcmS ...

  6. java socket通讯(一) 入门示例

    一.入门 要想学习socket通讯,首先得知道tcp/ip和udp连接,具体可参考浅谈TCP/IP 和 UDP的区别 二.示例 首先新建了一个java工程,包括两个部分,客户端SocketClient ...

  7. Java源码阅读的真实体会(一种学习思路)

    Java源码阅读的真实体会(一种学习思路) 刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈 ...

  8. Socket学习总结系列(一) -- IM & Socket

    写在准备动手的时候: Socket通讯在iOS中也是很常见,自己最近也一直在学习Telegram这个开源项目,Telegram就是在Socket的基础上做的即时通讯,这个相信了解这个开源项目的也都知道 ...

  9. Java源码阅读的真实体会(一种学习思路)【转】

    Java源码阅读的真实体会(一种学习思路)   刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+ ...

随机推荐

  1. Wordpress入门笔记

    简单介绍一下wordpress个人操作,建议安装中文版. 登入后台管理者页面, 浏览器地址栏输入           (线上) http://XXXX.com/wp-login.php (本地) ht ...

  2. C++ 指针的小知识

    看个小例子: char* fun1(){ char * p = (char*)malloc(100); p = "helloww"; return p;} void fun2(ch ...

  3. 对python的想法

    作为计算机专业的学生,在编程语言之余,我认为掌握一门脚本语言是很必要的.尤其是现在在数据分析,AI,机器学习等各个方面都大放异彩的python.相比于之前接触过的Java,C,C++乃至于php等语言 ...

  4. JAVA-STRUTS-2x的项目配置

    首先是web.xml的配置,这个是项目加载的开始. <display-name></display-name> <!--struts2配置开始--> <fil ...

  5. 九度oj 题目1370:数组中出现次数超过一半的数字

    题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2 ...

  6. ACM程序设计选修课——Problem F:(ds:图)旅游规划(优先队列+SPFA)

    问题 F: (ds:图)旅游规划 时间限制: 1 Sec  内存限制: 128 MB 提交: 14  解决: 4 题目描述 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路 ...

  7. NOIP2017赛前模拟1:总结

    题目: 1.造盒子 题目描述 企鹅豆豆收到了面积为 K 的一块橡皮泥.但是他没有合适的盒子来装下这个橡皮泥.所以他打算造一个盒子. 制造台是有方形网格的平台,每个小正方形边长为 1 .现在豆豆有两类木 ...

  8. Java面试题之Java中==和equals()和hashCode()的区别

    “==”: ==是运算符,用来比较两个值.两个对象的内存地址是否相等: “equals()”: equals是Object类的方法,默认情况下比较两个对象是否是同一个对象,内部实现是通过“==”来实现 ...

  9. d3 svg简单学习

    矩形 <rect x="/> 圆形 <circle cx="/> 椭圆 <ellipse cx="/> 线 <line x1=& ...

  10. poj 3468 线段树成段更新

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 54012   ...