本帖最后由 pildio 于 2024-10-18 13:53 编辑
大家好,我是pildio,今天向大家分享一下我参与Follow me第一期的任务汇总
项目简介:搭配必购板子Adafruit Circuit Playground Express完成下方任务。
首先是全部的物料清单
本文提供基于Arduino IDE的开发环境搭建 如果CircuitPython请看我下一篇文章
1、设置 Arduino IDE
参考文献:https://learn.adafruit.com/adafruit-circuit-playground-express/set-up-arduino-ide
安装 SAMD 支持 通过导航到 Tools->Board 菜单打开 Boards Manager
进入搜索界面后输入Arduino SAMD 确保Arduino SAMD 版本为1.6.16 或更高
退出并重新打开 Arduino IDE,以确保所有板都已正确安装。现在应该能够选择并上传到 Tools->Board 菜单中列出的新板。
- 安装驱动程序
参考文献:https://learn.adafruit.com/adafruit-circuit-playground-express/adafruit2-windows-driver-installation
下载正确的驱动程序 下载地址如下:也可以看我本文附件内容
如果您是windows10和 Windows 11 只需要则根本不需要运行安装程序
- 插入硬件让电脑读取
插入 Circuit Playground Express 并等待它作系统识别(只需几秒钟)。它将创建一个串行/COM 端口,您现在可以从下拉列表中选择它,它甚至会被“指示”为 Circuit Playground Express 板 正确选择串口号即可连接成功
- 成功上传
将示例程序上传并下载会得到一堆红色文本,告诉你设备已被找到,并且已经编程、验证和重置
【Follow me第二季第1期】 开发环境的搭建-基于CircuitPython
二、开发环境的搭建(基于CircuitPython)
- 安装或更新CircuitPython
单击上面的链接并下载最新的 UF2 文件这里选择中文拼音
Circuit Playground Express Download (circuitpython.org)
或者您可以在本文的末尾找到该文件 但是请注意版本如果需要更新版本 请随时去上述地址下载
- 使用一根具有数据传输功能的 USB 电缆将 Circuit Playground Express 插入电脑后 双击Circuit Playground Express中间的小重置按钮,您将看到所有 LED 都变为绿色。如果它们全部变为红色,请检查 USB 电缆,尝试另一个 USB 端口等。如果双击不起作用,请尝试单击一次!
- 您将看到一个名为 CPLAYBOOT的新磁盘驱动器出现 拖动刚才下载的文件到它上面
4、CPLAYBOOT驱动器将消失,并出现一个名为CIRCUITPY的新磁盘驱动器
5、安装vscode
我选用的开发工具为vscode+Circuitpython插件实现对开发板进行编程
在vscode界面点击 扩展 安装如下插件
然后将开发板连接到电脑上用vscode打开开发板u盘文件夹即可
在code.py文件即是本次开发板您需要编写的代码
这里提供一个测试代码
复制
import board import digitalio import time led = digitalio.DigitalInOut(board.LED
led.direction = digitalio.Direction.OUTPU
while True
led.value = Tru time.sleep(0.1 led.value = Fals time.sleep(0.5)
若您成功安装LED 将会亮起和熄灭
|
三、如何确定CircuitPython需要的库文件
1、我们在使用CircuitPython时需要用到库文件 这些库文件在这里下载https://circuitpython.org/libraries或者您可以从我的附件中获取 adafruit-circuitpython-bundle-9.x-mpy-20240728.zip (14.85 MB, 下载次数: 0)
adafruit-circuitpython-bundle-8.x-mpy-20240728.zip (14.84 MB, 下载次数: 0)
2、现在打开 lib 文件夹。当您打开该文件夹时,您会看到大量的 .MPY 文件和文件夹。
3、如何导入我需要的库 首先打开 CIRCUITPY 驱动器上的 lib 文件夹。然后,打开从下载的 zip 中提取的 lib 文件夹。在里面,你会发现许多文件夹和.mpy文件。找到您要使用的库,并将其复制到 CIRCUITPY 上的 lib 文件夹中。
如果库是一个包含多个 .mpy 文件的目录,请确保将整个文件夹复制到 CIRCUITPY/lib。
4、我们需要安装那些库 一般来说我们需要导入代码中import 后面的名称
例如import library_or_module 即 我们需要library_or_module这个库
5、如何创建自己的 .mpy 文件
mpy-cross
请参考一下连接
https://adafruit-circuit-python.s3.amazonaws.com/index.html?prefix=bin/mpy-cross/
若要创建 .mpy 文件,请运行以在与原始文件相同的目录中创建 yourfile.mpy。./mpy-cross path/to/yourfile.py
四、如何卸载CircuitPython
也许您尝试了 CircuitPython 并想回到 MakeCode 或 Arduino
备份您的代码在替换 CircuitPython 之前,不要忘记备份 CIRCUITPY 驱动器上的代码。这意味着您的 code.py 任何其他文件、lib 文件夹等
迁移到Arduino
如果你想改用Arduino,你只需使用Arduino IDE来加载Arduino程序。首先插入您的电路板,然后双击重置,直到您获得绿色的板载 LED。在Arduino IDE中,选择匹配的板,例如Circuit Playground Express。确保 LED 仍为绿色,然后单击 Upload 以上传 Blink。成功上传后,串行端口将更改,因此请重新选择新端口!
上传 Blink 后,您应该不再需要双击以进入引导加载程序模式。当您上传时,Arduino将自动重置。
五、CircuitPython中本次历程我们用到的库
以上为在本次活动中我锁使用到的全部库文件这些库文件将会依这种形式进行调用
from adafruit_circuitplayground import cp
adafruit_ble
adafruit_bluefruit_connect
adafruit_bus_device
adafruit_circuitplayground
adafruit_gizmo
adafruit_hid
adafruit_lis3dh.mpy
adafruit_thermistor.mpy
neopixel.mpy
你可以在我所提供的压缩包中找到这些文件
如果想依源码格式请使用 默认格式请使用
这里我在提供一份我使用到的lib整合包 见附件
六、上诉库文件用途
adafruit_ble 蓝牙模块
adafruit_bluefruit_connect 蓝牙连接手机模块
adafruit_bus_device 外部总线访问模块管理i2c与spi总线
adafruit_circuitplayground 本次板子的专属包
adafruit_gizmo 本次板子的tft显示模块
adafruit_hid 驱动程序模拟 USB HID 设备
adafruit_lis3dh.mpy 加速度传感器lis3dh的库文件
adafruit_thermistor.mpy ntc热敏温度电阻的库文件
neopixel.mpy 条带灯的库文件
USB接口处的一个红色LED标为D13
代码如下
import array
import math
import audiobusio
import board
import neopixel
import pwmio
import time
from adafruit_circuitplayground import cp
while 1:
cp.red_led = 1
任务完成 我们还可以尝试下控制灯的闪烁可以用到 time.sleep(1)这个方法来实现
这里辅一张完成图片
【Follow me第二季第1期】基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色... [复制链接]
板载的炫彩LED是WS2812的rgb灯珠在其中我们可以通过调用neopixel库
来实现这个目标可以参考这个官方网站Adafruit CircuitPython NeoPixel — Adafruit CircuitPython NeoPixel Library 1.0 documentation
我们首先需要对灯珠进行初始化
初始化函数定义如下
classneopixel.NeoPixel(pin: Pin, n: int, *, bpp: int = 3, brightness: float = 1.0, auto_write: bool = True, pixel_order: str = None)[source]¶
A sequence of neopixels.
Parameters:
pin (Pin) – The pin to output neopixel data on.
n (int) – The number of neopixels in the chain
bpp (int) – Bytes per pixel. 3 for RGB and 4 for RGBW pixels.
brightness (float) – Brightness of the pixels between 0.0 and 1.0 where 1.0 is full brightness
auto_write (bool) – True if the neopixels should immediately change when set. If False, show must be called explicitly.
pixel_order (str) – Set the pixel color channel order. GRBW is set by default.
但经过查阅资料了解到python已经封装好了无需自己写驱动直接调用即可这里附上详细代码
import time # 导入时间模块
from adafruit_circuitplayground import cp
# 定义颜色映射字典,将颜色名称映射到RGB元组
color_mapping = {
"black": (0, 0, 0), # 黑色
"white": (255, 255, 255), # 白色
"green": (0, 255, 0), # 绿色
"red": (255, 0, 0), # 红色
"blue": (0, 0, 255), # 蓝色
"cyan": (0, 255, 255), # 青色
"magenta": (228, 0, 127), # 品红色
"yellow": (255, 150, 0), # 黄色
}
a = 0
cp.detect_taps = 1
cp.pixels.brightness = 0.05
# 设置像素的亮度为0.05
pixel_count = 10 # 定义像素数量为10
def scale_range(value):
return round(value / 320 * 9)
# 定义一个颜色轮函数,根据输入位置返回对应颜色的RGB值
def color_wheel(position):
# 如果位置不在0到255范围内,返回黑色
if (position < 0) or (position > 255):
return color_mapping["black"]
# 根据位置计算颜色值并返回RGB元组
if position < 85:
return (int(255 - position * 3), int(position * 3), 0) # 红-绿渐变
elif position < 170:
position -= 85
return (0, int(255 - (position * 3)), int(position * 3)) # 绿-青渐变
else:
position -= 170
return (int(position * 3), 0, int(255 - position * 3)) # 青-蓝渐变
current_pixel = 0 # 初始化当前像素为0
# 无限循环,用于不断更新LED灯
while True:
#检查敲击状态
if cp.tapped:
cp.red_led = 1
print("Tapped!")
a=a+0.01
# 检查开关状态
if cp.switch:
current_pixel += 1 # 开关开启,当前像素增加1
if current_pixel > pixel_count - 1: # 如果当前像素超出范围,重置为0
current_pixel = 0
else:
current_pixel -= 1 # 开关关闭,当前像素减少1
if current_pixel < 0: # 如果当前像素小于0,重置为最大值
current_pixel = pixel_count - 1
if cp.button_b:
print("lingh+!")
cp.pixels.brightness = cp.pixels.brightness +0.01
if cp.button_a:
cp.pixels.brightness = cp.pixels.brightness -0.01
print("lingh-!")
time.sleep(a)
cp.red_led = 0
print(cp.light)
for index in range(pixel_count): # 遍历每个像素
# 计算当前像素的虹彩颜色
rainbow_color = color_wheel(255 // pixel_count * ((current_pixel + index) % pixel_count))
# 设置当前像素的颜色,使用tuple生成RGB值
cp.pixels[index] = tuple(
int(c * ((pixel_count - (current_pixel + index) % pixel_count)) / pixel_count) for c in rainbow_color
)
如视频中展示按下a按键增加亮度 按下b按键减小亮度中间拨码开关可以控制RGB轮换方向,敲击板子使能加速度传感器会让旋转速度变慢
|
Follow me第二季第1期基础任务二(必做)监测环境温度和光线,通过板载LED展示舒... [复制链接]
需要获取的数据有两个环境温度和光线,MMBT2222 ALSPT1931这里我定义的是光照越强亮起的灯就越多 因为在当地环境温度变化难度高于环境光线变化 本质上都是一个东西
环境温度我将会通过串口进行打印 light输出是l0-320
代码如下
from adafruit_circuitplayground import cp
import time
# 定义颜色映射字典,将颜色名称映射到RGB元组
color_mapping = {
"black": (0, 0, 0), # 黑色
"white": (255, 255, 255), # 白色
"green": (0, 255, 0), # 绿色
"red": (255, 0, 0), # 红色
"blue": (0, 0, 255), # 蓝色
"cyan": (0, 255, 255), # 青色
"magenta": (228, 0, 127), # 品红色
"yellow": (255, 150, 0), # 黄色
}
# 基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度
pixel_count = 10 # 定义像素数量为10
current_pixel = 0 # 初始化当前像素为0
cp.pixels.brightness = 0.05 # 灯珠亮度为0.05
while True:
temperature_value = cp.temperature
light_value = cp.light
print( "Temperature: %0.1f *C; Light Level: %d;"% (temperature_value, light_value))
case_val=light_value/10
for i in range(5):
if i <= light_value:
cp.pixels[i] = (0, 128, 128)
else:
cp.pixels[i] = (0, 0, 0)
for i in range(9,4,-1): #循环变量从9递减到5
if i >= 10 - temperature_value:
cp.pixels[i] = (0, 128, 128)
else:
cp.pixels[i] = (0, 0, 0)
cp.pixels.show() #pixels显示使能
效果图如下
|
Follow me第二季第1期二基础任务三(必做):接近检测 [复制链接]
这里我们使用到了板载的两颗红外LED 一个发射一个接受去判断设定阈值需要注意的是红外发光管应采用闪烁方式发光,避免过热烧毁
代码如下
展示
由于图片无法展示靠近过程请参考展示视频
|
【Follow me第二季第1期】制作不倒翁——展示不倒翁运动过程中的不同灯光效果 [复制链接]
这个任务中我们需要利用加速度传感器读取到xyz三方面的加速度 然后给出对应的灯光效果。我实现的是根据板子的倾斜方向亮起对应的灯 我还没太学习过加速度传感器的应用 这里参考了大佬的代码
如下
import math
from adafruit_circuitplayground import cp
# 如果需要改变颜色,请在这个字典中修改颜色值
colors = {
"black": (0, 0, 0)
}
# 定义一个颜色轮函数
def color_wheel(position):
if position < 0 or position > 255:
return (0, 0, 0)
if position < 85:
return (int(position * 3), int(255 - position * 3), 0)
if position < 170:
position -= 85
return (int(255 - position * 3), 0, int(position * 3))
position -= 170
return (0, int(position * 3), int(255 - position * 3))
while True:
accel_x, accel_y, accel_z = cp.acceleration
inclination = (2 - (math.atan2(accel_x, accel_y) / math.pi + 1)) * 180
force = math.sqrt((accel_x * accel_x) + (accel_y * accel_y))
print(
"Accelerometer: (%0.1f, %0.1f, %0.1f) m/s^2; Angle: %0.1f, Magnitude: %0.1f"
% (accel_x, accel_y, accel_z, inclination, force)
)
if force > 2:
force = min(force, 9.8)
for pos in range(10):
if pos == (inclination * 10 // 360):
cp.pixels[pos] = tuple(
int(comp * ((10 - pos % 10)) / 10.0) for comp in color_wheel(25 * (pos % 10))
)
else:
cp.pixels[pos] = colors["black"]
【Follow me第二季第1期】-水果钢琴——通过触摸水果弹奏音乐,并配合灯光效果 [复制链接]
水果钢琴
代码如下
while 1:
if cp.touch_A1:
cp.pixels.fill((256, 0, 0))
cp.start_tone(262)
elif cp.touch_A2:
cp.pixels.fill((256, 128, 0))
cp.start_tone(294)
elif cp.touch_A3:
cp.pixels.fill((256, 256, 128))
cp.start_tone(330)
elif cp.touch_A4:
cp.pixels.fill((128, 256, 256))
cp.start_tone(349)
elif cp.touch_A5:
cp.pixels.fill((0, 128, 256))
cp.start_tone(392)
elif cp.touch_A6:
cp.pixels.fill((0, 0, 256))
cp.start_tone(440)
elif cp.touch_A7:
cp.pixels.fill((256, 256, 256))
cp.start_tone(494)
elif cp.touch_A8:
cp.pixels.fill((0, 0, 0))
cp.start_tone(523)
else:
cp.pixels.fill((0, 0, 0))
cp.stop_tone()
只需要通过判断引脚电平的变化 调用touch_A1—touch_A8引脚,即可判断出哪里的电极被触发对应调用pixels与start_tone方法即可响起声音跟灯光
项目视频演示
本项目完成了本期活动的全部内容,所有任务的展示如下:分成两个视频一个专享项目展示
无标题视频——使用Clipchamp制作 202410131610
我的技术水平通过这次学习得到提升,我通过实际操作,我对这款开发板的特性和使用方法有了全面的了解,提升了我的硬件编程和调试技能。
对我的创新思维也有启发作用。看到其他同学的创意项目,激发了我的创新思维,启发我在未来的项目中尝试更多新的想法。
团队合作:通过与小组成员的合作,我学会了如何在团队中有效沟通和协作,这对于任何项目都是非常重要的。
社区交流:活动中认识了很多志同道合的朋友,建立了宝贵的联系。这些交流不仅有助于技术上的成长,也为未来可能的合作打下了基础。
总之,这次活动不仅让我学到了新的知识和技术,更重要的是激发了我对电子开发的热情。我相信这些经验和心得将对我的未来发展大有裨益。
我希望后面可以推出更多相关的活动,更高难度的工作,并且可以有相关更详尽的课程学习。
这里附上全部代码给大家参考
代码.zip
(116.09 KB, 下载次数: 2)
|
|