Hero Image
树莓派5操作GPIO

在树莓派上操作GPIO lgpio 库详解与使用指南 lgpio 是一个用于 Linux 系统的 GPIO(通用输入输出)控制库,专门为树莓派等单板计算机设计。它提供了高性能的 GPIO 操作接口,支持: GPIO 读写操作 PWM 信号生成 舵机控制 中断处理 硬件定时器 lgpio 安装方法 在树莓派上安装 # 更新系统 sudo apt update sudo apt upgrade # 安装 lgpio sudo apt install python3-lgpio # 或者使用 pip 安装 pip3 install lgpio 验证安装 import lgpio print(lgpio.__version__) 核心功能 1. GPIO 设备管理 import lgpio # 打开 GPIO 设备 handle = lgpio.gpiochip_open(0) # 0 表示第一个 GPIO 控制器 # 关闭 GPIO 设备 lgpio.gpiochip_close(handle) 2. GPIO 配置 # 设置为输出模式 lgpio.gpio_claim_output(handle, gpio_pin, initial_value) # 设置为输入模式 lgpio.gpio_claim_input(handle, gpio_pin) # 设置为输入模式并启用上拉电阻 lgpio.gpio_claim_input(handle, gpio_pin, lgpio.PULL_UP) 3. GPIO 读写操作 # 写入 GPIO(输出模式) lgpio.gpio_write(handle, gpio_pin, value) # value: 0 或 1 # 读取 GPIO(输入模式) value = lgpio.gpio_read(handle, gpio_pin) # 返回 0 或 1 实际应用示例 示例 1:LED 控制 import lgpio import time class LEDController: def __init__(self, led_pin=18): self.led_pin = led_pin self.handle = None def init_led(self): """初始化 LED GPIO""" try: # 打开 GPIO 设备 self.handle = lgpio.gpiochip_open(0) if self.handle < 0: print("无法打开 GPIO 设备") return False # 设置 LED 引脚为输出模式 lgpio.gpio_claim_output(self.handle, self.led_pin, 0) print(f"LED 初始化成功,引脚: {self.led_pin}") return True except Exception as e: print(f"LED 初始化失败: {e}") return False def turn_on(self): """点亮 LED""" if self.handle is not None: lgpio.gpio_write(self.handle, self.led_pin, 1) print("LED 已点亮") def turn_off(self): """熄灭 LED""" if self.handle is not None: lgpio.gpio_write(self.handle, self.led_pin, 0) print("LED 已熄灭") def blink(self, times=5, interval=0.5): """LED 闪烁""" for i in range(times): self.turn_on() time.sleep(interval) self.turn_off() time.sleep(interval) def cleanup(self): """清理资源""" if self.handle is not None: lgpio.gpiochip_close(self.handle) self.handle = None print("LED 资源已清理") # 使用示例 if __name__ == "__main__": led = LEDController(led_pin=18) try: if led.init_led(): led.blink(3, 1.0) # 闪烁 3 次,间隔 1 秒 finally: led.cleanup() 示例 2:按钮输入检测 import lgpio import time class ButtonController: def __init__(self, button_pin=23): self.button_pin = button_pin self.handle = None self.last_state = None def init_button(self): """初始化按钮 GPIO""" try: self.handle = lgpio.gpiochip_open(0) if self.handle < 0: return False # 设置为输入模式,启用上拉电阻 lgpio.gpio_claim_input(self.handle, self.button_pin, lgpio.PULL_UP) print(f"按钮初始化成功,引脚: {self.button_pin}") return True except Exception as e: print(f"按钮初始化失败: {e}") return False def read_button(self): """读取按钮状态""" if self.handle is not None: # 读取按钮状态(上拉电阻,按下为 0,松开为 1) state = lgpio.gpio_read(self.handle, self.button_pin) return state == 0 # 返回 True 表示按下 def wait_for_press(self, timeout=None): """等待按钮按下""" start_time = time.time() while True: if self.read_button(): return True if timeout and (time.time() - start_time) > timeout: return False time.sleep(0.01) # 10ms 检测间隔 def cleanup(self): """清理资源""" if self.handle is not None: lgpio.gpiochip_close(self.handle) self.handle = None # 使用示例 if __name__ == "__main__": button = ButtonController(button_pin=23) try: if button.init_button(): print("按下按钮...") if button.wait_for_press(timeout=10): print("按钮已按下!") else: print("等待超时") finally: button.cleanup() 示例 3:舵机控制 import lgpio import time class ServoController: def __init__(self, servo_pin=18): self.servo_pin = servo_pin self.handle = None def init_servo(self): """初始化舵机""" try: self.handle = lgpio.gpiochip_open(0) if self.handle < 0: return False # 设置舵机引脚为输出模式 lgpio.gpio_claim_output(self.handle, self.servo_pin, 0) print(f"舵机初始化成功,引脚: {self.servo_pin}") return True except Exception as e: print(f"舵机初始化失败: {e}") return False def set_angle(self, angle): """设置舵机角度 (0-180度)""" if self.handle is None: print("舵机未初始化") return False try: # 计算脉冲宽度(微秒) min_pulse = 500 # 0.5ms max_pulse = 2500 # 2.5ms pulse_width = min_pulse + (angle / 180.0) * (max_pulse - min_pulse) # 使用 lgpio.tx_servo 控制舵机 lgpio.tx_servo(self.handle, self.servo_pin, int(pulse_width)) # 等待舵机转动 time.sleep(0.5) # 停止 PWM 信号 lgpio.tx_servo(self.handle, self.servo_pin, 0) print(f"舵机已转到 {angle} 度") return True except Exception as e: print(f"设置舵机角度失败: {e}") return False def cleanup(self): """清理资源""" if self.handle is not None: lgpio.tx_servo(self.handle, self.servo_pin, 0) lgpio.gpiochip_close(self.handle) self.handle = None print("舵机资源已清理") # 使用示例 if __name__ == "__main__": servo = ServoController(servo_pin=18) try: if servo.init_servo(): # 舵机转动演示 angles = [0, 45, 90, 135, 180, 90, 0] for angle in angles: servo.set_angle(angle) time.sleep(1) finally: servo.cleanup() 高级功能 PWM 控制 # 设置 PWM 频率和占空比 lgpio.tx_pwm(handle, gpio_pin, frequency, duty_cycle) # 停止 PWM lgpio.tx_pwm(handle, gpio_pin, 0, 0) 中断处理 # 设置 GPIO 中断回调 lgpio.callback(handle, gpio_pin, lgpio.RISING_EDGE, callback_function) 硬件定时器 # 创建硬件定时器 timer = lgpio.timer_start(frequency, callback_function) 注意事项 权限要求:需要 root 权限或 gpio 组权限 引脚冲突:避免使用系统保留的引脚 资源管理:及时清理 GPIO 资源 错误处理:添加适当的异常处理 性能考虑:避免过于频繁的 GPIO 操作 常见问题解决 权限问题 # 将用户添加到 gpio 组 sudo usermod -a -G gpio $USER # 重新登录后生效 引脚被占用 # 查看 GPIO 使用情况 gpioinfo # 释放被占用的引脚 sudo gpio unexportall 性能优化 使用适当的检测间隔 避免在循环中进行不必要的 GPIO 操作 考虑使用中断而不是轮询 总结 lgpio 是一个功能强大、性能优异的 GPIO 控制库,特别适合树莓派等单板计算机的硬件控制项目。通过合理使用其提供的功能,可以实现各种复杂的硬件控制应用。

