[toc]

前言

毕业前大半年,我收到要设计毕业设计的消息之后,我选了一个最最最作死的毕业设计——基于RFID的图书借还系统,因为我是网工,只会网络和运维,可能还会些安服、安技的知识。但让我当开发去开发一个项目还是对我来说很困难的,现在,毕业设计如同一把达摩利斯之剑悬浮在我的头顶,也是我悲催的开始。

毕业设计里面需要的RFID,我当时考虑的时候就是找个RFID传感器就解决问题了,但很不幸!我树莓派4b的spi找不到RC522的传感器,所以没办法正常调用。我就买了创乐博的CreatePi v2.0,这玩意巨tm贵,花费我600大洋,买回来我就开始RFID的使用,刚开始的组装、刷系统、点亮等前戏还真别说,确实是有模有样!但到了RFID这里就出问题了,他们用的方案也是RC522,也就奠定了我失败!我的树莓派4B的系统硬件版本是1.4

1
2
dmesg | grep Rev
[ 0.000000] Machine model: Raspberry Pi 4 Model B Rev 1.4

因为没办法正常使用RFID我直接和客服联系,他们说可能RFID损坏,我寄回去!寄回去他们检修一段时间后回答我说,板子没有任何问题!这就离了个谱了。没办法正常使用RFID模块,用的是他们提供的东西,除了树莓派4B是我的。和客服扯了一堆有的没的,居然说我的树莓派有问题,没有用他们买的,当时他们给我的方案就是重新购买他们的树莓派4B,我当时那个气呀!树莓派就发行了两个版本硬件结构出现变化,一个是19年第一版树莓派4B有电源不识别的bug,后面发行的电路结构没有任何变化。客服那边说他们那边曾经有过这个问题就是系统硬件版本的问题,只有1.51.2的系统版本可以,而他们卖的配套树莓派则全是1.5系统硬件版本的。

image-20240104003728268

这个东西真的很神奇,我在官网查找资料,很少有人提及到这些东西,但是我查到了个东西,那就是树莓派的系统硬件版本销售

网址在这里

image-20240104005058350

我总结一下,就是树莓派4B有1.2、1.4和目前(2023年)1.5的,而版本1.3的没有流入市场,然后1.1==1.2,这个就很nice了!要知道我树莓派有很多啊!400、4B、5、pico、picoW等,刚好树莓派400的系统硬件版本是1.1的。我马上就让客服给我把板子寄回来,我使用树莓派400做RFID实验!果然成功了。

你以为就这么简单!其实我和客服ob大战了一个多小时!从rpi-eeprom打到Rev,刚开始我还以为我记错了,后面摆事实讲道理和技术客服聊,而客服的语言并不专业,让我在rpi-eeprom版本linux内核版本之间疯狂来回跳,最后我想到他说的可能是Rev。我让给他敲了命令给我看他的板子。。。果然!真是无语,上面那个图其实就是我ob完最后的挣扎,事实已定,我无力反抗。

1.LED模块实验

实验直接使用了物理pin的针脚顺序

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
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 文件名:blinking_led.py
# 版本:
# author:
# 说明:LED灯显示实验


#导入GPIO库
import RPi.GPIO as GPIO
#从time模块导入sleep函数
from time import sleep

# 定义 LED 引脚
makerobo_led_pin = 37

#暂时忽略警告
GPIO.setwarnings(False)
# 使用实际的PIN管脚编码
GPIO.setmode(GPIO.BOARD)
# 将LED引脚设置为输出引脚,并将初始值设置为低(关闭)
GPIO.setup(makerobo_led_pin, GPIO.OUT, initial=GPIO.LOW)

# 程序入口
if __name__ == "__main__":
try:
while True: # 无限循环
GPIO.output(makerobo_led_pin, GPIO.HIGH) # 打开
sleep(0.5) # 延时1s
GPIO.output(makerobo_led_pin, GPIO.LOW) # 关闭
sleep(0.5) # 延时1s
except KeyboardInterrupt:
# 按下 CTRL+C 键, 清除并退出脚本
GPIO.cleanup()

LED模块实验视频

2.有源蜂鸣器传感实验

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
#!/usr/bin/python
# -*- coding: utf-8 -*-
# 文件名:buzzer.py
# 版本:
# author:
# 说明:有源蜂鸣器

# 导入树莓Pi GPIO库
import RPi.GPIO as GPIO
# 从time模块导入sleep函数
from time import sleep
# 暂时忽略警告
GPIO.setwarnings(False)
# 使用实际的PIN管脚编码
GPIO.setmode(GPIO.BOARD)
# 设置蜂鸣器-引脚12作为输出
makerobo_buzzer=12

