联发科Linkit 7688 DUO(三): 通过 Arduino 控制外设和传感器

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的端口

     如下图:

联发科Linkit 7688 DUO(三): 通过 Arduino 控制外设和传感器_第1张图片     

至此,Arduino开发环境设置好了, 可以写 Arduino程序了。


四、写第一个Arduino程序

    第一个程序来自官网上的例程,原网页在这里:  范例

  • 打开 Arduino IDE,到 File 菜单点击 New, 然后复制与粘贴以下代码:   


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; 
        } 
    } 
}

 
 

这是一个典型的Arduino程序, 两个函数 setup(), loop()

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);
	}

}

编译后,上传到开发板,运行,D13 LED灯每隔一秒闪一下,效果正确。


串口函数库可以在我的资源中下载  C语言Linux串口编程


Arduino有很多好用的传感器和控制模块,下一节,将把各种Arduino模块装到 Linkit 7688 DUO上玩一玩








 


你可能感兴趣的:(联发科Linkit 7688 DUO(三): 通过 Arduino 控制外设和传感器)