当前位置: 首页 > news >正文

树莓派PICO入门教程

文章目录

  • 1.板子介绍
  • 2.led开关
  • 4.开关控制:
  • 5.中断:
  • 6.按按钮灯循环亮:
  • 7.模拟输入:
  • 8.PWM Control
  • 9.OLED
  • 10.H桥控制器小型直流电机
  • 11.用上全部

树莓派 Pico 中文站

1.板子介绍

![[Pasted image 20220920122543.png]]

  • 微型usb连接器 microUSB 数据通信,提供动力
  • On-board LED 板载LED 在自己专用的GPIO端口 峰值上的唯一LED
    不会给出电源任何施加到上面的指示
  • boot select按钮 启动模式选择 引导加载程序
  • Debug Pins 调试连接器 pico支持两线串行通过这个进行调试
  • rp2040微控制器芯片

![[Pasted image 20220920122934.png]]

  • 32位双核 arm-cortex m zero plus 芯片
  • 以48兆赫的的正常时钟速度运行,并可提升至133兆赫
  • 2兆字节的板载外部内存
  • 板载实时时钟
  • 板载温度传感器

![[Pasted image 20220920123303.png]]

  • 要么使用引脚,要么表面安装
  • 8个接地点 其中一个是1个调试的一部分 接地点发布均匀
  • 所有的接地连接是方行焊盘而不是圆形焊盘

![[Pasted image 20220920124224.png]]

  • v总线和输出的微型usb电缆电压 连接5v 无连接v总线无输出
  • 系统的输入功率 可以在2到5v的电压下运行该系统 尽管pico是3.3v逻辑机
  • 引脚36上的3.3输出是pico的内部电压调节器的3.3输出 可以用来驱动外部设备,但不要超过3亿
  • 3.3伏使能可启用 扳上的3.3伏电源 可以外部打开或关闭
  • run连接 rp2040微控制器的使能连接 可以用作微控制器的复位

![[Pasted image 20220920124407.png]]

  • 26个裸露的gpio引脚
  • 内部的第27个TPIO引脚用于板载LED

![[Pasted image 20220920124735.png]]

  • 12位模数转换器
  • 3个内部模数转换器
  • 内部ADC用于温度传感器
  • ADC vref gnd 用于外部基准电压源 以提高模数转换器的精度

![[Pasted image 20220920125113.png]]

  • 2个I2C总线
  • 2个SPI总线
  • 2个URAT
  • 16个PWM通道

![[Pasted image 20220920125351.png]]

  • 普通的微控制器运行
  • 使用micro usb 端口通电
  • 使用电池供电,能够在低压2伏特的电压下工作
  • 作为usb 设备运行
  • micro python 或 c

2.led开关

![[Pasted image 20220920131020.png]]

  • 26个gpio引脚,大多数的引脚支持带调制的脉冲
  • 3.3v的逻辑器件
  • 内置上拉电阻和下拉电阻,最大限度的减少所需的电路数量

![[Pasted image 20220920132001.png]]

可以用3个红绿蓝LED
或者一个LED

瞬间接触开关
一红一黑

3LED 需要3个降压电阻 330欧姆的电阻

引脚14(gpio引脚10) 连接到其中一个电阻器,连接到红色LED的阳极
引脚15(gpio引脚11) 连接到其中一个电阻器,连接到绿色LED的阳极
引脚19(gpio引脚14) 连接到其中一个电阻器,连接到蓝色LED的阳极

引脚23 上的接地点;连接到LED上的公共阴极

引脚4 (gpio引脚2)连接到黑色开关的一侧
引脚20 (gpio引脚15)连接到红色开关的一侧

引脚3 接地 连接到黑色开关的另一侧

pin引脚36 3.3v输出 连接到红色开关的另一侧

循环亮3种不同颜色

import machine
import utime


# 对应引脚并打开输出
led_red = machine.Pin(10, machine.Pin.OUT)
led_green = machine.Pin(11, machine.Pin.OUT)
led_blue = machine.Pin(14, machine.Pin.OUT)

