Linkit Smart 7688 MPU 与 MCU 通信

Linkit Smart 7688 Duo 自带了 MPU 和 MCU,这比单独使用 Arduino Uno 要方便许多,在复杂的情况下,尤其是物联网,通常需要与网络通信,比如支持 MQTT,HTTP 协议,但是使用单独的 Arduino Uno 通过 C 来实现,比较复杂,这会让开发者陷入到通讯协议实现的细节当中,而不是集中在原型方案创作中。

Linkit Smart 自带了 MPU,其中安装的系统为 OpenWrt,MCU 兼容 Arduino,在上层通讯可以在OpenWrt 中实现,然后通过 uart 与 MCU 交互,控制传感器。比如在 OpenWrt 中使用 Eclipse Paho 的 Python 库来订阅 MQTT 消息,收到消息后将消息转换成指令通过串口传递给 MCU,通过 MCU 来控制传感器。

下面是一个通过 OpenWrt 的 python 脚本来控制 LED 灯的闪烁,在 Arduino IDE 中写入如下代码:

void setup() {
    Serial1.begin(57600);  // open internal serial connection to MT7688AN                           // in MT7688AN, this maps to device
    pinMode(13, OUTPUT);
}

void loop() {
    int c = Serial1.read();      // read from MT7688AN
    if (c != -1) {
        switch(c) {
          case '0':                // turn off D13 when receiving "0"
             digitalWrite(13, 0);
            break;
          case '1':                // turn off D13 when receiving "1"
             digitalWrite(13, 1);
            break;
        }
    }
} 

这里使用了板子上自带的 D13 引脚的 Led 灯,MPU 和 MCU 连接的串口为 Serial1,不是Serial,不同的板子会有些区别,波特率为:57600。

我们在串口中接收命令,当收到 1 时,点亮 Led 灯,当为 0 时,熄灭 Led 灯,将文件上传,上传成功后,arduino 应该已经在监听串口了。

接下来是要通过 python 给串口发消息,通过 ssh 登录到 OpenWrt ,编辑 led.py ,输入:

import serial
import time

class Led:

  def __init__(self):
    self.setup()

  def setup(self):
    self.s = serial.Serial('/dev/ttyS0', 57600)

  def loop(self):
    self.s.write('1')
    print "light on"
    time.sleep(3)
    self.s.write('0')
    print "light off"
    time.sleep(3)

  def run(self):
    while True:
      self.loop()

if __name__ == '__main__':
  led = Led()
  led.run()

代码很简单,就是连接串口,然后向串口发送消息,执行 python led.py, 就应该能够看到 Led 灯闪烁了。