在 dotPack 上制造「雪崩」的 N 种方法
source link: http://wwj718.github.io/post/%E7%BC%96%E7%A8%8B/dotpack-snow-crash/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
在 dotPack 上制造「雪崩」的 N 种方法
我们在 MicroBlocks 编程案例: dotPack 讨论了如何使用 MicroBlocks 在 dotPack 上制造"雪崩"。
本文将展示在 dotPack 上制造"雪崩"的各种方法:
- MicroBlocks
- C/C++/Arduino
- MicroPython/CircuitPython
- MicroBlocks 固件 + Python 客户端
- 官方固件 + Python 客户端
- 官方固件 + Scratch
- 官方固件 + 浏览器里的 JavaScript
- 官方固件 + 浏览器中的 Python(PyScript/Pyodide)
- MicroBlocks 固件 + Squeak(Smalltalk) 客户端
- 待定…
- LISP(ulisp)
- Javascript
- Prolog
- Forth
在硬件层面了解 dotPack
为了在不同的编程语言中对 dotPack 进行编程,我们有必要在硬件层面了解一下 dotPack。
就可编程部分来说, dotPack 是一个由 ESP32 驱动的 16x16 NeoPixel 点阵屏, 控制引脚(Pin)为 12
。
NeoPixel 点阵屏采用 S 形走线方式。
在硬件层面,这个看起来像二维平面的点阵屏,实际是一条一维的 S 形 NeoPixel 灯带。如果你打算自己写底层固件,则一维坐标到二维平面坐标(x,y)的转化,需要自己完成。若使用官方固件,它已经为你完成了这个工作。
制造"雪崩"的 N 种方法
MicroBlocks
接下来,我们将使用 3 种不同的积木库,在 dotPack 上制造雪崩。
- 内置的 NeoPixel 库: 一维坐标
- NeoPixel Matrix: 二维坐标, 简单包装了 NeoPixel 库
- dotPack 库(推荐): 二维坐标, 修改了虚拟机
在开始制造雪崩之前,我们需要做些准备工作,将 dotPack 接入到 MicroBlocks 编程平台上。
为了使用 MicroBlocks 对 dotPack 编程,首先需要为 dotPack 刷入新的固件, 替代内置的官方固件。
这一过程十分简单,在 MicroBlocks 编程环境里(浏览器)即可完成所有操作:
- 将 dotPack 连接到计算机(需要 CH340 驱动)
- 点击左上角设置按钮(齿轮 ⚙️ 图标)
- 点击
升级主板固件
- 点击 ESP32
- 等待完成。
- 提醒: 使用 MicroBlocks 网页刷入 ESP32 固件时,请确保网页处于工作状态,耐心等待完成,不要切换到其他页面,否则会导致刷入的固件不完整。
完成之后,点击页面上方的 USB 图标,点击书包的串口地址,即可将 dotPack 接入硬件编程平台。
如果遇到问题,可以重新插拔下 dotPack 的 usb 线,并刷新下编程页面。
接下来就可以开始制造雪崩了!
方法 1: 内置的 NeoPixel 库: 一维坐标
首先打开内置的 NeoPixel 库
开始编程:
方法 2: NeoPixel Matrix
方法 3:dotPack 库
首先打开 dotPack 库
开始编程:
方法 4: C/C++/Arduino
接下来让我们采用 Arduino 平台制造"雪崩". 我选择 PlatformIO 编程环境。
这可能是硬件编程领域最主流的做法。
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#define PackPIN 12
// https://learn.adafruit.com/adafruit-neopixel-uberguide/neomatrix-library
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, PackPIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
NEO_GRB + NEO_KHZ800);
void setup()
{
// put your setup code here, to run once:
matrix.begin();
matrix.setBrightness(20);
}
void loop()
{
// put your main code here, to run repeatedly:
for (int i = 0; i < 16; ++i)
{
for (int j = 0; j < 16; ++j)
{
if (rand() % 2 == 0)
{
matrix.drawPixel(i, j, matrix.Color(0, 0, 0));
}
else
{
matrix.drawPixel(i, j, matrix.Color(255, 255, 255));
}
}
}
matrix.show();
delay(100);
}
项目源码已经放到 Github: dotPack-Arduino
方法 5: MicroPython
在此使用 Thonny 编辑器。
为了使用 MicroPython 对 dotPack 编程,首先需要往 dotPack 刷入 MicroPython 固件。在 Thonny 编辑器中刷入固件的方法是:
- 打开
运行 > 配置解释器
- 点击右下角的
安装或升级固件
- 下载最新MicroPython ESP32 固件,并选择它
点击安装,等待完成。
之后就可以在 Thonny 里使用 MicroPython 对 dotPack 编程了。
# https://docs.micropython.org/en/latest/esp32/quickref.html#neopixel-and-apa106-driver
import time
import random
from machine import Pin
from neopixel import NeoPixel
pin = Pin(12, Pin.OUT) # set GPIO12 to output to drive NeoPixels
np = NeoPixel(pin, 256) # create NeoPixel driver on GPIO12 for 256 pixels
while True:
for i in range(256):
if random.choice([True, False]) == True:
np[i] = (255//5, 255//5, 255//5) # set the first pixel to white
else:
np[i] = (0, 0, 0) # set the first pixel to black
np.write() # write data to all pixels
time.sleep(0.1)
值得注意的是,如果将 LED 开得过亮,过大的功耗会导致 ESP32 停机(出于保护目的)。这行代码用于调整亮度(最大亮度的 1/5): np[i] = (255//5, 255//5, 255//5)
方法 6: MicroBlocks 固件 + Python 客户端
首先需要在 MicroBlocks 中往 dotPack 刷入 MicroBlocks 固件。在 MicroBlocks 中配置好 WIFI 之后,你可以看到 dotPack 的 IP,之后我们在 Python 客户端中通过这个 IP 连接 dotPack,并对其编程。
import random
from dotpack import DotPack, Animation
pack = DotPack()
# 在 microblocks 里查看 IP
address = '172.20.10.2'
pack.connect(address)# 输入书包 address 可连接到书包
# 创建动画对象
animation = Animation()
# 生成10张雪崩图像
for x in range(10):
# 创建一张雪崩图像
for i in range(16):
for j in range(16):
if random.choice([True, False]):
pack.set_pixel(i, j, 'white', show=False)
else:
pack.set_pixel(i, j, 'black', show=False)
# 将雪崩图像添加到动画
animation.add_frame(pack)
# 在 JupyterLab 编辑器中预览动画
animation.show()
# 将动画上传到 dotPack (默认开机启动它)
animation.show(to_pack=pack)
Led Strip With Ble Device Using Esp32 And Toit
LISP(ulisp)
AVR NeoPixel driver using assembler
JavaScript
我们使用 espruino ESP32。
下载固件:espruino_2v13_esp32
esptool.py \
--chip esp32 \
--port /dev/ttyUSB0 \
--baud 921600 \
--after hard_reset write_flash \
-z \
--flash_mode dio \
--flash_freq 40m \
--flash_size detect \
0x1000 bootloader.bin \
0x8000 partitions_espruino.bin \
0x10000 espruino_esp32.bin
在 espruino IDE 里开始编程.
// todo: espruino 在 ESP32 下 bug 很多 :-(
require("neopixel")
Forth
Prolog
waiting…
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK