9821| 0
|
LattePanda 之深入学习 Firmata通讯与Python |
前言 原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正。 本文使用Markdown写成,为获得更好的阅读体验和正常的链接、图片显示,请访问我的博客原文: 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)。
另外还要注意,UP Board 使用Windows系统时树莓派兼容引脚的支持非常有限,例如 I2C, SPI, PCM, PWM, UART, ADC等功能只能在ubilinux环境下实现,而LattePanda则没有这种问题。 所以剧情发生了反转,我们有理由认为LattePanda的方案简单有效,兼容性更好。当然一些技术参数不得而知,例如ATmega32u4和Max V的性能对比、MPU-MCU传输速度等。
有兴趣的话可以去看看Udoo x86、MinnowBoard 开发板的实现方案。 2、Firmata协议作为一个业余爱好者,我们想要了解Firmata协议是什么,能做什么以及它的应用范围(优缺点),而不关心具体实现。 2.1 Firmata协议是什么
借助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上重新验证,不一样的地方会标示下来。 注意:
关于节省空间的Tips 最新版Arduino IDE占用空间400+MB,其实我们只是烧录个Firmata小程序进去就行了,大可不必安装完整版的IDE。或者也可以使用Atom文本编辑器+PlatformIO IDE插件,这样可以支持更多的编程语言和更多的开发板(STM32、MSP430等)。 2.2.2 测试Firmata固件【界面示意】首先选择正确的串口,然后将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视窗编程方面如鱼得水,异常方便,但是有两点促使我剑走偏锋。
我们再回过头来看,发现Firmata有众多Python库支持:
在此我们选择后三者进行演示。
pyFirmata示例: [mw_shl_code=python,true]#!/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)[/mw_shl_code] 效果是板载LED隔两秒循环熄亮。 PyMata示例: [mw_shl_code=python,true]#!/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()[/mw_shl_code] 效果是隔0.5秒熄亮一次,循环10次。可见简单功能用pyFirmata库就可以,复杂功能如完整的I2C传感器支持或者需要最新版协议相关特性,可以使用PyMata或者pymata-aio。注意以上均不需要管理员权限,直接从IDLE里面打开,按F5执行即可。 拾遗
|
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed