Linkit 系列博文:
联发科Linkit 7688 (一) 上手及在Mac下搭建OpenWrt交叉编译环境,C语言编译Hello,World
联发科Linkit 7688 (二)GPIO基本操作与C语言编程
联发科Linkit 7688 DUO(三): 通过 Arduino 控制外设和传感器
Linkit 7688 DUO(四): 接上各种Arduino传感器和模块——基础篇
Linkit 7688 DUO(五) 接上各种Arduino传感器和模块—扩展篇
Linkit 7688 DUO(六) 加入MQTT物联网协议
我的开发板是 Linkit 7688 DUO, 支持Arduino
一、 Linkit 7688 DUO开发板的基本结构
Linkit 7688 DUO开发板上有两个处理器芯片。
一片是 Linkit 7688, 主处理器
一片是 ATmega32U4, 这是Arduino的处理芯片,提供Arduino编程接口,用于控制传感器外设等
ATmega32U4 放在开发板的背面,见下图:
两个芯片用内部串口相连,开发板上的 引出管脚 D0-D23 均是由 ATmega32U4 引出的。结构如下图:
这个结构的好处是: 发挥Linit7688芯片强大的功能(Linux, Wifi联网, 处理能力)的同时, 又能兼容Arduino控制IO的优点,可以直接使用Arduino的众多传感器模块。
在开发中, 要写两个程序:
1, 写Arduino程序, 写入ATmega32U4中。Arduino程序通过串口接收主处理器Linkit 7688送来的命令, 执行相应动作。
2, 写主程序,写入Linkit7688中。 主程序通过串口向 ATmega32U4 发送命令
三、要写Arduino程序,首先要安装Arduino开发环境
1, 首先安装 Arduino IDE
去 Arduino 官网: https://www.arduino.cc/en/Main/OldSoftwareReleases#previous, 下载
我用Mac Book, 因此下载了 Arduino IDE for Mac 版。(注意: 要下载 1.6.4版,因为之前我下载过 1.6.9 和 1.6.8版都在编译文件时出错,只有安装 1.6.4版才正确)
下载后,解压。 将Arduino文件夹复制到 Application中即可。
点击打开Arduino, Mac 提示安全性不足不能打开。这是因为 Arduino 1.6.4版没有Mac开发者签名,因此要在 “系统安全性设置” -- “安全性与隐私” 中设置 “允许运行从以下位置下载的程序”, 设置为“任何来源“, 按 “仍要打开“按钮,即可运行Arduino 了。
首次运行Arduino时, Mac系统提示错误: “无法创建项目文件夹“
这是因为,arduino IDE会在我的文档里新建文件夹“Arduino”, 因为没有权限,创建失败。
因此,要自己手动在“文档"中创建 文件夹“Arduino”
再次运行Arduino, OK, 进入Arduino IDE主界面
2, 在 Arduino IDE中安装 Linkit 7688 DUO 主板支持包
打开Arduino安装 Linkit 7688 DUO 主板支持包
安装方法说明在官网上有:安装Linkit7688 DUO主板支持包
安装完成后, 在 Arduino IDE中, 菜单"工具"-->“开发板“中选 Linkit 7688 DUO
如果您的计算机跑的是 Windows操作系统,您还必须安装LinkIt Smart 7688 Duo COM port 驱动。(安装方法见:安装串口驱动)
如果您的操作系统是 Mac 或者 Linux,则不需要安装驱动。
我的电脑是 Mac, 所以不用装驱动
3,将Linkit 7688 DUO开发板 的USB连接线 连接到 Mac Book 的USB口上。
则 Mac Book 将识别到这个USB设备, 并在目录 /dev 下生成这个USB设备文件, 可以在Mac用 ls 命令 查看一下: ls /dev/tty.*
我的开发板设备文件是 /dev/tty.usbmodem1421 (不同电脑可能略有所不同)
这是一个串口设备,Arduino IDE 将通过这个串口将程序写入 ATmega32U4 中。
4,在 Mac 中打开 Arduino,
(1)在 菜单“工具” -->开发板中选择Linkit 7688 DUO. (如果你没有看到 Linkit7688的选项,则是没有安装 Linkit 7688 DUO 主板支持包, 请看这里安装:安装Linkit7688 DUO主板支持包)
(2)在 菜单“工具” --> "端口“中选择 Linkit 7688 DUO的端口
如下图:
至此,Arduino开发环境设置好了, 可以写 Arduino程序了。
四、写第一个Arduino程序
第一个程序来自官网上的例程,原网页在这里: 范例
void setup() Serial.begin(115200); // open serial connection to USB Serial port(connected to your computer) Serial1.begin(57600); // open internal serial connection to MT7688 pinMode(13, OUTPUT); // in MT7688, this maps to device } void loop() { int c = Serial1.read(); // read from MT7688 if (c != -1) { switch(c) { case '0': // turn off D13 when receiving "0" digitalWrite(13, 0); break; case '1': // turn on D13 when receiving "1" digitalWrite(13, 1); break; } } }
setup() 函数是初始化函数, 其中 Serial 是开发板与电脑的串口。 Serial1是linkit 7688 连接 Atmega32U4 的内部串口, pin 13 在 DUO开发板上连接了一个LED灯
loop() 函数是主循环, 含义是: 从内部串口Serial1读取一个字符(即,读取 Linkit 7688送来的命令), 如果字符为‘0’, 将pin 13 写为0 (即 D13 的LED灯灭了). 如果字符为‘1’, 将pin 13写为1 (即 LED灯亮)
2, 编译 Arduino程序,上传到开发板中
(1) 编译: 在Arduino IDE中,选菜单 "项目"-->"验证/编译“
如果出错了,则多半是 Arduino IDE 的版本太高,要重装一个 1.6.4版本的. (前文说过了)
( 2 ) 上传到开发板: 在Arduino IDE中,选菜单 "文件"-->"上传“
OK后,Arduino程序已上传到 Atmega32U4 中。
这时,开发板见不到LED灯闪烁,没有任何反应。这是因为我们还需要写一个主控程序到 Linkit 7688中,通知内部串口,才能命令Arduino程序动作。
3,写一个主控程序到Linkit 7688
官网上提供了一个Python例程, 不过从原网页拷贝下来的话,则缩进格式错了。要知道,Python可是严格要求缩进格式的,否则运行出错。
我把Python程序的缩进格式搞好,如下:
import serial import time s = None def setup(): global s # open serial COM port to /dev/ttyS0, which maps to UART0(D0/D1) # the baudrate is set to 57600 and should be the same as the one # specified in the Arduino sketch uploaded to ATMega32U4. s = serial.Serial("/dev/ttyS0", 57600) def loop(): # send "1" to the Arduino sketch on ATMega32U4. # the sketch will turn on the LED attached to D13 on the board s.write("1") time.sleep(1) # send "0" to the sketch to turn off the LED s.write("0") time.sleep(1) if __name__ == '__main__': setup() while True: loop()
这个程序的意思是:
setup()函数打开 /dev/ttyS0 串口(即:对应ATmage32U4的内部串口), 设置波特率 57600 (这个值必须与Arduino程序中的Seiral1波特率相同)
loop()函数死循环, 每隔一秒向串口发一个字符 ‘0’ 或 ‘1’, 这样将通知Arduino程序将D13 的LED灯打开或关闭
效果就是 D13的LED每隔一秒灯亮或灯灭。
将上述python文件存盘为 blink.py
用scp命令上传到开发板
scp blink.py [email protected]:/root
然后,用ssh命令登入开发板, 在 /root目录下运行 blink.py
python blink.py
程序运行后,则可以看到 开发板上的 D13 LED灯(在复位开关上方) 每隔一秒灯亮或灯灭。
这个python程序是死循环,按 CTRL+C 可以中断程序运行。
五、用C语言对串口编程,写Linkit 7688上的主控程序
虽然 Linkit 7688提供了 python 和 node.js的开发库, 但如果用了这些高级语言开发应用,换个CPU和开发环境就没用了。
还是用C语言做底层开发比较好。
1, Linux的串口编程原理
Linux一切皆是文件。Linux操作串口,其实就是读写串口设备文件。
(1) 在Linxu中,串口设备是通过串口设备文件来访问的,即通过访问/dev/ttyS0,/dev/ttyS1,/dev/ttyS2这些设备文件实现对串口的访问。
(2) 调用open()函数来代开串口设备,对于串口的打开操作,必须使用O_NOCTTY参数。
(3) 初始化串口 (波特率等),这里要用到一些串口专属函数
(4) 串口设备文件打开后,读写跟普通文件一样,用 read(), write()
(5) 串口操作完毕,close()关闭串口文件
2, linux 串口操作函数库
为简化串口操作,本人写了一个串口操作函数库。 共两个文件: serial.h , serial.c 里面有多个函数,比如:
serial_open( int port, int baud_rate ); //打开串口
serial_send( int fd, void *buffer, size_t data_len); //发送数据
serial_close( int file_descriptor ); //关闭串口
3, 编制C语言主程序,实现上文中的Python程序功能
#include <unistd.h> #include "serial.h" int main() { int fd; char c; fd = serial_open(0, 57600); //打开串口0, 即: /dev/ttyS0 if ( fd >= 0 ) { while (1) { c = '0'; serial_send(fd, &c, 1); //发送 ‘0’ sleep(1); //等待1秒 c = '1'; serial_send(fd, &c, 1); //发送 '1' sleep(1); //等待1秒 } serial_close(fd); } }
串口函数库可以在我的资源中下载 C语言Linux串口编程
Arduino有很多好用的传感器和控制模块,下一节,将把各种Arduino模块装到 Linkit 7688 DUO上玩一玩