TranslateProject/published/202306/20230314.3 ⭐️⭐️ Control your Raspberry Pi with Lua.md
2023-07-01 00:19:05 +08:00

146 lines
7.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[#]: subject: "Control your Raspberry Pi with Lua"
[#]: via: "https://opensource.com/article/23/3/control-your-raspberry-pi-lua"
[#]: author: "Alan Smithee https://opensource.com/users/alansmithee"
[#]: collector: "lkxed"
[#]: translator: "geekpi"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-15888-1.html"
用 Lua 控制你的树莓派
======
![][0]
> 学习如何使用 Lua 编程语言为物联网IoT设备编程并与树莓派上的通用输入/输出GPIO引脚互动。
Lua 是一种有时会被误解的语言。它与 Python 等其他语言不同,但它是一种通用的扩展语言,广泛用于游戏引擎、框架等。总的来说,我发现 Lua 对开发人员来说是一个有价值的工具,可以让他们以一些强大的方式增强和扩展他们的项目。
你可以按照 Seth Kenlon 的文章《[Lua 值得学习吗?][1]》的介绍下载并运行常用的 Lua该文章中还包括了简单的 Lua 代码示例。但是,要充分利用 Lua最好将它与采用该语言的框架一起使用。在本教程中我演示了如何使用名为 Mako Server 的框架,该框架旨在使 Lua 程序员能够轻松地编写 IoT 和 Web 应用代码。我还向你展示了如何使用 API 扩展此框架以使用树莓派的 GPIO 引脚。
### 要求
在学习本教程之前,你需要一个可以登录的正在运行的树莓派。虽然我将在本教程中编译 C 代码,但你不需要任何 C 代码经验。但是,你需要一些使用 [POSIX][2] 终端的经验。
### 安装
首先,在树莓派上打开一个终端窗口并安装以下工具,以使用 Git 下载代码和编译 C 代码:
```
$ sudo apt install git unzip gcc make
```
接下来,通过运行以下命令编译开源 Mako Server 代码和 lua-periphery 库(树莓派的 GPIO 库):
```
$ wget -O Mako-Server-Build.sh \
https://raw.githubusercontent.com/RealTimeLogic/BAS/main/RaspberryPiBuild.sh
```
查看脚本以了解它的作用,并在你觉得没问题后运行它:
```
$ sh ./Mako-Server-Build.sh
```
编译过程可能需要一些时间,尤其是在较旧的树莓派上。编译完成后,脚本会要求你将 Mako Server 和 lua-periphery 模块安装到 `/usr/local/bin/`。我建议安装它以简化软件的使用。别担心,如果你不再需要它,你可以卸载它:
```
$ cd /usr/local/bin/
$ sudo rm mako mako.zip periphery.so
```
要测试安装,请在终端中输入 `mako`。这将启动 Mako 服务器,并在你的终端中看到一些输出。你可以按 `CTRL+C` 停止服务器。
### IoT 和 Lua
现在 Mako 服务器已在你的树莓派上设置好,你可以开始对 IoT 和 Web 应用进行编程,并使用 Lua 操作树莓派的 GPIO 引脚。Mako Server 框架为 Lua 开发人员提供了一个强大而简单的 API 来创建物联网应用,而 lua-periphery 模块让 Lua 开发人员可以与树莓派的 GPIO 引脚和其他外围设备进行交互。
首先创建一个应用目录和一个 `.preload` 脚本,其中插入用于测试 GPIO 的 Lua 代码。`.preload` 脚本是一个 Mako 服务器扩展,在应用启动时作为 Lua 脚本加载和运行。
```
$ mkdir gpiotst
$ nano gpiotst/.preload
```
将以下内容复制到 [Nano 编辑器][3] 中并保存文件:
```
-- Load periphery.so and access the LED interface
local LED = require('periphery').LED
local function doled()
local led = LED("led0") -- Open LED led0
trace"Turn LED on"
led:write(true) -- Turn on LED (set max brightness)
ba.sleep(3000) -- 3 seconds
trace"Turn LED off"
led:write(false) -- Turn off LED (set zero brightness)
led:close()
end
ba.thread.run(doled) -- Defer execution
-- to after Mako has started
```
上面的 Lua 代码使用你编译并包含在 Mako 服务器中的 Lua-periphery 库控制树莓派 LED。该脚本定义了一个名为 `doled` 的函数来控制 LED。该脚本首先使用 Lua `require` 函数加载 `periphery` 库(共享库 periphery.so。返回的数据是一个包含所有 GPIO API 函数的 [Lua 表][4]。但是,你只需要 LED API你可以通过在调用 `require` 后附加 `.LED` 来直接访问它。接下来,代码定义了一个名为 `doled` 的函数,它执行以下操作:
- 通过调用 `periphery` 库中的 `LED` 函数,并将字符串 `led0` 传给它,打开树莓派主 LED识别为 `led0`
- 将消息 `Turn LED on` 打印到跟踪(控制台)。
- 通过调用 LED 对象上的 `write` 方法并将布尔值 `true` 传递给它来激活 LED该值设置 LED 的最大亮度。
- 通过调用 `ba.sleep(3000)` 等待 3 秒。
- 将消息 `Turn LED off` 打印到跟踪。
- 通过调用 LED 对象上的 `write` 方法并将布尔值 `false` 传递给它来停用 LED这会将 LED 的亮度设置为零。
- 通过调用 LED 对象上的 `close` 函数关闭 `LED`
`.preload` 脚本的末尾,`doled` 函数作为参数传递给 `ba.thread.run` 函数。这允许将 `doled` 函数的执行推迟到 Mako 服务器启动之后。
要启动 `gpiotst` 应用,请按如下方式运行 Mako 服务器:
```
$ mako -l::gpiotst
```
控制台中打印以下文本:
```
Opening LED:
opening 'brightness': Permission denied.
```
访问 GPIO 需要 root 访问权限,因此按 `CTRL+C` 停止服务器并重新启动 Mako 服务器,如下所示:
```
$ sudo mako -l::gpiotst
```
现在树莓派 LED 亮起 3 秒。成功!
### Lua 解锁 IoT
在本入门教程中,你学习了如何编译 Mako 服务器,包括 GPIO Lua 模块,以及如何编写用于打开和关闭树莓派 LED 的基本 Lua 脚本。在以后的文章中,我将在本文的基础上进一步介绍 IoT 功能。
同时,你可以通过阅读它的 [文档][5] 来更深入地研究 Lua-periphery GPIO 库,以了解有关功能以及如何将其与不同外设一起使用的更多信息。要充分利用本教程,请考虑关注 [交互式 Mako Server Lua 教程][6] 以更好地了解 Lua、Web 和 IoT。编码愉快
*题图MJ/4514210d-5697-4cd3-8c44-450bbe56be64*
--------------------------------------------------------------------------------
via: https://opensource.com/article/23/3/control-your-raspberry-pi-lua
作者:[Alan Smithee][a]
选题:[lkxed][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/alansmithee
[b]: https://github.com/lkxed/
[1]: https://opensource.com/article/22/11/lua-worth-learning
[2]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains
[3]: https://opensource.com/article/20/12/gnu-nano
[4]: https://opensource.com/article/22/11/iterate-over-tables-lua
[5]: https://github.com/vsergeev/lua-periphery/tree/master/docs
[6]: https://tutorial.realtimelogic.com/Introduction.lsp
[0]: https://img.linux.net.cn/data/attachment/album/202306/08/170454p0tf2a6znfn2kzkf.jpg