- 2024-09-06
-
加入了学习《Follow me第二季第1期》,观看 进阶任务(必做):制作不倒翁——摇摇马
- 2024-09-02
-
加入了学习《【Follow me第二季第1期】+ 任务汇总提交-章鱼哥 》,观看 【Follow me第二季第1期】+ 任务汇总提交-章鱼哥
-
回复了主题帖:
【Follow me第二季第1期】+ 任务汇总提交-章鱼哥
Jacktang 发表于 2024-9-2 07:44
用python对ATSAMD21进行开发和用C基本是是一样的,几项测评的不错了
谢谢
-
加入了学习《Follow me第二季第1期》,观看 创意任务二:章鱼哥
-
上传了资料:
【Follow me第二季第1期】+ 任务汇总提交-章鱼哥
-
发表了主题帖:
【Follow me第二季第1期】+ 任务汇总提交-章鱼哥
本帖最后由 jone5 于 2024-10-19 23:07 编辑
所有任务已完成,Follow Me参加了三期,以前大学的时候是自费去学习,现在EEWORLD能举办这种反费的活动,真的是很好的活动。本期的Adafruit Circuit Playground Express开发板传感器集成度很高,外设丰富,非常值得学习,感谢社区和得捷提供的机会,非常感谢得捷和EEWORLD为我们提高学习的机会,祝Follow me活动越办越好,期待后续活动再能出现一些有意思的板子~
项目视频如下:
物料清单如下:
任务成果展示
【Follow me第二季第1期】+ 任务汇总提交-章鱼哥
本次任务主板为Circuit Playground Express,基于ATSAMD21微控制器,板载灯珠,温度传感器,按键滑动开关等,可玩性非常高,再次感谢EEWORLD提供这么丰富的创客开发板。
入门任务(必做):开发环境搭建,板载LED点亮
本次使用的IDE为Thonny,编码语言为CircuitPython,调用board的LED,设置其为数字IO输出,设置其值为True或False即可控制LED的亮灭。
代码如下:
from adafruit_circuitplayground import cp
import time
while True:
cp.red_led = True
time.sleep(0.5)
cp.red_led = False
time.sleep(0.5)
基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换
通过设置RGB三原色的亮度值可以调配出各种想要的色彩,板载炫彩LED可以通过adafruit_circuitplayground模块中的pixel来调用,其调用过程类似给长度为10的链表中的元素进行赋值,例如cp.pixels[0] = (255, 0, 0)即将第1颗灯珠设置为红色,另外其fill方法可以一次性设置所有灯珠的颜色。
下面的代码通过随机数来设置rgb色彩值,给所有灯珠设置随机颜色:
import board
import neopixel
pixels = neopixel.NeoPixel(board.NEOPIXEL, 10) //10代表控制10个灯
pixels[0] = (0, 0, 10) //pixels[0]代表第0(1)个灯
pixels[4] = (10, 0, 0) //(0, 0, 10) 代表RGB颜色
pixels[8] = (0, 10, 0)
pixels.show()
基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度
本任务使用的是#include <Adafruit_CircuitPlayground.h>这个库,传感器的函数已封装成接口,直接调取cp.light即可获取光线值。
#Task 3
import time
from adafruit_circuitplayground import cp
cp.pixels.auto_write = False
cp.pixels.brightness = 0.3
minimum_temp = 24
maximum_temp = 30
while True:
light_now = cp.light
light_peak = round(light_now / 320 * 4)
for i in range(5):
if i <= light_peak:
cp.pixels[i] = (0, 255, 0)
else:
cp.pixels[i] = (0, 0, 0)
Temperature_now = cp.temperature
Temp_level = int((Temperature_now - minimum_temp) / (maximum_temp - minimum_temp) * 5)
print((light_now,Temperature_now))
print("Light level",int(light_peak))
print("Temperature level",int(Temp_level))
for i in range(9,4,-1):
if i >= 10 - Temp_level:
cp.pixels[i] = (0, 0, 255)
else:
cp.pixels[i] = (0, 0, 0)
cp.pixels.show()
time.sleep(0.1)
基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警
利用红外发射管发出红外脉冲,然后检测红外接收器信号强度来测算遮挡距离,在到达设定阈值后发出声光报警。
for i in range(32):
IR_Tx_pin.value = True
time.sleep(0.000013)
IR_Tx_pin.value = False
time.sleep(0.000013)
analog_now = analogin.value
analog_peak = int((analog_now - minimum_temp) / (maximum_temp - minimum_temp) * 10)
print((analog_now,analog_peak))
for i in range(10):
if i <= analog_peak:
cp.pixels[i] = (0, 255, 0)
else:
cp.pixels[i] = (0, 0, 0)
cp.pixels.show()
if analog_peak >= 8:
cp.play_tone(300, 0.1)
time.sleep(0.1)
进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果
本任务的原理主要是依据三轴加速度传感器的数值估算出不倒翁偏摆的方向,将偏摆方向映射到10个彩灯上,当不倒翁处于立直状态彩灯全为绿色,当发生偏摆则偏摆向下一侧的彩灯向红色变换,偏摆向上的彩灯向蓝色变换。
#Task 5
import time
from adafruit_circuitplayground import cp
R = 0
G = 0
B = 0
while True:
if not cp.switch:
print("Slide switch off!")
cp.pixels.fill((0, 0, 0))
continue
x, y, z = cp.acceleration
print((x, y, z))
cp.pixels.fill(((R + abs(int(x))), (G + abs(int(y))), (B + abs(int(z)))))
time.sleep(0.05)
■ 创意任务二:章鱼哥——章鱼哥的触角根据环境声音的大小,章鱼哥的触角可舒展或者收缩
这里主要用了麦克风和舵机以及板子led灯模块;其中舵机模块主要通过A2脚输出PWM信号控制转动,缓存麦克风数据,每隔0.2s采集一次麦克风数据,采集到数据后通过计算得到功率值,如果无声音则章鱼哥动作,若处于嘈杂环境章鱼哥则静止
import time
import math
import board
import array
import audiobusio
import pwmio
from digitalio import DigitalInOut, Direction, Pull
from analogio import AnalogIn
import microcontroller
from adafruit_circuitplayground.express import cpx
microcontroller.on_next_reset(microcontroller.RunMode.BOOTLOADER)
color = {
"black": 0x000000,
"white": 0xFFFFFF,
"red": 0xFF0000,
"green": 0x00FF00,
"blue": 0x0000FF,
"cyan": 0x00FFFF,
"magenta": 0xFF00FF,
"yellow": 0xFFFF00,
}
# Not too bright!
cpx.pixels.brightness = 0.3
# Number of Pixel on board
pix_num = 10
def map_range(input_value, input_min, input_max, output_min, output_max):
std_value = (input_value - input_min) / (input_max - input_min)
return std_value * (output_max - output_min) + output_min
def wheel(pos):
# Input a value 0 to 255 to get a color value.
# The colours are a transition r - g - b - back to r.
if (pos < 0) or (pos > 255):
return color["black"]
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))
# 创意任务二:章鱼哥——章鱼哥的触角根据环境声音的大小,章鱼哥的触角可舒展或者收缩
#Task 6
import array
import math
import audiobusio
import board
import neopixel
import time
import pwmio
from adafruit_motor import servo
PEAK_COLOR = (100, 0, 255)
NUM_PIXELS = 90
CURVE = 2
SCALE_EXPONENT = math.pow(10, CURVE * -0.1)
NUM_SAMPLES = 160
def constrain(value, floor, ceiling):
return max(floor, min(value, ceiling))
def log_scale(input_value, input_min, input_max, output_min, output_max):
normalized_input_value = (input_value - input_min) / (input_max - input_min) #输入缩放
return output_min + math.pow(normalized_input_value, SCALE_EXPONENT) * (output_max - output_min)
#计算一组值的标准化均方根值,在计算RMS之前消除直流偏压
def normalized_rms(values): #该函数接受一个参数values,用于存储要进行处理的值的列表
minbuf = int(mean(values)) #计算给定值列表 values 的平均值,将结果转换为整数
#计算了一组已经减去平均值的样本值的平方和。
#使用列表解析来计算每个值减去平均值后的平方,并将这些平方值相加得到 samples_sum。
samples_sum = sum(float(sample - minbuf) * (sample - minbuf) for sample in values)
#计算标准化均方根值。首先将平方和除以值的数量得到平均平方值,
#然后使用 math.sqrt 函数计算其平方根。最后函数返回这个标准化均方根值
return math.sqrt(samples_sum / len(values))
#求平均值
def mean(values):
return sum(values) / len(values)
def volume_color(volume):
return 200, volume * (255 // NUM_PIXELS), 0
# create a PWMOut object on Pin A2.
pwm = pwmio.PWMOut(board.A2, duty_cycle=2 ** 15, frequency=50)
# Create a servo object, my_servo.
my_servo = servo.Servo(pwm)
mic = audiobusio.PDMIn(board.MICROPHONE_CLOCK, board.MICROPHONE_DATA, sample_rate=16000, bit_depth=16)
samples = array.array("H", [0] * NUM_SAMPLES)
mic.record(samples, len(samples))
# Set lowest level to expect, plus a little.
input_floor = normalized_rms(samples) + 10
# OR: used a fixed floor
# input_floor = 50
# You might want to print the input_floor to help adjust other values.
print(input_floor)
# Corresponds to sensitivity: lower means more pixels light up with lower sound
# Adjust this as you see fit.
input_ceiling = input_floor + 500
angle_now = 0
systick = 0
while True:
if systick % 4 == 0:
mic.record(samples, len(samples))
magnitude = normalized_rms(samples)
c = log_scale(
constrain(magnitude, input_floor, input_ceiling),
input_floor,
input_ceiling,
0,
NUM_PIXELS,
)
if systick % 2 == 0:
if angle_now < c:
angle_now = angle_now + 2
if angle_now > c:
angle_now = angle_now - 2
if angle_now > 90:
angle_now = 90
elif angle_now < 0:
angle_now = 0
my_servo.angle = angle_now
print((c,angle_now))
time.sleep(0.01)
systick = systick + 1
可运行代码库:
https://download.eeworld.com.cn/detail/jone5/634253#related
项目总结:
我是第一次使用python对ATSAMD21进行开发,因此此次任务对我来说还是具有很强的学习意义的,非常感谢EEWORLD联合德捷的此次任务,给了我们很多学习的机会。因为第一次接触用python去开发ATSAMD21,由于工作繁忙,很多接口还不会使用,我会继续阅读学习源码,以熟悉此中开发方式原理并进行分享。
最后再次感谢EEWorld提供此学习机会及分享的平台。非常感谢
- 2024-09-01
-
加入了学习《Follow me第二季第1期》,观看 创意任务三:触摸钢琴
- 2024-03-07
-
加入了学习《【得捷Follow me第4期】+FTP服务器任务汇总》,观看 EEWORLD 第四期 FTP服务器
- 2024-02-27
-
加入了学习《FM4演示视频》,观看 FM4演示视频
-
加入了学习《【得捷电子Follow me第4期】任务视频》,观看 【得捷电子Follow me第4期】任务视频
-
加入了学习《【得捷Follow me第4期】+FTP服务器任务汇总》,观看 【得捷Follow me第4期】+FTP服务器
- 2024-02-25
-
发表了主题帖:
【得捷Follow me第4期】+FTP服务器(任务汇总帖)
本帖最后由 jone5 于 2024-2-27 01:07 编辑
入门任务:开发环境搭建,BLINK,驱动液晶显示器进行显示(没有则串口HelloWorld)
搭配器件: W5500-EVB-Pico、 Adafruit Sharp Memory Display Breakout
一.搭建开发环境
背景:
I/O
Pin Name
Description
I
GPIO16
Connected to MISO on W5500
O
GPIO17
Connected to CSn on W5500
O
GPIO18
Connected to SCLK on W5500
O
GPIO19
Connected to MOSI on W5500
O
GPIO20
Connected to RSTn on W5500
I
GPIO21
Connected to INTn on W5500
I
GPIO24
VBUS sense - high if VBUS is present, else low
O
GPIO25
Connected to user LED
I
GPIO29
Used in ADC mode (ADC3) to measure VSYS/3
O
GP10
SPI0 SCK (LCD)
O
GP11
SPI0 TX(LCD)
I
GP12
SPI0 RX(LCD)
O
GP13
SPI0 Csn(LCD)
1.1 搭建CircuitoPython环境
本次任务使用CircuitPython完成任务,首先下载CircuitPython最新固件,可通过以下链接获取:
https://learn.adafruit.com/getting-started-with-raspberry-pi-pico-circuitpython/circuitpython
下载完成后,通过Thony下载uf2固件,步骤如下图:
1.2 安装WIZnet 库
安装WIZnet Ethernet 库,通过以下路径下载https://learn.adafruit.com/ethernet-for-circuitpython/circuitpython-setup
下载完成后将以下三个文件夹拷贝至CircuitPython文件夹
1.3 安装显示屏库
打开以下路径:https://github.com/adafruit/Adafruit_CircuitPython_Bundle/releases 下载8.x版本bundle库
下载完成后可按下图将相关库文件放至lib文件夹
至此我们已经完成了开发环境搭建,接着开始最经典的点灯环节。
import random
import time
from adafruit_display_text.label import Label
from terminalio import FONT
from adafruit_bitmap_font import bitmap_font
import board
import displayio
import framebufferio
import sharpdisplay
import digitalio
import busio
def LCD_Init():
#SPI1
SPI1_SCK = board.GP10
SPI1_TX = board.GP11
SPI1_RX = board.GP12
chip_select_pin = board.GP13
# Release the existing display, if any
displayio.release_displays()
#display setting
bus = busio.SPI(SPI1_SCK, MOSI=SPI1_TX, MISO=SPI1_RX)
# Select JUST ONE of the following lines:
# For the 400x240 display (can only be operated at 2MHz) 144*168
framebuffer = sharpdisplay.SharpMemoryFramebuffer(bus, chip_select_pin, 144, 168)
# For the 144x168 display (can be operated at up to 8MHz)
#framebuffer = sharpdisplay.SharpMemoryFramebuffer(bus, chip_select_pin, width=144,height=168, baudrate=8000000)
display = framebufferio.FramebufferDisplay(framebuffer)
return display
def show(display):
#creat the text label
label = Label(font=FONT, text="BLACK\nLIVES\nMATTER", x=0, y=4, scale=1,line_spacing=1.2)
#show it
display.root_group = label
def LED_Init():
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
return led
def led_flush(led):
led.value = not led.value
time.sleep(0.5)
def U_show():
print("hello world")
if __name__ == '__main__':
display = LCD_Init()
led = LED_Init()
show(display)
while True:
led_flush(led)
基础任务一:完成主控板W5500初始化(静态IP配置),并能使用局域网电脑ping通,同时W5500可以ping通互联网站点;通过抓包软件(Wireshark、Sniffer等)抓取本地PC的ping报文,展示并分析。
搭配器件: W5500-EVB-Pico、 Adafruit Sharp Memory Display Breakout
增加W5500 ping网功能
eth = WIZNET5K(spi_bus, cs, is_dhcp=False, mac=MY_MAC)
# Set network configuration
eth.ifconfig = (IP_ADDRESS, SUBNET_MASK, GATEWAY_ADDRESS, DNS_SERVER)
print("Chip Version:", eth.chip)
print("MAC Address:", [hex(i) for i in eth.mac_address])
print("My IP address is:", eth.pretty_ip(eth.ip_address))
基础任务二:主控板建立TCPIP或UDP服务器,局域网PC使用TCPIP或UDP客户端进行连接并发送数据,主控板接收到数据后,送液晶屏显示(没有则通过串口打印显示);通过抓包软件抓取交互报文,展示并分析。(TCP和UDP二选一,或者全都操作)
搭配器件: W5500-EVB-Pico、 Adafruit Sharp Memory Display Breakout
通过任务一我们已经开启了W550的网络功能,接着我们开启Socket通信,
# Initialize a socket for our server
socket.set_interface(eth)
server = socket.socket() # Allocate socket for the server
server_ip = None # IP address of server
server_port = 50007 # Port to listen on
server.bind((server_ip, server_port)) # Bind to IP and Port
server.listen() # Begin listening for incoming clients
conn, addr = server.accept() # Wait for a connection from a client.
print("socket connected")
结果:
1.通过串口打印可以获取Pico的IP为192.168.124.13,接着我们通过TCP工具与Pico进行连接,并发送“123456789 ”数据。
2.通过wireshark捕获IP 17向IP 13发送的数据,可以知道通信协议为TCP协议,数据为”123456789“。
进阶任务:从NTP服务器(注意数据交互格式的解析)同步时间,获取时间送显示屏(串口)显示。
搭配器件: W5500-EVB-Pico、 Adafruit Sharp Memory Display Breakout
注意库Ntp库没有recv函数没有写入接收长度,因此需对以下函数进行修改
核心代码
#NTP
ntpserver_ip = eth.pretty_ip(eth.get_host_by_name("ntp.aliyun.com"))
print("NTP : %s" % ntpserver_ip) #DNS Domain
ntp = NTP(iface = eth, ntp_address =ntpserver_ip ,utc=8)
cal = ntp.get_time()
print("The date is %s %d/%d/%d" %(days[cal.tm_wday], cal.tm_mday,cal.tm_mon,cal.tm_year))
print("The time is %d:%02d:%02d" %(cal.tm_hour,cal.tm_min,cal.tm_sec))
■ 终极任务二:使用外部存储器,组建简易FTP文件服务器,并能正常上传下载文件。
搭配器件: W5500-EVB-Pico、 Adafruit Sharp Memory Display Breakout
【得捷Follow me第4期】FTP文件服务器
因本人没有SD模块,因此使用Pico内存模拟内存,使用MicroPython作为开发语言(从鲜de芒果 坛友了解到circuitpython对存储访问的管理较为严格,实现文件存储比较复杂,因此转为使用MicroPython进行开发。
总结
我是第一次使用python对Pico进行开发,因此此次任务对我来说还是具有很强的学习意义的,非常感谢EEWORLD联合德捷的此次任务,给了我们很多学习的机会。因为第一次接触用python去开发Pico,由于工作繁忙,很多接口还不会使用,我会继续阅读学习使用c开发Pico,以熟悉此中开发方式原理并进行分享。
最后再次感谢EEWorld提供此学习机会及分享的平台。非常感谢
附录:
1.源码路径
源码
2.视频说明
-
上传了资料:
【得捷Follow me第4期】+任务源码
-
加入了学习《 【得捷电子Follow me第4期】》,观看 【得捷Follow me第4期】简易FTP文件服务器
-
加入了学习《【得捷Follow me第4期】项目任务提交》,观看 视频
-
加入了学习《【得捷电子Follow me第4期】全部任务合集》,观看 【得捷电子Follow me第4期】全部任务合集
- 2024-02-24
-
加入了学习《 【得捷电子Follow me第4期】》,观看 【得捷Follow me第4期】入门任务:开发环境搭建
-
加入了学习《 【得捷电子Follow me第4期】》,观看 【得捷Follow me第4期】进阶任务:从NTP服务器同步时间
-
加入了学习《Follow me 第4期任务视频》,观看 Follow me 第4期任务视频
- 2024-02-21
-
加入了学习《Follow me 第4期任务视频展示及介绍》,观看 Follow me 第4期任务完成效果视频