- 2025-02-12
-
发表了主题帖:
想问一下盲盒如何查看发货,马上开学了,我地址填的家里
如题,想问一下盲盒如何查看发货,马上开学了,我地址填的家里
- 2024-12-28
-
上传了资料:
【Follow me第二季第4期】代码打包-ICS
-
发表了主题帖:
【Follow me第二季第4期】任务汇总 - ICS
本帖最后由 ICS 于 2025-1-10 17:16 编辑
# 任务总结
## 任务视频
[localvideo]125e8d7112387d52258f6becbf4529ed[/localvideo]
详情请查看:https://training.eeworld.com.cn/course/68903/learn?preview=1#lesson/42215
## 物料清单
| 任务1 | 任务2 | 任务3 |
| --------------------------- | --------------------------- | --------------------------- |
| Arduino Nano RP2040 Connect | Arduino Nano RP2040 Connect | Arduino Nano RP2040 Connect |
## 任务一:搭建环境并开启第一步Blink三色LED / 串口打印Hello DigiKey & EEWorld!
详情查看:[任务一:搭建环境并点亮RGBLED&串口输出](https://bbs.eeworld.com.cn/thread-1300301-1-1.html)
#### **难点**:
LED的GPIO引脚由W102所控制
#### **目标**
- 实现 Arduino Nano RP2040 Connect 的 **RGB LED 闪烁** 和 **串口打印 "Hello DigiKey & EEWorld!"**。
#### **步骤**
1. **搭建开发环境**
- 安装 **VS Code** 和 **PlatformIO**。
- 创建项目并选择开发板 `Arduino Nano RP2040 Connect`。
- 安装必要的库(如 WiFiNINA)。
2. **代码实现**
- 使用 `WiFiNINA` 库通过 SPI 与板载 NINA-W102 模块通信控制 RGB LED。
- 使用串口 `Serial` 输出字符串。
#### **核心代码**
```c++
#include
#include
void fadeLED(NinaPin ledPin) {
for (int brightness = 255; brightness >= 0; brightness--) {
analogWrite(ledPin, brightness);
delay(10);
}
for (int brightness = 0; brightness Create3D[创建3D对象]
Create3D --> LoopStart((读取串口信息))
BoardIMU[Arduino Nano RP2040 Connect\n串口输出数据] --> LoopStart
LoopStart --> UpdateState[更新3D对象状态]
UpdateState --> LoopStart
LoopStart --> End[结束]
```
Markdown解析好像有点问题:
---
# 【Follow me第二季第4期】任务三:学习PDM麦克风技术知识,调试PDM麦克风,通过串口打印收音数据和音频波形
详情查看:[任务三:学习PDM麦克风技术知识,调试PDM麦克风,通过串... ](https://bbs.eeworld.com.cn/thread-1303102-1-1.html)
#### **难点**:
PDM调制与波形转换
#### 软件流程图:
```mermaid
flowchart TD
Start[开始] --> Init[初始化参数和PDM引脚]
Init --> Filter[定义滤波函数]
Filter --> Downsample[定义降采样函数]
Downsample --> Handler[定义缓冲区处理函数]
Handler --> PDMInit[初始化PDM并设置缓冲区处理程序]
PDMInit --> PDMStart[启动PDM采集]
PDMStart --> Loop((循环采集数据))
Loop --> Buffer[调用缓冲区处理函数]
Buffer --> ApplyFilter[对数据进行滤波]
ApplyFilter --> DownsampleData[对数据进行降采样]
DownsampleData --> PrintData[输出PCM数据]
PrintData --> Loop
```
Markdown解析好像有点问题:
#### **硬件背景**
- **麦克风型号**:ST MP34DT06JTR(兼容 MP34DT05 的驱动)。
- 技术特点
- PDM(Pulse Density Modulation,脉冲密度调制)麦克风输出脉冲流,脉冲密度表示信号强度。
- 需要通过滤波和降采样将 PDM 数据转换为 PCM(脉冲编码调制)格式,用于音频处理。
------
#### **主要任务**
1. **学习 PDM 麦克风技术**:
- PDM 数据通过脉冲密度表示模拟信号的强弱。
- 相较于传统模拟麦克风,PDM 麦克风具有低功耗、高信噪比的特点。
2. **搭建 PDM 驱动并采集数据**:
- 使用 RP2040 的 PIO(可编程 I/O)模块处理高速 PDM 数据流。
- 自定义缓冲区管理,实现数据实时处理。
3. **通过串口打印数据**:
- 采集 PDM 数据后,通过滤波和降采样将其转换为可用的 PCM 数据,并通过串口输出。
4. **音频波形绘制**:
- 将 PDM 转换后的 PCM 数据输出到串口,便于进一步分析或绘制音频波形。
------
#### **技术实现**
1. **初始化 PDM 麦克风**: 使用 MicroPython 驱动配置 PIO,以高速采集 PDM 数据。
- PDM 时钟频率:3.072 MHz。
- 利用 RP2040 的硬件中断优化数据采集效率。
2. **数据处理**:
- **低通滤波**:平滑 PDM 数据,去除高频噪声。
- **降采样**:将高频 PDM 数据转为音频采样率(如 4 kHz)的 PCM 数据。
3. **代码示例**:
##### **驱动初始化与数据采集**
```python
import rp2
import array
from machine import Pin
from micropython import schedule
# 初始化 PDM 驱动(简化版)
def buffer_handler(inactive_buf):
pdm_data = list(pdm.get_buffer(inactive_buf))
filtered_data = low_pass_filter(pdm_data)
pcm_data = downsample(filtered_data)
for sample in pcm_data:
print(sample)
pdm.init(Pin(23), Pin(22), handler=buffer_handler) # 定义时钟和数据引脚
pdm.start()
```
##### **滤波与降采样**
```python
# 低通滤波
def low_pass_filter(pdm_data, window_size=8):
return [sum(pdm_data[i:i + window_size]) // window_size for i in range(len(pdm_data) - window_size)]
# 降采样
def downsample(data, factor=4):
return data[::factor]
```
------
#### **实现效果**
1. **串口打印音频数据**:
- 实时采集的 PCM 数据通过串口输出。
- 数据可以直接绘制波形,观察音频信号的变化。
2. **音频波形绘制**:
- 利用串口输出数据,可通过图形工具生成音频波形,直观显示信号强度和变化趋势。
---
感谢 DigiKey 和 EEWORLD 提供的学习机会。任务涵盖了 Arduino Nano RP2040 Connect 开发板的 RGB LED 控制、IMU 传感器数据处理和 PDM 麦克风音频采集。通过 `WiFiNINA` 库实现了 RGB LED 的控制,展示了嵌入式模块化通信的特点;利用 I2C 接口读取 IMU 数据并通过 Vispy 库实现 3D 可视化;通过 PIO 高速采集 PDM 麦克风数据并处理为 PCM 音频波形。这些实践全面提升了嵌入式开发与音频处理的技术能力。
---
# 代码打包
[【Follow me第二季第4期】代码打包-ICS-嵌入式开发相关资料下载-EEWORLD下载中心](https://download.eeworld.com.cn/detail/ICS/635457)
-
发表了主题帖:
【Follow me 第二季第4期】任务三:学习PDM麦克风技术知识,调试PDM麦克风,通过串...
[localvideo]614b16003a92b50b05755df98a3a8290[/localvideo]
---
Arduino® Nano RP2040 Connect 上的麦克风型号为:`ST MP34DT06JTR`,在网上只找到了`MP34DT05`的驱动,不过同样可以使用
```python
# https://github.com/PinkInk/mp34dt05-a-micropython-driver/blob/main/st34dt05a.py
import rp2
import array
from uctypes import addressof
import micropython
bit_sample_freq = 3_072_000 # PDM clock frequency Hz
__steps = 8 # PIO clock steps per PDM clock cycle
# 8 word raw sample buffer matching size joined RX FIFO
__raw_sample_buf = array.array('I', [0 for _ in range(8)])
# sample buffers
buf_len = 1024
# initialise buffers
__buf0 = array.array('B', [0 for _ in range(buf_len)])
__buf1 = array.array('B', [0 for _ in range(buf_len)])
# sample buffer wrapper [byte offset]
# __data[0] = buffer length [0]
# __data[1] = active buffer (0 or 1) [4]
# __data[2] = index of current sample [8]
# __data[3] = address of start of buffer 0 [12]
# __data[4] = address of start of buffer 1 [16]
__data = array.array('I', [buf_len, 0, 0, addressof(__buf0), addressof(__buf1)])
__active_buf = 0
# return buffer
def get_buffer(b):
return eval(f'__buf{b}')
# placeholder for user provided buffer handler fn
buffer_handler = None
# sample PDM microphone
@rp2.asm_pio(set_init=rp2.PIO.OUT_LOW, out_init=rp2.PIO.IN_LOW, fifo_join=rp2.PIO.JOIN_RX)
def sample() -> uint:
set(y, 8) # no. of word length samples
label("WORDSTART")
set(x, 30) # 32 bits per sample (- 2)
label("SAMPLE")
set(pins, 1) [2] # set clock pin high
wrap_target()
in_(pins, 1) # sample data pin into ISR
# (>105ns after rising clock edge)
set(pins, 0) [2] # set clock pin low
jmp(x_dec, "SAMPLE") # loop
# last bit sample 3 steps shorter accomodating
# push, jmp and (re-)set x loop counter
set(pins, 1) [2]
in_(pins, 1)
set(pins, 0)
push(noblock) # push ISR to to RX FIFO
jmp(y_dec, "WORDSTART")
irq(rel(0)) # raise irq - consume RX FIFO in main
# reset counters and loop back, whilst maintaining timing
set(pins, 1)
set(y, 8)
set(x, 30)
# implicit wrap (no clock cycle)
# count bits in 8 word sample and store into active buffer
# r0 = __raw_sample_buf (8 word array)
# r1 = __data array
@micropython.asm_thumb
def store_pcm_sample(r0, r1) -> uint:
# r2 = overloaded scratch variable
# init
ldr(r4, [r1, 12]) # r4 = address of start of buffer 0 (__data[3])
ldr(r2, [r1, 4]) # r2 = get active buffer (__data[1])
cmp(r2, 0) # if __buf0 active
beq(BUF0) # skip
ldr(r4, [r1, 16]) # else: r4 = address of start of buffer 1 (__data[4])
label(BUF0)
ldr(r3, [r1, 8]) # r3 = get index (__data[2])
add(r4, r4, r3) # add buf index
# sample buffer loop (SBL)
mov(r5, 0) # r5 = current sample running set-bit count
mov(r6, 0) # r6 = init index into 8 word __raw_sample_buf
label(SBL_START) # __raw_sample_buf loop START
cmp(r6, 32) # 8 * 4 byte words = 32 bits
beq(SBL_END) # end of buffer? GOTO: __raw_sample_buf loop END
# sample loop
mov(r2, r0) # r2 = address of __raw_sample_buf
add(r2, r2, r6) # add __raw_sample_buf index
ldr(r7, [r2, 0]) # r7 = current sample
# Brian Kernighan method
# https://developer.arm.com/documentation/ka002486/latest
label(SL_START) # sample loop START
cmp(r7, 0) # if sample decremented to zero
beq(SL_END) # GOTO: Sample Loop END
add(r5, 1) # increment sample set-bit count
mov(r2, r7) # r2 = temp copy of sample
sub(r2, 1) # subtract 1 (reverses LSB)
and_(r7, r2) # remove LSB from sample
b(SL_START) # GOTO: Sample Loop START
label(SL_END) # sample loop END
add(r6, 4) # increment sample counter one word
b(SBL_START) # GOTO: __raw_sample_buf loop STARTs
label(SBL_END) # sample buffer loop END
# store sample set-bit count into active buf[index]
strb(r5, [r4, 0]) # buf is a Byte array
# increment and store buf index
ldr(r2, [r1, 0]) # r2 = buf_len
add(r3, 1) # increment
cmp(r3, r2) # if index = buf_len?
bne(SKIP_RESET) # GOTO: SKIP_RESET
mov(r3, 0) # re-init index = 0
# swap buffers
ldr(r2, [r1, 4]) # r2 = get active buffer (to invert)
cmp(r2, 0)
beq(BUF1) # if buffer 0 is not active
mov(r2, 0) # make buffer 0 active
b(UPD_BUF)
label(BUF1)
mov(r2, 1) # else: make buffer 1 active
label(UPD_BUF)
str(r2, [r1, 4]) # store active buffer
label(SKIP_RESET)
str(r3, [r1, 8]) # store buf index back to __data
# irq handler
# get samples and store in buffer
# p = irq (passed by StateMachine.irq)
def irq_handler(p):
global __raw_sample_buf, __data, __active_buf, buffer_handler
sm.get(__raw_sample_buf)
store_pcm_sample(__raw_sample_buf, __data)
if __active_buf != __data[1]:
if buffer_handler:
# handle now inactive buffer
micropython.schedule(buffer_handler, __active_buf)
__active_buf = __data[1]
# init StateMachine
# pdm_clk = pdm clock pin (23 on arduino nano rp2040 connect)
# pdm_data = pdm data pin (22 on arduino nano rp2040 connect)
# handler = function to handle inactive buffer
def init(pdm_clk, pdm_data, handler=None):
global buffer_handler, sample, irq_handler, sm, bit_sample_freq, __steps
buffer_handler = handler
sm = rp2.StateMachine(0, sample, freq=bit_sample_freq*__steps, set_base=pdm_clk, in_base=pdm_data)
# hard interupt flag causes lockup?
sm.irq(handler=irq_handler) #, hard=True)
def start():
sm.active(True)
def stop():
sm.active(False)
```
驱动利用可编程IO将脉冲密度信号转换为 PDM 格式(脉冲计数)。
> PDM(Pulse Density Modulation,脉冲密度调制)麦克风是一种广泛应用于消费电子、物联网设备和嵌入式系统中的数字麦克风技术。相较于传统的模拟麦克风,PDM麦克风以其低功耗、紧凑的封装和高信噪比等优点,成为当下音频采集领域的重要技术。
>
> PDM通过脉冲的“密度”来表示信号的幅值:
>
> - 当输入信号幅值较高时,输出的数字脉冲密度较大(更多的“1”)。
> - 当输入信号幅值较低时,输出的数字脉冲密度较小(更多的“0”)。
我们可以通过将 PDM 数据滤波降采样后转换为 PCM 数据
```python
from time import sleep
import random
from wavsimple import wav
from machine import Pin
import mp34 as pdm
pcm_rate = 4_000 # Hz - default is 12kHz i.e. 3.072MHz bit-sample rate
pdm.bit_sample_freq = pcm_rate * 256
pdm_clk = Pin(23)
pdm_data = Pin(22)
# 滤波函数
def low_pass_filter(pdm_data, window_size=8):
filtered_data = []
for i in range(len(pdm_data) - window_size):
avg = sum(pdm_data[i:i + window_size]) // window_size
filtered_data.append(avg)
return filtered_data
# 降采样函数
def downsample(data, factor=4):
return data[::factor]
def buffer_handler(inactive_buf):
pdm_data = list(pdm.get_buffer(inactive_buf))
filtered_data = low_pass_filter(pdm_data)
pcm_data = downsample(filtered_data)
for i in pcm_data:
print(i)
pdm.init(pdm_clk, pdm_data, handler=buffer_handler)
pdm.start()
```
- 2024-12-10
-
回复了主题帖:
【Follow me第二季第4期】任务二:IMU传感器的使用——串口输出和姿态监控
秦天qintian0303 发表于 2024-12-10 12:13
这个串口工具不错,求分享
附件有,几年前用的,最近很难找
- 2024-12-09
-
发表了主题帖:
【Follow me第二季第4期】任务二:IMU传感器的使用——串口输出和姿态监控
本帖最后由 ICS 于 2024-12-9 16:38 编辑
同样,先上演示视频,再看文章:
[localvideo]9b2686762a8cb2dabe6e2ad7b5916e49[/localvideo]
---
参考: [在 Nano RP2040 Connect 上访问 IMU 数据 |Arduino 文档](https://docs.arduino.cc/tutorials/nano-rp2040-connect/rp2040-imu-basics/)
Arduino® Nano RP2040 Connect板载了一个`LSM6DSOX` 的六轴`IMU`,提供了三轴加速度计和三轴陀螺仪。
### 加速度计
加速度计是一种用于测量加速度的机电设备。这些力可能是静态的,例如重力的连续力,或者像许多移动设备一样,动态的,用于感应运动或振动。
在此示例中,我们将使用加速度计作为 “level” ,以提供有关板位置的信息。使用此应用程序,我们将能够读取板的相对位置,以及通过向上、向下、向左或向右倾斜板来读取度数。
### 陀螺仪
陀螺仪传感器是一种可以测量和保持物体的方向和角速度的设备。陀螺仪比加速度计更先进,因为它们可以测量物体的倾斜和横向,而加速度计只能测量其线性运动。
陀螺仪传感器也称为“角速率传感器”或“角速度传感器”。角速度以度/秒为单位,是物体每单位时间内旋转角度的变化。
## 通过串口打印六轴原始数据
如果烧录的是`Micropython`,则我们可以很简单的通过串口打印六轴原始数据:
```python
import time
from machine import Pin, I2C
from lsm6dsox import LSM6DSOX
i2c = I2C(0, sda=Pin(12), scl=Pin(13))
lsm = LSM6DSOX(i2c)
while True:
# 陀螺仪
gyro_x, gyro_y, gyro_z = lsm.gyro()
# 加速度计
accel_x, accel_y, accel_z = lsm.accel()
print(f"{gyro_x:.3f} {gyro_y:.3f} {gyro_z:.3f} {accel_x:.3f} {accel_y:.3f} {accel_z:.3f}")
time.sleep_ms(50)
```
使用串口绘图器绘图如下:
[localvideo]fe482e0505c7ccd7bfa71e3b878c8b49[/localvideo]
## 通过串口读取重力加速度获取大致姿态
首先我们需要安装`vispy`、`numpy`、`pyserial`和`PyQT5`:
`pip install PyQt5 pyserial vispy numpy `
```python
import numpy as np
from vispy import app, scene
from vispy.scene import transforms
import serial
import sys
# 创建Canvas和View
canvas = scene.SceneCanvas(keys='interactive', show=True)
view = canvas.central_widget.add_view()
view.camera = 'turntable'
view.camera.fov = 60
view.camera.distance = 300
# 创建3D长方体的顶点和面
vertices = np.array([
[50, 15, 2.5], [50, -15, 2.5], [-50, -15, 2.5], [-50, 15, 2.5],
[50, 15, -2.5], [50, -15, -2.5], [-50, -15, -2.5], [-50, 15, -2.5]
])
faces = np.array([
[0, 1, 5], [5, 4, 0], # Front face
[2, 3, 7], [7, 6, 2], # Back face
[0, 4, 7], [7, 3, 0], # Top face
[1, 5, 6], [6, 2, 1], # Bottom face
[4, 5, 6], [6, 7, 4], # Right face
[0, 1, 2], [2, 3, 0] # Left face
])
# 为每个面指定不同颜色(使用RGB值)
colors = [
[1, 0, 0], # Red
[0, 1, 0], # Green
[0, 0, 1], # Blue
[1, 1, 0], # Yellow
[0, 1, 1], # Cyan
[1, 0, 1], # Magenta
[0.5, 0.25, 0], # Brown
[0.75, 0.25, 0.25], # Pink
[0.5, 0.5, 0.5], # Gray
[0.6, 1, 0], # Lime
[0.25, 0.5, 0.75], # Light Blue
[0.25, 0.75, 0.25] # Light Green
]
# 更新Mesh对象的颜色
mesh = scene.visuals.Mesh(vertices=vertices, faces=faces, face_colors=colors)
view.add(mesh)
# 串口设置
try:
ser = serial.Serial('COM6', 115200)
except Exception as e:
print("Error opening serial port: {}".format(e))
sys.exit(1)
def update_mesh(event):
try:
line = ser.readline().decode('utf-8').strip()
if line:
g_y, g_x, g_z = map(float, line.split())
angle_x = np.arcsin(g_x) * 180 / np.pi # 镜像x轴
angle_y = -np.arcsin(g_y) * 180 / np.pi # 镜像y轴
angle_z = np.arcsin(g_z) * 180 / np.pi # 镜像z轴
mesh.transform = transforms.MatrixTransform()
mesh.transform.rotate(angle_x, (1, 0, 0))
mesh.transform.rotate(angle_y, (0, 1, 0))
mesh.transform.rotate(angle_z, (0, 0, 1))
canvas.update()
except ValueError:
pass # Ignore conversion errors
timer = app.Timer('auto', connect=update_mesh, start=True)
if __name__ == '__main__':
app.run()
```
这段代码通过 Vispy 库显示一个 3D 长方体,定义每个面的颜色,并通过串口接收数据调整其倾斜角度。串口数据表示 x、y、z 方向的倾斜比例,转换为旋转角度后实时更新图形的旋转状态。
```python
import time
from machine import Pin, I2C
from lsm6dsox import LSM6DSOX
i2c = I2C(0, sda=Pin(12), scl=Pin(13))
lsm = LSM6DSOX(i2c)
while True:
# 这里我们只需要加速度
accel_x, accel_y, accel_z = lsm.accel()
print(f"{accel_x:.3f} {accel_y:.3f} {accel_z:.3f}")
time.sleep_ms(50)
```
## 附件
1. 代码打包
2. 串口绘图软件
先前文章:
[【Follow me第二季第4期】任务一:搭建环境并点亮RGBLED&串口输出](https://bbs.eeworld.com.cn/thread-1300301-1-1.html)
[【Follow me第二季第4期】非任务:制作一个黑神话碎玉池银行提款机](https://bbs.eeworld.com.cn/thread-1300596-1-1.html)
- 2024-12-02
-
回复了主题帖:
【Follow me第二季第4期】非任务:制作一个黑神话碎玉池银行提款机
wangerxian 发表于 2024-12-2 13:12
是不是搞个修改器会更快一些
更专业且高效的方法通常是通过专门的软件来实现自动化刷取,但本文旨在提供一种有趣的尝试和娱乐思路
- 2024-12-01
-
发表了主题帖:
【Follow me第二季第4期】非任务:制作一个黑神话碎玉池银行提款机
众所周知,黑神话第四章盘丝洞的碎玉池银行是那些灵韵、灵光点不足的玩家最爱去的地方。然而,刷取灵韵的过程往往枯燥且乏味,笔者就曾亲身经历,刷了一整晚才勉强将等级提升至200级。鉴于此,笔者突发奇想,是否能利用`Arduino® Nano RP2040 Connect`的`USB-HID`功能,将其模拟成一个键盘,从而自动执行刷灵韵的操作,以加速这一过程。(注:当然,更专业且高效的方法通常是通过专门的软件来实现自动化刷取,但本文旨在提供一种有趣的尝试和娱乐思路。)
## 首先先上演示视频
[localvideo]36fcf66e44de691aaee5e55e1b507a7a[/localvideo]
## 准备
#### 软件准备:
1. 黑神话悟空
2. `Arduino® Nano RP2040 Connect`需要刷入`CircuitPython`,且导入`adafruit_hid`库
#### 属性准备:
1. 攻击力需大于90
2. 装备双头鼠,且点满变身攻击和双头鼠
3. q键必须切换到缩地
4. 最好带上仙禄和幽灯鬼
#### 安装CircuitPython
前往[Nano RP2040 Connect Download](https://circuitpython.org/board/arduino_nano_rp2040_connect/)下载固件,在短接`REC`和`GND`的情况下双击两下按钮,拖入下载好的`.uf2`文件即可。
#### 安装adafruit_hid库
前往[Release 6.1.3 - Fix For Sphinx RTD Theme · adafruit/Adafruit_CircuitPython_HID · GitHub](https://github.com/adafruit/Adafruit_CircuitPython_HID/releases/tag/6.1.3)下载[adafruit-circuitpython-hid-py-6.1.3.zip](https://github.com/adafruit/Adafruit_CircuitPython_HID/releases/download/6.1.3/adafruit-circuitpython-hid-py-6.1.3.zip)解压后将lib目录下面的adafruit_hid移动到板载目录下即可
## 代码实现
```python
import json
import time
import board
import digitalio
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS
keyboard_map = {
"a": 0x04, "A": 0x04,
"b": 0x05, "B": 0x05,
"c": 0x06, "C": 0x06,
"d": 0x07, "D": 0x07,
"e": 0x08, "E": 0x08,
"f": 0x09, "F": 0x09,
"g": 0x0A, "G": 0x0A,
"h": 0x0B, "H": 0x0B,
"i": 0x0C, "I": 0x0C,
"j": 0x0D, "J": 0x0D,
"k": 0x0E, "K": 0x0E,
"l": 0x0F, "L": 0x0F,
"m": 0x10, "M": 0x10,
"n": 0x11, "N": 0x11,
"o": 0x12, "O": 0x12,
"p": 0x13, "P": 0x13,
"q": 0x14, "Q": 0x14,
"r": 0x15, "R": 0x15,
"s": 0x16, "S": 0x16,
"t": 0x17, "T": 0x17,
"u": 0x18, "U": 0x18,
"v": 0x19, "V": 0x19,
"w": 0x1A, "W": 0x1A,
"x": 0x1B, "X": 0x1B,
"y": 0x1C, "Y": 0x1C,
"z": 0x1D, "Z": 0x1D,
"1": 0x1E, "!": 0x1E,
"2": 0x1F, "@": 0x1F,
"3": 0x20, "#": 0x20,
"4": 0x21, "$": 0x21,
"5": 0x22, "%": 0x22,
"6": 0x23, "^": 0x23,
"7": 0x24, "&": 0x24,
"8": 0x25, "*": 0x25,
"9": 0x26, "(": 0x26,
"0": 0x27, ")": 0x27,
"enter": 0x28,
"esc": 0x29,
"ctrl": 0xE0,
"alt": 0xE2
}
# 初始化键盘和布局
kbd = Keyboard(usb_hid.devices)
layout = KeyboardLayoutUS(kbd)
# 定义一个按键(例如,板载的一个按钮)
usrkey = digitalio.DigitalInOut(board.D2) # 假设GP24是板载按钮的引脚
usrkey.direction = digitalio.Direction.INPUT
usrkey.pull = digitalio.Pull.UP
def launch_notepad():
# 打开记事本(Windows系统)
kbd.send(Keycode.WINDOWS, Keycode.R)
time.sleep(0.3)
layout.write('notepad\n')
time.sleep(0.5)
def type_text(text):
# 输入文本
layout.write(text)
while True:
# 检查按钮是否被按下
if not usrkey.value:
while True:
with open("sycbank.txt", "r", encoding="utf-8") as f:
keys = f.readlines()
start_time = 0
last_time = 0
for key in keys:
try:
key = key.replace("\n", "")
key_json = json.loads(key)
except:
print(f"error: {key}")
continue
print(key_json, f"{key_json['time']:.2f}")
event_type = key_json["event_type"]
name = key_json["name"]
key_time = key_json["time"]
if last_time == 0:
last_time = key_time
if event_type == "start":
start_time = key_json["time"]
if event_type == "stop":
pass
else:
time.sleep(key_time - last_time)
print(key_time - last_time)
if event_type == "down":
kbd.press(keyboard_map[name.lower()])
elif event_type == "up":
kbd.release(keyboard_map[name.lower()])
last_time = key_time
time.sleep(2)
# 添加一个小的延时以避免过度占用CPU资源
time.sleep(0.1)
```
## 启用方法
1. 首先前往盘丝洞碎玉池
2. 在土地庙前按`E`后,点击鼠标右键返回后不要移动鼠标和控制键盘
3. 短接`D2`和`GND`即可
## 附件
板卡文件,可直接复制替换
- 2024-11-27
-
发表了主题帖:
【Follow me第二季第4期】任务一:搭建环境并点亮RGBLED&串口输出
[Follow me第二季第4期!与得捷一起解锁开发板超能力!](https://www.eeworld.com.cn/huodong/digikey_follow_me_2024_04/?sid=102)
---
### 任务准备
1. 硬件准备
1. Arduino® Nano RP2040 Connect开发板
2. USB-Micro B 数据线
2. 软件准备
1. 安装Arduino IDE(确保版本支持RP2040芯片)或者 PlatformIO
2. 安装RP2040的Board支持包
### 从零搭建环境(以PlatformIO为例)
1. 安装 VS Code
访问[Download Visual Studio Code - Mac, Linux, Windows](https://code.visualstudio.com/Download)下载**System Installer**的安装包,根据步骤安装即可。
2. 安装 PlatformIO IDE
1. 在VS Code中点击左边栏的拓展(Ctrl+Shift+X)
2. 点击搜索框,搜索`PlatformIO IDE`
3. 点击安装
3. 安装RP2040支持包
1. 在VS Code中点击左边栏的PlatformIO
2. 点击Open->New Project
3. 在Board中选择Arduino Nano RP2040 Connect
4. 点击Finsh,等待非常长一段时间(示网络情况而定)
### Blink三色LED / 串口打印Hello DigiKey & EEWorld!
一开始以为,串口打印和Blink应该是很简单的事情,结果事实上并不简单。从上面的框图和介绍中可知,RGB LED连接的并不是 RP2040,而是一个叫NINA-W102的东西,一看介绍:240MHz 32位双核Xtensa LX6处理器!!!这不是ESP32嘛!!!并没有直接可以通过RP2040操作RGB LED的引脚,必须先通过SPI与ESP32进行通讯,然后再由ESP 32对RGB LED进行操作。不过官方文档给出了如何操作NINA的库和例程:[Control Built-in RGB LED over Wi-Fi with Nano RP2040 Connect | Arduino Documentation](https://docs.arduino.cc/tutorials/nano-rp2040-connect/rp2040-web-server-rgb/),例程如下:
```C++
#include
#include # 需要在Platform IO 中安装 WiFi NINA
void fadeLED(NinaPin ledPin)
{
for (int brightness = 255; brightness >= 0; brightness--)
{
analogWrite(ledPin, brightness);
delay(10);
}
for (int brightness = 0; brightness
- 2024-05-20
-
发表了主题帖:
【2023 DigiKey大赛参与奖】Raspberry Pi 5 4G 开箱帖
本帖最后由 ICS 于 2024-5-20 21:19 编辑
介绍
大家好!我最近有幸参加了2023年的DigiKey“智造万物,快乐不停”创意大赛,并且荣幸地获得了参与奖——我使用参与奖的报销金来购买 Raspberry Pi 5 4G!
外包装
内部包装
初步印象
拿起Raspberry Pi 5 4G,我被它的轻巧和紧凑的设计所吸引。但是真的是很热!!!!而且是个毛坯房,除了板子什么都没有。必要的有TF卡,5V5A的电源,散热器,可能还需要microHDMI的线。
结语
总的来说,我对这个参与奖感到非常满意和兴奋。Raspberry Pi 5 4G是一个功能强大且多用途的开发板,我迫不及待地想要开始我的树莓派之旅了!感谢EEWORLD 和 DigiKey为我提供了这个机会,我期待着在未来的项目中充分发挥它的潜力。
新的一期的2024 DigiKey“感知万物,乐享生活”创意大赛开始报名啦!:【万元大奖,600元物料】2024 DigiKey“感知万物,乐享生活”创意大赛开始报名啦!。快来参加吧!
这就是我对Raspberry Pi 5 4G的开箱体验和初步印象!如果你对这个开发板感兴趣,也可以去DigiKey网站上了解更多详情。期待未来能与大家分享我的树莓派项目!