本帖最后由 allankliu 于 2016-5-27 12:12 编辑
好久没有冒泡。今天混一篇。
研究micropython有多方面的需求。其中有一项就是IoT网关的二次开发。大家EE背景也算是IT行业的一部分,现在两创中IOT/IOE的项目特别多。我平时就总是接到此类需求。有的要求做整体方案,有的要求做云服务器等等。我的旧友旧同事中也有类似的业务。
现有的开发模式
但是我观察下来,他们的硬件端的开发模式是类似的:
MCU:ARM Cortex-M3/M4 MCU
IoT:CAN/RS485/RF433/RF2.4G/Zigbee/6LowPAN
B/E:Eth/WiFi/BLE/BT SPP/GPRS
固件平台:C/C++,以C为主,C++为辅。
这些方案最苦逼的事情就是对接,需要根据OEM客户进行修改。但有一点,越接近应用层,越接近消费者,各种无聊的修改就越多。比如某个界面的控件等等。要么交付所有源码给客户,客户会收下源码,开发还是你。要么交付库,那么麻烦更多。
micropython/Python赋予二次开发能力
而micropython/Lua/node.js/java(对不起,Java一开始就是面对嵌入式的)之所以进入嵌入式,其中一个理由就是赋予OEM客户,乃至消费者以二次开发能力。
所以,我最近在阅读Python与硬件相关设计的书籍。总体上说,我比较倾向以下技术组合:
- 硬件:ARM9/Cortex-A + USB/UART IoT dongle。
- 软件:Ubuntu + sysfs或网络驱动 + CPython + PyUSB/PySerial/socket
- 应用:MQTT/ZeroMQ/Redis + Python Web + SQLite
利用USB的即插即用,也可以动态修改整体设备的配置。我倾向这种组合,还有一个原因是:ARM9/Cortex开发板的成本非常低,甚至低于pyboard BOM。
如果STM32F40X如果价格够低,比如整体BOM低于CNY30。但我觉得micropython可以构建更加简单的IoT产品。
- 硬件:STM32F40X或其他中低端MCU,UART/SPI IoT dongle;
- 软件:RTOS + IoT dongle stack;
- 应用:用户应用 + 网盘/REST API
IoT/IP连接接口
IoT/IP这些接口无外乎几类:
UART:ESP8266,BLE;
SPI:CC1100,SX1276等没有内置MCU的RFIC,或者Microchip的ETH/USB到SPI的桥接IC;
APB:ARM外设总线等,可以内置CAN总线模块;
I2C,相对较少。
USB,pyboard中大多数做device。但以后host/otg会较多。
SPI总线
各类总线中,SPI是连接各类IOT的高速接口。简单,有效。所以我测试了一下pyboard的SPI串口。
SPI是许多物联网RFIC的缺省通讯方式。基于SPI类,可以构建CC11XX/nRF24L01/SX1267等设备子类。笔者在pyboard中做个一个localloop的测试,即MOSI与MISO(即X7/X8)短接。如果从MISO返回的数值等于MOSI的输出。则工作正常。
- from pyb import SPI
- buf = bytearray(10)
- spi = SPI(1, SPI.MASTER, baudrate=9600000, polarity=1, phase=0, crc=0x07)
- data = spi.send_recv(b'0123456789')
- spi.send_recv(b'0123456789', buf)
- #spi.send_recv(buf, buf)
- print(repr(buf))
复制代码
如果不短接MOSI/MISO,返回数值是:
- >>>
- PYB: sync filesystems
- PYB: soft reboot
- bytearray(b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff')
复制代码
短接后返回数值是:
- >>>
- PYB: sync filesystems
- PYB: soft reboot
- bytearray(b'0123456789')
复制代码
在mbed网站中已经找到许多RFIC的C++类库(CC1101/CC2500/CC2530/CC2650/nRF51/nRF24L01)。花费一点时间可以很容易移植成为此类SPI设备的Python类。
返回数值说明,SPI收发正常。但我继续测试了pyboard的SPI总线速度极限。LoRaWAN虽然速度不高,但是如果对接FSK器件,那么大部分WSN的空口速率在250Kbps,而SPI速率都在2Mbps左右。此例中,最初的SPI速度设置为600000,即600K,距离SX1276的10M速度还有距离。但设置到9.6M依然工作正常。
所以,在micropython/Python中,将Buffer bytearray设置长度为256B,工作在较高频率问题不大。