树莓派PICO W,使用实例

树莓派PICO W,使用实例

Pico 规格参数

  • 双核 Arm Cortex-M0 + @ 133MHz
  • 芯片内置 264KB SRAM 和 2MB 的板载闪存
  • 通过专用 QSPI 总线支持最高 16MB 的片外闪存
  • DMA 控制器
  • 30 个 GPIO 引脚,其中 4 个可用作模拟输入
  • 2 个 UART、2 个 SPI 控制器和 2 个 I2C 控制器
  • 16 个 PWM 通道
  • USB 1.1 主机和设备支持
  • 8 个树莓派可编程 I/O(PIO)状态机,用于自定义外围设备支持
  • 支持 UF2 的 USB 大容量存储启动模式,用于拖放式编程
图片[1]-树莓派PICO W,使用实例-青柠博客

刷入固件

也可以去这里下载最新版:https://pico.org.cn/

下载最新的MicroPython固件:

树莓派pico 固件  

 
RPI_PICO-20231005-v1.21.0.zip
zip文件
 

树莓派pico w 固件

 
RPI_PICO_W-20231005-v1.21.0.zip
zip文件
 

下载完成后解压

  • 按住开发板上的“BOOTSEL”按钮不要松手,插入电脑,此时电脑会将树莓派pico识别为u盘
  • 然后将.uf2后缀的固件文件拖到pico里,此时pico会消失
  • 查看树莓派pico固件是否成功

image

    出现这个说明成功了

搭建树莓派pico开发环境

  • 下载Thonny官网:https://thonny.org/
  • 点击运行-》配置解释器
  • image

    image

自带灯闪烁

freq值越大,闪烁越快

from machine import Pin, Timer

led = Pin("LED", Pin.OUT)
tim = Timer()
def tick(timer):
    global led
    led.toggle()

tim.init(freq=1, mode=Timer.PERIODIC, callback=tick)

VID_20231025_160802

自带温度传感器实时显示温度

import machine
import utime

sensor_temp = machine.ADC(4)
conversion_factor = 3.3 / (65535)

while True:
    reading = sensor_temp.read_u16() * conversion_factor
    
    # The temperature sensor measures the Vbe voltage of a biased bipolar diode, connected to the fifth ADC channel
    # Typically, Vbe = 0.706V at 27 degrees C, with a slope of -1.721mV (0.001721) per degree. 
    temperature = 27 - (reading - 0.706)/0.001721
    print(temperature)
    utime.sleep(2)

连接wifi,并且控制点灯

创建index.html文件

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title>树莓派Pico W开发板</title>
    </head>
    <body>
        <h3>树莓派Pico W</h3>
        <p>控制板载LED亮灭</p>
        <a href="/light/on"><button>1</button></a>&nbsp;
        <a href="/light/off"><button>0</button></a>
    </body>
</html>

创建main.py文件

import network
import socket
import time

from machine import Pin

led = Pin("LED", Pin.OUT)

ssid = 'Xiaomi_FANFAN'
password = 'yangfan0522'

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
# 定义加载HTML页面函数  
def get_html(html_name):
    with open(html_name, 'r') as file: # 打开HTML文件
        html = file.read() # 读取HTML内容
    return html

max_wait = 10
while max_wait > 0:
    if wlan.status() < 0 or wlan.status() >= 3:
        break
    max_wait -= 1
    print('waiting for connection...')
    time.sleep(1)

if wlan.status() != 3:
    raise RuntimeError('network connection failed')
else:
    print('connected')
    status = wlan.ifconfig()
    print( 'ip = ' + status[0] )

addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]

s = socket.socket()
s.bind(addr)
s.listen(1)

print('listening on', addr)

# Listen for connections
while True:
    try:
        cl, addr = s.accept()
        print('client connected from', addr)
        request = cl.recv(1024)
        print(request)

        request = str(request)
        led_on = request.find('/light/on')
        led_off = request.find('/light/off')
        print( 'led on = ' + str(led_on))
        print( 'led off = ' + str(led_off))

        stateis = "LED is OFF"
        if led_on == 6:
            print("led on")
            led.value(1)
            stateis = "LED is ON"

        if led_off == 6:
            print("led off")
            led.value(0)
            stateis = "LED is OFF"

        response = get_html('index.html')

        cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
        cl.send(response)
        cl.close()

    except OSError as e:
        cl.close()
        print('connection closed')

HC-SR04超声波测距

  •  连接VCC:将测距模块的VCC引脚连接到树莓派Pico上的3.3V电源引脚或5V电源引脚(根据测距模块的工作电压确定)。
  •  连接GND:将测距模块的GND引脚连接到树莓派Pico上的GND引脚。
  •  连接TRIG:将测距模块的TRIG引脚连接到树莓派Pico上的一个可用的GPIO引脚,例如GP2或GP3。
  •  连接ECHO:将测距模块的ECHO引脚连接到树莓派Pico上的一个可用的GPIO引脚。这个引脚应该支持中断(interrupt)功能,因为ECHO引脚将用来接收回波信号。

请注意确保正确连接VCC和GND引脚来提供电源,以及将TRIG和ECHO引脚与适当的GPIO引脚连接。具体 GPIO 引脚的选择取决于您在代码中使用的引脚编号。

在编写代码之前,请查看您所使用的测距模块的数据手册或文档,以了解关于TRIG和ECHO引脚的更多详细信息,如引脚电平要求、输入输出模式等。这将有助于确保正确的电气连接和编写代码。

python代码实现

import machine
import time
from machine import Pin
led = Pin("LED", Pin.OUT)

# 设置引脚
trig = machine.Pin(2, machine.Pin.OUT)  # TR1G
echo = machine.Pin(3, machine.Pin.IN)  # ECHO

