Raspberry Pi 教程:在 Docker 上使用 Go 点亮 LED

本文将介绍如何使用 Raspberry Pi 运行 Docker 来运行 Go 语言的旅程,并让编写第一个真实世界的应用程序,这些只需要一个下午的时间,一个客户端连接我的显示服务器。 跟着我一步一步走:

不要 Blinkt

Blinkt!是一个 Raspberry Pi 的小插件。

它与 Raspberry Pi 的 40 针的接头兼容。

Raspberry Pi Blinkt

它的外形小巧,在 GPIO 接头之上,提供了八个可单独寻址的 RGB LED。

最酷的是:这些 LED 不会干扰 Pi 声音输出。

制造商 @Pimoroni 在 GitHub上 提供了一个 Python库 的搭建细节。

不要 Go!

Go 是由 Google 创建的流行编程语言。这是一个编译型的,静态类型的语言,其目标的易用性和易采用。Go 程序可以在 Raspberry Pi 上编译和运行,以下是其特点:

  • 自包含可执行文件
  • 编译,运行速度更快
  • 微小的静态二进制文件,如... 1.5MB的大小

Blinkt!的库已经被 @AlexEllisUK 移植到了 Go,所以你可以直接在项目中使用它们!

试试和学习 Go 有多简单?

我知道一些编程语言,但是我从来没有尝试过。那么,我们带着我们的树莓派开始吧!

由于我不想用一堆文件和依赖项填充我的基础映像,所以我使用 Docker 安全地在独立的容器中尝试和测试。

curl -sSL get.docker.com | sh
usermod -aG docker pi

设置

我 Clone 了这个示例:

git clone https://github.com/alexellis/blinkt_go_examples.git

“process” 文件夹下有一个示例 Dockerfile,我用它作为起点,并构建了 Docker 镜像。

cd progress
docker build -t actuino/blinkt-go-dev-armhf:1 .

注1:我使用 -t 参数标记镜像,所以稍后我可以用 docker push 命令来提交它。现在,你可以直接获取这个图像,而不需要构建它:docker pull actuino / blinkt-go-dev-armhf:1,不需要 git clone 命令,也不需要 docker build注2:我测试了Blinkt!在 Pi Zero 中。它是一个漂亮的玩具,但不是最好的 CPU 处理能力。由于构建花费了太多时间,我只需构建并从 4核的 Orange Pi Zero(大约需要10分钟)中将镜像提交,然后从 Pi Zero 中拉下来镜像。

Raspberry Pi Zero 以及 Orange Pi

上图是 Orange Pi Zero 和带有 Blinkt 的 Raspberry Pi Zero!

首先测试

docker run -it --privileged actuino/blinkt-go-dev-armhf:1

它的第一次尝试是:在 Blinkt 上点起一盏红灯。

现在,我能做更多吗?

让我们尝试修改 app.go 代码,这是几分钟后我做的:

  • 改变颜色
  • 给移动的点添加一条线(trail)
  • “bounces” 时更改颜色

只是,我是从容器本身编辑 app.go 代码。

为此,我必须运行一个 shell 而不是默认的 process 应用程序。 这很容易:

docker run -it --privileged actuino/blinkt-go-dev-armhf:1 /bin/bash
apt-get install nano
nano app.go

最后代码如下所示:

package main

import . "github.com/alexellis/blinkt_go"

