402|2

33

帖子

3

TA的资源

一粒金砂(中级)

楼主
 

【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提供此学习机会及分享的平台。非常感谢

 

最新回复

用python对ATSAMD21进行开发和用C基本是是一样的,几项测评的不错了   详情 回复 发表于 2024-9-2 07:44
点赞 关注
 
 

回复
举报

6807

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

用python对ATSAMD21进行开发和用C基本是是一样的,几项测评的不错了

点评

谢谢  详情 回复 发表于 2024-9-2 18:24
 
 
 

回复

33

帖子

3

TA的资源

一粒金砂(中级)

板凳
 
Jacktang 发表于 2024-9-2 07:44 用python对ATSAMD21进行开发和用C基本是是一样的,几项测评的不错了

谢谢

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

开源项目 更多>>
    随便看看
    查找数据手册?

    EEWorld Datasheet 技术支持

    相关文章 更多>>
    关闭
    站长推荐上一条 1/9 下一条

     
    EEWorld订阅号

     
    EEWorld服务号

     
    汽车开发圈

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表