这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » Let'sdo-2025年第3期-DIY拾色播放器-过程帖

共2条 1/1 1 跳转至

Let'sdo-2025年第3期-DIY拾色播放器-过程帖

专家
2025-11-30 11:20:19     打赏

### 开发环境的配置


CircuitPython 10.0.0  


### 升级TinyUF2 Bootloader


***需要升级TinyUF2 Bootloader到0.33以上***  

在浏览器输入“https://adafru.it/1alW”可以下载固件。在活动提供的资料中已有这个固件。  

然后到这里“https://adafruit.github.io/Adafruit_WebSerial_ESPTool/”进行升级。  

进入此页面后,点击Connect(此时需要把ESP32-S3 FEATHER PCB ANTENNA开发板通过usb连接到电脑上),会弹出串口选择窗口,在里面找到对应的串口,进行连接。  


在线下载工具连接设备.png


连接失败的话需要检查串口选择是不是正确,及波特率设置。  

连接成功的话会出现下面的提示。


在线下载工具连接设备2.png


 

##### 烧录bin文件


加载“tinyuf2-adafruit_feather_esp32s3_reverse_tft-0.33.0-combined.bin”文件。此文件在活动的资料中已提供,也可以从上面的连接中下载。  



点击“Program”进行烧录,等待完成。

此时在我的电脑的硬盘列表下面可以看到出现的“FIHRS3BOOT”盘符。  

在线下载工具连接设备6.png


### 烧录CircuitPython


将“adafruit-circuitpython-adafruit_feather_esp32s3_reverse_tft-en_US-10.0.0.uf2”拖到上面出现的“FIHRS3BOOT”盘内,即可自动进行烧录。

更新uf2文件后.png


*活动资料里提供的是英文版的固件,需要其它的语言的固件可以从“[ESP32-S3 Reverse TFT Feather Download](https://circuitpython.org/board/adafruit_feather_esp32s3_reverse_tft/)”进行下载。* 


完成之后启动Mu程序,就可以在自动连接到开发板。

更新uf2文件后2.png




### 牛刀初试


在mu窗口使用“load”命令直接打开开发板里的code.py,可以看到以下命令:


```python

printf("Hello World!")

```

在开发板的内容如下:

尝试修改内容0.jpg


我们直接修改code,修改为:


```python

printf("Hello World! Hey Hey Hey...")

```

尝试修改内容1.png


然后点击“save”,mu在保存的时候会自动下载到开发板,之后我们就会在开发板的显示屏上看到结果。

尝试修改内容2.jpg






关键词: let's do-2025     diy     拾色器    

专家
2025-12-07 10:43:08     打赏
2楼

任务1:实现颜色传感器驱动,按键获取当前颜色数据并可以通过串口或屏幕进行打印;任务1.1:按键按下后,串口或屏幕打印按键值

import time
import board
import digitalio

led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT

button0 = digitalio.DigitalInOut(board.BUTTON)
button0.switch_to_input(pull=digitalio.Pull.UP)

button1 = digitalio.DigitalInOut(board.D1)
button1.switch_to_input(pull=digitalio.Pull.DOWN)

button2 = digitalio.DigitalInOut(board.D2)
button2.switch_to_input(pull=digitalio.Pull.DOWN)

print("Hello World! Hey Hey Hey...")
print("Button led")

while True:
   # Check Button D0
   if not button0.value:  # button0 is active (Pull.UP, active LOW)
       print("Button D0 pressed")
       led.value = True
   # Check Button D1
   elif button1.value:  # button1 is active (Pull.DOWN, active HIGH)
       print("Button D1 pressed")
       led.value = True
   # Check Button D2
   elif button2.value:  # button2 is active (Pull.DOWN, active HIGH)
       print("Button D2 pressed")
       led.value = True
   else:
       led.value = False  # No buttons are pressed, turn off the LED

   # Small delay to debounce buttons and reduce serial output spam
   time.sleep(0.1)

保存之后可以在显示屏上看到下面的内容。每次按下按键,显示屏上显示按下的按键名,同时led点亮。

任务1.2:实现颜色传感器驱动

接着上面的任务,按照教程PPT中的任务一部分添加TCS2000类。

class TCS3200:
   def __init__(self, s0, s1, s2, s3, out_pin):
       # 初始化TCS3200的控制引脚
       self.s0 = s0
       self.s1 = s1
       self.s2 = s2
       self.s3 = s3
       self.out = out_pin
       
       # 设置引脚方向
       self.s0.direction = digitalio.Direction.OUTPUT
       self.s1.direction = digitalio.Direction.OUTPUT
       self.s2.direction = digitalio.Direction.OUTPUT
       self.s3.direction = digitalio.Direction.OUTPUT
       self.out.direction = digitalio.Direction.INPUT
       
   def set_frequency(self, freq_mode):
       """
       设置传感器的频率控制(s0和s1)

       Parameters
       ----------
       freq_mode : TYPE
           DESCRIPTION.
           0:2%频率
           1:20%频率
           2:100%频率
       Returns
       -------
       None.

       """
       if freq_mode == 0:
           self.s0.value = False
           self.s1.value = False
       elif freq_mode == 1:
           self.s0.value = False
           self.s1.value = True
       elif freq_mode == 2:
           self.s0.value = True
           self.s1.value = False
       else:
           self.s0.value = True
           self.s1.value = True

   def set_color_channel(self, color):
       """
       设置S2和S3引脚来选择颜色通道

       Parameters
       ----------
       color : TYPE
           DESCRIPTION.
       'R': Red
       'G': Green
       'B': Blue
       Returns
       -------
       None.

       """
       if color == 'R':
           self.s2.value = False
           self.s3.value = False
       elif color == 'G':
           self.s2.value = True
           self.s3.value = True
       elif color == 'B':
           self.s2.value = False
           self.s3.value = True
       
   # 配置采样次数
   NUM_CYCLES = 10 # 测多少个周期
   
   def measure_frequency(self):
       timestamps = []
       last_state = self.out.value
       
       while len(timestamps) < self.NUM_CYCLES:
           current_state = self.out.value
           if current_state != last_state:
               # 发生边缘变化
               timestamps.append(time.monotonic_ns())
               last_state = current_state
               
       # 计算周期
       periods = []
       for i in range(2, len(timestamps), 2):
           period_ns = timestamps[i] - timestamps[i - 2] # 一个完整周期(两个边缘)
           periods.append(period_ns)
           
       avg_period_ns = sum(periods) / len(periods)
       frequency = 1_000_000_000 / avg_period_ns # 转换成Hz
       return frequency

现在的程序还不能驱动拾色器。接下来我们还需要把类给实例化:


try:        
   pickColor_tcs = TCS3200(
       s0=digitalio.DigitalInOut(board.D12),
       s1=digitalio.DigitalInOut(board.D11),
       s2=digitalio.DigitalInOut(board.D10),
       s3=digitalio.DigitalInOut(board.D9),
       out_pin=digitalio.DigitalInOut(board.D6)
   )
   print("TCS3200 finished")
except Exception as e:
   print(f"init TCS3200 failed:{e}")
   pickColor_tcs = None


任务1.3:实现颜色传感器驱动,按键获取当前颜色数据并可以通过串口或屏幕进行打印;

在按键D0里添加命令:

        pickColor_tcs.set_color_channel('R')
       red_freq = pickColor_tcs.measure_frequency()
       print("red_freq: {:.2f}".format(red_freq))

这时候会保存、运行后,按下D0键,会看到存在错误提示。经排查后发现是例程中几个地方存在些小问题:

    def measure_frequency(self):
       ...
               last_state = self.out.value
           ...
while len(timestamps) < self.NUM_CYCLES:
           current_state = self.out.value
       ...

这几个地方都是没有self的引用,添加后可以工作。  

继续添加D1、D2的命令:

        pickColor_tcs.set_color_channel('G')
       green_freq = pickColor_tcs.measure_frequency()
       print("green_freq: {:.2f}".format(green_freq))
        pickColor_tcs.set_color_channel('B')
       blue_freq = pickColor_tcs.measure_frequency()
       print("blue_freq: {:.2f}".format(blue_freq))

怎么改变字体的颜色啊?好想实现……啊啊啊……啊……

task1.2.jpg



共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]