[toc]
安装系统 更换系统源 清华大学源
如何添加armv7l架构源,很简单,只需编辑/etc/apt/sources.list
,并且无需额外的服务或者整机的重启操作。
先注释掉所有语句,然后加入:
1 2 3 deb https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ bullseye main non-free contrib rpi deb-src https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ bullseye main non-free contrib rpi deb [arch =arm64] https://mirrors.tuna.tsinghua.edu.cn/raspbian/multiarch/ bullseye main
第一行是:
1 选择你的 Raspbian 对应的 Debian 版本: Debian 11 (bullseye) Debian 10 (buster) Debian 9 (stretch)
第二行是:
源码目录仓库是否开启
第三行是:
为arm64和aarch64提供deb包
然后更新软件列表和软件即可
如果出现证书问题
1 gpg --keyserver keyserver.ubuntu.com --recv-keys [报错的公钥]
如果还想加入aarch64架构的源也可这样,编辑 /etc/apt/sources.list.d/raspi.list
文件。
1 deb https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bullseye main
然后更新软件列表和软件即可
树莓派实验 RPI.GPIO 使用手册 RPI.GPIO包介绍 RPi.GPIO 模块程序包提供了一个在 Raspberry Pi 中控制 GPIO 的类。
**RPi.GPIO是 Python的一个module( 模块 ), 树莓派官方系统默认已经安装, 仍在不断更新中,可以访问 python主页下载源码 **
注意,该模块不适合应用到追求实时性或计数周期的应用中。这是由于您无法预测 Ptyhon 何时繁忙,以及资源回收的时间。而且它是运行在基于 Linux 核心的系统中,也不合适用于实时应用 – 原因在于其它进程可能获得更高的 CPU 优先级。
官方的帮助文档的链接:
导入模块
通过这样,您可以在脚本的其余部分中将其称为 GPIO。
要导入模块并检查它是否成功,请执行以下操作:
1 2 3 4 try: import RPi.GPIO as GPIO except RuntimeError: print ("Error importing RPi.GPIO! This is probably because you need superuser privileges. You can achieve this by using 'sudo' to run your script" )
1 2 解释:try except异常捕获处理 RuntimeError是运行时错误,如果触发这个就会打印后面print 里面的话
引脚编号 在RPi.GPIO中,有两种方法可以对Raspberry Pi上的IO引脚进行编号。
第一种是使用BOARD编号系统。这是指Raspberry Pi板上P1接头上的引脚号。使用这种编号系统的优点是,无论树莓派的电路板版本如何,您的硬件都能正常工作。你不需要重新连接你的连接器或更改你的代码。
第二个编号系统是BCM号码。这是一种较低级别的工作方式 - 它指的是Broadcom SOC上的通道号码。您必须始终使用那个通道编号所对应的树莓派板上哪个引脚的图表。您的脚本程序可能会在Raspberry Pi板的硬件修订后而不能使用。
我们在使用RPi.GPIO包的时候必须要指定正在使用的(必需):
1 2 3 GPIO.setmode(GPIO.BOARD) GPIO.setmode(GPIO.BCM)
模式将是GPIO.BOARD则返回10,如果是GPIO.BCM则返回11,如果没有设置则返回None
下面附上GPIO图,适用BCM编码
交互式引脚排列图: 这个网站可以查看GPIO接口作用
警告 你可能在Raspberry Pi的GPIO上有多个脚本/电路。因此,如果RPi.GPIO检测到引脚已被配置为默认(输入)以外的其他引脚,则在尝试配置脚本时会收到警告。要禁用这些警告:
设置一个通道 你需要设置您用作输入或输出的每个通道。下面是将通道配置为输入:
1 GPIO.setup(channel, GPIO.IN)
(其中通道是基于你指定的编号系统(BOARD或BCM)的通道编号)。
有关设置输入通道的更多高级信息,请参阅此处 。
要将通道设置为输出:
1 GPIO.setup(channel, GPIO.OUT)
(其中通道是基于您指定的编号系统(BOARD或BCM)的通道编号)。
你还可以为您的输出通道指定一个初始值:
1 GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)
设置多个通道 你可以一次设置多个通道(从版本 0.5.8 及更高版本)。例如:
1 2 3 4 chan_list = [ 11 ,12 ] #添加任意数量的通道! #你可以用元组代替,即: #chan_list =(11 ,12 ) GPIO.setup(chan_list, GPIO.OUT)
输入 读取GPIO引脚的值:
(其中通道是基于你指定的编号系统(BOARD 或 BCM)的通道编号)。这将返回0 / GPIO.LOW / False
或1 / GPIO.HIGH / True
有几种方法可以将GPIO输入到您的程序中。第一种也是最简单的方法是在某个时间点检查输入值。这就是所谓的“轮询”,如果你的程序在错误的时间读取了值,可能会错过输入。轮询在循环中执行,并可能是处理器密集型的。响应GPIO输入的另一种方式是使用’中断’(边沿检测)。边沿是从高电平到低电平(下降沿)或从低电平到高电平(上升沿)的意思。
点亮LED灯珠 实验材料:1.官方说的耐压2.2v的小灯珠(我经过5V测试两颗,果然烧了,然后使用树莓派3.3VGPIO口)、2.色环电阻一颗(27K)3.杜邦线公口若干条、4.GPIO口拓展线一根、5.T型GPIO拓展板一块、6.面包板一块
我们使用树莓派GPIO17接面包板的GND,然后树莓派GPIO第1口(3.3V)接面包板VCC,LED和电阻一起接上面包板GND和VCC(注意:LED有正负极,长的是+,短的是-;电阻不分正负),接上去之后可以看到LED灯是亮的,因为GPIO1口是默认3.3V电压,所以灯已经亮起。
那么,由于前面烧了两颗LED,我可以得知,我的LED是能扛得住3.3V电压直接上电的,所以有了下面这个图(电阻去掉,用杜邦线直接连接)
一直亮着也不是个好玩的是吧,那我写个python让它闪烁咯
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import RPi.GPIO as GPIOimport timeLED = 17 GPIO.setmode(GPIO.BCM) GPIO.setup(LED,GPIO.OUT) try : while True : GPIO.output(LED,GPIO.HIGH) time.sleep(1 ) GPIO.output(LED,GPIO.LOW) time.sleep(1 ) except : print ("except" ) GPIO.cleanup()
可以看出,python控制的HIGHT电平比默认的更加亮,而且能够闪烁(这里由于是图片,所以看不到闪烁)
显示信息在LCD_1602 实验材料:1.LCD1602显示面板、2.可调电阻(也叫可变电阻)3.杜邦线公口若干条、4.GPIO口拓展线一根、5.T型GPIO拓展板一块、6.面包板一块
我们要根据BCM编码来接线
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 root@raspberrypi:/share/raspberry +-----+-----+---------+------+---+---Pi 3B+-+---+------+---------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ | | | 3.3v | | | 1 || 2 | | | 5v | | | | 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5v | | | | 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | | | 4 | 7 | GPIO. 7 | OUT | 0 | 7 || 8 | 0 | IN | TxD | 15 | 14 | | | | 0v | | | 9 || 10 | 1 | IN | RxD | 16 | 15 | | 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 | | 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | | | 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 | | | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 | | 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | | | 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 | | 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 | | | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 | | 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 | | 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | | | 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 | | 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | | | 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 | | 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 | | | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 | +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+---------+------+---+---Pi 3B+-+---+------+---------+-----+-----+
这个图不够直观的话,可以看看下面这个图:
根据python代码接好线路
1 2 3 4 5 6 LCD_RS = 7 LCD_E = 8 LCD_D4 = 25 LCD_D5 = 24 LCD_D6 = 23 LCD_D7 = 18
LCE1602的VSS和K接口要接地,
VDD和A要接上正极(+),
V0是调节液晶显示的偏压信号,可接10K的可调电阻,V0接可调电阻中间脚位,可调电阻另外两个脚位一个接地一个接正极,
RS接树莓派BCM7号位,
RW接地(接地表示是写入模式),
E使能接树莓派BCM8号位,
D4接树莓派BCM25号位,
D5接树莓派BCM24号位,
D6接树莓派BCM23号位,
D7接树莓派BCM18号位
下面是接完线之后的样子:
给树莓派执行下面python脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 import RPi.GPIO as GPIOimport timeLCD_RS = 7 LCD_E = 8 LCD_D4 = 25 LCD_D5 = 24 LCD_D6 = 23 LCD_D7 = 18 LCD_CHR = True LCD_CMD = False LCD_LINE_1 = 0x80 LCD_LINE_2 = 0xc0 E_PULSE = 0.0005 E_DELAY = 0.0005 like = 'I love raspberry' lu = ' orange' def lcd_toggle_enable (): time.sleep(E_DELAY) GPIO.output(LCD_E,True ) time.sleep(E_PULSE) GPIO.output(LCD_E,False ) time.sleep(E_DELAY) def lcd_byte (bits,mode ): GPIO.output(LCD_RS,mode) GPIO.output(LCD_D4,False ) GPIO.output(LCD_D5,False ) GPIO.output(LCD_D6,False ) GPIO.output(LCD_D7,False ) if bits & 0x10 == 0x10 : GPIO.output(LCD_D4,True ) if bits & 0x20 == 0x20 : GPIO.output(LCD_D5,True ) if bits & 0x40 == 0x40 : GPIO.output(LCD_D6,True ) if bits & 0x80 == 0x80 : GPIO.output(LCD_D7,True ) lcd_toggle_enable() GPIO.output(LCD_D4,False ) GPIO.output(LCD_D5,False ) GPIO.output(LCD_D6,False ) GPIO.output(LCD_D7,False ) if bits & 0x01 == 0x01 : GPIO.output(LCD_D4,True ) if bits & 0x02 == 0x02 : GPIO.output(LCD_D5,True ) if bits & 0x04 == 0x04 : GPIO.output(LCD_D6,True ) if bits & 0x08 == 0x08 : GPIO.output(LCD_D7,True ) lcd_toggle_enable() def lcd_init (): lcd_byte(0x33 ,LCD_CMD) lcd_byte(0x32 ,LCD_CMD) lcd_byte(0x01 ,LCD_CMD) lcd_byte(0x0f ,LCD_CMD) lcd_byte(0x06 ,LCD_CMD) lcd_byte(LCD_LINE_1,LCD_CMD) time.sleep(E_DELAY) def main (): GPIO.setwarnings(False ) GPIO.setmode(GPIO.BCM) GPIO.setup(LCD_E,GPIO.OUT) GPIO.setup(LCD_RS,GPIO.OUT) GPIO.setup(LCD_D4,GPIO.OUT) GPIO.setup(LCD_D5,GPIO.OUT) GPIO.setup(LCD_D6,GPIO.OUT) GPIO.setup(LCD_D7,GPIO.OUT) lcd_init() for i in range (len (like)): lcd_byte(ord (like[i]),LCD_CHR) time.sleep(0.05 ) lcd_byte(LCD_LINE_2,LCD_CMD) for i in range (len (lu)): lcd_byte(ord (lu[i]),LCD_CHR) time.sleep(0.05 ) main()
看看效果吧
开头的显示没有问题,但是第二行出现了乱码。