Hero Image
在无显示屏状态下使用vnc登录树莓派

在树莓派上通过sd卡设置固定ip地址 安装操作系统 按照前序文章将操作系统安装到SD卡上。 如果树莓派不连接显示器,也无法连接鼠标键盘,此时我们可以在SD卡中直接设置固定IP地址以方便后续通过VNC-Viewer登录。 设置IP地址 将SD卡通过读卡器连接到电脑,直接打开SD卡,使用记事本打开cmdline.txt文件,在文件末尾增加 ip=192.168.1.200::192.168.1.1:255.255.255.0:rpi:eth0:off,需要注意的是在新增的内容前有一个空格。 修改完成之后将SD卡插入树莓派中,启动树莓派。 ssh登录 在windows上打开终端(如下图所示),通过指令登录树莓派 ssh登录树莓派 在终端输入以下指令登录树莓派 ssh rpi@192.168.1.200 # 回车后,如果需要输入密码,则输入密码即可,在输入过程中密码是不可见的,输入完密码,直接回车即可 如果在登陆时,如果提示REMOTE HOST IDENTIFICATION HAS CHANGED!,说明之前连接过相同IP地址,但不是当前设备。此时需要删除已经存在的host。 删除已经存在的host 在图示路径下打开known_hosts文件,删除我们访问的ip地址以及后面的公钥指纹。 配置VNC 开启VNC 成功登录树莓派后,在终端执行以下指令,并按照图示进行选择 sudo raspi-config 切换到x11服务 设置VNC分辨率 以上配置结束后,记得重新启动树莓派,以让所有配置生效 vnc-viewer 登录 经过测试,推荐使用VNC-VIEWER。 vncview 下载地址 mobaxterm下载地址 mobaxterm备用下载地址 VNC登录 使用 vnc-viewer ,输入树莓派IP地址,按照过程输入安装过程中设置的用户名以及密码即可。 帮助 如果vnc连接后打开的为灰色屏幕 # 使用 SSH 登录树莓派,输入以下指令查看 x11 服务是否启用 sudo systemctl status vncserver-x11-serviced.service # 如果没有启用,则输入以下指令启用 sudo systemctl enable vncserver-x11-serviced.service sudo systemctl start vncserver-x11-serviced.service

