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

# 目录 [点击这里查看所有博文](https://blog.csdn.net/weixin_44570083/article/details/104285283) # 一、前言 > 本系列教程选择使用Luat在模块上进行二次开发,那么就要把Air720SL...

目录

点击这里查看所有博文

本系列博客,理论上适用于合宙的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
在这里插入图片描述
而Vb的电压是由GPIO输出经过电阻分压,而形成的,也就是说,要想LED点亮,那么GPIO需要输出高电平,我们分别控制GPIO64和GPIO65就能控制LED

2、尝试点亮一个灯

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

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

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

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

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

  1. --必须在这个位置定义PROJECTVERSION变量
  2. --PROJECTascii string类型,可以随便定义,只要不使用,就行
  3. --VERSIONascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
  4. PROJECT = "LED"
  5. VERSION = "0.0.1"
  6. require "sys"
  7. --加载日志功能模块,并且设置日志输出等级
  8. --如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
  9. require "log"
  10. LOG_LEVEL = log.LOGLEVEL_TRACE
  11. require "pins"
  12. local function LED0()
  13. --初始化GPIO 比如GPIO_64
  14. local ledpin = pins.setup(64, 0)
  15. while true do
  16. ledpin(1)--让指示灯亮500ms
  17. sys.wait(500)
  18. ledpin(0); --让指示灯灭500ms
  19. sys.wait(500)
  20. end
  21. end
  22. local function LED1()
  23. --初始化GPIO 比如GPIO_65
  24. local ledpin = pins.setup(65, 0)
  25. for i=1,5 do
  26. ledpin(1)--让指示灯亮500ms
  27. sys.wait(500)
  28. ledpin(0); --让指示灯灭500ms
  29. sys.wait(500)
  30. end
  31. end
  32. local function user_main()
  33. sys.wait(10000)
  34. sys.taskInit(LED0)
  35. sys.taskInit(LED1)
  36. end
  37. --启动系统框架
  38. sys.taskInit(user_main)
  39. sys.init(0, 0)
  40. sys.run()

下载程序后运行结果如下,LED1和LED2以1HZ频率闪烁,LED2闪烁5次后停止
在这里插入图片描述

四、总结

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里面讲了怎么下载
这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束

  • 发表于 2020-02-14 14:43
  • 阅读 ( 2925 )

0 条评论

请先 登录 后评论
不写代码的码农
陈夏

26 篇文章

作家榜 »

  1. 技术销售Delectate 43 文章
  2. 陈夏 26 文章
  3. 国梁 24 文章
  4. miuser 21 文章
  5. 晨旭 20 文章
  6. 朱天华 19 文章
  7. 金艺 19 文章
  8. 杨奉武 18 文章