Pico学习笔记

DAY 1

 

一、硬件概述

 

1.1 核心规格

 

· 微控制器:RP2040(树莓派首款自研芯片)

· CPU:双核ARM Cortex-M0+ @ 133MHz

· 内存:264KB SRAM

· 存储:2MB板载闪存

· GPIO:26个多功能引脚(23个数字+3个ADC)

 

1.2 关键接口

 

```

26个GPIO引脚(包含3个ADC输入)

2个UART、2个SPI、2个I2C接口

16个PWM通道

8个PIO状态机(可编程IO)

USB 1.1主机和设备支持

```

 

二、开发环境搭建

 

2.1 MicroPython环境

 

```python

# 1. 下载固件

# 从树莓派官网下载最新的MicroPython固件

 

# 2. 刷写固件

# 按住BOOTSEL按钮,连接USB

# 将uf2固件拖入出现的U盘

 

# 3. 连接串口

# Linux/Mac: /dev/ttyACM0

# Windows: COM端口

```

 

2.2 常用工具

 

· Thonny IDE(推荐初学者)

· VS Code + Pico-Go扩展

· 命令行工具: ampy, rshell

 

三、基础编程示例

 

3.1 GPIO控制

 

```python

import machine

import time

 

# LED闪烁

led = machine.Pin(25, machine.Pin.OUT)

while True:

    led.toggle()

    time.sleep(0.5)

```

 

3.2 PWM控制

 

```python

from machine import Pin, PWM

import time

 

# PWM呼吸灯

led = PWM(Pin(25))

led.freq(1000)

 

duty = 0

direction = 1

 

while True:

    duty += direction * 10

    if duty > 1000:

        duty = 1000

        direction = -1

    elif duty < 0:

        duty = 0

        direction = 1

    

    led.duty_u16(duty * 64)

    time.sleep(0.01)

```

 

3.3 ADC读取

 

```python

from machine import ADC, Pin

import time

 

# 读取电位器

pot = ADC(26)

 

while True:

    value = pot.read_u16() # 0-65535

    voltage = value * 3.3 / 65535

    print(f"ADC值: {value}, 电压: {voltage:.2f}V")

    time.sleep(0.1)

```

 

四、通信协议

 

4.1 I2C通信

 

```python

from machine import Pin, I2C

import time

 

# I2C初始化

i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=400000)

 

# 扫描设备

devices = i2c.scan()

print(f"找到 {len(devices)} 个设备: {[hex(x) for x in devices]}")

 

# 读取传感器数据示例

def read_sensor():

    i2c.writeto(0x68, b'\x00')

    data = i2c.readfrom(0x68, 6)

    return data

```

 

4.2 SPI通信

 

```python

from machine import Pin, SPI

import time

 

# SPI初始化

spi = SPI(0,

          baudrate=1000000,

          polarity=0,

          phase=0,

          bits=8,

          firstbit=SPI.MSB,

          sck=Pin(2),

          mosi=Pin(3),

          miso=Pin(4))

 

# 片选引脚

cs = Pin(5, Pin.OUT)

 

def read_spi_sensor():

    cs.value(0)

    data = spi.read(2)

    cs.value(1)

    return data

```

 

4.3 UART串口通信

 

```python

from machine import UART, Pin

import time

 

uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))

 

# 发送数据

uart.write("Hello Pico!\n")

 

# 读取数据

while True:

    if uart.any():

        data = uart.read()

        print("收到:", data)

```

 

五、PIO(可编程IO)基础

 

5.1 PIO简介

 

· 8个独立状态机

· 每个状态机有自己的指令存储器

· 可编程时序控制

· 适用于非标准通信协议

 

5.2 WS2812 LED控制示例

 

```python

import array

import rp2

from machine import Pin

import time

 

# PIO程序定义

@rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW, out_shiftdir=rp2.PIO.SHIFT_LEFT,

             autopull=True, pull_thresh=24)

def ws2812():

    T1 = 2

    T2 = 5

    T3 = 3

    wrap_target()

    label("bitloop")

    out(x, 1) .side(0) [T3 - 1]

    jmp(not_x, "do_zero") .side(1) [T1 - 1]

    jmp("bitloop") .side(1) [T2 - 1]

    label("do_zero")

    nop() .side(0) [T2 - 1]

    wrap()

 

# 创建状态机

sm = rp2.StateMachine(0, ws2812, freq=8000000, sideset_base=Pin(22))

 

# 启动状态机

sm.active(1)

 

# 发送颜色数据

def set_color(r, g, b):

    color = (g << 16) | (r << 8) | b

    sm.put(color)

 

# 测试

set_color(255, 0, 0) # 红色

time.sleep(1)

set_color(0, 255, 0) # 绿色

```

 