# 将蜂鸣器引脚设置为输出引脚,并将初始值设置为LOW(关闭)
GPIO.setup(makerobo_buzzer, GPIO.OUT, initial=GPIO.LOW)

# 程序入口
if __name__ == "__main__":
try:
while True:
GPIO.output(makerobo_buzzer,GPIO.HIGH)
print ("Beep")
sleep(0.5) # 延时0.5s
GPIO.output(makerobo_buzzer,GPIO.LOW)
print ("No Beep")
sleep(0.5)
except KeyboardInterrupt:
# 按下 CTRL+C 键, 清除并退出脚本
GPIO.cleanup()

3.按键组模块实验

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
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 文件名:button_buzzer.py
# 版本:
# author:
# 说明:按下(key3:37)按键,触发蜂鸣器,
# 也可以使用其他按键:key1:22,key2:33,key3:37,key4:35

# 导入树莓Pi GPIO库
import RPi.GPIO as GPIO
# 从time模块导入sleep函数
from time import sleep

# 配置按钮和蜂鸣器引脚
makerobo_button_pin = 37 # 按键
makerobo_buzzer_pin = 12 # 蜂鸣器

# 暂时忽略警告
GPIO.setwarnings(False)
# 使用实际的PIN管脚编码
GPIO.setmode(GPIO.BOARD)