while True:


    led_red.value(1)
    led_green.value(0)
    led_blue.value(0)
    utime.sleep(2)


     led_red.value(0)
    led_green.value(1)
    led_blue.value(0)
    utime.sleep(2)


    led_red.value(0)
    led_green.value(0)
    led_blue.value(1)
    utime.sleep(2)

    led_red.value(1)
    led_green.value(1)
    led_blue.value(0)
    utime.sleep(2)

    led_red.value(1)
    led_green.value(0)
    led_blue.value(1)
    utime.sleep(2)

    led_red.value(0)
    led_green.value(1)
    led_blue.value(1)
    utime.sleep(2)

    led_red.value(1)
    led_green.value(1)
    led_blue.value(1)
    utime.sleep(2)

    print("End of Loop")

    led_red.value(0)
    led_green.value(0)
    led_blue.value(0)
    utime.sleep(2) 

4.开关控制:


import machine  
import utime    #时间有关的库


button_red = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_DOWN)   # gpio15 输入 下拉电阻,因为红灯的
                                                                      # 的一段是3.3v 所以一直保持低位
                                                                      # 当开关接通时,它将激活并将其拉高
button_black = machine.Pin(2, machine.Pin.IN, machine.Pin.PULL_UP)  # 上拉电阻,降低即开始

while True:

     if button_red.value() == 1:
        print("Red")




     if button_black.value() == 0:
        print("Black")

    utime.sleep(0.25)  # 延迟


5.中断:

import machine
import utime


led_red = machine.Pin(10, machine.Pin.OUT)
led_green = machine.Pin(11, machine.Pin.OUT)


led_red.value(0)
led_green.value(0)  # 关灯



button_red = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_DOWN)   # 正常下拉电阻为低,除非按他就会拉高



def in_handler(pin)
     button_red.irq(handler=None)  # 关闭此引脚的中断
     print("Interrupt Detected!")
     led_red.value(1) 
     led_green.value(0) 
     utime.sleep(4)  # 休眠在中断不常见,这是个示范
     led_red.value(0)
     button_red.irq(handler=int_handler)  # 重新设置程序,然后才能再次工作


button_red.irq(trigger=machine.Pin.IRQ_RISING, handler=int_handler)
# 修复中断请求  触发中断  我们在上升信号时触发它(低到高)  此时传入一个被称为中断处理程序的函数
# 每次按下按钮会有一个中断,就调用这个函数


# 不被中断时
while True:

      led_green.toggle()  # 切换函数 ,获取输出状态并将其反转
        # led将开或关,就反转成
      utime.sleep(2)



6.按按钮灯循环亮:


import machine
import utime

# 对应引脚并打开输出
led_red = machine.Pin(10, machine.Pin.OUT)
led_green = machine.Pin(11, machine.Pin.OUT)
led_blue = machine.Pin(14, machine.Pin.OUT)

led_red.value(0)
led_green.value(0)
led_blue.value(0)


button_black = machine.Pin(2, machine.Pin.IN, machine.Pin.PULL_UP)  # 上拉电阻,降低即开始

while True:

     if button_black.value() == 0:   #  按下按钮,值为0

                led_red.value(1)
			    led_green.value(0)
			    led_blue.value(0)
			    utime.sleep(1)
			
			
			    led_red.value(0)
			    led_green.value(1)
			    led_blue.value(0)
			    utime.sleep(1)
			
			
			    led_red.value(0)
			    led_green.value(0)
			    led_blue.value(1)



                led_red.value(0)
				led_green.value(0)
				led_blue.value(0)





			    


7.模拟输入:

![[Pasted image 20220920232711.png]]

  • 3个内部模数转换器
  • 12位adc
  • 模拟基准电压源 模拟接地引脚 可与外部基准电压源配合使用

最简单组件是有效直径

这里使用10k的直线壶

  • 引脚23 连接到patometer的一端
  • 引脚31 gpio26 模拟转换器0 连接到patometer的一端
  • 引脚36 3.3v输出 连接到patometer的一端

代码


import machine
import utime


# 定义一个称为电位计的变量,并将其定义为模拟输入,然后使用库的ADC功能
potentiometer = machine.ADC(26)

while True:
    print(potentiometer.read_u16())   # 打印电位值,打印模数转换器的输出值
                                      # 使用的是读出无符号16位输出,16位实际从0到65535
                                      # 但是返回的值可能不是你期待的值
                                      # 当我们需要将其传递给其它操作时
                                      # 例如当我们使用PWM时,只要我们将所有内容
                                      # 保持为无符号的16位数字,就不需要担心映射命令之类的
                                      # 事情
    utime.sleep(2)


8.PWM Control

从电位器中读取值用作PWM信号的控制
把信号馈送到rgbled的红色部分

