2

在 dotPack 上制造「雪崩」的 N 种方法

 2 years ago
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.
neoserver,ios ssh client

在 dotPack 上制造「雪崩」的 N 种方法

2022-05-28

dotPack-homepage.png

我们在 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 形走线方式。

12e4e816fcd717bd190663b442f364ab.jpg

在硬件层面,这个看起来像二维平面的点阵屏,实际是一条一维的 S 形 NeoPixel 灯带。如果你打算自己写底层固件,则一维坐标到二维平面坐标(x,y)的转化,需要自己完成。若使用官方固件,它已经为你完成了这个工作。

制造"雪崩"的 N 种方法

MicroBlocks

接下来,我们将使用 3 种不同的积木库,在 dotPack 上制造雪崩。

  • 内置的 NeoPixel 库: 一维坐标
  • NeoPixel Matrix: 二维坐标, 简单包装了 NeoPixel 库
  • dotPack 库(推荐): 二维坐标, 修改了虚拟机

在开始制造雪崩之前,我们需要做些准备工作,将 dotPack 接入到 MicroBlocks 编程平台上。

为了使用 MicroBlocks 对 dotPack 编程,首先需要为 dotPack 刷入新的固件, 替代内置的官方固件。

这一过程十分简单,在 MicroBlocks 编程环境里(浏览器)即可完成所有操作:

  • 将 dotPack 连接到计算机(需要 CH340 驱动)
  • 点击左上角设置按钮(齿轮 ⚙️ 图标)
  • 点击升级主板固件
  • 点击 ESP32
  • 等待完成。
    • 提醒: 使用 MicroBlocks 网页刷入 ESP32 固件时,请确保网页处于工作状态,耐心等待完成,不要切换到其他页面,否则会导致刷入的固件不完整。

dotpack-snow-crash2.png

完成之后,点击页面上方的 USB 图标,点击书包的串口地址,即可将 dotPack 接入硬件编程平台。

如果遇到问题,可以重新插拔下 dotPack 的 usb 线,并刷新下编程页面。

接下来就可以开始制造雪崩了!

方法 1: 内置的 NeoPixel 库: 一维坐标

首先打开内置的 NeoPixel 库

dotpack-snow-crash3.png

开始编程:

dotpack-snow-crash4.png

查看/编辑 程序

方法 2: NeoPixel Matrix

dotpack-snow-crash6.png

查看/编辑 程序

方法 3:dotPack 库

首先打开 dotPack 库

dotpack-snow-crash5.png

开始编程:

snow_crash.png

查看/编辑 程序

方法 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 固件,并选择它

dotpack-snow-crash7.png

点击安装,等待完成。

之后就可以在 Thonny 里使用 MicroPython 对 dotPack 编程了。

dotpack-snow-crash8.png
# 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")

mruby-esp32

Forth

ESP32forth

Prolog

prolog-esp32

rust-esp32-example

nesper


waiting…


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK