这是所有工作的物理基础。我首先仔细规划了引脚分配,避免冲突。使用杜邦线和面包板进行了引脚连接,由于该开发板的数字IO引脚很少,因此为了节省IO,将颜色传感器的输出频率scaler进行固定,S0=H;S1=L。
下图为连接框图

下图为实际电路连接

验证主控板和开发环境是否正常的最佳方式,就是经典的“Blink”程序。测试了板载的led。
spec中的位置和使用方法如下


需要注意的点!!!LED与D13引脚也存在冲突。。。所以在使用的过程中一定要避开。
下图为实际LED亮起

代码如下
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
while True:
led.value = True
time.sleep(0.5)
led.value = False
time.sleep(0.5)
3. 任务一:驱动颜色传感器与串口打印色彩值这是实现“拾色”功能的核心。创建了TCS3200的class,区别在于实际连接S0,S1固定,减少了两个GPIO的初始化。class内部有测量RGB值的函数,通过测试将各channel的最大值进行写入,最后转为0-255。
class TCS3200:
def __init__(self,s2_in,s3_in,out_pin_in):
self.s2 = digitalio.DigitalInOut(s2_in)
self.s3 = digitalio.DigitalInOut(s3_in)
self.out_pin = digitalio.DigitalInOut(out_pin_in)
self.s2.direction = digitalio.Direction.OUTPUT
self.s3.direction = digitalio.Direction.OUTPUT
self.out_pin.direction = digitalio.Direction.INPUT
def set_color_filter(self,color):
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
else:
self.s2.value = True
self.s3.value = False
def measure_frequency_one_channel(self,number_of_cycle=10):
timestamps = []
last_state = self.out_pin.value
while len(timestamps) < number_of_cycle:
current_state = self.out_pin.value
if current_state != last_state:
timestamps.append(time.monotonic_ns())
last_state = current_state
time.sleep(0.01)
periods = []
for i in range(4,len(timestamps),2):
periods_ns = timestamps[i] - timestamps[i-2]
periods.append(periods_ns)
avg_period_ns = sum(periods)/len(periods)
freq = 1_000_000_000 / avg_period_ns
return freq



这里调用板载的三色LED,在spec的这个位置

将采集到的RGB值转化到0-255,给到LED
def get_color_freq(cs):
color_freq_array = []
cs.set_color_filter('R')
color_freq_array.append(cs.measure_frequency_one_channel())
cs.set_color_filter('G')
color_freq_array.append(cs.measure_frequency_one_channel())
cs.set_color_filter('B')
color_freq_array.append(cs.measure_frequency_one_channel())
return color_freq_array
if previous_button_state and not current_button_state:
#task 1:print color
c_f_a = get_color_freq(color_senser)
display_RGB_freq(c_f_a)
c_f_a[0] = (c_f_a[0]/48) * 255
if c_f_a[0] > 255:
c_f_a[0] = 255
c_f_a[1] = (c_f_a[1]/44) * 255
if c_f_a[1] > 255:
c_f_a[1] = 255
c_f_a[2] = (c_f_a[2]/42) * 255
if c_f_a[2] > 255:
c_f_a[2] = 255
display_RGB_freq(c_f_a)
#task2: sample color and show in LED
pixel.fill((c_f_a[0],c_f_a[1],c_f_a[2]))
5. 用蜂鸣器复现Do,Re,Mi
蜂鸣器使用pwm输出,通过音阶相应的频率修改pwm频率,需要注意的点是配置pwm的时候variable_frequency=True才能够对频率进行修改。虽然spec上说要5v驱动,实际3.3v也可以驱动
pwm = pwmio.PWMOut(board.D10,duty_cycle=0, frequency=440, variable_frequency=True)
note_names = ['C4', 'D4', 'E4', 'F4', 'G4', 'A4', 'B4', 'C5']
frequencies = [261, 293, 329, 349, 392, 440, 493, 523]
DEBOUNCE_TIME = 0.2
NOTE_DURATION = 0.5
#task3: bibibi
if d2_current and not last_d2_state:
stop_playing()
play_note(note_index)
note_index = (note_index + 1) % len(note_names)
note_start_time = time.monotonic()
time.sleep(DEBOUNCE_TIME)
stop_playing()
last_d2_state = d2_current
我要赚赏金