import machine
import utime



led_red = machine.PWM(machine.Pin(10))  # 定于led为PWM输出
potentiomemter = machine.ADC(26)    # 定义一个称为电位计的变量,并将其定义为模拟输入,然后使用库的ADC功能




led_red.freq(1000)  # 工作频率为1000赫兹



while True:
    led_red.duty_u16(potentiomemter.read_u16())  # 占空比是一个无符号的16位整数
                                                 # 其值是从读取电位器中的无符号的16位整数中获得的



9.OLED

  • PICO内部I2c总线零号
  • 两个I2C总线
  • 只需要写入
  • 只需3.3v

![[Pasted image 20220921004505.png]]

驱动显示器的脚本:

需要导入这个oled 的库

进入工具的包管理下载对应的包
![[Pasted image 20220921005140.png]]


import machine
import utime

sda = machine.Pin(20)
scl = machine.Pin(21)


i2c = machine.I2C(0, sda = sda, scl = scl, freq = 400000) 
# 设置I2C对象,(使用哪个总线0还是1,赋值,i2c所在总线的频率  )



# 使用库
from ssd1306 import  SSD1306_I2C
oled = SSD1306_I2C(128, 32, i2c)  
# 不用给ssd1306分配i2c,因为这是一个固定的地址,内置在库中,不同的显示参数

# 在屏幕上打印出文本
oled.text('Welcome to the', 0, 0)
oled.text('Pi Pico', 0, 10)
oled.text('Display Demo', 0 ,20)
oled.show()
utime.sleep(4)  


oled.fill(1)  # 填满显示屏
oled.show()
utime.sleep(2)
oled.fill(0)   # 清空显示屏
oled.show()


# 循环滚动
while True:
  oled.text("Hello  World", 0, 0)
  for i in range (0,164):
  oled.sroll(1, 0)    #滚动一次只移动一个像素
  oled.show()
  utime.sleep(0.01)



10.H桥控制器小型直流电机

![[Pasted image 20220921011209.png]]

  • gpio上的PWM调制脉冲来控制直流电机的速度
  • 使用MOSFET 的H桥驱动器

![[Pasted image 20220921011512.png]]

ADC电机 6v
tb 6612 fng 8桥电机驱动器 双批次桥, 但是只使用一面
6v 的电源


import machine
import utime


# 设置电位计,作为模拟1到数字输入
potentiometer = machine.ADC(26)


# 设置H桥控制器引脚
# AI1,2控制电机的旋转方向
# PWMa控制马达的速度
mtr_AI1 = machine.Pin(8, machine.Pin.OUT)
mtr_AI2 = machine.Pin(7, machine.Pin.OUT)
mtr_PWMa = machine.PWM(machine.Pin(6))



button_red = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_DOWN)  # 红色按钮下拉电阻
button_black = machine.Pin(2, machine.Pin.IN, machine.Pin.PULL_UP)    # 黑色按钮上拉电阻

led_red = machine.Pin(10, machine.Pin.OUT)
led_green = machine.Pin(11, machine.Pin.OUT)
led_blue = machine.Pin(14, machine.Pin.OUT)



led_red.value(0)
led_green.value(0)
led_blue.value(1)


mtr_PWMa.freq(50)  #输入的PWM频率1设置为50赫兹,猜测
mtr_AI1.value(1)   # 让马达以特定的方向旋转
mtr_AI1.value(0)



while True:

# 当驱动LED时我们采用的是PWM的占空比,并将其与电位计的读数相匹配
      mtr_PWMa.duty_u16(potentiometer.read_u16())


     if button_red.value() == 1:
         mtr_AI1.value(0)
         mtr_AI2.value(1)
         led_red.value(1)
         led_green.value(0)
         led_blue.value(0)

     
     if button_black.value() == 0:
         mtr_AI1.value(1)
         mtr_AI2.value(0)
         led_red.value(0)
         led_green.value(1)
         led_blue.value(0)


    utime.sleep(0.25)   # 防反跳按钮


11.用上全部

import machine
import utime


# 设置电位计,作为模拟1到数字输入
potentiometer = machine.ADC(26)


# 设置H桥控制器引脚
# AI1,2控制电机的旋转方向
# PWMa控制马达的速度
mtr_AI1 = machine.Pin(8, machine.Pin.OUT)
mtr_AI2 = machine.Pin(7, machine.Pin.OUT)
mtr_PWMa = machine.PWM(machine.Pin(6))