Hero Image
在无显示屏状态下登录树莓派

查找树莓派IP地址 当树莓派没有连接到显示屏时,需要借助第三方工具查找树莓派IP地址。 Advanced IP Scanner 下载地址:https://www.advanced-ip-scanner.com/ 备用下载地址:https://pan.baidu.com/s/1Gn4WzB7eWj082HQvlFAz_Q?pwd=y29q 下载后启动软件,在树莓派关机和开机状态下各扫描一次,看哪个设备为新增的设备,则该IP地址大概率是树莓派IP地址。 登录树莓派 ssh rpi@树莓派的IP地址 修改静态IP地址 编辑网络配置文件 sudo nano /etc/dhcpcd.conf 在文件末尾添加以下配置 # 配置静态IP地址 interface eth0 # 有线网络接口 static ip_address=192.168.1.100/24 # 设置静态IP地址和子网掩码 static routers=192.168.1.1 # 设置网关地址 static domain_name_servers=8.8.8.8 8.8.4.4 # 设置DNS服务器 # 如果使用WiFi,则配置wlan0接口 interface wlan0 # WiFi网络接口 static ip_address=192.168.1.101/24 static routers=192.168.1.1 static domain_name_servers=8.8.8.8 8.8.4.4 保存并退出 按 Ctrl + X 按 Y 确认保存 按 Enter 确认文件名 重启网络服务 sudo systemctl restart dhcpcd Ping 在笔记本电脑上通过Ping指令验证是否修改成功,需要提前确认该网络下没有IP地址冲突。 开启 VNC 方法一:通过raspi-config配置(推荐) 进入配置界面 sudo raspi-config 启用VNC服务 选择 Interface Options 选择 VNC 选择 Yes 启用VNC 选择 Finish 退出 设置VNC分辨率 再次进入 raspi-config 选择 Display Options 选择 VNC Resolution 选择合适的分辨率(如1920x1080或1280x720) 连接VNC客户端 Windows用户: 下载VNC Viewer

Hero Image
开机自启动

设置程序开机自启动 开机自启动项的实现在ubuntu以及linux操作系统中一般采用systemd;在docker中一般采用supervisor来实现。 systemd systemd是Ubuntu系统中非常重要的一个组件,可以提高系统的稳定性、安全性和可维护性。具体的来看systemd是一种用于管理Linux操作系统的系统和服务的守护进程,具有非常重要的作用: 启动和停止服务:systemd可用于管理系统中运行的所有服务,包括网络、文件系统、进程和应用程序。 管理系统进程:systemd可以在系统启动时自动启动特定的进程,也可以监控进程的运行状态并在必要时重新启动它们。 控制系统挂起和恢复:systemd可以监控系统的状态并在需要时进行挂起、休眠或恢复操作。 日志记录和故障排除:systemd提供了一个统一的日志系统,可以轻松地查看和分析系统日志,有助于诊断和解决故障。 定时任务管理:systemd的timer单元可以执行定时任务,比如定期备份系统数据等。 设置Python/Cpp程序在系统开机后自动启动 要在Ubuntu系统下将Python程序设置为开机自启动并在后台运行,可以按照以下步骤操作: 创建一个shell脚本文件 在Ubuntu系统中,可以使用sudo nano命令创建一个shell脚本文件,例如: sudo nano /usr/local/bin/myprogram.sh 在打开的文本编辑器中,输入以下内容: 一个使用服务开机后自动启动python程序的例子 #!/bin/bash /usr/bin/python3 /path/to/myprogram.py & # /usr/bin/python3 : 表示Python解释器的路径, # /path/to/myprogram.py : 表示Python程序的路径。 # & : 在脚本末尾添加一个&符号可以让程序在后台运行 给shell脚本文件添加执行权限 # 给刚刚创建的shell脚本文件添加执行权限: sudo chmod +x /usr/local/bin/myprogram.sh 创建一个systemd服务文件 执行以下命令,将创建一个systemd服务文件,该文件用来描述服务以告诉systemd如何来启动和停止它。 sudo nano /etc/systemd/system/myprogram.service 在打开的文本编辑器中,输入以下内容: [Unit] Description=My Python Program After=multi-user.target [Service] Type=idle ExecStart=/bin/bash /usr/local/bin/myprogram.sh [Install] WantedBy=multi-user.target 主要参数解释: [Unit] : 配置服务中的一个节,主要用来定义服务单元。该节下有以下几个属性可以设置:Description:指定服务的描述信息。 Documentation:指定服务的文档地址。Requires:指定服务的依赖关系,表示该服务依赖于指定的服务。Wants:指定服务的依赖关系,表示该服务希望指定的服务运行,但不是必须的。After:指定服务的启动顺序,表示该服务应该在指定的服务之后启动。Before:指定服务的启动顺序,表示该服务应该在指定的服务之前启动。Conflicts:指定服务的冲突关系,表示该服务与指定的服务不能同时运行。 [Service] : 配置服务中的一个节,主要用来定义服务属性。该节下有以下几个属性可以设置:Type:指定服务的进程类型,可选值包括simple、forking、oneshot、dbus和notify等。User:指定服务运行的用户。Group:指定服务运行的用户组ExecStart:指定服务启动时要执行的命令或脚本。ExecStop:指定服务停止时要执行的命令或脚本。WorkingDirectory:指定服务的工作目录。PIDFile:指定服务进程的PID文件路径。Restart:指定服务重启的行为,设定为no: 服务退出后不会自动重新启动。always: 无论退出原因如何,服务都将自动重新启动。on-success: 仅在服务以退出状态0(成功)退出时才自动重新启动。 on-failure: 仅在服务以退出状态非0(失败)退出时才自动重新启动。on-abnormal: 仅在服务以异常退出状态(如由信号导致的退出)退出时才自动重新启动。on-abort: 仅在服务以中止退出状态(如由程序自己退出)退出时才自动重新启动。on-watchdog: 仅在服务超时退出时才自动重新启动。需要使用WatchdogSec选项来启用看门狗定时器。可以使用逗号分隔符将多个选项组合在一起。例如,Restart=on-failure,always表示在服务以失败退出时重新启动服务,同时也会在服务因其他原因退出时自动重新启动。。TimeoutStartSec:指定服务启动超时时间。TimeoutStopSec:指定服务停止超时时间。ExecStartPre:设定延迟启动。

