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控制器选型指南》
而根据胖哒官方文档可知,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 x86、MinnowBoard 开发板的实现方案。
2、Firmata协议
作为一个业余爱好者,我们想要了解Firmata协议是什么,能做什么以及它的应用范围(优缺点),而不关心具体实现。
2.1 Firmata协议是什么
- 官方wiki:http://www.firmata.org/wiki/Main_Page
- Arduino Firmata 实现:一、二
- Firmata协议介绍:https://github.com/firmata/protocol
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上重新验证,不一样的地方会标示下来。
注意:
随胖哒预置的Arduino IDE版本较低,会影响到Firmata协议版本,请下载并升级到最新版IDE再行烧录。当前IDE最新版 1.8.2.
IDE中开发板型选择
Arduino Leonardo
,并设置正确的串口号(一般是COM3)。FirmataPlus
是一个第三方增强固件,可以从这里下载,烧录方式见此。增加支持以下设备:HC-SR04 Sonar distance devices
Rotary Encoder (not supported for FirmataPlus32u4)
Stepper Motor Support
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 Studio
IDE使用C#
语言来进行编程,诚然,C#在Windows视窗编程方面如鱼得水,异常方便,但是有两点促使我剑走偏锋。
- Visual Studio 方便好用但是体积太过庞大
- C#不熟悉,反而对Python较了解
我们再回过头来看,发现Firmata有众多Python库支持:
- [https://github.com/firmata/pyduino]——最后更新8年前
- [https://github.com/lupeke/python-firmata]——最后更新8年前
- [https://github.com/tino/pyFirmata]——简单好用,支持Firmata 2.1协议版本
- [https://github.com/MrYsLab/PyMata]——更新频繁,支持Firmata 2.4.1协议版本
- [https://github.com/MrYsLab/pymata-aio]——第二代PyMata,支持Python 3.5+和asyncio异步IO库
在此我们选择后三者作为演示。
- 下载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盘操作,输入上述命令,安装pyFirmata
、PyMata
和pymata-aio
备用。
pyFirmata示例:
#!/usr/bin/env python3from pyfirmata import Arduino, util
from time import sleepboard = 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 signalfrom 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 = Highboard.digital_write(BOARD_LED, 1)# Wait a half second between toggles.time.sleep(.5)# Set the output to 0 = Lowboard.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
执行即可。
拾遗
- 由于需要插键盘鼠标显示器来操作,而这办公室键盘手感不给力,建议还是用VNC控制胖哒吧,参考LP官方文档安装tightVNC和相关加速插件,建议Host和Client都使用TightVNC可以获得更好的兼容性、运行效率以及文件传输功能
- 传输文件、文本原本想在host上搭建FTP服务器,后来想起免费绿色的小软件Dukto,非常好用。
- 可能我的笔本真的老了,编译Arduino Sketch的速度竟然比不上LattePanda,泪目
- 推荐Atom编辑器+Platform IO 插件取代Arduino IDE
- 下一篇就将介绍编写图形界面,获取当前天气飞行条件
参考阅读
Python 与嵌入式系统系列 - Firmata
使用FirmATA操作硬件
Arduino:在Windows裡使用Python語言經由Firmata協定控制Arduino開發板
[LinkIt Samrt 7688]MPU與MCU溝通方式
[LinkIt Samrt 7688] Using Firmata with Python
【LinkIt Smart 7688 Duo】三种开发模式及控制Led
☆Using Firmata with Python
☆☆Going Beyond StandardFirmata - Adding New Device Support
PyMata PyFirmata 有何差異
转载于:https://www.cnblogs.com/sjqlwy/p/lattepanda_firmata.html
LattePanda 之深入学习 Firmata通讯相关推荐
- 102 613 SWP协议学习笔记--通讯流程参考
1 SWP接口激活流程 uicc -> CLF 69123400 CA37 (SYNC management / Information field present) uicc <- ...
- 搭建windows下无人机软件在环仿真(SITL)仿真环境,无需任何无人机、飞控硬件,学习无人机通讯等知识
SITL环境配置方法 APM飞控官网提供的SITL(software in the loop)软件在环仿真 官网地址 通过该虚拟仿真环境可学习地面站操作.Mavlink通信协议等知识. 参照此方法可构 ...
- 实现输入提示 layui_ASP.NET Core SignalR :学习消息通讯,实现一个消息通知
什么是 SignalR 目前我用业余时间正在做一个博客系统,其中有个功能就是评论通知,就是假如A用户评论B用户的时候,如果B用户首页处于打开状态,那么就会提示B用户有未读消息.暂时用SignalR来实 ...
- 嵌入式智能家居项目视频监控_智能化您的视频嵌入
嵌入式智能家居项目视频监控 Video content is taking over the Internet. The trend began long ago and the most recen ...
- STM32学习笔记(十) CAN通讯测试(环回模式)
1.CAN通讯的理解 想学习CAN通讯,那么要对通讯协议有一定的认知.通讯协议是指通信双方对数据传送控制的一种约定.约定中包括对数据格式,同步方式,传输速度,传送步骤,检纠错方式以及控制字符定义等问题 ...
- 嵌入式开发学习之--串口通讯(上)
提示:本篇开始学习各种通讯方式,重中之重. 文章目录 前言 一. 串口通讯协议简介 1.1 物理层 1.2 协议层 1.2.1 基本组成. 1.2.2 波特率 1.2.3 起始和终止位 1.2.4 有 ...
- 01-iOS之wifi通讯开发简介
wifi通讯开发 1.1-wifi通讯简介 1.wifi通讯原理介绍 wifi通讯的本质上是网络传输,只不过wifi通讯使用的并不是我们传统的HTTP协议,而是UDP协议 想要了解UDP协议,则必须要 ...
- 海德上位机软件学习总结(NetScada5.0)
海德软件学习总结 通讯 变量 事件/动作 报表 日志 数据库 数据归档 画面组态 报警 配方 安全策略 脚本语言 作为一款上位机软件,海德软件常规功能基本都已满足.具体功能如下: 通讯 作为一款上 ...
- IEEE ICIP 2019 | 更快更好的联邦学习:一种特征融合方法
目录 前言 Abstract 1.Introduction 2.Related Work 3.Methods 3.1 Feature Fusion Modules 3.1.1 Conv operato ...
最新文章
- labview实现简单的图片显示
- 今日SGU 5.25
- 未来不是计算机发展的方向,未来人类的方向,或许不是人工智能,而是智能人类...
- 读CLR via C#总结(7) 以传引用的方式向方法传递参数---refout
- 线程池原理及创建(C++实现)
- Visual Studio 2017迎来F# 4.1
- ReentrantLock与synchronized的区别(最直观)
- 数据:以太坊2.0合约余额新增9856 ETH
- 2018-3-7 色彩的一些知识
- 计算机维保资质,电脑维保属于技术合同吗?
- Js对接口数据归类整理
- 宁波计算机程序32届初赛,25届宁波市中小学计算机程序设计竞赛初赛试题
- OSS客户端简单介绍和评测
- Eclipse+OpenCV3.1.0 的环境搭建
- 《深入解析Windows操作系统第4版》随笔记录02
- haswell主板linux驱动下载,Haswell核芯显卡驱动首版已发布,附下载地址
- kafka 分区多节点消费
- 码云的注册与使用,很简单
- 基于智能手机传感器数据的人类行为识别
- pureftpd mysql.conf_Pure-ftpd.conf 配置详解
热门文章
- linux用vi写文件内容,Linux下利用vi编辑器创建文件并写入内容 专家详解
- 正点原子的内存管理_LWIP操作系统实操讲解-正点原子手把手教你学系列
- php中seq是什么意思,seq-answer
- 2055 到淄博旅游
- Windows驱动开发学习记录-驱动中快速重启关闭计算机之一
- 2022年天猫618满300减30红包怎么用?
- Java程序包system不存在I_急急急!!java 软件包 system不存在
- 【Carla】自定义仿真场景制作
- 【网络】IP、域名、端口号和DNS域名解析之间的联系简介(给服务器添加域名来验证)
- 我们眼中的人那是极少数,我们才是大多数人