准备
硬件:CM4(4GB DDR+32GB EMMC 板载WIFI和蓝牙)
CM4-to-Pi4-Adapter
python GPIO 库:链接
安装 python GPIO 库
创建python GPIO库下载的工程路径
gh@ubuntu:~$ mkdir -p ~/project/raspberry_pi_hardware/gpio
下载python GPIO库
然后使用文件服务器(winscp,filezilla,mobaxterm等等),将下载的文件传到树莓派。或者其他方式,这取决于树莓派有没有桌面。
切换路径,并解压GPIO库。
gh@ubuntu:~$ cd ~/project/raspberry_pi_hardware/gpio/
gh@ubuntu:~/project/raspberry_pi_hardware/gpio$ ls
RPi.GPIO-0.7.0.tar.gz
gh@ubuntu:~/project/raspberry_pi_hardware/gpio$ tar -vxf RPi.GPIO-0.7.0.tar.gz
安装GPIO库
gh@ubuntu:~/project/raspberry_pi_hardware/gpio$ cd RPi.GPIO-0.7.0/
gh@ubuntu:~/project/raspberry_pi_hardware/gpio/RPi.GPIO-0.7.0$ ls
CHANGELOG.txt INSTALL.txt LICENCE.txt PKG-INFO README.txt RPi create_gpio_user_permissions.py setup.py source test
gh@ubuntu:~/project/raspberry_pi_hardware/gpio/RPi.GPIO-0.7.0$ sudo python3 setup.py install
以上步骤也可以直接用以下指令
pip install RPi.GPIO
pip install spidev
修改GPIO操作权限
gh@ubuntu:~$ ls -l /dev/gpiomem
crw------- 1 root root 239, 0 Sep 8 09:58 /dev/gpiomem
gh@ubuntu:~$ sudo chmod a+rw /dev/gpiomem
gh@ubuntu:~$ ls -l /dev/gpiomem
crw-rw-rw- 1 root root 239, 0 Sep 8 09:58 /dev/gpiomem
测试 python GPIO 库
gh@ubuntu:~/project/raspberry_pi_hardware/gpio$ mkdir gpio_control
gh@ubuntu:~/project/raspberry_pi_hardware/gpio$ cd gpio_control/
gh@ubuntu:~/project/raspberry_pi_hardware/gpio/gpio_control$ touch gpio_test1.py
gh@ubuntu:~/project/raspberry_pi_hardware/gpio/gpio_control$
gpio_test1.py文件输入内容如下:
注意:因为普通用户没有GPIO操作权限,因此需要使用sudo 命令执行脚本
import time
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")
GPIO.setmode(GPIO.BOARD) # BOARD编号方式,基于插座引脚编号
GPIO.setup(38, GPIO.OUT) # 输出模式
GPIO.setwarnings(False) # 禁止警告
# GPIO.setmode(GPIO.BCM) # 若使用BCM编号方式,上两行代码应这样写
# GPIO.setup(17, GPIO.OUT) # 对应为17号脚
try:
while True:
GPIO.output(38, GPIO.HIGH)
time.sleep(0.001)
GPIO.output(38, GPIO.LOW)
time.sleep(0.001)
except KeyboardInterrupt:
pass
GPIO.cleanup()
添加.py文件的可执行权限
gh@ubuntu:~/project/raspberry_pi_hardware/gpio/gpio_control$ ls -l
total 4
-rw-rw-r-- 1 gh gh 408 Feb 26 08:47 gpio_test1.py
gh@ubuntu:~/project/raspberry_pi_hardware/gpio/gpio_control$ chmod +x *.py
gh@ubuntu:~/project/raspberry_pi_hardware/gpio/gpio_control$ ls -l
total 4
-rwxrwxr-x 1 gh gh 408 Feb 26 08:47 gpio_test1.py
%% 执行
gh@ubuntu:python3 gpio_test1.py
实验现象分析:我们设置的矩形波频率为500Hz,但是示波器测出该矩形波频率为456Hz,也就是说python库的时时性比较差。
关于添加GPIO可执行权限的方法
参考:https://www.guyuehome.com/37647
首先,创建一个gpio组
groupadd -f -r gpio
然后把当前用户加入到gpio组
gpasswd -a username gpio
然后建立udev的规则文件:/etc/udev/rules.d/99-gpio.rules
cd /etc/udev/rules.d/
touch 99-gpio.rules
sudo chmod +777 99-gpio.rules
99-gpio.rules文件中输入:
SUBSYSTEM=="bcm2835-gpiomem", KERNEL=="gpiomem", GROUP="gpio", MODE="0666"
SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:gpio /sys/class/gpio/export /sys/class/gpio/unexport ; chmod 220 /sys/class/gpio/export /sys/class/gpio/unexport'"
SUBSYSTEM=="gpio", KERNEL=="gpio*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:gpio /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value ; chmod 660 /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value'"
查看树莓派GPIO定义的指令
gh@ubuntu:~/project/raspberry_pi_hardware/gpio/gpio_control$ gpio readall
+-----+-----+---------+------+---+---Pi ?---+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | ALT0 | 1 | 3 || 4 | | | 5v | | |
| 3 | 9 | SCL.1 | ALT0 | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 1 | ALT5 | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | ALT5 | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | OUT | 0 | 11 || 12 | 1 | 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 | ALT0 | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | ALT0 | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | ALT0 | 0 | 23 || 24 | 1 | OUT | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | OUT | 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 | 1 | 37 || 38 | 1 | 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 ?---+---+------+---------+-----+-----+