Hero Image
树莓派Arm配置 apt 源

树莓派Arm配置 apt 源 1. Backup sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 2. Update sudo apt-get update 3. Replace 参考链接 ubuntu 22.04 - arm architecture deb https://mirror.sjtu.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse deb https://mirror.sjtu.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse deb https://mirror.sjtu.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse deb https://mirror.sjtu.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse # deb https://mirror.sjtu.edu.cn/ubuntu-ports/ jammy-proposed main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu-ports/ jammy-proposed main restricted universe multiverse ubuntu 20.04 - arm architecture deb https://mirror.sjtu.edu.cn/ubuntu-ports/ focal main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu-ports/ focal main restricted universe multiverse deb https://mirror.sjtu.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse deb https://mirror.sjtu.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse deb https://mirror.sjtu.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse # deb https://mirror.sjtu.edu.cn/ubuntu-ports/ focal-proposed main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu-ports/ focal-proposed main restricted universe multiverse ubuntu 18.04 - arm architecture deb https://mirror.sjtu.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse deb https://mirror.sjtu.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse deb https://mirror.sjtu.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse deb https://mirror.sjtu.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse # deb https://mirror.sjtu.edu.cn/ubuntu-ports/ bionic-proposed main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu-ports/ bionic-proposed main restricted universe multiverse ubuntu 22.04 - x86_64 architecture deb https://mirror.sjtu.edu.cn/ubuntu/ jammy main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu/ jammy main restricted universe multiverse deb https://mirror.sjtu.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse deb https://mirror.sjtu.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse deb https://mirror.sjtu.edu.cn/ubuntu/ jammy-security main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu/ jammy-security main restricted universe multiverse # deb https://mirror.sjtu.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse ubuntu 20.04 - x86_64 architecture deb https://mirror.sjtu.edu.cn/ubuntu/ focal main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu/ focal main restricted universe multiverse deb https://mirror.sjtu.edu.cn/ubuntu/ focal-updates main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb https://mirror.sjtu.edu.cn/ubuntu/ focal-backports main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu/ focal-backports main restricted universe multiverse deb https://mirror.sjtu.edu.cn/ubuntu/ focal-security main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu/ focal-security main restricted universe multiverse # deb https://mirror.sjtu.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse ubuntu 18.04 - x86_64 architecture deb https://mirror.sjtu.edu.cn/ubuntu/ bionic main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu/ bionic main restricted universe multiverse deb https://mirror.sjtu.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse deb https://mirror.sjtu.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse deb https://mirror.sjtu.edu.cn/ubuntu/ bionic-security main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu/ bionic-security main restricted universe multiverse # deb https://mirror.sjtu.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse # deb-src https://mirror.sjtu.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse 4. Update sudo apt-get update