• 欢迎大家分享资料!前往留言板评论即可!

4、合宙Air模块Luat开发:用GPIO输出功能实现一个简单的LED灯闪烁

合宙 模组资料网 2年前 (2021-05-15) 324次浏览 0个评论 扫描二维码
文章目录[隐藏]

目录

点击这里查看所有博文

本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持)。

先不管支不支持,如果你用的是合宙的模块,那都不妨一试,也许会有意外收获
我使用的是Air720SL模块,如果在其他模块上不能用,那就是底层core固件暂时还没有支持,这里的代码是没有问题的。例程仅供参考!

一、前言

本系列教程选择使用Luat在模块上进行二次开发,那么就要把Air720SL模块当作一个普通的单片机来学。

既然我们谈到了单片机那么驱动外设是必不可少的,单片机的外设有很多中,常见的有GPIO,UART,IIC,ADC,DAC,SPI等等。
就拿我们的Air720SL来讲,其拥有的外设也不少,可玩性还是很高的。
在这里插入图片描述
如果仅仅把它当作一个通讯模块来用,显得有点浪费。
既然厂商开发了这么多外设功能,那我们要想办法把他用起来,而不是放在那里吃灰,要想方设法榨干它的身体

俗话说得好,不学爬怎么学跑呢,对吧。
学习也是一样,我们要从简单的学起不是上来就干最难的。
在上面这么多种外设中,GPIO无疑是最简单的,最容易的,也是最基本的,而GPIO又有输入和输出的功能。
想要点亮一个灯,那就需要用到GPIO的输出功能。那我们现在闲话少说,开始学习新的内容

二、磨刀不误砍柴工

1、怎么才能点亮一个灯

我们这里就长话短说,想要灯亮首先得满足led灯的电压要求,其次还要形成足够的电流,led才能点亮。
在我们的开发板这里我们就不需要考虑这些,官方的就是计算好的,我们只需要让它形成电流即可,形成电流的条件是在led两端要有压差

现在我们打开开发板原理图,找到指示灯模块,如下图所示
在这里插入图片描述
从原理图得知,LED实际上是由三极管控制的
如果想要LED1和LED2两端形成压差,那就要使三极管导通
在本图中三极管导通的条件是Vb>Ve,Ve=0,那么就需要Vb>0
4、合宙Air模块Luat开发:用GPIO输出功能实现一个简单的LED灯闪烁
而Vb的电压是由GPIO输出经过电阻分压,而形成的,也就是说,要想LED点亮,那么GPIO需要输出高电平,我们分别控制GPIO64和GPIO65就能控制LED

2、尝试点亮一个灯

既然知道了应该怎样才能点亮一个灯,那我们现在就来试一下,验证刚才的分析对不对
首先我们需要包含一个库pin库,require "pins"才能使用GPIO驱动相关的库函数
然后在main程序里写入如下代码

local function user_main()
    --初始化GPIO 比如GPIO_64
    local LED1 = pins.setup(64, 0)
    local LED2 = pins.setup(65, 0)
    LED1(1)--让指示灯亮
    LED2(1)--让指示灯亮
end

下载测试程序,等待片刻LED1(第二个灯)和LED2(第三个灯)成功点亮,第一个灯是电源灯,不控制的话开机就会亮
在这里插入图片描述
接下来我们测量一下GPIO64的引脚电平,果然是高电平点亮LED,说明我们刚才的分析没有问题
在这里插入图片描述

# 三、下载完整的代码到Air720Sl开发板

这里我们直接贴出全部代码

--必须在这个位置定义PROJECT和VERSION变量
--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
PROJECT = "LED"
VERSION = "0.0.1"
require "sys"
--加载日志功能模块,并且设置日志输出等级
--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
require "log"
LOG_LEVEL = log.LOGLEVEL_TRACE


require "pins"
local function LED0()
    --初始化GPIO 比如GPIO_64
    local ledpin = pins.setup(64, 0)
    while true do
        ledpin(1)--让指示灯亮500ms
        sys.wait(500)
        ledpin(0); --让指示灯灭500ms
        sys.wait(500)
    end
end

local function LED1()
    --初始化GPIO 比如GPIO_65
    local ledpin = pins.setup(65, 0)
    for i=1,5 do
        ledpin(1)--让指示灯亮500ms
        sys.wait(500)
        ledpin(0); --让指示灯灭500ms
        sys.wait(500)
    end
end

local function user_main()
    sys.wait(10000)
    sys.taskInit(LED0)  
    sys.taskInit(LED1)  
end

--启动系统框架
sys.taskInit(user_main)
sys.init(0, 0)
sys.run()

下载程序后运行结果如下,LED1和LED2以1HZ频率闪烁,LED2闪烁5次后停止
4、合宙Air模块Luat开发:用GPIO输出功能实现一个简单的LED灯闪烁

四、总结

1、官方的pins库函数

  • pins.setup(pin, val, pull):配置GPIO模式
  • pins.close(pin):关闭GPIO模式
  • GPIO的操作直接使用setup函数的返回值即可

2、学会驱动GPIO输出有什么作用

  • 直接驱动LED灯
  • 直接驱动继电器,间接控制插座或者其他强电开关,实现自动控制
  • 在没有硬件IIC的芯片上,可以使用GPIO输入和输出功能,模拟软件IIC
  • 这里只列出了三种比较常用的用法,其他用法还有很多,需要自己摸索

不会下载的点击这里,进去查看我的第二篇博文2、Air720SL模块Luat开发:第一个Luat的Hello World里面讲了怎么下载
这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束


喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址