button_red = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_DOWN)  # 红色按钮下拉电阻
button_black = machine.Pin(2, machine.Pin.IN, machine.Pin.PULL_UP)    # 黑色按钮上拉电阻

led_red = machine.Pin(10, machine.Pin.OUT)
led_green = machine.Pin(11, machine.Pin.OUT)
led_blue = machine.Pin(14, machine.Pin.OUT)


sda = machine.Pin(20)
scl = machine.Pin(21)



i2c = machine.I2C(0, sda = sda, scl = scl, freq = 400000) 
# 设置I2C对象,(使用哪个总线0还是1,赋值,i2c所在总线的频率  )



# 使用库
from ssd1306 import  SSD1306_I2C
oled = SSD1306_I2C(128, 32, i2c)  
# 不用给ssd1306分配i2c,因为这是一个固定的地址,内置在库中,不同的显示参数

oled.text('Pico Motor Test', 0 ,0)
oled.show()
utime.sleep(2)  




led_red.value(1)
led_green.value(0)
led_blue.value(0)
utime.sleep(2)


led_red.value(0)
led_green.value(1)
led_blue.value(0)
utime.sleep(2)


led_red.value(0)
led_green.value(0)
led_blue.value(1)


# 设置电机频率的值
mtr_PWMa.freq(50)  #输入的PWM频率1设置为50赫兹,猜测
mtr_AI1.value(1)   # 让马达以特定的方向旋转
mtr_AI1.value(0)








while True:

#  500计算速度值,在oled上创建条形图
    speedvalue = int(potentiometer.read_u16()/500)


# 当驱动LED时我们采用的是PWM的占空比,并将其与电位计的读数相匹配
      mtr_PWMa.duty_u16(potentiometer.read_u16())


    if button_red.value() == 1:
         mtr_AI1.value(0)
         mtr_AI2.value(1)
         led_red.value(1)
         led_green.value(0)
         led_blue.value(0)

     
    if button_black.value() == 0:
         mtr_AI1.value(1)
         mtr_AI2.value(0)
         led_red.value(0)
         led_green.value(1)
         led_blue.value(0)

    

	oled.fill_rect(1, 15, speedvalue, 25, 1)  # oled上创建一个矩形,1,15经常启动的位置,速度值,25用来确定长度
	 # 11展示出来1
	oled.show()
	oled.fill_rect(1, 15, speedvalue, 25, 0)  # 
	utime.sleep(0.25)




视频教程

相关文章:

  • 深入理解计算机系统——第五章 Optimizing Program Performance
  • 【JDBC实战】水果库存系统 [设计阶段]
  • 【前端之旅】JavaScript进阶笔记
  • JVM运行时参数
  • 【Android】-- 数据存储(二)(存储卡上读写文件、Application保存数据)
  • 消息队列|RabbitMQ入门概述
  • 并发(5)线程之间的协作
  • Vue 新手期练手出现问题记录与解决方案——Vue练手项目“小问题“,强迫症患者福音——持续更新ing
  • 公钥密码学中的简单数学基础
  • docker简洁版
  • 牛客网面试必刷TOP101之——判断某种二叉树以及寻找最近公共祖先节点
  • leetcode——最长回文子串——百日算法成就第五天5%
  • Java_Stream流式计算
  • 微雪树莓派PICO笔记——4. ADC(模拟数字转换器)
  • 网课查题公众号接口使用
  • 自己简单写的 事件订阅机制
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • android图片蒙层
  • Iterator 和 for...of 循环
  • Linux gpio口使用方法
  • miaov-React 最佳入门
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Selenium实战教程系列(二)---元素定位
  • SQLServer之创建显式事务
  • zookeeper系列(七)实战分布式命名服务
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 使用putty远程连接linux
  • 思否第一天
  • 学习HTTP相关知识笔记
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 用element的upload组件实现多图片上传和压缩
  • 用mpvue开发微信小程序
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #define 用法
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (2)STL算法之元素计数
  • (libusb) usb口自动刷新
  • (二)hibernate配置管理
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (七)Java对象在Hibernate持久化层的状态
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转载)利用webkit抓取动态网页和链接
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET 解决重复提交问题
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .net访问oracle数据库性能问题
  • .net生成的类,跨工程调用显示注释
  • @Import注解详解
  • @NestedConfigurationProperty 注解用法
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作