# 发送触发脉冲
def send_trigger_pulse():
    trig.value(0)
    time.sleep_us(2)
    trig.value(1)
    time.sleep_us(10)
    trig.value(0)

# 读取回波信号并计算距离
def get_distance():
    send_trigger_pulse()
    
    while echo.value() == 0:
        pulse_start = time.ticks_us()
    
    while echo.value() == 1:
        pulse_end = time.ticks_us()
    
    pulse_duration = pulse_end - pulse_start
    distance = pulse_duration * 0.0343 / 2  # 根据声速计算距离,单位为厘米
    
    return distance

# 主程序
while True:
    distance = get_distance()
    print("Distance: {:.2f} cm".format(distance))
    led.value(1)
    time.sleep(1)  # 每秒测量一次
    led.value(0)

image

树莓派pico+L298n控制直流电机的正传反转和速度

接线方法

  • 树莓派PICO22引脚接在L298n的ENA上
  • 树莓派PICO2引脚接在L298n的IN1上
  • 树莓派PICO3引脚接在L298n的IN2上
  • L298n的OUT1,OUT2分别接在一个电机上
  • L298n的+12v接电源正极,GNG接电源负极

代码示例

import machine
import utime

pwmPin = 22 #控制马达的转速
cwPin = 2
acwPin = 3

# speed:速度,0到100
# direction: 旋转方向,1为顺时针,0停止,-1逆时针
# speed_pin:控制小马达起停的引脚编号
def motorRun(speed, direction, speed_pin, clockwise_pin, anti_clockwise_pin):
    if speed > 100: speed=100
    if speed < 0: speed=0
    cw = machine.Pin(clockwise_pin, machine.Pin.OUT)
    acw = machine.Pin(anti_clockwise_pin, machine.Pin.OUT)
    pwm = machine.PWM(machine.Pin(speed_pin))
    pwm.freq(100)
    pwm.duty_u16(int(speed/100*65535))
    if direction == -1:   # 如果方向为-1(逆时针)  
        cw.value(0)        # 让 cwPin 输出低电平,acwPin 输出高电平  
        acw.value(1)
        print(direction)
    elif direction == 1:   # 如果方向为1(顺时针)  
        cw.value(1)        # 让 cwPin 输出高电平,acwPin 输出低电平  
        acw.value(0)
        print(direction)
    else:                 # 如果方向为0(停止)  
        cw.value(0)        # 让 cwPin 和 acwPin 都输出低电平  
        acw.value(0)
        print(direction)


motorRun(100, 0, pwmPin, cwPin, acwPin)#第一个参数调速度,第二个参数调方向

pico+l298n电机驱动器控制两个电机

接线

。。。。。。

Python代码

import machine
import utime

# 设置电机控制引脚
pwmPin1 = 8
cwPin1 = 2
acwPin1 = 3
pwmPin2 = 9
cwPin2 = 4
acwPin2 = 5

def motorRun(speed1, direction1, speed2, direction2, speed_pin1, clockwise_pin1, anti_clockwise_pin1, speed_pin2, clockwise_pin2, anti_clockwise_pin2):
    if speed1 > 100: speed1=100
    if speed1 < 0: speed1=0
    if speed2 > 100: speed2=100
    if speed2 < 0: speed2=0
    cw1 = machine.Pin(clockwise_pin1, machine.Pin.OUT)
    acw1 = machine.Pin(anti_clockwise_pin1, machine.Pin.OUT)
    cw2 = machine.Pin(clockwise_pin2, machine.Pin.OUT)
    acw2 = machine.Pin(anti_clockwise_pin2, machine.Pin.OUT)
    pwm1 = machine.PWM(machine.Pin(speed_pin1))
    pwm1.freq(100)
    pwm1.duty_u16(int(speed1/100*65535))
    pwm2 = machine.PWM(machine.Pin(speed_pin2))
    pwm2.freq(100)
    pwm2.duty_u16(int(speed2/100*65535))
    if direction1 == -1:   # 如果方向为-1(逆时针)  
        cw1.value(0)        # 让 cwPin 输出低电平,acwPin 输出高电平  
        acw1.value(1)
        print(direction1)
    elif direction1 == 1:   # 如果方向为1(顺时针)  
        cw1.value(1)        # 让 CWPin 输出高电平,acwPin 输出低电平  
        acw1.value(0)
        print(direction1)
    else:                 # 如果方向为0(停止)  
        cw1.value(0)        # 让 CWPin 和 acwPin 都输出低电平  
        acw1.value(0)
        print(direction1)

    if direction2 == -1:   # 如果方向为-1(逆时针)  
        cw2.value(0)        # 让 CWPin 输出低电平,acwPin 输出高电平  
        acw2.value(1)
        print(direction2)
    elif direction2 == 1:   # 如果方向为1(顺时针)  
        cw2.value(1)        # 让 CWPin 输出高电平,acwPin 输出低电平  
        acw2.value(0)
        print(direction2)
    else:                 # 如果方向为0(停止)  
        cw2.value(0)        # 让 CWPin 和 acwPin 都输出低电平  
        acw2.value(0)
        print(direction2)


# 设置电机速度和方向
motorRun(20, -1, 20, -1, pwmPin1, cwPin1, acwPin1, pwmPin2, cwPin2, acwPin2)#第一个参数调速度,第二个参数调方向
# 等待一段时间后停止电机
utime.sleep(1)
motorRun(0, 0, 0, 0, pwmPin1, cwPin1, acwPin1, pwmPin2, cwPin2, acwPin2)
© 版权声明
THE END
喜欢就支持一下吧
点赞13赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容