ICS

  • 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网站上了解更多详情。期待未来能与大家分享我的树莓派项目!

最近访客

< 1/2 >

统计信息

已有10人来访过

  • 芯积分:225
  • 好友:--
  • 主题:17
  • 回复:14

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言