【Follow me第二季第1期】全部任务提交
[复制链接]
本帖最后由 土豆12 于 2024-10-13 00:14 编辑
这次的followme活动主控是Adafruit Circuit Playground Express,这块板子可以非常方便的使用circuitpython来进行开发。跟随活动一起我还附带了一片树莓派,打算作为上位机使用。话不多说,先来开箱。
本次活动中,我会使用树莓派作为上位机,用来给circuitplayground编程并烧录。
下面我们开始入门任务,开发环境搭建,点亮板载LED。
首先先准备一张内存卡,烧录上raspberry pi OS 64bit lite固件,启动后通过ssh登录,接下来需要安装一些所需的软件:
- sudo apt update
-
- sudo apt upgrade
-
- sudo apt install xserver-xorg
-
- sudo apt install ttf-wqy-zenhei
-
- sudo apt autoremove
-
-
-
- pip install thonny
上面的命令除了安装了我们编程所需的Thonny和中文字体外,还安装了Xserver,这是用来将Thonny的图形化界面通过ssh显示在我们电脑上的工具,所用的协议是X11-Forwarding。
在使用前还需要确认一下SSHD配置:
- sudo nano /etc/ssh/sshd_config
确认其中的X11Forwarding是yes。
重启一下sshd服务:
- sudo systemctl restart sshd
最后,在MobaXterm中,我们要在连接配置中勾选X11-Forwarding选项:
再次重新连接SSH,看到如下X11-Forwarding部分已经被搭上了勾,就说明已经启用完毕。
在命令里直接敲入thonny,就可以看到树莓派上的thonny界面成功的在我们电脑上被显示了出来。
接着在接上circuitpplayground前,我们要先把circuitpython固件刷进去才行。去官网下载完circuitpython的uf2固件,把开发板接上电脑,按下reset后,直接拖到bootloader里就可以。
接着我们把开发板插到树莓派的USB口上,这里需要一根OTG线,插好后,就可以用树莓派上的thonny连接到开发板了。
首先我们先把本次项目所需的所有库文件,和生成流水灯所需的函数准备好:
- import time
-
- import board
-
- from digitalio import DigitalInOut, Direction, Pull
-
- from analogio import AnalogIn
-
- from adafruit_circuitplayground import cp
-
- from adafruit_circuitplayground.express import cpx
-
-
-
-
-
- def wheel(pos):
-
- if (pos < 0) or (pos > 255):
-
- return (0, 0, 0)
-
- if pos < 85:
-
- return (int(255 - pos * 3), int(pos * 3), 0)
-
- elif pos < 170:
-
- pos -= 85
-
- return (0, int(255 - (pos * 3)), int(pos * 3))
-
- else:
-
- pos -= 170
-
- return (int(pos * 3), 0, int(255 - pos * 3))
-
-
-
-
-
- pixeln = 0
-
-
-
- t = 10
接下来是点灯,只需要用自带的cpx就可以
-
-
- print("入门任务")
-
- cpx.red_led = 1
-
- time.sleep(t)
接下来是基础任务一,利用之前的wheel函数来创建一个流水灯
-
-
- print("基础任务一")
-
- start_time = time.time()
-
- while time.time() - start_time < t:
-
- for p in range(10):
-
- color = wheel(25 * ((pixeln + p) % 10))
-
- cpx.pixels[p] = tuple(int(c * ((10 - (pixeln + p) % 10)) / 10.0) for c in color)
-
- pixeln += 1
-
- if pixeln > 9:
-
- pixeln = 0
接着是基础任务二,读取温度和光强后,如果温度和光强都较低,温度不高于25,光强不超过40,则比较舒适,板子上的LED都显示为绿色;若温度不高于32,光强不高于80,则一般,LED显示黄色;其他情况则说明舒适度比较差,LED显示为红色。从下面的串口信息可以看到,当前较为炎热,所以板子显示是红色。
-
-
- print("基础任务二")
-
- start_time = time.time()
-
- while time.time() - start_time < t:
-
- print("Temperature: %0.1f *C" % cpx.temperature)
-
- print("Light Level: %d" % cpx.light)
-
- if 18 <= cpx.temperature <= 25 and cpx.light <= 40:
-
- for p in range(10):
-
- cpx.pixels[p] = (0, 15, 0)
-
- elif 10 <= cpx.temperature <= 32 and cpx.light <= 80:
-
- for p in range(10):
-
- cpx.pixels[p] = (15, 15, 0)
-
- else:
-
- for p in range(10):
-
- cpx.pixels[p] = (15, 0, 0)
下面是基础任务三,参考官方的视频教程,可以知道如果想用IR发射和接收管来测量接近情况,需要让IR发射端闪一下,然后立马读取IR接收端的模拟量。此时我把阈值设置为31000,若障碍物过于接近,读数超过31000,则发出警报声,并亮红灯;否则则关闭警报,亮绿灯。
-
-
- print("基础任务三")
-
- LED_IR = DigitalInOut(board.IR_TX)
-
- LED_IR.switch_to_output()
-
- SENSOR_IR = AnalogIn(board.IR_PROXIMITY)
-
- start_time = time.time()
-
- while time.time() - start_time < t:
-
- LED_IR.value = 1
-
- time.sleep(0.01)
-
- LED_IR.value = 0
-
- sensor = SENSOR_IR.value
-
- print("proximity Level: %d" % sensor)
-
- if sensor > 31000:
-
- for p in range(10):
-
- cpx.pixels[p] = (15, 0, 0)
-
- cp.start_tone(440)
-
- else:
-
- for p in range(10):
-
- cpx.pixels[p] = (0, 15, 0)
-
- cp.stop_tone()
下面是进阶任务,读取板载重力感应的数值,通过两个水平量的平方和可以计算出板子倾斜的程度,如果程度较大则LED显示红色并报警;否则关闭警报并显示绿色。
-
-
- print("进阶任务")
-
- start_time = time.time()
-
- while time.time() - start_time < t:
-
- x, y, z = cpx.acceleration
-
- print("Accelerometer: (%0.1f, %0.1f, %0.1f) m/s^2" % (x, y, z))
-
- skew = (x * x) + (y * y)
-
- if skew > 5:
-
- for p in range(10):
-
- cpx.pixels[p] = (15, 0, 0)
-
- cp.start_tone(440)
-
- else:
-
- for p in range(10):
-
- cpx.pixels[p] = (0, 15, 0)
-
- cp.stop_tone()
最后一个任务是水果钢琴,板载的GPIO带有触摸功能,通过手指触摸就可以触发。如果把引脚外接到水果上,也可以有相同的效果。由于水果会腐蚀引脚,这里我就直接用手触摸开发板的引脚来进行演示,触摸不同的引脚,板载LED会显示不同的颜色,同时播放不同的音符,实现钢琴效果。
-
-
- print("创意任务三:水果钢琴")
-
- while 1:
-
- if cp.touch_A4:
-
- print("Touched A4!")
-
- cp.pixels.fill((15, 0, 0))
-
- cp.start_tone(262)
-
- elif cp.touch_A5:
-
- print("Touched A5!")
-
- cp.pixels.fill((15, 5, 0))
-
- cp.start_tone(294)
-
- elif cp.touch_A6:
-
- print("Touched A6!")
-
- cp.pixels.fill((15, 15, 0))
-
- cp.start_tone(330)
-
- elif cp.touch_A7:
-
- print("Touched A7!")
-
- cp.pixels.fill((0, 15, 0))
-
- cp.start_tone(349)
-
- elif cp.touch_A1:
-
- print("Touched A1!")
-
- cp.pixels.fill((0, 15, 15))
-
- cp.start_tone(392)
-
- elif cp.touch_A2 and not cp.touch_A3:
-
- print("Touched A2!")
-
- cp.pixels.fill((0, 0, 15))
-
- cp.start_tone(440)
-
- elif cp.touch_A3 and not cp.touch_A2:
-
- print("Touched A3!")
-
- cp.pixels.fill((5, 0, 15))
-
- cp.start_tone(494)
-
- elif cp.touch_A2 and cp.touch_A3:
-
- print('Touched "8"!')
-
- cp.pixels.fill((15, 0, 15))
-
- cp.start_tone(523)
-
- else:
-
- cp.pixels.fill((0, 0, 0))
-
- cp.stop_tone()
心得体会:这次活动让我同时体验到两块开发板,并尝试在他们之间进行协作,非常有意思。建议以后可以继续多选一些容易上手,可玩性高的开发板,并且给大家足够的剩余额度购买其他板子来开发新玩法。
源代码:https://download.eeworld.com.cn/detail/eew_JtDqA2/633951
演示视频:https://training.eeworld.com.cn/video/40781
|