前言
原創文章,轉載引用務必注明鏈接,水平有限,如有疏漏,歡迎指正。
本文使用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 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 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
執行即可。
拾遺
- 由於需要插鍵盤鼠標顯示器來操作,而這辦公室鍵盤手感不給力,建議還是用VNC控制胖噠吧,參考LP官方文檔安裝tightVNC和相關加速插件,建議Host和Client都使用TightVNC可以獲得更好的兼容性、運行效率以及文件傳輸功能
- 傳輸文件、文本原本想在host上搭建FTP服務器,后來想起免費綠色的小軟件Dukto,非常好用。
- 可能我的筆本真的老了,編譯Arduino Sketch的速度竟然比不上LattePanda,淚目
- 推薦Atom編輯器+Platform IO 插件取代Arduino IDE
- 下一篇就將介紹編寫圖形界面,獲取當前天氣飛行條件
參考閱讀
2020年7月23日 更新
firmata_test 不再更新,Windows 可用,Linux不可用