六、多核编程

 

6.1 使用第二个核心

 

```python

import _thread

import time

from machine import Pin

 

# 核心1的任务

def core1_task():

    led = Pin(25, Pin.OUT)

    while True:

        led.toggle()

        time.sleep(0.2)

 

# 启动第二个核心

_thread.start_new_thread(core1_task, ())

 

# 核心0继续执行主程序

while True:

    print("核心0运行中...")

    time.sleep(1)

```

 

6.2 核心间通信

 

```python

import _thread

import time

from machine import Pin

 

# 共享变量

shared_data = 0

lock = _thread.allocate_lock()

 

def core1_task():

    global shared_data

    while True:

        with lock:

            shared_data += 1

            print(f"核心1设置: {shared_data}")

        time.sleep(0.5)

 

# 启动第二个核心

_thread.start_new_thread(core1_task, ())

 

# 核心0读取共享数据

while True:

    with lock:

        current = shared_data

    print(f"核心0读取: {current}")

    time.sleep(1)

```

 

七、电源管理

 

7.1 低功耗模式

 

```python

import machine

import time

 

# 进入深度睡眠

def deep_sleep(duration_ms):

    # 配置唤醒源

    machine.RTC().wake_on_ext0(pin=machine.Pin(14), level=0)

    # 进入深度睡眠

    machine.deepsleep(duration_ms)

 

# 空闲状态省电

def idle_sleep():

    import micropython

    while True:

        machine.idle() # 等待中断

        # 处理事件

        print("唤醒处理任务")

```

 

八、常用库和资源

 

8.1 内置库

 

```

machine - 硬件访问

time - 时间相关

utime - 时间函数

rp2 - PIO相关功能

_thread - 多线程

uasyncio - 异步IO

```

 

8.2 推荐外部库

 

· urequests:HTTP请求

· umqtt:MQTT客户端

· ssd1306:OLED显示屏驱动

· dht:温湿度传感器

 

8.3 在线资源

 

1. 官方文档

2. MicroPython文档

3. RP2040数据手册

4. Pico项目示例

 

九、项目实践建议

 

9.1 初学者项目

 

1. 温度监测站:使用DS18B20

2. 气象站:温湿度+气压传感器

3. 简易示波器:ADC采集+OLED显示

4. 智能灯控:PWM调光+无线控制

 

9.2 进阶项目

 

1. USB HID设备:自定义键盘/游戏手柄

2. 音频处理:PIO实现音频接口

3. 机器视觉:OV7670摄像头应用

4. 物联网网关:多传感器+WiFi上传

 

9.3 调试技巧

 

```python

# 1. 使用print调试

import sys

def debug(*args):

    print("[DEBUG]", *args, file=sys.stderr)

 

# 2. 异常处理

try:

    risky_operation()

except Exception as e:

    print(f"错误: {e}")

    

# 3. 性能监控

import time

start = time.ticks_us()

# 执行代码

elapsed = time.ticks_diff(time.ticks_us(), start)

print(f"耗时: {elapsed}微秒")

```

 

十、常见问题解决

 

Q1: 无法刷写固件

 

· 确保按住BOOTSEL按钮再插入USB

· 尝试不同的USB线缆

· 检查电脑驱动

 

Q2: 内存不足

 

```python

import gc

gc.collect() # 手动垃圾回收

print(gc.mem_free()) # 查看剩余内存

```

 

Q3: GPIO无响应

 

· 检查引脚复用功能

· 确认上拉/下拉电阻配置

· 检查供电是否稳定

 

---

 

学习建议

 

1. 循序渐进:从GPIO控制开始,逐步学习通信协议

2. 动手实践:每个功能都实际接线测试

3. 阅读源码:参考官方示例理解设计思路

4. 参与社区:在论坛和GitHub上交流学习

 

更新记录

 

· v1.0 (2024) - 基础笔记创建

· 持续更新中...

 

---

 

注:本笔记基于MicroPython环境,部分代码可能需要根据实际硬件连接调整引脚号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值