# 设置按钮引脚按键管脚为高电平输入和蜂鸣器引脚作为输出
# GPIO.PUD_UP表示启用上拉电阻,这意味着当按钮没有被按下时,引脚被拉高到逻辑高电平
GPIO.setup(makerobo_button_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# 将蜂鸣器引脚设置为输出引脚,并将初始值设置为LOW(关闭)
GPIO.setup(makerobo_buzzer_pin, GPIO.OUT,initial=GPIO.LOW)

# 程序入口
if __name__ == "__main__":
try:
while True:
# 检查按键是否按下
if(GPIO.input(makerobo_button_pin) ==0):
sleep(0.1) # 延时10ms
if(GPIO.input(makerobo_button_pin) ==0):
# 打开蜂鸣器
GPIO.output(makerobo_buzzer_pin, GPIO.HIGH)
else:
# 没有按键按下, 关闭蜂鸣器
GPIO.output(makerobo_buzzer_pin, GPIO.LOW)
except KeyboardInterrupt:
GPIO.cleanup() # 清空GPIO

博客没有设计声音播放,所以我直接把蜂鸣器换成LED

按键组模块实验

4.继电器实验

我还年轻,还不想死这么快!!!

5.振动小马达模块实验

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
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 文件名:vibration.py
# 版本:
# author:
# 说明:在做这个项目的时候,要把指拨开关(BUTTON:UX2)的第1位拨到ON上,
# 做完实验之后,记得拨下来

# 导入树莓Pi GPIO库
import RPi.GPIO as GPIO
# 从time模块导入sleep函数
from time import sleep

# 定义振动传感器管脚
makerobo_vibration_pin = 13

# 暂时忽略警告
GPIO.setwarnings(False)
# 将board模式设置为GPIO.BOARD
GPIO.setmode(GPIO.BOARD)

# 设置振动管脚为输出模式,并将初始值设置为LOW(关闭)
GPIO.setup(makerobo_vibration_pin, GPIO.OUT,initial=GPIO.LOW)

# 程序入口
if __name__ == "__main__":
try:
# 打开振动传感器
GPIO.output(makerobo_vibration_pin, GPIO.HIGH)
# 等待2S时间
sleep(2)
# 关闭震动传感器
GPIO.output(makerobo_vibration_pin, GPIO.LOW)

except KeyboardInterrupt:
GPIO.cleanup() # 清空GPIO

6.声音传感器实验

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
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 文件名:sound.py
# 版本:
# author:
# 说明:在做这个项目的时候,要把指拨开关(BUTTON:UX3)的第6位拨到ON上,
# 做完实验之后,记得拨下来
# 可以扭那个电阻调节灵敏度,向左灵敏,向右不灵敏

# 导入树莓Pi GPIO库
import RPi.GPIO as GPIO
# 从time模块导入sleep函数
from time import sleep

# 定义声音传感器端口
makerobo_sound_pin = 18

# 暂时忽略警告
GPIO.setwarnings(False)
# 使用实际的PIN管脚编码
GPIO.setmode(GPIO.BOARD)

# 设置为输入脚,并设置为上拉为高电平(3.3V)
GPIO.setup(makerobo_sound_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

# 程序入口
if __name__ == "__main__":
try:
while True:
# 检查是否检测到声音
if(GPIO.input(makerobo_sound_pin)==GPIO.LOW):
print('Makerobo Sound Detected!')
sleep(0.1)
else:
print('Makerobo No Sound Detected!')
sleep(0.1)
except KeyboardInterrupt:
# 检测到CTRL+C,清除并退出脚本
GPIO.cleanup()

不是很灵敏就是了

image-20240105202324535

[toc]

换源

  • 清华源bookworm
1
2
3
4
5
6
7
8
9
10
11
cat >/etc/apt/sources.list<<EOF
# 清华源
deb https://mirrors4.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
#deb-src https://mirrors4.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb https://mirrors4.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
#deb-src https://mirrors4.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb https://mirrors4.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
#deb-src https://mirrors4.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
deb https://mirrors4.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware
#deb-src https://mirrors4.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware
EOF

在树莓派5(bookworm)上设置静态IP地址

随着 Raspberry Pi OS Bookworm 的发布,Raspberry Pi 上的网络改为使用 NetworkManager 作为网络的标准控制器,取代了之前的 dhcpcd 系统。 NetworkManager 包括一个名为nmcli的命令行工具,它可以控制 NetworkManager 并报告网络状态。

接下来,我将使用nmcli将网络配置为使用静态 IP 地址。

  • 找到网络接口名称(树莓派5有两张网卡wlan0和eth0,一般都叫这个,我的可能特别,但是教程都适用)
1
2
3
4
5
6
7
8
9
10
11
root@R5:~# sudo nmcli -p connection show
======================================
NetworkManager connection profiles
======================================
NAME UUID TYPE DEVICE
--------------------------------------------------------------------------------------------------->
preconfigured add9af6e-dda9-4bb5-b69c-845989b05ee4 wifi wlan0
docker0 b899dcfa-19fd-4c29-9aae-42e3851f29a3 bridge docker0
lo ddd0da87-3ac9-4752-9619-b744001c7f8f loopback lo
utun bbd48214-4665-4ec6-8f06-13b466e1829a tun utun
ztk4jl4ggs 6cb57bf8-5c8a-4833-aa72-3ff3f8c69788 tun ztk4jl4ggs

通过上面一堆的网卡,我们都没找到需要的eth0在哪里,反而找到其他的网卡,其实除了eth0wlan0其他都是我的虚拟网卡和本地回环网卡lo网卡

那我的物理网卡接口eth0呢!因为我没接线!所以用connection show是看不出来滴!所以采用更加原始的办法,用你们的tab补全弹出网卡选项

1
2
3
root@R5:~# nmcli device show 
docker0 help p2p-dev-wlan0 wlan0
end0 lo utun ztk4jl4ggs

这里就多出一个end0网卡了,我说它就是eth0你信吗?改个设备名字而已,别慌!!!就是它

因为,我没有接有线,有线网卡没有自动创建它的设备名称和对应的配置

所以,我接下来给它创建一个名称就叫R5_eth0

1
2
root@R5:~# nmcli connection add type ethernet ifname end0 con-name R5_eth0
Connection 'R5_eth0' (0e6c5292-f391-49be-b1f4-1981c5c26538) successfully added.

再看看

1
2
3
4
5
6
7
8
9
10
11
12
root@R5:~# sudo nmcli -p connection show
======================================
NetworkManager connection profiles
======================================
NAME UUID TYPE DEVICE
-----------------------------------------------------------------------------------------------------------------
preconfigured add9af6e-dda9-4bb5-b69c-845989b05ee4 wifi wlan0
docker0 b899dcfa-19fd-4c29-9aae-42e3851f29a3 bridge docker0
lo ddd0da87-3ac9-4752-9619-b744001c7f8f loopback lo
utun bbd48214-4665-4ec6-8f06-13b466e1829a tun utun
ztk4jl4ggs 6cb57bf8-5c8a-4833-aa72-3ff3f8c69788 tun ztk4jl4ggs
R5_eth0 0e6c5292-f391-49be-b1f4-1981c5c26538 ethernet --

额!为啥R5_eth0对应的设备是--而不是end0,我也不知道!但是我可以确认配置有没有生效!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@R5:~# cat /etc/NetworkManager/system-connections/R5_eth0.nmconnection
[connection]
id=R5_eth0
uuid=0e6c5292-f391-49be-b1f4-1981c5c26538
type=ethernet
interface-name=end0

[ethernet]

[ipv4]
method=auto

[ipv6]
addr-gen-mode=default
method=auto

[proxy]

很好,下一步,插上网线

设置静态ip、网关、dns

1
root@R5:~# nmcli connection modify R5_eth0 ipv4.addresses 192.168.0.30/24 ipv4.method manual connection.autoconnect yes ipv4.gateway 192.168.0.1 ipv4.dns 8.8.8.8

网卡启动

1
root@R5:~# nmcli connection up R5_eth0

然后就发现,静态ip设置成功

image-20231228214539257