func main() {
        brightness := 0.5
        blinkt := NewBlinkt(brightness)
        blinkt.SetClearOnExit(true)
        blinkt.Setup()
        Delay(100)

        r := 0
        g := 150
        b := 0
        for {
                for pixel := 0; pixel < 8; pixel++ {
                        blinkt.Clear()
                        blinkt.SetPixel(pixel, r, g, b)
                        if pixel > 0 {
                                blinkt.SetPixel(pixel-1, 0,25,0)
                        }
                        if pixel > 1 {
                                blinkt.SetPixel(pixel-2, 0,10,0)
                        }
                        if pixel == 0 || pixel == 7 { blinkt.SetPixel(pixel, 100,50,0) }
                        blinkt.Show()
                        Delay(100)
                }
                for pixel := 6; pixel > 0; pixel-- {
                        blinkt.Clear()
                        blinkt.SetPixel(pixel, r, g, b)
                        if pixel < 7 {
                                blinkt.SetPixel(pixel+1, 0,25,0)
                        }
                        if pixel < 6 {
                                blinkt.SetPixel(pixel+2,0,25,0)
                        }
                        if pixel == 0 || pixel == 7 { blinkt.SetPixel(pixel, 100,50,0) }
                        blinkt.Show()
                        Delay(100)
                }
        }
        blinkt.Clear()
        blinkt.Show()
}

(我知道它不漂亮,高效也不破土,我只是修改了几行,并添加了一些条件来测试)

它工作吗? 是!!!

让我们继续,我们可以吗?

我学了Go吗? 不太确定。 只是第一次接触,这很好。

但是我还有一个想法。还记得我们做的 Minecraft 实验,还有我们的 “Unicorn” 显示器,有客户端和服务器?

> 如何从一个虚拟的 Minecraft 世界内更新一个物理的 LED 显示屏

Unicorn Connected Display 使用 8x8 或 4x8 LED 阵列。为什么不把它扩展到 Blinkt 的 1x8 呢?

我感到非常乐观。 事实上,我所需要的只是一个 WebSocket 客户端,一些复制粘贴的代码,也许是一个堆栈溢出标签,一切都会好起来的。 真? 这么简单吗?

在 Go 中寻找一个 Socket.Io 客户端

我们的 Unicorn 服务器(Node.js)依赖于 Socket.io WebSocket 库。 Google 搜索显示了几个有趣的库。我用显示服务器测试了两个很好的库。

注意:Unicorn 服务器也有一个树莓派的 Docker 镜像,docker run -d -p 80:80 actuino/unicorn-server-armhf:1,所以很容易运行和测试 Pi(e)。

在 Go 项目中导入新库时,不需要自行获取代码:只需在代码中添加库的名称,然后运行 go get -v -d 并获取代码本身。

然后只需要简单的执行 go build(可能需要几分钟),你最终得到一个从你的文件夹命名的可执行文件,你可以运行或发货(ship)。

看看我的第一个Go程序!

一旦我得到了一个有效的客户端原型 - 感谢这些例子 - 这只是一个混搭显示和客户端代码的问题。

好消息!我设计的 Unicorn Protocol 使用简单的 Json 数据有效载荷,Json 对于 Go 很容易解析,真好!

是的,我不得不使用堆栈溢出,并做了一些复制/粘贴。

最后的代码在 Github 上可用:Star和克隆代码,然后自己尝试一下,这里是一步一步的自述文件

最后的结果

花了一个下午的时间来安装,测试和玩 Go 以及 Raspberry Pi,并开始第一个(非平凡的)程序的工作。

任务完成没有摩擦,我会再次玩 Go。

我们现在有一个连接到显示服务器的轻量级连接 RGB 显示器,并可以从任何来源实时更新:它接受 WebSocket 或 HTTP Post,几乎任何东西都可以试驾显示器,包括移动应用程序、网页、IOT 传感器...

以下是我们想到的一些实际应用:

  • 开放空间的忙/可用信号
  • 一个连接在你的屏幕顶部的番茄钟
  • 一些网站出现故障时的警报信号
  • 当 Pi Zero W 在您最喜爱的经销商再次出货时,闪烁的灯光!
  • CPU 负载/磁盘空间指示器
  • 早上用一种温和的渐进光使你醒来的心情灯(在最高水平,LED 真的很亮)

更多,请继续关注并告诉我们您的想法!

原文链接:http://www.actuino.fr/raspi/learn-go-pi.html

尚未评分
您的评分将帮助我们做出更好的玩法

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.