Raspberry Pi Documentation
入门
介绍
- Raspberry Pi,中文名为“树莓派”,简写为 RPi,是一款基于Debian GNU/Linux操作系统的微型计算机,由英国树莓派基金会开发并推出。
- 它小巧、便携,却有着强大的计算能力和丰富的扩展接口,广泛应用于物联网、嵌入式系统、教育、娱乐等领域。
- 树莓派官方推荐系统是 Raspberry Pi OS,除此之外,树莓派还支持许多操作系统:Ubuntu、RetroPie、LibreELEC、Apertis 和 Manjaro 等
器件准备
- TF卡读卡器
- 5V 3A电源适配器
- 至少 8GB 的TF卡
- micro HDMI 转HDMI线
- 带有HDMI接口的电脑显示器或电视(其它接口显示器可以用接口转换)
安装操作系统
使用官方工具安装系统(推荐使用)
- 树莓派官方开发了一款图形TF卡写入工具为Raspberry Pi Imager,适用Windows、Mac OS和Ubuntu等操作系统;
- 它会自动下载图像并将其安装到 SD 卡中,下载最新版本的Raspberry Pi Imager并安装它。
使用步骤
- 将TF卡连接电脑。
- 打开 Raspberry Pi Imager选择所需的操作系统。
- 选择要写入图像的 TF 卡(注意:最好移除其它U盘设备,以防将U盘文件擦除)。
- 预先配置系统,按住 CTRL+SHIFT+X(或点击右下角小齿轮),设置完成点击保存即可。
-
单击烧录按钮,将数据写入TF卡。
-
此时镜像就烧录成功了,拔掉读卡器,将TF卡插到树莓派上。
-
装入TF卡、连接外设,打开电源,树莓派就可以开机了。
使用其他工具安装系统
- 烧录镜像可以使用其它方法,使用镜像写入工具将下载好镜像写入树莓派,例如:balenaEtcher或Win32DiskImager 。
- 首先去树莓派官网下载镜像,推荐使用Raspberry Pi OS with desktop。
- Raspberry Pi OS with desktop版本的特点是有电脑桌面,对于普通用户来说,这个就够用了。
- Raspberry Pi OS Lite版本特点是没有电脑桌面,进入系统所有操作都要用命令行,由于没有UI界面,适合TF卡容量小和熟练掌握Linux操作使用,如果您没有linux基础,使用起来会非常艰难,入门还是建议选择带桌面的镜像。
- 镜像下载后需要先解压成.img文件格式才能被烧录软件识别。
- 烧录镜像前需要使用Panasonic_SDFormatter-SD卡格式化软件软件格式化TF卡。
Win32DiskImager
- 打开对应的烧录工具Win32DiskImager-烧录镜像软件
- 将TF卡插入读卡器,将读卡器插入电脑。
- 选择下载好的树莓派镜像文件。
- 单击“写入”并等待写入完成。
balena
- 下载安装balenaEtcher。
- 运行 balenaEtcher 并选择解压后的 Raspberry Pi OS 映像文件。
- 选择 TF 卡驱动器。
- 最后,点击刻录,将树莓派 OS 镜像写入 TF 卡。
- 烧录成功后拔掉TF卡插到树莓派上就可以运行了。
树莓派的操作系统
介绍
- Raspberry Pi OS 是基于 Debian 的免费操作系统,针对树莓派硬件进行了优化,是推荐在树莓派上正常使用的操作系统。该操作系统带有超过35,000个软件包:预编译软件以一种很好的格式捆绑在一起,便于安装在您的 树莓派上。
更新和升级树莓派操作系统
- 让您的树莓派保持最新状态非常重要。
- 第一个最重要的原因是安全性。由于树莓派系统的源代码会开源在Github上,就会暴露出源代码的漏洞。树莓派官方也会及时更新源代码修复漏洞,作为树莓派用户要避免漏洞带来的危害就是让您的软件保持最新。
- 第二个原因,与第一个相关,是您在设备上运行的软件肯定包含错误。一些错误是 CVE,但错误也可能会影响所需的功能,而与安全性无关。通过使您的软件保持最新,您可以降低遇到这些错误的机会。
使用 APT
-
管理安装、升级和删除软件的最简单方法是使用 Debian 的 APT,使您的操作系统保持最新
sudo apt update
-
使用以下命令将所有已安装的软件包升级到最新版本:
sudo apt upgrade
换源
- 树莓派默认软件源地址是国外的服务器地址,经常出现更新速度慢或者连不上的情况。
- 我们只需要将软件源换成国内镜像源这个问题就得以解决了。
- 推荐两个软件源:清华源和阿里源。
- 清华源
# armv7l 用户:编辑 `/etc/apt/sources.list` 文件,删除原文件所有内容,用以下内容取代 deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ bullseye main non-free contrib rpi # deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ bullseye main non-free contrib rpi # armv7l 用户如果需要开启 multi-arch 使用 arm64 软件源,需要在 `/etc/apt/sources.list` 中加上 deb [arch=arm64] http://mirrors.tuna.tsinghua.edu.cn/raspbian/multiarch/ bullseye main # aarch64 用户:编辑 `/etc/apt/sources.list` 文件,用以下内容取代: # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free # 对于两个架构,编辑 `/etc/apt/sources.list.d/raspi.list` 文件,删除原文件所有内容,用以下内容取代: deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bullseye main
- 阿里源
- 编辑 /etc/apt/sources.list 文件,删除原文件所有内容,用以下内容取代:
deb http://mirrors.aliyun.com/raspbian/raspbian/ bullseye main non-free contrib deb-src http://mirrors.aliyun.com/raspbian/raspbian/ bullseye main non-free contrib
- 编辑 /etc/apt/sources.list.d/raspi.list 文件,删除原文件所有内容,用以下内容取代:
deb http://mirrors.aliyun.com/raspberrypi/ bullseye main ui
实例
- 我们以清华源为例,首先通过确定你使用的系统的架构,在终端输入:
uname -m
-
修改默认配置文件,将里面内容替换成清华源。
sudo nano /etc/apt/sources.list
- 保存成功后,在终端输入:
sudo apt update
Linux操作基础
Linux
- Linux是一种通用的操作系统,它的网络功能非常强大,对内存等硬件的消耗也小,多用于网络服务器中。
- 极其稳定、极其安全、可移植性、可扩展性强。
- 具有开放源码、没有版权、技术社区用户多等特点,开放源码使得用户可以自由裁剪,灵活性高,功能强大,成本低。
- 缺点入门比Windows难,由于缺少桌面周边生态,使用Linux桌面系统的用户也非常少。
为什么学习Linux
- Linux系统被广泛应用在人们的日常生活用品中,如手机、智能家居、汽车电子、可穿戴设备等,只不过很多人不知道自己使用的电子产品里面运行的是Linux系统,例如我们用的安卓手机系统就是基于Linux内核开发的。
- 全球100万个顶尖领域中超过90%在使用Linux系统;全球大部分的股票交易市场是基于Linux系统部署的,包括纽交所、纳斯达克等;
- 全球知名的淘宝、亚马逊、易趣、沃尔玛等电子商务平台都在使用Linux系统。
- 参与Linux内核开发的开发人员和公司也是最多的、最活跃的。因此了解和学习Linux是十分重要的。
终端
- 计算机上的终端允许用户对其系统进行大量控制。Windows的用户可能已经接触过Command Promptor Powershell,而mac OS的用户可能已经熟悉了Terminal。所有这些工具都允许用户通过使用命令直接操作他们的系统。
-
由于早期并没有鼠标,所以Linux终端完全是由键盘和显示器完成工作的,这个做法一直沿用至今。可以使用键盘的Ctrl+Alt+t打开树莓派终端。
- pi 当前用户名/登录名
- raspberrypi 主机名
- ~ 当前用户所在的目录是/home/pi
- $ 字符表示当前登录的是普通用户啊
- # 字符表示登录的是root用户
- 在终端窗口中键入命令,然后按键盘上的回车键运行命令。
Linux 系统目录结构
-
在Windows中每一个分区都是一个树形结构,有多少个分区就有多少个树形结构,而Linux中只有一个树形结构,所有的文件、分区都是存在于一个树形结构中。在这个结构中,最上层的是根目录,其他所有的目录、文件、分区都是在根目录下建立的。读者可以通过ls /命令来查看整个根目录的文档,如图所示。
- 以下是对这些目录的解释:
常用目录
- /home:用户目录。
- 除了root用户外,其他所有的使用者的数据都存放在这个目录下,在树莓派的系统中,/home目录中有一个pi的子目录,这个就是pi用户的默认目录。
- /bin: 主要放置系统的必备执行文件目录。
- 放置与Linux系统有关(包括运行图形界面所需的)的二进制可执行文件,如ls、mkdir、rm等。
- /boot:引导目录。
- 用于存放系统引导程序,如linux内核以及启动配置文件,里面的config.txt也是用户配置使用频率最高的文件。
- /etc: 系统配置文件存放目录。
- 在这个目录中存放了几乎所有的Linux系统软件所需的配置文件,如果需要对这个目录中的文本进行修改,那么最好是先将需要修改的文件进行备份,以保证在修改之后还可以回到原来的状态。
其它目录
- /dev :设备目录。在Linux系统中,所有设备都视为文件,而在这个目录中存放了所有设备,例如第一个SATA硬盘或U盘会被识别为sda文件,而SATA硬盘或U盘第一个分区会被识别为sda1文件。
- /lib:基本系统的动态链接库存放位置,在这个目录中存放了可以维持一个基本系统启动所需要的库文件。如果没有这个目录,系统程序根本就无法工作。
- /lost + found/分区系统的目录。系统非正常关机而产生的文件通常都存放在这里,另外由fsck等程序进行硬盘修复后产生的文件也存放在这里。
- /media:linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux会把识别的设备挂载到这个目录下。
- /mnt:传统的外部设备挂载点。在早期的时候,除了系统分区外的其他分 区,如U盘等设备,都会被挂载到这个目录下以供用户读写。不过现在已经被 /media/取代。
- /proc:proc是一个虚拟文件系统。这个目录是存放在内存中的,因此不会占用硬盘空间,系统或用户通过读取这些设备来了解它们的信息。例如,可以使用cat /proc/cpuinfo命令来査看CPU信息。
- /root:该目录为系统管理员,也称作超级权限者的用户主目录。
- /srv:该目录存放一些服务启动之后需要提取的数据。
- /sys:与/proc目录一样,也是一个虚拟目录,是由内核中的sysfs系统来实现的,其作用与proc有些类似,但除了与proc具有相同的查看和设定内核参数功能之外,还有为Linux统一设备模型作为管理之用。
- /tmp:临时目录。由程序所产生的临时文件都会存放在该目录下,不用担心这个目录会占用太多的空间,因为每次系统启动都会清除这个目录的内容;同时这也是系统为数不多的拥有所有用户可读写属性的目录。
- /usr:Linux系统所安装的程序都是存放在该目录中的,如非必要请不要修改这个目录的内容。类似于windows下的program files 目录。
- /usr/src:内核源代码默认的放置目录。
- /run:用于存放系统启动时描述系统信息的文件。这个目录最初是在/var/目录下的,但是现在被提升到根目录下。
重要目录
- 在 Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。
- /etc:这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。
- /bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如ls就是在/bin/ls目录下的。
- /bin, /usr/bin是给系统用户使用的指令(除root外的普通用户),而/sbin,/usr/sbin则是给root使用的指令。
- /var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在/var/log目录下。
常见指令介绍
文件系统
sudo
- sudo命令以系统管理者的身份执行指令。
- 初次使用树莓派系统时,默认用户是pi ,密码为raspberry。
- 要想使用root帐号,或者说开启root用户,可使用pi用户登录,执行下面命令(此命令是给root账户设置密码的,当切换到root管理员后,此命令无效)
sudo su #切换为超级用户 su pi #切换普通用户
ls
- ls命令用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)。
- 常用的指令:
ls ls -a #显示所有文件及目录 (. 开头的隐藏文件也会列出) ls -l #除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出 ls -lh #文件大小以容易理解的格式列出,例如4K
- 想要学习了解指令更多参数,我们可以使用help指令来查看:
ls --help
chmod
- chmod命令是控制用户对文件的权限的命令。
- Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。
- 在下图中,显示了Linux根目录下的详细文件信息。在这些文件信息中, 最重要的就是第一列,它详细描述了文件和目录的权限,而第三与第四列则显示了这个文件和目录属于哪一个用户或组。
- Linux的文件属性可以分为三种:只读(r)、写(w)和可执行(x)。但是上面的文件属性却分为10小格,这是因为除了第一格显示目录外,另外三组每组三格分别表示文件所有者权限、同一组内的权限以及其他用户权限。
- 第一栏中如果显示d,则表示这是一个目录;如果是链接文件,则在这里显示l;如果是设备文件,则显示c。
- 第一个rwx栏位:-rwx------ 表示文件拥有者所拥有的权限。
- 第二个rwx栏位:---rwx--- 表示同一工作组内用户权限。
- 第三个rwx栏位:------rwx 表示其他用户权限。
- 例如:
- -rwx rwx rwx 表示无论哪个用户都可以对这个文件读写与执行。
- -rw- --- --- 表示只有文件拥有者有读写权限,但是没有执行权限。
- -rw -rw -rw 表示所有用户都有读写权。
- 符号模式
-
who(用户类型)
who 用户类型 说明 u user 文件所有者 g group 文件所有者所在组 o others 所有其他用户 a all 所用用户, 相当于 ugo
-
operator(符号模式表)
Operator 说明 + 为指定的用户类型增加权限 - 去除指定用户类型的权限 = 设置指定用户权限的设置,即将用户类型的所有权限重新设置
-
permission 的符号模式表
模式 名字 说明 r 读 设置为可读权限 w 写 设置为可写权限 x 执行权限 设置为可执行权限 X 特殊执行权限 只有当文件为目录文件,或者其他类型的用户有可执行权限时,才将文件权限设置可执行 s setuid/gid 当文件被执行时,根据who参数指定的用户类型设置文件的setuid或者setgid权限 t 粘贴位 设置粘贴位,只有超级用户可以设置该位,只有文件所有者u可以使用该位
-
符号模式实例
- 给file的所有用户增加读权限
chmod a+r file
- 删除file的所有用户的执行权限
chmod a-x file
- 给file的所有用户增加读写权限
chmod a+rw file
- 给file的所有用户增加读写执行权限
chmod +rwx file
- 对file的所有者设置读写权限,清空该用户组和其他用户对file的所有权限(空格代表无权限)
chmod u=rw,go= file
- 对目录waveshare和其子目录层次结构中的所有文件给用户增加读权限,而对用户组和其他用户删除读权限
chmod -R u+r,go-r waveshare
- 给file的所有用户增加读权限
-
who(用户类型)
- 八进制语法
-
chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者(User)的读、写、执行,用户组(Group)的读、写、执行以及其它用户(Other)的读、写、执行。
# 权限 rwx 二进制 7 读 + 写 + 执行 rwx 111 6 读 + 写 rw- 110 5 读 + 执行 r-x 101 4 只读 r-- 100 3 写 + 执行 -wx 011 2 只写 -w- 010 1 只执行 --x 001 0 无 --- 000
-
例如:765的解释如下:
- 所有者的权限用数字表达:属主的那三个权限位的数字加起来的总和。如 rwx ,也就是 4+2+1 ,应该是 7。
- 用户组的权限用数字表达:属组的那个权限位数字的相加的总和。如 rw- ,也就是 4+2+0 ,应该是 6。
- 其它用户的权限数字表达:其它用户权限位的数字相加的总和。如 r-x ,也就是 4+0+1 ,应该是 5。
-
常用的数字权限
- 400 -r-------- 拥有者能够读,其他任何人不能进行任何操作;
- 644 -rw-r–r-- 拥有者都能够读,但只有拥有者可以编辑;
- 660 -rw-rw---- 拥有者和组用户都可读和写,其他人不能进行任何操作;
- 664 -rw-rw-r-- 所有人都可读,但只有拥有者和组用户可编辑;
- 700 -rwx------ 拥有者能够读、写和执行,其他用户不能任何操作;
- 744 -rwxr–r-- 所有人都能读,但只有拥有者才能编辑和执行;
- 755 -rwxr-xr-x 所有人都能读和执行,但只有拥有者才能编辑;
- 777 -rwxrwxrwx 所有人都能读、写和执行(该设置不建议使用)。
-
实例
- 给file的所有用户增加读权限,拥有者和组用户可编辑权限
sudo chmod 664 file
- 给file的所有用户增加读权限,拥有者和组用户可编辑权限
-
chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者(User)的读、写、执行,用户组(Group)的读、写、执行以及其它用户(Other)的读、写、执行。
mkdir
- mkdir命令用于创建目录。
- 语法
mkdir [-p] dirName
- -p 确保目录名称存在,不存在的就建一个。
sudo mkdir waveshare
sudo mkdir -p waveshare/test
cd
- 切换当前工作目录。cd命令是最常用的Linux命令之一,用于切换用户当前的工作目录。如果需要快速回到登录用户的家目录,可以直接使用不带参数的cd命令来返回。
-
语法:
cd [dirName]
dirName:要切换的目标目录。
cd.. 返回上一层目录 cd /home 进入/home目录 cd 返回用户目录
touch
-
touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。
- 使用指令"touch"时,如果指定的文件不存在,则将创建一个新的空白文件。例如,在当前目录下,使用该指令创建一个空白文件"file",输入如下命令:
sudo touch file
cp
- cp命令主要用于复制文件或目录。 语法:
cp [options] source dest 或 cp [options] source... directory
- -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
- -d:复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式。
- -f:覆盖已经存在的目标文件而不给出提示。
- -i:与 -f 选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答y时目标文件将被覆盖。
- -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
- -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
- -l:不复制文件,只是生成链接文件。
sudo cp –r test/ newtest
mv
- mv命令用来为文件或目录改名、或将文件或目录移入其它位置。
-
语法:
mv [options] source dest mv [options] source... directory
-
参数:
- -b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。
- -i: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入y表示直接覆盖,输入n表示取消该操作。
- -f: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件。
- -n: 不要覆盖任何已存在的文件或目录。
- -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。
-
使用指令mv将当前目录test/下的file1文件复制到新目录/home/pi下,输入如下命令:
sudo mv file1 /home/pi
rm
- rm命令用于删除一个文件或者目录。
-
语法:
rm [options] name...
-
参数:
- -i 删除前逐一询问确认。
- -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
- -r 将目录及以下之档案亦逐一删除。
-
- 删除文件可以直接使用rm命令,若删除目录则必须配合选项"-r",例如:
sudo rm test.txt
- rm:是否删除 一般文件 "test.txt"? y
sudo rm homework
- rm: 无法删除目录"homework": 是一个目录
sudo rm -r homework
- rm:是否删除 目录 "homework"? y
reboot
- reboot命令用于用来重新启动计算机,更改树莓派的配置经常需要重启。 语法:
reboot [-n] [-w] [-d] [-f] [-i]
- -n : 在重开机前不做将记忆体资料写回硬盘的动作
- -w : 并不会真的重开机,只是把记录写到 /var/log/wtmp 档案里
- -d : 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d)
- -f : 强迫重开机,不呼叫 shutdown 这个指令
- -i : 在重开机之前先把所有网络相关的装置先停止
sudo reboot
shutdown
- 树莓派的关机是不能直接拔掉电源线的,因为树莓派会将内存作为暂存区,如果直接拔掉电源线会使一些在内存中的数据没有来得及写入SD卡中,从而造成数据的丢失或是损坏SD卡上的数据,造成系统无法启动。
-
语法
shutdown [-t seconds] [-rkhncfF] time [message]
-
参数
- -t seconds : 设定在几秒钟之后进行关机程序。
- -k : 并不会真的关机,只是将警告讯息传送给所有使用者。
- -r : 关机后重新开机。
- -h : 关机后停机。
- -n : 不采用正常程序来关机,用强迫的方式杀掉所有执行中的程序后自行关机。
- -c : 取消目前已经进行中的关机动作。
- -f : 关机时,不做 fsck 动作(检查 Linux 档系统)。
- -F : 关机时,强迫进行 fsck 动作。
- time : 设定关机的时间。
- message : 传送给所有使用者的警告讯息。
- 实例
- 立即关机
sudo shutdown -h now
- 指定 10 分钟后关机
sudo shutdown -h 10
- 重新启动计算机
sudo shutdown -r now
pwd
- 该pwd命令显示当前工作目录的名称:在树莓派上,输入pwd将输出类似/home/pi.
scp
- scp是用于通过SSH发送文件的命令,可以通过此命令来实现树莓派和Windows计算机之间的文件传输。
- 将文件从您的树莓派复制到您的windows计算机上:
-
将文件waveshare.py从树莓派复制到Windows计算机的当前目录,在终端上输入指令应为:
scp pi@192.168.10.30:waveshare.py .
- 回车,输入yes:
- 回车,输入树莓派的默认密码 raspberry:
- 此时我们就复制成功了:
- 将文件从您的计算机复制到您的树莓派用户:
-
- PS:直接点击右键空白处是不会出现Open PowerShell window here
-
使用以下命令将文件test.py从您的计算机复制到树莓派用户的/home/pi下:
scp test.py pi@192.168.10.30:
- 回车,输入树莓派的默认密码 raspberry:
此时我们就复制成功了:
head
tail
- 该tail显示文件的结尾。-c字节或-n行数指定文件中的起始点
df
zip
- zip命令用于压缩文件,zip 是个使用广泛的压缩程序,压缩后的文件后缀名为 .zip。
-
如果在我们在 /home/pi/waveshare 目录下,将这个目录下所有文件和文件夹打包为当前目录下的waveshare.zip,可以执行以下命令:
zip -q -r waveshare.zip *
unzip
tar
- tar命令是用来建立,还原备份文件的工具程序,它可以加入,解开备份文件内的文件。
-
压缩文件:
tar -cvzf waveshare.tar.gz *
-
解压文件:
tar -xvzf waveshare.tar.gz
tree
- 使用该tree命令将目录以及所有子目录和文件缩进为树结构。
wget
-
下载树莓派4数据表并将其另存为raspberry-pi-4-datasheet.pdf,使用
wget https://datasheets.raspberrypi.com/rpi4/raspberry-pi-4-datasheet.pdf
curl
- Linux curl命令是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。作为一款强力工具,curl支持包括HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。做网页处理流程和数据检索自动化,curl可以祝一臂之力。
-
语法:
curl (选项) (参数)
-
参数:
- -A/--user-agent <string> 设置用户代理发送给服务器
- -b/--cookie <name=string/file> cookie字符串或文件读取位置
- -c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中
- -C/--continue-at <offset> 断点续转
- -D/--dump-header <file> 把header信息写入到该文件中
- -e/--referer 来源网址
- -f/--fail 连接失败时不显示http错误
- -o/--output 把输出写到该文件中
- -O/--remote-name 把输出写到该文件中,保留远程文件的文件名
- -r/--range <range> 检索来自HTTP/1.1或FTP服务器字节范围
- -s/--silent 静音模式。不输出任何东西
- -T/--upload-file <file> 上传文件
- -u/--user <user[:password]> 设置服务器的用户和密码
- -w/--write-out [format] 什么输出完成后
- -x/--proxy <host[:port]> 在给定的端口上使用HTTP代理
- -#/--progress-bar 进度条显示当前的传送状态
-
基本用法:
执行以下命令,www.waveshare.net 的html就会显示在屏幕上:
curl http://www.waveshare.net
-
保存访问网页:
使用curl的内置option:-o(小写)保存网页,显示100%则表示保存成功:
curl -o waveshare.html http://www.waveshare.com
-
使用curl的内置option:-O(大写)保存网页中的文件,要注意这里后面的url要具体到某个文件,不然抓不下来
curl -O http://www.waveshare.com/hello.sh
-
测试网页返回值
curl -o /dev/null -s -w %{http_code} www.waveshare.com
-
利用curl下载文件:
使用内置option:-o(小写)和内置option:-O(大写)curl -o 1.png https://www.waveshare.net/wiki/文件:Test-1111.png
curl -O https://www.waveshare.net/wiki/文件:Test-1111.png
apt
- apt(Advanced Packaging Tool)是一个在 Debian 和 Ubuntu 中的 Shell 前端软件包管理器。
- apt 命令提供了查找、安装、升级、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。
- apt 命令执行需要超级管理员权限(root)。
- apt 常用命令
- 列出所有可更新的软件清单命令:sudo apt update
- 升级软件包:sudo apt upgrade
- 列出可更新的软件包及版本信息:apt list --upgradeable
- 升级软件包,升级前先删除需要更新软件包:sudo apt full-upgrade
- 安装指定的软件命令:sudo apt install <package_name>
- 安装多个软件包:sudo apt install <package_1> <package_2> <package_3>
- 更新指定的软件命令:sudo apt update <package_name>
- 显示软件包具体信息,例如:版本号,安装大小,依赖关系等等:sudo apt show <package_name>
- 删除软件包命令:sudo apt remove <package_name>
- 清理不再使用的依赖和库文件: sudo apt autoremove
- 移除软件包及配置文件: sudo apt purge <package_name>
- 查找软件包命令: sudo apt search <keyword>
- 列出所有已安装的包:apt list --installed
- 列出所有已安装的包的版本信息:apt list --all-versions
搜索
find
- Linux find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
-
通过文件名查找,例如我们查找waveshare.py文件:
find -name waveshare.py
-
通过文件嵌套层数查找。
- 文件查找最大层数为1,找出的文件全部在/etc目录下,例如我们查找/etc目录下的.conf文件:
find /etc/ -maxdepth 1 -name *.conf
- 文件查找最小层数为2,找出的文件不会包含/etc目录下文件,而是去/etc子目录查找。
find /etc/ -mindepth 2 -name *.conf
- 文件查找最大层数为1,找出的文件全部在/etc目录下,例如我们查找/etc目录下的.conf文件:
-
将当前目录及其子目录下所有最近 20 天内更新过的文件列出:
find . -ctime -20
-
查找/var/log目录中更改时间在7日以前的普通文件,并在删除之前询问它们:
find /var/log -type f -mtime +7 -ok rm {} \;
-
查找当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:
find . -type f -perm 644 -exec ls -l {} \;
-
查找系统中所有文件长度为0的普通文件,并列出它们的完整路径:
find / -type f -size 0 -exec ls -l {} \;
grep
cat
awk
- AWK 是一种处理文本文件的语言,是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
-
每行按空格或TAB分割,输出文本中的1、4项:
awk '{print $1,$4}' waveshare.txt
-
输出第一列大于2的行:
awk '$1>2' waveshare.txt
-
输出第一列等于2的行:
awk '$1==2' waveshare.txt
-
输出第一列大于2并且第三列等于'SQL'的行
awk '$1>2 && $3=="SQL"' waveshare.txt
-
输出包含 "Python" 的行:
awk '/Python/ ' waveshare.txt
-
awk -v # 设置变量
awk -va=1 '{print $1,$1+a}' waveshare.txt
awk -va=1 -vb=nice '{print $1,$1+a,$1b}' waveshare.txt
whereis
联网
ifconfig
hostname
- 该hostname命令显示系统的当前主机名。我们使用树莓派的时候经常需要使用远程工具,而默认的网络配置IP地址采用动态分配,会造成IP地址不确定的问题,当我们的树莓派IP地址发生变化时,可以使用主机名登录。
-
登录树莓派,修改hosts文件,命令如下:
sudo nano /etc/hosts
- 将raspberrypi替换成要修改的名字,例如waveshare,按下键盘Ctrl+x,按下键盘的y,回车确认:
-
修改hostname文件,将这里raspberrypi也替换成要修改的名字,例如waveshare,按下键盘Ctrl+x,按下键盘的y,回车确认:
sudo nano /etc/hostname
- 修改完成重启树莓派即可:
sudo reboot
- 修改主机名也可以用sudo raspi-config中 System Options
ping
-
该ping实用程序通常用于检查是否可以与另一台主机进行通信。它可以与默认设置一起使用,只需指定主机名或 IP 地址(例如ping 192.168.1.1)。-c它可以使用标志指定要发送的数据包数。
ping 192.168.1.1
nmap
- nmap是一个网络探索和扫描工具。它可以返回有关主机或主机范围的端口和操作系统信息。运行nmap将显示可用的选项以及示例用法。
-
先让我们ping一段地址范围,找到在线主机:
nmap -sP 192.168.10.1-255
配置
raspi-config 工具
- raspi-config是树莓派官方镜像自带的一个系统配置工具。
- 如果您使用的是树莓派桌面,则可以使用"首选项"菜单中的图形化" 树莓派配置"应用程序来配置树莓派。
- 要打开配置工具,请在命令行中键入以下内容:
sudo raspi-config
- 基本操作:键盘上的上、下键进行菜单项目的选择,回车键进入,左右键进行OK和cancel等按钮的选择,Esc键取消返回,空格键为选择定选项。最后改完后选择Finish退出即可,可能会重启。
- 任何更改都将在重新启动后生效,您可以通过编辑config.txt设置。
选项列表
System Options
- 树莓派的引导、登录和网络过程的各个部分进行配置更改。
- Wireless LAN:树莓派无线上网设置,选择要连接的网络。
- Audio:音频输出。
- Password:树莓派的默认用户是pi密码raspberry。如果你不想让别人访问你的Pi,可以点击change修改密码。
- Hostname:树莓派系统默认的主机名为raspberrypi,你可以修改自己专属的主机名 hostname:
- Boot / Auto Login:从此子菜单中,您可以选择是引导到控制台还是桌面,以及是否需要登录。如果您选择自动登录,您将以pi用户身份登录。
- Network at Boot:使用此选项等待网络连接,然后再继续引导。
- Splash Screen:启用或禁用启动时显示的启动画面。
Display Options
- D2 Underscan 去除屏幕周围的黑边,将overscan禁用掉来让系统充分利用整个屏幕。
- D4 Screen Blanking 启用/禁用屏幕空白。
- D5 VNC Resolution:设置远程桌面VNC的分辨率。
- D6 Composite:组合输出选项。
Interface Options
Performance Options
- P1 Overclock:适当的对树莓派的CPU进行超频,可以实现一些性能的提升,注意的是超频可能会减少树莓派的寿命,超频还会在一定程度上导致系统不稳定,建议不要更改,更改后会失去保修。
- P2 GPU Memory:给GPU分配内存。中央处理器(CPU)和图形处理器(GPU)。树莓派上的内存是分一些给CPU用,分一些给GPU用的,GPU占用的默认是128M。
- P3 Overlay File System :启用/禁用只读文件系统
Localisation Options Configure language and regional settings
- 本地化子菜单可以设置键盘布局、时区、区域设置和无线 LAN 国家代码。
Advanced Options
- A1 Expand Filesystem :允许您扩展文件系统。扩展文件系统将最大化分区的大小以匹配物理TF卡上可用的大小。
- A3 Compositor:启用/禁用xcompmgr组合管理器
- A4 Network Interface Names:切换网卡命名规则。
- A5 Network Proxy Settings:配置网络代理设置。
- A6 Boot Order:选择网络或USB设备启动。
- A7 Bootloader版本:选择最新或默认启动ROM软件。
Update
- 将raspi-config工具更新到最新版本。
About raspi-config
- 显示raspi-config版本信息。
config.txt 文件
- 由于树莓派并没有传统意义上的BIOS,为了替代BIOS的功能,树莓派使用SD卡第一“boot”分区上的“config.txt”文件存储配置项。树莓派的config.txt文件会在ARM内核初始化之前被GPU读取。它位于SD卡的/boot(引导)分区上,并且必须以root身份进行编辑。
- 更改里面的参数都需要重新启动树莓派后才会生效。Linux 启动后,您可以使用以下命令查看当前活动设置:
- vcgencmd get_config <config>:这会显示一个特定的配置值,例如查看树莓派4B的CPU默认主频:
vcgencmd get_config arm_freq
其中1800指的是1.8GHz。
- 对于一些最早期推出的树莓派4,还采用旧版供电模块的PCB,官方表示也可以通过手动修改config.txt文件来超频,而且只要加入arm_freq=1800一行命令就行了,如果运行不稳定的话,再按50MHz逐级下调就好了,或者稍微加点电压。
- config.txt文件由早期启动固件读取,因此文件格式非常简单。格式是每行上的单个property=value语句,其中value是整数或字符串。#通过以字符开头的一行,可以添加注释,或者可以注释掉和禁用现有的配置值。
AP
- 建议本地访问,将屏幕、鼠标、网线和键盘连接到您的树莓派,启动树莓派,确保树莓派软件源是最新的,可以使用命令更新:
sudo apt update
- 记下树莓派连接到的以太网的 IP 配置:
- 将192.168.4.0/24设置为树莓派无线客户端管理 IP 网络。如果 192.168.4.0/24这个网段IP 网络已被您的以太网 LAN 使用,请为无线选择另一个网段 IP 网络,例如192.168.10.0/24,
- 准备好无线客户端(笔记本电脑、智能手机……)来测试您的新无线网络。
安装 AP 和管理软件
-
为了让树莓派创建无线热点,树莓派需要安装hostapd:
sudo apt install hostapd
-
启用无线接热点服务,并将其设置为树莓派开机自启:
sudo systemctl unmask hostapd sudo systemctl enable hostapd
-
为了向无线客户端提供网络管理服务(DNS、DHCP),树莓派需要dnsmasq安装以下软件包:
sudo apt install dnsmasq
-
正常情况下,我们写入的iptables规则将会在系统重启时消失,让防火墙规则重启后依旧有效,安装netfilter-persistent及其插件iptables-persistent。:
sudo DEBIAN_FRONTEND=noninteractive apt install -y netfilter-persistent iptables-persistent
设置网络路由器
-
定义无线接口 IP 配置。
树莓派为无线网络运行 DHCP 服务器;这需要对树莓派中的无线接口 (wlan0)进行静态 IP 配置。树莓派还充当无线网络上的路由器的时候,我们一般会给它网络中的第一个 IP 地址:192.168.4.1.
要配置静态 IP 地址,请编辑配置文件dhcpcd,转到文件末尾并添加以下内容:
sudo nano /etc/dhcpcd.conf
interface wlan0 static ip_address=192.168.4.1/24 nohook wpa_supplicant
-
要让树莓派具有路由转发功能,需要配置一个树莓派的内核参数net.ipv4.ip_forward。这个参数指定了树莓派当前对路由转发功能的支持情况;其值为0时表示禁止进行IP转发;值为1时表示允许IP转发,请使用以下命令创建一个文件,其内容如下:
sudo nano /etc/sysctl.d/routed-ap.conf
# Enable IPv4 routing net.ipv4.ip_forward=1
-
防火墙伪装是树莓派本身内建了一种称作”伪装”的简单机制,设定要使用”IP伪装”时,它会将内部与外部两个网络桥接起来,并自动解译由内往外或由外至内的IP地址,通常这个动作称为网络地址转换。树莓派这种”IP伪装”法,就是把你的IP藏起来,不让网络上的其他人看到。那我们就利用树莓派自带防火墙伪装“IP”来配置路由器:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
-
现在保存 IPv4(包括上面的规则)和 IPv6 的当前防火墙规则,由于 iptables-persistent 在安装时已经把它作为一个服务设置为开机启动了,它在开机后会自动加载已经保存的规则:
sudo netfilter-persistent save
-
为无线网络配置 DHCP 和 DNS 服务。DHCP 和 DNS 服务由dnsmasq默认配置文件用作模板,重命名默认配置文件并编辑一个新的:
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig sudo nano /etc/dnsmasq.conf
将以下内容添加到文件并保存:
interface=wlan0 # Listening interface dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h # Pool of IP addresses served via DHCP domain=wlan # Local wireless DNS domain address=/gw.wlan/192.168.4.1 # Alias for this router
-
确保无线操作
世界各国对电信无线电频段的使用进行规范,在树莓派配置 WiFi 国家代码之前,5 GHz无线网络被禁用。在设置国家代码之前我们先禁用wifi,请执行以下命令:
sudo rfkill unblock wlan
此设置将在启动时自动恢复。接下来,我们将在接入点软件配置中定义适当的国家代码。
-
配置 AP 软件
创建hostapd位于 的配置文件,/etc/hostapd/hostapd.conf为您的新无线网络添加各种参数。
sudo nano /etc/hostapd/hostapd.conf
将以下信息添加到配置文件中。此配置假设我们使用的是通道 7,网络名称为waveshareRaspberry,密码为waveshare12345。请注意,名称和密码不应有引号。密码短语的长度应介于 8 到 64 个字符之间。
country_code=CN interface=wlan0 ssid=waveshareRaspberry hw_mode=g channel=7 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_passphrase=waveshare12345 wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP
注意这一行country_code=CN:它将计算机配置为在中国使用正确的无线频率。现在我们身处中国,所以我们填入我们的国家代码CN,如果您不知道您的国家代码可以去wikipedia查找。
要使用 5 GHz 频段,您可以将操作模式从 更改hw_mode=g为hw_mode=a。的可能值为hw_mode:
a = IEEE 802.11a (5 GHz)(树莓派 3B+ 以上)
b = IEEE 802.11b (2.4 GHz)
g = IEEE 802.11g (2.4 GHz)
-
运行新的无线 AP
现在重新启动您的树莓派并验证无线接入点是否自动可用。
sudo systemctl reboot
- 重新启动树莓派后,使用手机或者电脑就可以搜索无线网络。
HDMI配置
- 在树莓派4B上,有两个微型HDMI端口。最多可驱动两台显示器,分辨率高达1080p,刷新率为60Hz。在 4K分辨率下,如果连接两台显示器,则刷新率限制为30Hz。您还可以以60Hz的刷新率以4K驱动单个显示器:这要求显示器连接到与USB-C 电源输入相邻的 HDMI 端口(标记为 HDMI0)。hdmi_enable_4kp60=1您还必须通过在config.txt中设置标志来启用4Kp60 输出。
HDMI 组和模式
- HDMI 有两个常见的组:CEA(消费电子协会,电视通常使用的标准)和DMT(显示监视器计时,监视器通常使用的标准)。每个组都宣传一组特定的模式,其中一个模式描述了输出的分辨率、帧速率、时钟速率和纵横比。
模式支持
-
在使用tvservice命令前,需要将默认的KMS驱动修改为FKMS驱动,修改方法:打开/boot目录下config.txt文件:
sudo nano /boot/config.txt
在config.txt中将dtoverlay=vc4-kms-v3d
修改为dtoverlay=vc4-fkms-v3d
-
您可以tvservice在命令行来确定您的设备支持哪些模式以及其他有用的数据:
- tvservice -s显示当前 HDMI 状态,包括模式和分辨率
- tvservice -m CEA列出所有支持的CEA模式
- tvservice -m DMT列出所有支持的DMT模式
设置特定的HDMI模式
-
修改config.txt文件下 hdmi_group和hdmi_mode这两行可以设置HDMI输出格式CEA或DMT。模式选择分辨率和帧速率。结合模式表和使用上述tvservice命令来准确了解您的设备支持哪些模式。
hdmi_group=1 CEA模式
hdmi_mode 分辨率 频率 屏幕尺寸 备注 1 VGA(640×480) 60Hz 4:3 2 480p 60Hz 4:3 3 480p 60Hz 16:9 4 720p 60Hz 16:9 5 1080i 60Hz 16:9 6 480i 60Hz 4:3 7 480i 60Hz 16:9 8 240p 60Hz 4:3 9 240p 60Hz 16:9 10 480i 60Hz 4:3 四倍像素 11 480i 60Hz 16:9 四倍像素 12 240p 60Hz 4:3 四倍像素 13 240p 60Hz 16:9 四倍像素 14 480p 60Hz 4:3 四倍像素 15 480p 60Hz 16:9 四倍像素 16 1080p 60Hz 16:9 17 576p 50Hz 4:3 18 576p 50Hz 16:9 19 720p 50Hz 16:9 20 1080i 50Hz 16:9 21 576i 50Hz 4:3 22 576i 50Hz 16:9 23 288p 50Hz 4:3 24 288p 50Hz 16:9 25 576i 50Hz 4:3 四倍像素 26 576i 50Hz 16:9 四倍像素 27 288p 50Hz 4:3 四倍像素 28 288p 50Hz 16:9 四倍像素 29 576p 50Hz 4:3 四倍像素 30 576p 50Hz 16:9 四倍像素 31 1080p 50Hz 16:9 32 1080p 24Hz 16:9 33 1080p 25Hz 16:9 34 1080p 30Hz 16:9 35 480p 60Hz 4:3 四倍像素 36 480p 60Hz 16:9 四倍像素 37 576p 50Hz 4:3 四倍像素 38 576p 50Hz 16:9 四倍像素 39 1080i 50Hz 16:9 减少消隐 40 1080i 100Hz 16:9 41 720p 100Hz 16:9 42 576p 100Hz 4:3 43 576p 100Hz 16:9 44 576i 100Hz 4:3 45 576i 100Hz 16:9 46 1080i 120Hz 16:9 47 720p 120Hz 16:9 48 480p 120Hz 4:3 49 480p 120Hz 16:9 50 480i 120Hz 4:3 51 480i 120Hz 16:9 52 576p 200Hz 4:3 53 576p 200Hz 16:9 54 576i 200Hz 4:3 55 576i 200Hz 16:9 56 480p 240Hz 4:3 57 480p 240Hz 16:9 58 480i 240Hz 4:3 59 480i 240Hz 16:9 60 720p 24Hz 16:9 61 720p 25Hz 16:9 62 720p 30Hz 16:9 63 1080p 120Hz 16:9 64 1080p 100Hz 16:9 65 空 66 720p 25Hz 64:27 适用pi4 67 720p 30Hz 64:27 适用pi4 68 720p 50Hz 64:27 适用pi4 69 720p 60Hz 64:27 适用pi4 70 720p 100Hz 64:27 适用pi4 71 720p 120Hz 64:27 适用pi4 72 1080p 24Hz 64:27 适用pi4 73 1080p 25Hz 64:27 适用pi4 74 1080p 30Hz 64:27 适用pi4 75 1080p 50Hz 64:27 适用pi4 76 1080p 60Hz 64:27 适用pi4 77 1080p 100Hz 64:27 适用pi4 78 1080p 120Hz 64:27 适用pi4 79 1680×720 24Hz 64:27 适用pi4 80 1680×720 25Hz 64:27 适用pi4 81 1680×720 30Hz 64:27 适用pi4 82 1680×720 50Hz 64:27 适用pi4 83 1680×720 60Hz 64:27 适用pi4 84 1680×720 100Hz 64:27 适用pi4 85 1680×720 120Hz 64:27 适用pi4 86 2560×720 24Hz 64:27 适用pi4 87 2560×720 25Hz 64:27 适用pi4 88 2560×720 30Hz 64:27 适用pi4 89 2560×720 50Hz 64:27 适用pi4 90 2560×720 60Hz 64:27 适用pi4 91 2560×720 100Hz 64:27 适用pi4 92 2560×720 120Hz 64:27 适用pi4 93 2160p 24Hz 16:9 适用pi4 94 2160p 25Hz 16:9 适用pi4 95 2160p 30Hz 16:9 适用pi4 96 2160p 50Hz 16:9 适用pi4 97 2160p 60Hz 16:9 适用pi4 98 4096×2160 24Hz 256:135 适用pi4 99 4096×2160 25Hz 256:135 适用pi4 100 4096×2160 30Hz 256:135 适用pi4 101 4096×2160 50Hz 256:135 适用pi4 102 4096×2160 60Hz 256:135 适用pi4 103 2160p 24Hz 64:27 适用pi4 104 2160p 25Hz 64:27 适用pi4 105 2160p 30Hz 64:27 适用pi4 106 2160p 50Hz 64:27 适用pi4 107 2160p 60Hz 64:27 适用pi4 hdmi_group=2 DMT模式
hdmi_mode 分辨率 频率 屏幕尺寸 备注 1 640×350 85Hz 2 640×400 85Hz 16:10 3 720×400 85Hz 4 640×480 60Hz 4:3 5 640×480 72Hz 4:3 6 640×480 75Hz 4:3 7 640×480 85Hz 4:3 8 800×600 56Hz 4:3 9 800×600 60Hz 4:3 10 800×600 72Hz 4:3 11 800×600 75Hz 4:3 12 800×600 85Hz 4:3 13 800×600 120Hz 4:3 14 848×480 60Hz 16:9 15 1024×768 43Hz 4:3 不适用树莓派 16 1024×768 60Hz 4:3 17 1024×768 70Hz 4:3 18 1024×768 75Hz 4:3 19 1024×768 85Hz 4:3 20 1024×768 120Hz 4:3 21 1152×864 75Hz 4:3 22 1280×768 60Hz 15:9 减少消隐 23 1280×768 60Hz 15:9 24 1280×768 75Hz 15:9 25 1280×768 85Hz 15:9 26 1280×768 120Hz 15:9 减少消隐 27 1280×800 60Hz 16:10 减少消隐 28 1280×800 60Hz 16:10 29 1280×800 75Hz 16:10 30 1280×800 85Hz 16:10 31 1280×800 120Hz 16:10 减少消隐 32 1280×960 60Hz 4:3 33 1280×960 85Hz 4:3 34 1280×960 120Hz 4:3 减少消隐 35 1280×1024 60Hz 5:4 36 1280×1024 75Hz 5:4 37 1280×1024 85Hz 5:4 38 1280×1024 120Hz 5:4 减少消隐 39 1360×768 60Hz 16:9 40 1360×768 120Hz 16:9 减少消隐 41 1400×1050 60Hz 4:3 减少消隐 42 1400×1050 60Hz 4:3 43 1400×1050 75Hz 4:3 44 1400×1050 85Hz 4:3 45 1400×1050 120Hz 4:3 减少消隐 46 1440×900 60Hz 16:10 减少消隐 47 1440×900 60Hz 16:10 48 1440×900 75Hz 16:10 49 1440×900 85Hz 16:10 50 1440×900 120Hz 16:10 减少消隐 51 1600×1200 60Hz 4:3 52 1600×1200 65Hz 4:3 53 1600×1200 70Hz 4:3 54 1600×1200 75Hz 4:3 55 1600×1200 85Hz 4:3 56 1600×1200 120Hz 4:3 减少消隐 57 1600×1200 60Hz 16:10 减少消隐 58 1600×1200 60Hz 16:10 59 1600×1200 75Hz 16:10 60 1600×1200 85Hz 16:10 61 1600×1200 120Hz 16:10 减少消隐 62 1792×1344 60Hz 4:3 63 1792×1344 75Hz 4:3 64 1792×1344 120Hz 4:3 减少消隐 65 1856×1392 60Hz 4:3 66 1856×1392 75Hz 4:3 67 1856×1392 120Hz 4:3 减少消隐 68 1920×1200 60Hz 16:10 减少消隐 69 1920×1200 60Hz 16:10 70 1920×1200 75Hz 16:10 71 1920×1200 85Hz 16:10 72 1920×1200 120Hz 16:10 减少消隐 73 1920×1440 60Hz 4:3 74 1920×1440 75Hz 4:3 75 1920×1440 120Hz 4:3 减少消隐 76 2560×1600 60Hz 16:10 减少消隐 77 2560×1600 60Hz 16:10 78 2560×1600 75Hz 16:10 79 2560×1600 85Hz 16:10 80 2560×1600 120Hz 16:10 减少消隐 81 1366×768 60Hz 16:9 不适用pi4 82 1920×1080 60Hz 16:9 1080p 83 1600×900 60Hz 16:9 减少消隐 84 2048×1152 60Hz 16:9 减少消隐 85 1280×720 60Hz 16:9 720p 86 2366×768 60Hz 16:9 减少消隐
设置自定义HDMI模式
-
根据自己的显示器参数自定义设置CVT 模式:
hdmi_cvt=<宽度> <高度> <帧率> <尺寸> <边距> <交错> <rb>
- 例如,我们使用的是7寸显示屏,分辨率为1024×600,帧率是60Hz,长宽比是15:9,我们就可以在/boot/config.txt最后加入以下代码:
hdmi_cvt=1024 600 60 6 0 0 0 hdmi_group=2 hdmi_mode=87 hdmi_drive=1
- CVT参数含义是:
- 分辨率为1024×600
- 帧率60Hz
- 1=4:3, 2=14:9, 3=16:9, 4=5:4, 5=16:10, 6=15:9
- 0=禁用边距,1=启用边距
- 0=逐行,1=隔行
- 0=正常,1=减少消隐
- hdmi_group=2将HDMI输出组定义为DMT,但是我们查看DMT表格最后一个值是hdmi_mode=86,这里的hdmi_mode=87就是自定义模式。
- hdmi_drive 1表示普通 DVI 模式(无声音);2表示普通 HDMI 模式(如果支持并启用,将发送声音)
- CVT参数含义是:
旋转显示屏
- 在树莓派终端输入xrandr,查看主屏所在的HDMI-ID(大部分是HDMI-1):
-
输入以下命令可以旋转显示屏:
xrandr --output HDMI-1 --rotate normal 旋转0度 xrandr --output HDMI-1 --rotate left 旋转-90度 xrandr --output HDMI-1 --rotate right 旋转+90度 xrandr --output HDMI-1 --rotate inverted 旋转180度
板载模拟音频(3.5 毫米插孔)
- 修改config.txt文件来更改模拟音频的驱动方式,启用或禁用一些固件功能。
- audio_pwm_mode
- audio_pwm_mode=1从 3.5 毫米 AV 插孔中选择传统的低质量模拟音频。
- audio_pwm_mode=2(默认)使用高级调制方案选择高质量的模拟音频。
- disable_audio_dither
- 设置为1,可以禁止默认情况下的1LSB抖动音频输出。可解决某些情况下(如:将操作系统音量调小),产生的轻微背景噪音。
- enable_audio_dither
- 设置为1,可以强制对所有深度的音频使用音频抖动。
- pwm_sample_bits
- 该pwm_sample_bits用于调整模拟音频输出的位深度。默认位深度为11。
常用的开机自启
- 本小节以自启OLED_1in5_test.py程序为例,该程序绝对路径是/home/pi/python/example/OLED_1in5_test.py,请结合自己实际文件和路径修改对应位置。
桌面自启
- 首先我们使用如下命令新建一个startup.sh:(树莓派默认在/home/pi)
sudo touch startup.sh
- 打开startup.sh脚本文件,填入如下内容:
#!/bin/sh sudo python3 python/example/OLED_1in5_test.py
- 赋予startup.sh脚本文件权限:
sudo chmod 777 startup.sh
- 新建自启文件:
cd .config && mkdir autostart cd autostart && sudo vim start.desktop
- 填入如下内容:
[Desktop Entry] Type=Application Exec=/home/pi/startup.sh
- 重启树莓派:
sudo reboot
在rc.local脚本中添加开机自启动程序
- 打开/etc/rc.local脚本在exit 0前面增加一行:
sudo python3 /home/pi/python/example/OLED_1in5_test.py &
- 重启树莓派:
sudo reboot
系统管理器设置开机自启
- 在/etc/systemd/system/OLED_1in5_test.service新建一个自启服务对应的配置文件,填入如下内容:
[Unit] Description=start oled [Service] Type=simple Restart=always RestartSec=5 ExecStart=/home/pi/python/example/OLED_1in5_test.py [Install] WantedBy=multi-user.target
- 启用一个服务,使它在系统启动时自动启动:
sudo systemctl enable OLED_1in5_test.service
- 重启:
sudo systemctl restart OLED_1in5_test.service
- 重启树莓派:
sudo reboot
- 如果想要禁用一个服务,使它在系统启动时不会自动启动:
sudo systemctl disable OLED_1in5_test.service
USB启动
- 由于TF卡读写速度相对比较慢,对性能就会有影响,我们可以将高速的固态硬盘通过USB接口来连接树莓派,使用USB启动,对树莓派的性能会有较大的提升。
器材准备
- 树莓派4B主板
- TF卡读卡器
- 5V 3A电源适配器
- 至少 8GB 的TF卡
- Micro HDMI 转HDMI线
- 带有HDMI接口的电脑显示器或电视
- 带有USB转接口的固态硬盘,不推荐使用U盘和机械硬盘,读写速度提升不大
使用Raspberry Pi Imager设置USB启动
树莓派烧录引导程序
- 将TF卡插入读卡器连接电脑,打开Raspberry Pi Imager软件。
- 选择操作系统下的Misc utility images—>Bootloader—>USB Boot
- 等待引导程序烧录完成后,我们将TF卡插到树莓派上开机。
- 第一次开机需要耐心等待,当绿色LED将以稳定模式闪烁,7inch显示屏将呈绿色(或屏幕闪烁绿色),此时关闭树莓派并取出TF卡。
给固态硬盘安装树莓派系统
- 打开Win32DiskImager或者Raspberry Pi Imager烧录镜像。
- 安装完成系统后,将固态硬盘插入树莓派的USB3.0接口,等待开机成功就从硬盘启动树莓派系统了。
使用 raspi-config 设置USB启动
- 将树莓派官方系统烧录到TF卡插到树莓派上开机,开机完成后,打开树莓派终端输入raspi-config
- 选择Advanced Options—>Bootloader Order—>选择USB启动,重启树莓派。
适用于Ubuntu18.04和Ubuntu20.04
- 上述教程只支持树莓派官方系统和Ubuntu22.04系统,对于想使用Ubuntu18.04系统和Ubuntu20.04系统的同学,还需要做如下配置:
更新EEPROM
- 使用Raspberry Pi Imager烧录过引导程序就可以无需在升级EEPROM。
- 使用树莓派官方系统raspi-config方法需要升级EEPROM,输入如下指令:
sudo apt update sudo apt full-upgrade
更新固件
更新config.txt文件
- Ubuntu18.04
- 使用记事本打开config.txt文件,将[pi4]部分替换如下内容:
[pi4] max_framebuffers=2 dtoverlay=vc4-fkms-v3d boot_delay kernel=vmlinuz initramfs initrd.img followkernel
- 对于Ubuntu18.04完成上述步骤,直接将 SSD 接入USB3.0的口启动即可使用。无需后面的操作。
- Ubuntu20.04
- 使用记事本打开config.txt文件,将[pi4]部分替换如下内容:
[pi4] max_framebuffers=2 dtoverlay=vc4-fkms-v3d boot_delay kernel=vmlinux initramfs initrd.img followkernel
解压内核(Ubuntu20.04后的版本需解压内核)
- 找到vmlinuz使用7-zip工具解压缩后,将解压出来的vmlinuz~重命名为vmlinux
创建自动解压缩脚本
- 在更新 Ubuntu 或其众多软件包之一期间,apt将创建一个新的内核映像。此映像将被压缩,并会导致树莓派在更新后无法启动。为了解决这个问题,需要创建一个脚本来在更新后解压缩新的内核映像。
- 使用SSH远程软件连接树莓派,树莓派的IP地址查找参考 IP地址查询部分。
- 登录名和登录密码都是ubuntu
- 第一次登录,会进行一次密码修改。
- 先输入当前默认密码:ubuntu,系统会提示你输入新的密码,输入新的密码后,系统让你确认新密码。
- 修改成功SSH会自动断开,重新登陆使用修改后的密码。
- 创建解压脚本
sudo nano /boot/firmware/auto_decompress_kernel
脚本内容如下
#!/bin/bash -e # auto_decompress_kernel script #Set Variables BTPATH=/boot/firmware CKPATH=$BTPATH/vmlinuz DKPATH=$BTPATH/vmlinux #Check if compression needs to be done. if [ -e $BTPATH/check.md5 ]; then if md5sum --status --ignore-missing -c $BTPATH/check.md5; then echo -e "\e[32mFiles have not changed, Decompression not needed\e[0m" exit 0 else echo -e "\e[31mHash failed, kernel will be compressed\e[0m" fi fi #Backup the old decompressed kernel mv $DKPATH $DKPATH.bak if [ ! $? == 0 ]; then echo -e "\e[31mDECOMPRESSED KERNEL BACKUP FAILED!\e[0m" exit 1 else echo -e "\e[32mDecompressed kernel backup was successful\e[0m" fi #Decompress the new kernel echo "Decompressing kernel: "$CKPATH".............." zcat $CKPATH > $DKPATH if [ ! $? == 0 ]; then echo -e "\e[31mKERNEL FAILED TO DECOMPRESS!\e[0m" exit 1 else echo -e "\e[32mKernel Decompressed Succesfully\e[0m" fi #Hash the new kernel for checking md5sum $CKPATH $DKPATH > $BTPATH/check.md5 if [ ! $? == 0 ]; then echo -e "\e[31mMD5 GENERATION FAILED!\e[0m" else echo -e "\e[32mMD5 generated Succesfully\e[0m" fi #Exit exit 0
设置自动运行
- 为了让我们刚刚创建的脚本在每次安装包时都能被调用
sudo nano /etc/apt/apt.conf.d/999_decompress_rpi_kernel #写入以下内容 DPkg::Post-Invoke {"/bin/bash /boot/firmware/auto_decompress_kernel"; }; #设置为可运行权限 cd /etc/apt/apt.conf.d/ sudo chmod +x 999_decompress_rpi_kernel
- 完成设置后,我们可以使用apt安装软件包测试。
登录
配置SSH
配置SSH(有显示器)
- 从电脑上取出SD卡,将SD卡安装到树莓派,给树莓派连接上鼠标键盘显示器,开机。
- 打开树莓派终端输入raspi-config进入设置界面,选择 Interface Options。
- 进入Interfaces选项卡。
- 选择SSH旁边的Enable。
- 点击OK。
- 重启树莓派。
配置SSH(无显示器)
- 用户使用的是官方bullseye镜像需要自行开启SSH。
- 开启方法如下:
- 如果你还需要配置WIFI,请不要取出TF卡。
配置WLAN
- 在支持 5GHz 频段(Pi3B+、Pi4、CM4、Pi400)的树莓派设备上,出于监管原因,在设置国家代码之前禁用无线网络。要设置国家代码。
配置WLAN(有显示器)
- 打开终端输入sudo raspi-config,选择 Localisation Options Configure language and regional settings,按下回车。
- 选择L4:WLAN Country Set legal wireless channels for your country,按下回车。
- 找到你所在国家的国家代码,现在我们身处中国,所以我们国家代码CN,如果你不知道你的国家代码可以去wikipedia查找。选择CN China,按下回车,OK确认。
- 按下OK确认后就会回到初始的设置界面,按下Finish,系统会提示你重启树莓派,选择Yes,等待树莓派重启后就可以搜到您的无线网络,输入无线网络密码就连接成功了。
配置WLAN(无显示器)
- 考虑到并非每个用户有显示屏和键盘给树莓派使用
- 在这里我们提供一个方法,可以通过读卡器配置WLAN无线网络
- 在 SD 卡上创建映像后,将其插入读卡器即可访问引导文件夹。
- 将某些文件添加到此文件夹将在 Raspberry Pi 首次启动时激活某些设置功能。
- 新建一个记事本文件:
- 打开并输入对应内容('假设我在中国,无线名称test,无线密码密码为12345678):
country=CN update_config=1 ctrl_interface=/var/run/wpa_supplicant network={ ssid="test" psk="12345678" key_mgmt=WPA-PSK }
- 关闭记事本并保存:
- 记事本重命名为wpa_supplicant.conf:
- 将SD卡安全弹出,插上树莓派。
- 树莓派连接到电源后,请确保等待几分钟(最多 5 分钟)以使其启动并在网络上注册。
获取树莓派的IP地址
路由器获取
智能手机获取(仅适用苹果手机)
- 使用智能手机获取 Pi 的 IP 地址,在应用商店搜索Fing应用程序,它是一款适用于智能手机的免费网络扫描仪
- 注意:您的手机和树莓派必须在同一网络上,因此请将您的手机连接到正确的无线网络。
- 打开 Fing 应用程序时,触摸屏幕左上角的设备扫描。
- 几秒钟您将获得一个设备连接列表 其中包含连接网络的所有设备。
- 此时我们就成功获取树莓派的IP地址:192.168.0.105。
使用Advanced IP Scanner
- 你可以通过一些局域网IP扫描工具,这里以Advanced IP Scanner为例程
使用nmap指令获取
- 下载并安装nmap,否则计算机无法识别该指令。
- 按住键盘WIN+R,输入cmd,打开终端。
- 在使用nmap指令前我们需要知道我们电脑的IP地址,通过电脑的IP地址我们才能知道IP网段,再去使用nmap扫描这个网段下的设备。
ipconfig
- 如果您的 IP 地址是192.168.1.5,则其他设备的地址将在这个192.168.1.0/24子网范围内(这涵盖192.168.1.0到192.168.1.255)。
- 我的计算机是192.168.0.104。现在在整个子网范围上使用nmap带有标志(ping 扫描)的命令。-sn这可能需要几秒钟:
nmap -sn 192.168.0.0/24
- 此时我们就成功获取树莓派的IP地址:192.168.0.105。
远程登陆
有时您需要访问树莓派而不将其连接到显示器,任何连接到局域网的设备都被分配了一个 IP 地址。在上一章节我们学习了如何获取 Pi 的 IP 地址。下面我来学习如何远程访问Pi。
- 确保树莓派连接到网络,无论是通过WLAN或者网线。
- 确保树莓派与你的电脑出于一个路由器下或同一网段。
- 确保树莓派开启对应的远程登录功能。
在4月4日树莓派官方对Raspberry Pi OS Bullseye进行了一次更新,此次更新删除了树莓派默认账户pi。
第一次登录树莓派需要创建一个自己账户,在创建用户帐户之前,您无法登录树莓派,我们可以在桌面新建一个userconf.txt文档,里面加入如下图所示:
pi:$6$c70VpvPsVNCG0YR5$l5vWWLsLko9Kj65gcQ8qvMkuOoRkEagI90qi3F/Y7rm8eNYZHW8CY6BOIKwMH7a3YYzZYL90zf304cAHLFaZE0
保存成功后,将userconf.txt复制到树莓派uboot目录下。默认账户是“pi” 密码是raspberry。
如果想要自定义用户名和登录密码,最简单的方法使用Raspberry Pi Imager或者显示器设置。
如果想生成自己的userconf.txt内容,可以使用如下指令设置
echo '你的密码' | openssl passwd -6 -stdin
例如设置的密码为:12345678,那userconf.txt内容为:
cm4:$6$E9yEBJOesm27lrGZ$PCtGBDX7GMqUHHkO4QTcMQd7UnED5tc0tvOKwd7QIiMxVlq9UYebsqvGe4X9celqUVbLYdAvwuTowiYwvpWwG1
SSH登录
确保SSH功能开启,这里使用Windows自带的SSH登录指令
- 同时按win键和R键,输入cmd,回车,打开命令行
- 假设你获取到的地址为192.168.10.36,,指令就应为:
ssh pi@192.168.10.36
- 输入yes确认:
- 输入树莓派的默认密码 raspberry:
- 这里SSH就登录成功了:
PUTTY登录
- 打开对应的烧录工具putty,点击session,在IP adress输入树莓派的IP地址:
- 选择Accept(接受):
- 登录名为pi,密码是raspberry:
- 这里就登录成功了:
VNC登录
MobaXterm登录
主机名登录
- 修改主机名方法在前面已经介绍过了,可以参考 hostname和 System Options部分。
-
使用主机名登录,只需把前面输入IP地址的部分换成主机名就可以了,以putty为例:
配置静态IP地址
- 当我们的树莓派IP地址发生变化时,除了前面学习的可以使用主机名登录,还可以给树莓派配置静态的IP地址。
-
配置IP地址注意事项:
- 静态IP地址与路由器网段一致。
- 不能与路由器分配出去的IP地址发生冲突,否则树莓派可能无法正常联网。
- 可以使用当前路由器给树莓派分配的IP地址。
-
第一步查找默认网关,按住键盘的Win+R,输入cmd,打开电脑的终端。
ipconfig
-
第二步修改树莓派DHCP配置文件,输入指令:
sudo nano /etc/dhcpcd.conf
在文件末尾加入:
interface eth0 static ip_address=树莓派的IP地址/24 static routers=默认网关 static domain_name_servers=默认网关 8.8.8.8
例如我们的树莓派地址是192.168.10.40,默认网关是192.168.10.1。
interface eth0 static ip_address=192.168.10.40/24 static routers=192.168.10.1 static domain_name_servers=192.168.10.1 8.8.8.8
Ctrl+s保存,Ctrl+x退出。
-
最后一步重启树莓派:
sudo reboot
NFS(简单)
- 有时候我们在需要在自己的电脑与树莓派或树莓派与树莓派之间进行文件互传时我们传统的方式是利用u盘进行,但是我们如果在树莓派上配置NFS文件存储服务器的话我们完全可以通过网络非常方便的完成我们的这个繁杂的步骤,搭建的过程也非常简单。
设置NFS服务器
-
安装NFS服务端到树莓派
- 先下载NFS需要的基础服务:
sudo apt install portmap
- 安装NFS核心服务器:
sudo apt install nfs-kernel-server
- 先下载NFS需要的基础服务:
- 修改NFS文件服务配置
-
启动nfs服务
- 重启nfs服务:
sudo /etc/init.d/nfs-kernel-server restart
- 重启nfs服务:
设置NFS客户端
-
我们在使用另一块树莓派或其他Linux电脑通过mount命令进行挂载,具体挂载的例子如下:
sudo mount -t nfs -o nolock 192.168.10.46:/mnt/nfs /tmp
- 其中192.168.10.46是服务器的IP地址,此处根据自己实际IP填写.
-
我们可以通过df命令验证是否配置成功:
-
在服务端建立一个测试文件,在客户端目录可以查看使用:
NFS(复杂)
网络文件系统 (NFS) 允许您与同一网络上的其他计算机或设备共享位于一台联网计算机上的目录。目录所在的计算机称为服务器,连接到该服务器的计算机或设备称为客户端。客户端通常mount将共享目录使其成为自己目录结构的一部分。共享目录是共享资源或网络共享的一个示例。
- 注意:本实例是采用两块树莓派4B搭建,分别做服务端和客户端,服务端的IP地址是:192.168.10.36
设置NFS服务器
-
使用以下命令安装所需软件包:
sudo apt install nfs-kernel-server
-
我们要创建用户NFS导出的主目录:
sudo mkdir -p /export/users
-
给我们导出用户的主目录777权限:
sudo chmod 777 /export/users
-
将导出主目录挂载到/export/users下
sudo mount --bind /home/users /export/users
-
为了避免我们在每次重新启动后重新输入,在/etc/fstab最后一行添加:
sudo nano /etc/fstab
修改完成后Ctrl+X,按y确认:/home/users /export/users none bind 0 0
-
将NEED_SVCGSSD设置为"no"
sudo nano /etc/default/nfs-kernel-server
-
设置共享服务器的目录,我们将以下两行添加到/etc/exports末尾:
sudo nano /etc/exports
/export 192.168.10.0/24(rw,fsid=0,insecure,no_subtree_check,async) /export/users 192.168.10.0/24(rw,nohide,insecure,no_subtree_check,async)
-
设置对指定客户端的访问,首先阻止所有客户端,修改配置文件,在/etc/hosts.deny最后一行添加:
sudo nano/etc/hosts.deny
rpcbind mountd nfsd statd lockd rquotad : ALL
-
设置允许访问服务器客户端,修改配置文件,服务器和所有客户端的 IP 地址列表添加到/etc/hosts.allow末尾:
sudo nano /etc/hosts.allow
rpcbind mountd nfsd statd lockd rquotad : 192.168.10.0/24
- 最后需要重启服务生效:
sudo systemctl restart nfs-kernel-server
配置NFS客户端
- 身份验证,在/etc/idmapd.conf末尾添加:
sudo nano /etc/idmapd.conf
[Translation] Method = nsswitch
-
下载客户端所需的安装包:
sudo apt install nfs-common
-
挂载完整导出树到mnt下:
sudo mount -t nfs -o proto=tcp,port=2049 192.168.10.36:/ /mnt
- 在/home下新建一个用来挂载服务端目录:
sudo mkdir -p /home/users
-
将服务端/users挂载到客户端的/home/users下:
sudo mount -t nfs -o proto=tcp,port=2049 192.168.10.36:/users /home/users
-
为了避免我们在每次重新启动后重新输入,在/etc/fstab最后一行添加:
192.168.10.36:/ /mnt nfs auto 0 0
-
我们可以验证是否配置成功,在服务端建立一个测试文件,在客户端目录可以查看使用:
sudo nano test.py
或者使用命令:df -hT
文件共享(samba)
我们使用树莓派的时候经常要在windows和树莓派之间进行文件传输,使用samba服务可实现文件共享。在windows的网上邻居即可访问树莓派文件系统,非常方便。
-
首先更新源,命令如下:
sudo apt update
- 运行如下命令安装samba:
sudo apt install samba samba-common-bin
-
安装完成后,修改配置文件/etc/samba/smb.conf:
sudo nano /etc/samba/smb.conf
将homes下的 read only = yes 改成 read only = no
- 重启samba服务:
sudo /etc/init.d/samba-ad-dc restart
-
添加默认用户pi到samba,设置密码和确认密码即可:
sudo smbpasswd -a pi
-
访问树莓派,在Windows地址栏输入:
\\192.168.10.30\pi
-
输入名称pi和前面设置的密码:
-
此时就可以看到树莓派的目录了:
GPIO
说明
- GPIO全称:通用型输入输出端口(General-purpose input/output)
- 树莓派引脚分类
- 电源引脚:5v,3.3v,GND(Ground)。
- 常规GPIO控制引脚:可以通过编写程序控制这些引脚的高低电平。
- 特殊GPIO通讯引脚: SPI通讯,12C通讯,TxD/RxD串口通讯。
- 树莓派引脚编码
- 终端窗口查看引脚编号
- 在终端输入指令:
pinout
- 使用树莓派输入gpio readall命令查看pin状态
- 输入以下命令安装Git:
sudo apt install git-core
- 输入以下命令,将 WiringPi 文件下载到树莓派系统的当前目录。
sudo git clone https://github.com/WiringPi/WiringPi
- 耐心等待其安装完成。下载完成后,我们可以在当前目录下看到一个WiringPi文件夹。如下所示。
- 输入以下命令进入 WiringPi 文件夹目录。
cd WiringPi/
- 输入以下命令安装 WiringPi。
sudo ./build
- 耐心等待它的安装完成。当我们看到下面的界面没有任何错误时,就意味着安装完成了。
- 输入以下命令查看gpio的版本。
gpio -v
- 最后,我们可以查看树莓派各个管脚的状态,输入指令:
gpio readall
- 在终端输入指令:
使用RPi.GPIO模块
- RPi.GPIO是Python的一个模块,树莓派默认已经安装了该模块。本节详细介绍如何使用Python的RPi.GPIO模块控制GPIO。
- 导入RPi.GPIO模块
import RPi.GPIO as GPIO
- 设置指定模式(强制)管脚编号
GPIO.setmode(GPIO.BOARD) #物理引脚编码 GPIO.setmode(GPIO.BCM) #BCM编码
- 设置禁用警告
- 如果GRIO检测到一个引脚已经被设置成了非默认值,可以使用setwarnings()关闭警告信息。
GPIO.setwarnings(False)
- 如果GRIO检测到一个引脚已经被设置成了非默认值,可以使用setwarnings()关闭警告信息。
- 设置引脚输入和输出
- 要将通道配置为输入:
GPIO.setup(channel, GPIO.IN)
- 要将通道设置为输出,请调用:
GPIO.setup(channel, GPIO.OUT)
- 为输出通道指定一个初始值:
GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)
- 将通道设置为输出时,同时设置多个通道:
channels = [18, 12, 13] GPIO.setup(channels, GPIO.OUT)
- 要读取通道的值:
GPIO.input(channel) #返回 GPIO.LOW 或 GPIO.HIGH。
- 要设置配置为输出的引脚的值:
GPIO.output(channel, state)
其中状态可以是 GPIO.LOW 或 GPIO.HIGH。 - 还可以输出到通道列表或元组:
channels = [18, 12, 13] GPIO.output(channels, GPIO.HIGH) # or GPIO.LOW GPIO.output(channel, (GPIO.LOW, GPIO.HIGH, GPIO.HIGH))
- 要将通道配置为输入:
- 清理所有使用的通道
- 在程序结束时,最好清理通道,以便将所有引脚设置为默认状态。
GPIO.cleanup()
- 在程序结束时,最好清理通道,以便将所有引脚设置为默认状态。
点亮LED
- 本教程是WaveShare设计的Pioneer600扩展板为例。
- Pioneer600扩展板包括了GPIO,I2C, SPI,Serial等接口的器件,是学习树莓派编程很好的扩展板。
- 我们使用的是Pioneer600扩展板上的LED1,有原理图可知,LED1连接树莓派的25号引脚(BCM编码为 26)。
shell脚本控制
-
设置 BCM26输出:
cd /sys/class/gpio echo 26 > export cd gpio26 echo out > direction echo 1 > value # 输出高 echo 0 > value # 输出低
标准I/O
下载例程
在树莓派终端运行:
sudo apt-get install p7zip wget https://www.waveshare.net/w/upload/3/3a/Pioneer600_code.zip unzip Pioneer600_code.zip sudo chmod 777 -R Pioneer600_code cd Pioneer600_code/LED/
- bcm2835程序
进入Linux终端,在终端执行以下命令:
cd bcm2835 make sudo ./led
预期结果:可以看到LED1闪烁。按下Ctrl+C结束程序。
- wiringPi程序
进入Linux终端,在终端执行以下命令:
cd wiringPi make sudo ./led
预期结果:可以看到LED1闪烁。按下Ctrl+C结束程序。
呼吸灯:
sudo ./pwm
预期结果:可以看到LED1亮度逐渐改变。
按下Ctrl+C结束程序。
- python程序
在终端输入以下命令执行程序:
cd python sudo python led.py
预期结果:可以看到LED1闪烁。按下Ctrl+C结束程序。
呼吸灯:
sudo python pwm.py
预期结果:可以看到LED1亮度逐渐改变。按下Ctrl+C结束程序。
- shell程序
在终端输入以下命令执行程序:
cd shell sudo sh LED.sh 26 1 sudo sh LED.sh 26 0
预期结果:LED1状态根据输入的 0/ 1改变。
文件I/O
- 通过上面的操作,我们可以发现在linux系统中,读写设备文件即可操作对应的设备。
- 在linux的世界,一切的都是文件。下面我们可以通过C语言读写文件的方式操作GPIO 。
- sysfs程序
进入Linux终端,在终端执行以下命令:
cd fs make sudo ./led
预期结果:LED1闪烁10次后自动退出程序。按下Ctrl+C结束程序。
Serial串口
说明
- 串口是串行接口(serial port)的简称,也称为串行通信接口或COM接口。
- 串口通信是指采用串行通信协议(serial communication)在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式。
-
树莓派3/4B有两个串口一个称是硬件串口(/dev/ttyAMA0)一个是mini串口(/dev/ttyS0)。
- 硬件串口由硬件实现,有单独的波特率时钟源,性能高、可靠。
- “mini串口”性能低,功能也简单,并且没有波特率专用的时钟源而是由CPU内核时钟提供,因此“mini串口”有个致命的弱点是:波特率受到内核时钟的影响,内核若在智能调整功耗降低主频时,相应的这个mini串口的波特率便受到牵连。
-
树莓派串口分类:
- 主串口:可以通过引脚实现通讯。
- 辅助串口:不能使用GPIO引脚通信默认被分配给蓝牙端。
- 在树莓派上,引脚8(发送)和引脚10(接收)是作为主串口的收发端引脚8被叫做TXD(Transmit Data)引脚10被称为RXD(Receive Data)
- 在树莓派3/4B中默认将“硬件串口”被默认分配给辅助串口(与蓝牙通信),而把“mini串口”分配给主串口(与引脚GPIO Tx Rx通信),并且“mini串口”默认还是禁用的,需要raspi-config手动开启。
Linux 设备 | 描述 | |
/dev/ttyS0 | mini UART | |
/dev/ttyAMA0 | 硬件串口 | |
/dev/serial0 | 主串口 | |
/dev/serial1 | 辅助串口 |
设置步骤
- 为了通讯稳定,需要进行“硬件串口”与“mini串口”默认映射对换,把“硬件串口” /dev/ttyAMA0映射分配给GPIO的Tx Rx。
- 启动串口
先查看一下串口启动的情况,如果没配置过串口,那么正常情况应该会得到下面的结果:
ls -la /dev/serial*
- 只有serial1 -> ttyAMA0,没有看到ttyS0的相关映射。之所以在没有开启串口的时候能看到ttyAMA0的映射,就是上面讲过的,树莓派3/4B将ttyAMA0默认用于板载蓝牙通讯。
- 在终端输入raspi-config开启串口Serial Port (参考配置开启ssh Interface Options):
-
重启树莓派,在设置中启用串口后,会发现 /dev目录下变成了两个: serial0 -> ttyS0 和 serial1 ->ttyAMA0,这就是开启成功了。
sudo reboot
-
禁用蓝牙(硬件串口与mini串口映射对换),ttyAMA0 得以释放,这时候树莓派也自动交换了ttyAMA0和ttyS0,把serial0 分配给了 ttyAMA0 。
映射对换的目的是将硬件串口作用在GPIO接口的Tx Rx上。如果项目中有用到蓝牙通讯,那么进行这一步的时候要谨慎。修改系统配置文件/boot/config.txt:
sudo nano /boot/config.txt
在文件中添加:
dtoverlay=pi3-disable-bt
这里有个坑要注意一下:树莓派4B的参数值也是pi3-disable-bt。
-
重启树莓派
sudo reboot
-
查看一下串口状态,看看ttyAMA0和ttyS0的映射是否对调:
ls -la /dev/serial*
- 可以看到结果中,ttyAMA0和ttyS0的映射对调了
-
禁用串口控制台功能
树莓派默认将IO引出的串口用作于控制台使用,在没有网络的时候,可以通过串口对树莓派进行控制管理所以经过前面的步骤做好串口映射交换后,还是不能正常地使用串口模块进行通讯。需要禁用串口控制台功能,使串口为我们自由使用。分别通过如下两个命令停止和禁用串口的控制台功能。(由于我们前面已经交换了串口的映射关系,因此这里注意是ttyAMA0)
sudo systemctl stop serial-getty@ttyAMA0.service sudo systemctl disable serial-getty@ttyAMA0.service
-
最后还需要删除一个东西:
sudo nano /boot/cmdline.txt
在打开的文件中删去或注释掉
console=serial0,115200
这样树莓派的串口就设置好了,可以通过串口进行通讯收发消息了。
- 树莓派安装minicom串口助手:
sudo apt install minicom -y
- 运行minicom,输入命令:
minicom -D /dev/ttyAMA0 -b 9600
- 使用USB转TTL连接电脑,打开串口调试助手SSCOM助手就可以发送数据了。
I2C
简介
- I2C,中文全称为集成电路总线;
- 它是一种串行通信总线,使用多主从架构,由飞利浦公司在20世纪80年代为了让主板和嵌入式系统用以连接低速周边设备而开发。I2C的正确读法为“I平方C”("I-squared-C")或者'I方C'
I2C硬件连接方式
- I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。
- 通信原理是通过控制SCL和SDA高低电平来产生I2C总线协议所需要的信号进行数据传输。
- 在总线空闲状态时,SCL和SDA会上拉电阻拉高,保持着高电平。
通过其物理连接方式,我们就可以知道I2C协议是串行、同步通讯协议。
特征
- I2C总线上的每一个设备都会对应这唯一的I2C地址,部分从设备可以通过外围电路改变I2C地址。
- 主从设备之间就通过这个地址来确定与哪个器件进行通信。
- I2C总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输。
协议详解
- I2C协议规定,总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号总是由主设备产生(意味着从设备不可以主动发起通信,所有的通信都是主设备发起的,主可以发出询问的指令,然后等待从设备的通信)。
- 总线在空闲状态时,SCL和SDA都保持着高电平,当SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件;当传输结束时,SCL为高而SDA由低到高的跳变,表示产生一个停止条件。
- 数据传输以字节为单位。主设备在SCL线上产生每个时钟脉冲的过程中将在SDA线上传输一个数据位,当一个字节按数据位从高位到低位的顺序传输完后,紧接着从设备将拉低SDA线,回传给主设备一个应答位,此时才认为一个字节真正的被传输完成。当然,并不是所有的字节传输都必须有一个应答位,比如:当从设备不能再接收主设备发送的数据时,从设备将不回传应答位。
开启I2C接口
- 树莓派一共有两个i2c通道,分别是I2C-0(引脚3和引脚5)和I2C-1(引脚27和引脚28),开启I2C方法如下:
- 在终端输入raspi-config开启串口I2C (参考配置开启ssh Interface Options):
sudo raspi-config
硬件连接
10 DOF | Raspberry Pi | 功能 |
Board物理引脚序号 | ||
VCC | 5V | 电源输入 |
GND | GND | 电源地 |
SDA | 3 | I2C数据输入 |
SCL | 5 | I2C时钟信号 |
i2cdetectc测试
- 查询i2c设备:
sudo i2cdetect -y -r -a 1
- 参数: -y是无视交互问题直接执行,-r是SMBus read byte命令,-a是所有地址,1是指i2c-1。
- 扫描寄存器数据:
i2cdump -y 1 0x77
-
寄存器数据写入:
sudo i2cset -y 1 0x77 0x90 0x55
参数 含义 1 代表I2C设备号 0x77 代表I2C设备地址 0x90 代表寄存器地址 0x55 代表向寄存器写入的数据 -
寄存器数据读出:
sudo i2cget -y 1 0x77 0x90
参数 含义 1 代表I2C设备号 0x77 代表I2C设备地址 0x90 代表寄存器地址
安装库
- 本实例采用的是 10轴惯性导航模块。
如果使用bookworm系统,只能使用lgpio库,bcm2835跟wiringPi无法安装与使用,python库可以不安装,直接运行程序即可
BCM2835
#打开树莓派终端,并运行以下指令 wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.71.tar.gz tar zxvf bcm2835-1.71.tar.gz cd bcm2835-1.71/ sudo ./configure && sudo make && sudo make check && sudo make install # 更多的可以参考官网:http://www.airspayce.com/mikem/bcm2835/
wiringPi
#打开树莓派终端,并运行以下指令 cd sudo apt-get install wiringpi #对于树莓派2019年5月之后的系统(早于之前的可不用执行),可能需要进行升级: wget https://project-downloads.drogon.net/wiringpi-latest.deb sudo dpkg -i wiringpi-latest.deb gpio -v # 运行gpio -v会出现2.52版本,如果没有出现说明安装出错 #Bullseye分支系统使用如下命令: git clone https://github.com/WiringPi/WiringPi cd WiringPi ./build gpio -v # 运行gpio -v会出现2.70版本,如果没有出现说明安装出错
lgpio
wget https://github.com/joan2937/lg/archive/master.zip unzip master.zip cd lg-master sudo make install # 更多的可以参考官网:https://github.com/gpiozero/lg
下载测试程序
打开树莓派终端,执行:
sudo apt-get install p7zip-full -y sudo wget https://www.waveshare.net/w/upload/c/c1/10_DOF_IMU_Sensor_D_Code.7z 7z x 10_DOF_IMU_Sensor_D_Code.7z -O./10_DOF_IMU_Sensor_D_Code cd 10_DOF_IMU_Sensor_D_Code/RaspberryPi/
运行测试程序
以下命令请在RaspberryPi下执行,否则不在索引不到目录;
C
- 重新编译,编译过程可能需要几秒
BCM2835
cd BCM2853 sudo make clean sudo make sudo ./10Dof-D_Demo
wiringPi
cd wiringPi sudo make clean sudo make sudo ./10Dof-D_Demo
注意:如果运行过BCM2835,请重启之后再运行wiringPi。
现象
串口输出数据含义
Roll, Pitch, Yaw | Roll 倾角(°), Pitch 倾角(°), Yaw 倾角(°) |
Acceleration | 加速度(LSB,可换算为 g①) |
Gyroscope | 陀螺仪角速度(LSB,可换算为°/秒②) |
Magnetic | 电子罗盘(LSB,可转换μT③) |
Angle | 方向角(°),理论上等于 Yaw 倾角。 |
Pressure | 气压值(hPa) |
Altitude | 海拔高度(m) |
Temperature | 温度值(℃) |
备注:
①:示例程序串口输出的加速度为寄存器原始值(既寄存器数值),该数值
除以16384后,即可转化为单位为g(重力加速度常数)的数值。
②:示例程序串口输出的角速度为寄存器原始值(既寄存器数值),该数值
除以32.8后,即可转化为单位为dps(角度/秒)的数值。
③:示例程序串口输出的磁传感器数值为寄存器原始值(既寄存器数值),该
数值乘以0.15,即可转化为单位为μT(10-6特斯拉)的数值。
SPI
简介
- SPI全称为串行外设接口(Serial Peripheral Interface),其是一种高速的,全双工,同步通信总线.
- 它以主从方式工作,这种模式通常一个主设备对应一个或多个从设备,双向数据传输时需要4根线,单向数据传输时可以裁切为3根线。
说明
- SPI总线本身由四个物理连接组成:两条数据线,一条时钟线和从选择线。
- MOSI(主机输出/从机输入) –树莓派将数据发送到设备(传感器)的线路。
- MISO(主机输入/从机输出) –设备将数据发送到树莓派的线路。
- SCLK(时钟) –时钟信号线。
- SS / CS(从站选择/芯片选择) –用于选择向其发送数据的设备的线路。
- 在树莓派上,CS线称为“芯片使能”线(简称为CE)。树莓派实际上有两条从选择线可用,标识为CE0和CE1。
- 树莓派MOSI为引脚19、MISO为引脚21、SCLK为引脚23、CE0为引脚24和CE1引脚为26.
工作方式
- 时钟信号将主设备的数据位输出同步到从设备的位采样。每个时钟周期传输一位数据,因此数据传输的速度取决于时钟信号的频率。由于主机配置并生成时钟信号,因此SPI通信始终由主机启动。
-
从机选择:
- 主机可以通过将从机的CE线设置为低电压电平来选择要与之通信的从机。在空闲,非传输状态下,从选择线保持在高电压电平。
- 树莓派上有两个CE引脚,这允许多个从机并行连接。如果仅存在一个CE/CS/SS引脚,则可以通过菊花链将多个从机连接到主机。
- 多个从机:
-
MOSI和MISO
- 主机通过MOSI线以串行方式将数据发送到从机。从机通过MOSI引脚接收主机发送的数据。从主机发送到从机的数据通常先发送最高有效位。
- 从机也可以通过MISO线串行将数据发送回主机。从从机发送回主机的数据通常先发送最低有效位。
- 树莓派输出时钟信号。
- 树莓派将CE引脚切换到低电压状态,从而激活从机。
- 树莓派沿着MOSI线一次将数据发送给从机。从站读取接收到的位。
- 如果需要响应,则从机沿着MISO线一次将数据返回一位给树莓派。树莓派读取接收到的位。
-
完整时序图:
- 可以使用时钟极性和时钟相位的属性来修改SPI中的时钟信号。这两个属性共同定义了何时输出位以及何时对其进行采样。
- 主机可以设置时钟极性,以允许在时钟周期的上升沿或下降沿输出和采样位。
- 主机可以设置时钟相位,以便在时钟周期的第一沿或第二沿进行输出和采样,而不管它是上升还是下降。
- Linux内核用CPOL和CPHA的组合来表示当前SPI的四种工作模式:
CPOL=0,CPHA=0 SPI_MODE_0 CPOL=0,CPHA=1 SPI_MODE_1 CPOL=1,CPHA=0 SPI_MODE_2 CPOL=1,CPHA=1 SPI_MODE_3
- CPOL:表示时钟信号的初始电平的状态,0为低电平,1为高电平。
- CPHA:表示在哪个时钟沿采样,0为第一个时钟沿采样,1为第二个时钟沿采样。
- SPI的四种工作模式波形图如下:
- 在终端输入raspi-config开启串口I2C (参考配置开启ssh Interface Options):
sudo raspi-config
- 测试SPI已启用:
ls -l /dev/spidev*
- 本实例采用的是 1.8寸彩色LCD。
SPI传输
时钟极性和时钟相位
开启SPI
SPI编程
安装库
BCM2835
#打开树莓派终端,并运行以下指令 wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.68.tar.gz tar zxvf bcm2835-1.68.tar.gz cd bcm2835-1.68/ sudo ./configure && sudo make && sudo make check && sudo make install # 更多的可以参考官网:http://www.airspayce.com/mikem/bcm2835/
wiringPi
#打开树莓派终端,并运行以下指令 sudo apt-get install wiringpi #对于树莓派2019年5月之后的系统(早于之前的可不用执行),可能需要进行升级: wget https://project-downloads.drogon.net/wiringpi-latest.deb sudo dpkg -i wiringpi-latest.deb gpio -v # 运行gpio -v会出现2.52版本,如果没有出现说明安装出错 #Bullseye分支系统使用如下命令: git clone https://github.com/WiringPi/WiringPi cd WiringPi ./build gpio -v # 运行gpio -v会出现2.60版本,如果没有出现说明安装出错
安装Python函数库
#python2 sudo apt-get update sudo apt-get install python-pip sudo apt-get install python-pil sudo apt-get install python-numpy sudo pip install RPi.GPIO sudo pip install spidev #python3 sudo apt-get update sudo apt-get install python3-pip sudo apt-get install python3-pil sudo apt-get install python3-numpy sudo pip3 install RPi.GPIO sudo pip3 install spidev
硬件连接
- 连接树莓派的时候,选择用8PIN排线连接,请参考下方的引脚对应表格
- 使用的是排针或者PH2.0 8PIN接口,需要对照以下表格连线
LCD | Raspberry Pi | |
BCM2835编码 | Board物理引脚序号 | |
VCC | 3.3V | 3.3V |
GND | GND | GND |
DIN | MOSI | 19 |
CLK | SCLK | 23 |
CS | CE0 | 24 |
DC | 25 | 22 |
RST | 27 | 13 |
BL | 18 | 12 |
- 1.8inch LCD 使用的是PH2.0 8PIN接口,对照上述表格连接在树莓派上即可: (请按照引脚定义表格连接,图中排线颜色仅供参考,以实际颜色为准。)
下载程序
打开树莓派终端,执行:
sudo apt-get install unzip -y sudo wget https://www.waveshare.net/w/upload/8/8d/LCD_Module_RPI_code.zip sudo unzip ./LCD_Module_RPI_code.zip -d ./LCD_Module_RPI_code/ cd LCD_Module_RPI_code/RaspberryPi/
运行程序
以下命令请在RaspberryPi下执行,否则不在索引不到目录;
C语言
- 重新编译,编译过程可能需要几秒
cd c sudo make
所有屏幕的测试程序,可以直接通过输入对应的尺寸进行调用:
sudo ./main 屏幕尺寸
我们这里采用的是1.8彩色LCD,应当输入以下指令:
sudo ./main 1.8
python
- 进入python程序目录,并运行指令ls -l
cd python/examples ls -l
- 可以查看到所有屏幕的测试程序,找到我们对应的尺寸程序:1inch8_LCD_test.py
- 运行对应屏幕的程序即可,程序支持python2/3
# python2 sudo python 1inch8_LCD_test.py # python3 sudo python3 1inch8_LCD_test.py
CSI
硬件连接
要测试树莓派摄像头,需要给树莓派接入HDMI屏幕或者DSI屏幕
树莓派主板上的CSI (摄像头) 和 DSI (显示器) 两个接口的封装是相似的,接线的时候注意不要接错了。CSI接口在音频接口和HDMI接口中间, 树莓派Zero系列的摄像头接口在Power接口边上。 如果你使用的计算模块,具体以底板的布局为准。
- 接入树莓派5
- 将排线的金属面朝向有线网口位置,插入接口
- Pi5有两个CSI接口,任意口都可以接入
- 接入树莓派Zero 系列
- 其他树莓派主板
关于型号
感光芯片型号 | 支持的树莓派主板型号 | 支持的驱动类型 |
---|---|---|
OV5647 | 所有树莓派主板 | libcamera / Raspicam |
OV9281 | 所有树莓派主板 | libcamera |
IMX219 (树莓派官方) | 所有树莓派主板 | libcamera / Raspicam |
IMX219 (第三方) | 树莓派计算模块 | libcamera |
IMX290/ IMX327 | 所有树莓派主板 | libcamera |
IMX378 | 所有树莓派主板 | libcamera |
IMX477 (树莓派官方) | 所有树莓派主板 | libcamera / Raspicam |
IMX477 (第三方) | 树莓派计算模块 | libcamera |
IMX519 | 树莓派主板 | libcamera(另装驱动) |
IMX708 (树莓派Camera Module 3) | 所有树莓派主板 | libcamera |
IMX296(树莓派Global Camera) | 所有树莓派主板 | libcamera |
IMX500(树莓派AI Camera) | 所有树莓派主板 | libcamera |
测试摄像头
软件配置
如果使用的是最新的Raspberry Pi Camera Module 3 或者Raspberry Pi Global Shutter Camera,需要运行以下指令进行系统更新(需要联网操作).
sudo apt-get update -y sudo apt-get upgrade -y
如果只调用一个摄像头,请将摄像头接入到CAM1口.
如果使用的是是非树莓派官方的摄像头,均需要另外配置config.txt 文件.
如果使用的是最新的Bookworm系统,需要配置的是/boot/firmware/config.txt。
sudo nano /boot/config.txt #如果是bookworm系统 sudo nano /boot/firmware/config.txt
找到camera-auto-detect=1 语句,修改为 camera_auto_detect=0
在文件结尾,根据摄像头型号加入以下设置语句
型号 | 设置语句 |
---|---|
OV9281 | dtoverlay=ov9281 |
IMX290/IMX327 | dtoverlay=imx290,clock-frequency=37125000 |
IMX378 | dtoverlay=imx378 |
IMX219 | dtoverlay=imx219 |
IMX477 | dtoverlay=imx477 |
IMX708 | dtoverlay=imx708 |
注意:在树莓派5上使用IMX290,还需要添加json文件到指令目录才能使用。操作如下:
sudo wget https://www.waveshare.net/w/upload/7/7a/Imx290.zip sudo unzip Imx290.zip sudo cp imx290.json /usr/share/libcamera/ipa/rpi/pisp
- 双目摄像头配置
- 目前CM4底板和树莓派5均支持接入两路摄像头
- 如果用户需要同时接入两路摄像头调用,可以在对应的摄像头配置语句后面加入cam0和cam1指定摄像头。
- 例如,如果同时接入imx219在cam0接口,ov5647摄像头接口在cam1
dtoverlay=imx219,cam0 dtoverlay=ov5647,cam1
AI Camera 软件配置
使用Raspberry Pi AI Camera,需要确保你使用的是树莓派最新系统。
- 打开树莓派终端,使用指令更新系统
sudo apt update && sudo apt full-upgrade
- 安装imx500固件和相关驱动
sudo apt install imx500-all
- 安装完成后,重启系统
sudo reboot
测试摄像头指令
- 打开树莓派终端,并开启摄像头预览:
sudo rpicam-hello -t 0
如果要关掉预览窗口,可以直接组合按键Alt-F4,或者点击x关掉。 也可以回到终端界面,用ctrl-c终止程序。
注:如果是Camera module 3,会开启自动对焦功能
- 测试双目摄像头
- 测试双目摄像头的时候,需要加--camera 指定摄像头,不加该参数设置默认指定cam0
sudo rpicam-hello -t 0 --camera 0 sudo rpicam-hello -t 0 --camera 1
测试AI 摄像头指令
- 打开树莓派终端,并使用rpicam-apps 摄像头程序进行测试
- 物体识别预览测试
rpicam-hello -t 0s --post-process-file /usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json --viewfinder-width 1920 --viewfinder-height 1080 --framerate 30
- 录制视频,并做物体检测
rpicam-vid -t 10s -o output.264 --post-process-file /usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json --width 1920 --height 1080 --framerate 30
- 姿势检测预览
rpicam-hello -t 0s --post-process-file /usr/share/rpi-camera-assets/imx500_posenet.json --viewfinder-width 1920 --viewfinder-height 1080 --framerate 30
前言
树莓派镜像在Bullseye版本之后,底层的树莓派驱动由Raspicam切换成libcamera。libcamera是一个开源的软件栈(后面会称呼做驱动,方便理解),方便于第三方移植和开发自己的摄像头驱动。截止到20231211,官方已经针对libcamera提供了pycamera2库,方便用户使用Python程序调用
调用摄像头
libcamera软件栈提供了六个指令方便用户预览测试摄像头接口.
libcamera-hello
这个是一个简单的“hello world" 程序,用来预览摄像头并将摄像头画面显示在屏幕上。
- 使用示例
libcamera-hello
这个指令会在屏幕上预览摄像头大概5秒时间,用户可以用-t <duration>参数来设置预览的时间, 其中<duration>的单位是毫秒,如果设置为0的话就是保持一直预览。比如:
libcamera-hello -t 0
- 调谐文件
树莓派的libcamera驱动会针对不同的摄像头模块调用一个调谐文件,调谐文件中提供了各种参数,调用摄像头的时候,libcamera会调用调谐文件中的参数,结合算法对图像进行处理最终输出成预览画面。由于libcamera驱动只能自动感光芯片信号,但是摄像头的最终显示效果还会受整个模块的影响,调谐文件的使用就是为了可以灵活处理不同模块的摄像头,调整提高图像质量。
如果在使用默认调谐文件的情况下,摄像头的输出图像不理想的话,用户可以通过调用自定义的调谐文件来对图像进行调整。比如,如果你使用的是官方的NOIR版本摄像头,相对于于Raspberry Pi Camera V2 常规款,NOIR摄像头可能需要不同的白平衡参数,这种情况下就可以通过调用调谐文件来进行切换。
libcamera-hello --tuning-file /usr/share/libcamera/ipa/raspberrypi/imx219_noir.json
用户可以复制默认的调谐文件,根据自己的需求进行修改。
备注:调谐文件的使用适用于其他的libcamera指令,后续指令中就不再做介绍
- 预览窗口
大部分的libcamera指令都会显示一个预览窗口在屏幕上,用户可以通过--info-text 参数来自定义预览窗口的标题信息, 同时也可以通过%directives 调用一些摄像头参数并显示在窗口上
比如如果使用HQ Camera: 可以通过--info-txe "%focus" 在窗口上显示摄像头的焦距
libcamera-hello --info-text "focus %focus"
备注:更多关于参数的设置,可以参考后续的指令参数设置章节
libcamera-jpeg
libcamera-jpeg 是一个简单的静态图片拍摄程序,不同于libcamera-still的复杂功能,libcamera-jpeg代码更简洁,并且有很多相同的功能来完成图片拍摄。
- 拍摄一张全像素的JPEG图像
libcamera-jpeg -o test.jpg
这个拍摄指令会显示一个5秒左右的预览串口,然后拍摄一张全像素的JPEG图像,保存为test.jpg
用户可以通过-t 参数来设置预览时间,同时可以通过--width 和 --height来设置拍摄图像的分辨率。例如:
libcamera-jpeg -o test.jpg -t 2000 --width 640 --height 480
- 曝光控制
所有的libcamera指令都允许用户自己设置快门时间和增益,比如:
libcamera-jpeg -o test.jpg -t 2000 --shutter 20000 --gain 1.5
这个指令会拍摄一张图像,拍摄中会曝光20ms并且摄像头增益被设置为1.5倍。设置的增益参数,会首先设置感光芯片内部的模拟增益参数,如果设置的增益超过了驱动内置的最大的模拟增益的数值,会先设置芯片的最大模拟增益,然后将剩下的增益倍数作为数字增益来生效。
备注:数字增益是通过ISP(图像信号处理)来实现的,并非是直接调整芯片内置寄存器。正常情况下,默认的数字增益趋近于1.0,除非是有有以下三种情况。
- 整体的增益参数需求,也就是当模拟增益无法满足设定的增益参数需求的时候,会需要数字增益来做补偿
- 其中一个颜色增益小于1 (颜色增益是通过数字增益来实现的),在这种情况下, 最后获得增益就是稳定为 1/min(red_gain, blue_gain), 也就是实际是上应用了统一的数字增益, 且是其中一个颜色通道的增益值(非绿色通道)。
- AEC/AGC被修改了。如果AEC/AGC有变化的时候, 数值增益也会一定程度上会发生变化,从何来来消除任何波动,但是这种变化会被快速恢复到"正常"值
树莓派的AEC/AGX算法允许程序指定曝光补偿,也就是通过设置光圈数值来调整图像的亮度。比如:
libcamera-jpeg --ev -0.5 -o darker.jpg libcamera-jpeg --ev 0 -o normal.jpg libcamera-jpeg --ev 0.5 -o brighter.jpg
libcamera-still
libcamera-still和libcamera-jpeg非常相似,不同的是libcamera继承了更多raspistill的功能。和之前一样,用户可以用以下指令拍摄一张图片.
- 测试指令
libcamera-still -o test.jpg
- 编码器
libcamea-still支持不同格式的图像文件,可以支持png和bmp编码,也支持直接不带编码或者任何图像格式地将RGB或者YUV像素的二进制转储保存成文件。如果是直接保存RGB或者YUV数据,程序在读取此类文件的时候必须了解文件的像素排列方式。
libcamera-still -e png -o test.png libcamera-still -e bmp -o test.bmp libcamera-still -e rgb -o test.data libcamera-still -e yuv420 -o test.data
备注:图像保存的格式是通过-e参数控制的, 如果没有调用-e参数设置的话,默认按照输出的文件名的格式保存。
- 原始图像拍摄
原始图像(Raw image)图像就是直接图像传感器输出的图像, 没有经过任何ISP或者CPU处理。对于彩色相机传感器,一般来说原始图像的输出格式是Bayer. 注意原始图和我们之前说的位编码的RGB和YUV图像不同,RGB和YUV也是经过ISP处理后的图像的。
拍摄一张原始图像的指令:
libcamera-still -r -o test.jpg
原始图像一般是以DNG (Adobe digital Negative) 格式保存的,DNG格式可以兼容大部分标准程序, 比如dcraw 或者RawTherapee. 原始图像会被保存为.dng后缀的相同名字的文件,比如如果运行上面的指令,为被另存为test.dng, 并同时生成一张jpeg文件。DNG文件中包含了已图像获取有关的元数据, 比如白平衡数据,ISP颜色矩阵等, 下面是用exiftool工具显示的元数据编码信息:
File Name : test.dng Directory : . File Size : 24 MB File Modification Date/Time : 2021:08:17 16:36:18+01:00 File Access Date/Time : 2021:08:17 16:36:18+01:00 File Inode Change Date/Time : 2021:08:17 16:36:18+01:00 File Permissions : rw-r--r-- File Type : DNG File Type Extension : dng MIME Type : image/x-adobe-dng Exif Byte Order : Little-endian (Intel, II) Make : Raspberry Pi Camera Model Name : /base/soc/i2c0mux/i2c@1/imx477@1a Orientation : Horizontal (normal) Software : libcamera-still Subfile Type : Full-resolution Image Image Width : 4056 Image Height : 3040 Bits Per Sample : 16 Compression : Uncompressed Photometric Interpretation : Color Filter Array Samples Per Pixel : 1 Planar Configuration : Chunky CFA Repeat Pattern Dim : 2 2 CFA Pattern 2 : 2 1 1 0 Black Level Repeat Dim : 2 2 Black Level : 256 256 256 256 White Level : 4095 DNG Version : 1.1.0.0 DNG Backward Version : 1.0.0.0 Unique Camera Model : /base/soc/i2c0mux/i2c@1/imx477@1a Color Matrix 1 : 0.8545269369 -0.2382823821 -0.09044229197 -0.1890484985 1.063961506 0.1062747385 -0.01334283455 0.1440163847 0.2593136724 As Shot Neutral : 0.4754476844 1 0.413686484 Calibration Illuminant 1 : D65 Strip Offsets : 0 Strip Byte Counts : 0 Exposure Time : 1/20 ISO : 400 CFA Pattern : [Blue,Green][Green,Red] Image Size : 4056x3040 Megapixels : 12.3 Shutter Speed : 1/20
- 超长曝光
如果要拍摄一张超长曝光的图片,我们需要禁用AEC/AGC和白平衡,否则这些算法会导致图片在收敛的时候多等待很多帧数据。禁用这些算法需要另设置显式值,另外, 用户可以通过--immediate设置来跳过预览过程。
这里是拍摄一张曝光100秒的图像指令:
libcamera-still -o long_exposure.jpg --shutter 100000000 --gain 1 --awbgains 1,1 --immediate
备注:几款官方摄像头的最长曝光时间参考表格.
模块 | 最长曝光时间(s) |
---|---|
V1(OV5647) | 6 |
V2(IMX219) | 11.76 |
V3(IMX708) | 112 |
HQ(IMX477) | 670 |
libcamera-vid
libcamera-vid是一个视频录制程序, 默认使用的是树莓派的硬件H.264编码器。这个程序运行之后会在屏幕上显示一个预览窗口,同时将比特流编码输出到指定文件。比如,录制一个10s的视频。
libcamera-vid -t 10000 -o test.h264
如果要查看视频可以用vlc来进行播放
vlc test.h264
备注:录制的是未打包的视频流, 用户可以使用--save-pts 设置输出时间戳,方便后续将比特流转成其他视频格式。
libcamera-vid -o test.h264 --save-pts timestamps.txt
如果想要输出mkv文件,可以用以下指令:
mkvmerge -o test.mkv --timecodes 0:timestamps.txt test.h264
- 编码器
树莓派支持JPEG格式以及没有压缩和格式的YUV420:
libcamera-vid -t 10000 --codec mjpeg -o test.mjpeg libcamera-vid -t 10000 --codec yuv420 -o test.data
--codec选项设置的是输出格式,而不是输出文件的扩展名。
使用--segment参数可以将输出文件分割成段(单位是ms),适用于需要脚JPEG视频流分割成单独的时间比较短(大概1ms)的JPEG文件
libcamera-vid -t 10000 --codec mjpeg --segment 1 -o test%05d.jpeg
- UDP 视频流传输
可以使用UDP进行视频流传输,树莓派端运行(server):
libcamera-vid -t 0 --inline -o udp://<ip-addr>:<port>
其中<ip-addr>需要替换成实际的客户端IP地址或者组播地址。
在客户端(client),输入以下指令进行视频流获取和显示(两个指令使用一种即可);
vlc udp://@:<port> :demux=h264 vlc udp://@:<port> :demux=h264
注意:port需要跟你在树莓派端设置的一致
- TCP视频流传输
可以使用TCp进行视频流传输, 树莓派端运行(server):
libcamera-vid -t 0 --inline --listen -o tcp://0.0.0.0:<port>
客户端(client)运行:
vlc tcp/h264://<ip-addr-of-server>:<port> #两条指令选一条即可 ffplay tcp://<ip-addr-of-server>:<port> -vf "setpts=N/30" -fflags nobuffer -flags low_delay -framedrop
- RTSP视频流传输
在树莓派上,通常使用vlc来对RTSP视频流做处理,
libcamera-vid -t 0 --inline -o - | cvlc stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/stream1}' :demux=h264
播放端,可以运行以下任一条指令:
vlc rtsp://<ip-addr-of-server>:8554/stream1 ffplay rtsp://<ip-addr-of-server>:8554/stream1 -vf "setpts=N/30" -fflags nobuffer -flags low_delay -framedrop
在所有预览指令中,如果想要关掉树莓派端的预览窗口,可以用参数-n(--nopreview)设置。另外注意--inline参数的设置,改设置会强制将视频流的报头信息包含在每个 I (intra)帧中,这个设置可以让客户端在丢失视频头的情况下仍然可以正确解析视频流。
- 高帧率模式
如果使用libcamera-vid指令录制高帧率视频(一般高于60fps),同时减少丢帧情况,需要注意以下几点:
- H.264 的目标级别需要设置成4.2, 可以使用--level 4.2 参数设置
- 必须关闭彩色降噪功能,可以使用--denoise cdn_off参数设置
- 如果设置的帧率高于100fps,关掉预览窗口,释放更多CPU资源,避免丢帧。可以使用参数-n设置
- 建议在/boot/config.txt文件中添加设置force_turbo=1, 来保证视频流或中中,CPU时钟不会被限制
- 调整ISP输出分辨率,使用-width 1280 --height 720 设置分辨率,或者设置成更低的分辨率,具体以摄像头型号为准。
- 如果你使用的是Pi 4或这个更高性能的型号,可以在/boot/config.txt文件中添加设置gpu_freq=550或者更高,来对主板GPU进行超频,来达到更高的性能效果。
例如,录制 1280 x720 120fps视频。
libcamera-vid --level 4.2 --framerate 120 --width 1280 --height 720 --save-pts timestamp.pts -o video.264 -t 10000 --denoise cdn_off -n
libcamera-raw
libcamera-raw类似于视频录制程序,不同的地方是,libcamera-raw录制的是直接传感器输出的Bayer格式的数据,也就是原始图像数据。libcamera-raw不会显示预览窗口。比如录制一个2秒的原始数据片段.
libcamera-raw -t 2000 -o test.raw
程序会在没有格式信息的情况下直接转储原始帧, 程序会将像素格式和图像尺寸直接打印在终端,用户可以根据输出的数据查看像素数据.
默认情况下,程序会将原始帧保存成一个文件,文件通常比较大,用户可以通过--segement参数将文件进行分割。
libcamera-raw -t 2000 --segment 1 -o test%05d.raw
如果内存条件比较好(比如使用SSD), libcamera-raw可以以大概10帧每秒的速度将官方的HQ Camera的数据(大概18MB每帧)写入到硬盘中, 为了达到这个速度,程序写入的是没有格式化过的原始帧,没有办法像libcamera-still那样保存成DNG文件。 如果想要确保不出现丢帧的情况,可以使用--framerate 降低帧率。
libcamera-raw -t 5000 --width 4056 --height 3040 -o test.raw --framerate 8
通用的指令设置选项
通用的指令设置选项适用于libcamera的所有指令
--help, -h
打印程序帮助信息,可以打印每个程序指令的可用设置选项,然后退出.
--version
打印软件版本,打印libcamera和libcamera-app的软件版本,然后退出.
--list-cameras
显示识别到的可支持的摄像头。 比如:
Available cameras ----------------- 0 : imx219 [3280x2464] (/base/soc/i2c0mux/i2c@1/imx219@10) Modes: 'SRGGB10_CSI2P' : 640x480 [206.65 fps - (1000, 752)/1280x960 crop] 1640x1232 [41.85 fps - (0, 0)/3280x2464 crop] 1920x1080 [47.57 fps - (680, 692)/1920x1080 crop] 3280x2464 [21.19 fps - (0, 0)/3280x2464 crop] 'SRGGB8' : 640x480 [206.65 fps - (1000, 752)/1280x960 crop] 1640x1232 [41.85 fps - (0, 0)/3280x2464 crop] 1920x1080 [47.57 fps - (680, 692)/1920x1080 crop] 3280x2464 [21.19 fps - (0, 0)/3280x2464 crop] 1 : imx477 [4056x3040] (/base/soc/i2c0mux/i2c@1/imx477@1a) Modes: 'SRGGB10_CSI2P' : 1332x990 [120.05 fps - (696, 528)/2664x1980 crop] 'SRGGB12_CSI2P' : 2028x1080 [50.03 fps - (0, 440)/4056x2160 crop] 2028x1520 [40.01 fps - (0, 0)/4056x3040 crop] 4056x3040 [10.00 fps - (0, 0)/4056x3040 crop]
按照打印的信息, IMX219摄像头后缀0, IM新477摄像头后缀1. 在调用摄像头的时候,就可以对应的后缀进行指定
--camera
指定摄像头,对应的后缀可以参考指令--list-camera的打印信息。
比如: libcamera-hello -c config.txt
其中的设置文件中,一行一个设置参数,用key=value的格式:
timeout=99000 verbose=
--config, -c
一般情况下,我们可以通过指令直接设置摄像头参数,这里使用--config参数,可以指定设置文件,直接读取文件中的设置参数来对摄像头预览效果进行设置
--timeout, -t
-t选项 设置了libcamera程序运行时间, 如果运行的是视频录制指令,timeout选项设置的是录制时长,如果运行的是图像拍摄指令,timeout设置的拍摄并输出图像之前的预览时间。
如果在运行libcamera程序的时候没有设置timeout,默认的timeout数值就是5000(5秒), 如果将timeout设置为0,那程序就会一直运行。
示例: libcamera-hello -t 0
--preview, -p
-p 设置预览预览窗口大小以及窗口的位置(则合格设置在 X和DRM版本的窗口中都有效), 设置格式为 --preview <x. y, w, h> 其中x y设置预览窗口在显示屏上的坐标位置, w和h设置的是预览窗口的宽度和长度
预览串口的设置不会影响摄像头图像预览的分辨率和宽高比。 程序会将预览图像缩放到预览窗口中显示,并会按照原来的图像宽高比做适配。
示例: libcamera-hello -p 100,100,500,500
--fullscreen, -f
-f选项设置预览窗口全屏显示,全屏显示模式的预览窗口和边框。同-p一样,不会影响分辨率和宽高比,会自动适配。
示例: libcamera-still -f -o test.jpg
--qt-preview
使用基于QT框架的预览窗口, 正常情况下不推荐用这个设置,因为这个预览程序不会使用零拷贝缓冲区共享以及GPU加速, 这个会导致占用资源过高。 QT预览窗口支持X转发(默认预览程序不支持).
Qt预览串口不支持--fullscreen设置选项, 如果用户要使用Qt预览,建议保持小预览窗口,避免资源占用过高影响系统正常运行。
示例: libcamera-hello --qt-preview
--nopreview, -n
不预览图像。这个设置会关掉图像预览功能.
示例:libcamera-hello -n
--info-text
设置预览窗口的标题和信息显示(只在X图形窗口下有效)使用格式为 --info-text <string>。调用改选项,有多个参数可以设置,参数通常以%指令格式调用。 程序会按照指令调用图形元数据中的对应数值。
如果没有指定窗口信息,默认的--info-text设置为 "#%frame (%fps fps) exp %exp ag %ag dg %dg"
示例: libcamera-hello --info-test "Focus measure: %focus
可用参数:
指令 | 说明 |
---|---|
%frame | 帧序列号 |
%fps | 瞬时帧速率 |
%exp | 捕捉图像时的快门速度, 单位是ms |
%ag | 感光芯片控制的图像模拟增益 |
%dg | 通过ISP控制的图像数值增益 |
%rg | 每个像素点红色组件的增益 |
%bg | 每个像素点蓝色组件的增益 |
%focus | 图像的角点度量,数值越大表示图像越清晰 |
%lp | 当前镜头的屈光度 (1/米为单位的距离) |
%afstate | 自动对焦状态 (idle, scanning, focused, failed) |
--width --height
这两个参数分别设置图像的宽度和高度。对于libcamera-still, libcamera-jpeg和libcamera-vid指令,这两个参数可以设置输出图像/视频的分辨率。
如果使用libcamera-raw指令,这两个参数会影响获取的元数据帧的大小。 摄像头有一个2x2的分块读取模式,如果设置的分辨率小于分开模式, 摄像头会按照2x2的分块大小获取元数据帧。
libcamera-hello无法指定分辨率.< br />
示例:
libcamera-vid -o test.h264 --width 1920 --height 1080 录制1080p视频
libcamera-still -r -o test.jpg --width 2028 --height 1520 拍摄一张分辨率为2028x1520的JPEG图像。
--viewfinder-width --viewfinder-height
这个设置选项也是用来设置图像的分辨率,不同的是只设置的预览的图像大小。并不会影响最终输出的图像或者视频的分辨率。 预览图像大小的设备不会影响预览窗口尺寸,会根据窗口适配。
示例: libcamera-hello --viewfinder-width 640 --viewfinder-height 480
--rawfull
这个设置强制感光芯片激活了--width和--height的设置, 在全分辨率读取模式下输出静态图像和视频。这个设置libcamera-hello无效。
使用该设置,会牺牲帧率。全分辨率模式下,帧读取速度会比较慢。
示例: libcamera-raw -t 2000 --segment 1 --rawfull -o test%03d.raw 示例指令会捕获多张全分辨率模式下的元数据帧。 如果你使用的是HQ摄像头。 每个帧的大小为18MB, 而如果没有设置--rawfull, HQ摄像头默认的是2x2模式, 每帧的数据大小只有4.5MB.
--mode
这个参数比rawfull更通用,用于设置摄像头模式,使用的时候,需要指定宽度,高度,位深度和打包模式,并用冒号分割。设置的数值不一定要完全精确,系统会自动匹配最接近的数值,另外位深度和打包模式是可设置的(默认为12 和 P 表示打包)
- 4056:3040:12:P - 4056x3040分辨率,12bit每像素, 打包。打包意味着原始图像数据会在缓冲区被打包,这种情况下,两个像素点仅会占用3个字节,可以节省内存
- 1632:1224:10 - 1632x1224分辨率,10bit每像素, 默认打包。10-bit 打包的模式下,4个像素点数据会占用5 bytes.
- 2592:1944:10:U -2592x1944分辨率,10bits每像素,不打包。不打包的情况下,每个限速会占用2bytes内存,这种情况下,最高的6 bits会被设置为0
- 3262:2448 -3264x2448分辨率, 默认使用12bits和打包模式。 但是,如果摄像头型号,比如Camera V2 (IMX219)不支持12bits模式,系统会自动选择为10bits模式
--viewfinder-mode #Specify sensor mode, given as <width>:<height>:<bit-depth>:<packing>
--mode参数是用来在录制视频和拍摄静态图像的时候设置摄像头模式,如果想要在预览的时候设置,可以用--viewfinder-mode参数
--lores-width --lores-height
这个两个选项设置低分辨率图像。 低分辨率数据流会压缩图像,导致图像的纵横比改变。在使用libcamera-vid录制视频的时候,如果设置了低分辨率,会禁用掉颜色去噪处理等功能。
示例: libcamera-hello --lores-width 224 --lores-height 224 注意,低分辨率设置通常要结合图像后处理使用,否则效用不大。
--hflip #水平翻转图像 --vflip #垂直翻转图像 --rotation #根据给出的角度,水平或者垂直翻转图像 <angle>
这三个选项用来翻转图像。 --rotation的参数目前只支持0 和180, 其实就是相当于--hflip和--vflip.
示例: libcamera-hello --vflip --hflip
--roi #裁剪图像<x, y, w, h>
--roi允许用户从传感器提供的完整图像中根据坐标裁剪自己想要的图像区域,也就是数字缩放,注意坐标值要是在有效范围的。 比如 --roi 0, 0, 1, 1就是无效的指令。
示例:libcamera-hello --roi 0.25,0.25,0.5,0.5 示例指令会从图像中心裁剪1/4图像出来。
--hdr Run the camera in HDR mode (supported cameras only)
hdr参数用来设置摄像头的宽动态模式。这个设置只有在摄像头支持宽动态的情况下才能生效。你可以使用--list-camera来查看摄像头是否支持hdr模式
--sharpness #设置图像的锐度 <number>
通过<number>数值调整图像的锐度。 如果设置为0,就是不应用锐化。 如果设置的值超过1.0,会使用而外的锐化量。
示例: libcamera-still -o test.jpg --sharpness 2.0
--contrast #设置图像对比度 <number>
示例: libcamera-still -o test.jpg --contrast 1.5
--brightness #设置图像亮度<number>
设置范围是-1.0 ~ 1.0
示例: libcamera-still -o test.jpg --brightness 0.2
--saturation #设置图像色彩饱和度 <number>
示例:libcamera-still -o test.jpg --saturation 0.8
--ev #设置EV补偿<number>
以光圈为单位来设置图像的EV补偿,设置范围是-10 ~ 10, 默认值是0. 该程序运行使用了 AEC/AGC 算法。
示例:libcamera-still -o test.jpg --ev 0.3
--shutter #设置曝光时间 ,单位是ms <number>
注意:如果相机的帧率太快,可能会导致无法按照设定的快门时间工作,如果遇到这种情况,可以尝试用--framerate来降低帧速率。
示例:libcamera-hello --shutter 30000
--gain #设置增益值 (数值增益和模拟增益组合) <number> --analoggain #--gain的代名词
--analoggain和--gain是一样的,使用analoggain只是为了兼容raspicam的程序。
--metering #设置测光模式 <string>
设置AEC/AGC算法的测光模式, 可用的参数有:
- centre - 中心测光 (默认)
- spot -点测光
- averag -平均或者全幅测光
- custom -自定义测光模式, 可以通过调谐文件设置
示例:libcamera-still -o test.jpg --metering spot
--exposure #设置曝光配置文件 <string>
曝光模式可以设置为normal或者sport. 这两种模式的报告配置文件不会影响图像的整体曝光,但是如果是sport模式的话,程序会缩短曝光时间和提高增益来达到同样的曝光效果。
- sport:曝光时间短,增益大
- normal:正常曝光,正常增益
- long:曝光时间长,增益小
示例:libcamera-still -o test.jpg --exposure sport
--awb #设置白平衡模式<string>
可用的白平衡模式:
模式 | 色温 |
---|---|
auto | 2500K ~ 8000K |
incadescent | 2500K ~ 3000K |
tungsten | 3000K ~3500K |
fluorescent | 4000K ~ 4700K |
indoor | 3000K ~ 5000K |
daylight | 5500K ~ 6500 K |
cloudy | 7000K ~ 8500K |
custom | 自定义范围, 通过调谐文件设置 |
示例: libamera-still -o test.jpg --awb tungsten
--awbgains #设置固定的颜色增益<number,number>
设置红色和蓝色增益。
示例: libcamera-still -o test.jpg --awbgains 1.5, 2.0
--denoise #设置去噪模式 <string>
支持的去噪模式:
- auto -默认模式, 使用标准空间去噪, 如果是视频,会使用快速色彩降噪,拍摄静态图片的时候会使用高质量的色彩降噪。预览图像不会使用任何色彩去噪
- off - 关闭空间去噪和色彩去噪
- cdn_off -关闭色彩去噪
- cdn_fast - 使用快速色彩去噪
- cdn_hq - 使用高质量色彩去噪,不适用于视频录制。
示例: libcamera-vid -o test.h264 --denoise cdn_off
--tuning-file #指定摄像头调谐文件 <string>
关于更多调谐文件的说明, 可以参考官方教程
示例: libcamera-hello --tuning-file ~/my~camera-tuning.json
--autofocus-mode Specify the autofocus mode <string>
设置自动对焦模式。
- default -默认情况下,摄像头会开始连续自动对焦模式,除非设置了--lens-position 或者 --autofocus-on-capture 手动对焦的方式
- manual -手动对焦模式,可以通过--lens-position来设置对焦位置
- auto -只有在开启摄像头的时候会做一次对焦,其他情况下不调整对焦。(如果使用的是libcamera-still指令,只有使用--autofocus-on-capture情况下,会在拍照前做一次对焦)
- continuous -摄像头会根据场景变化,自动调整对焦位置
--autofocus-range Specify the autofocus range <string>
设置自动对焦范围
- normal --默认项, 从最近到无穷远
- macro -微距模式,只对近处的物体对焦。
- full -全距离模式,对最近物体调整到无穷远
--autofocus-speed Specify the autofocus speed <string>
设置对焦速度。
- normal -默认项,正常速度
- fast -快速对焦模式
--autofocus-window --autofocus-window
显示对焦窗口,需要设置x,y,width, height, 其中的坐标值设置是根据图像的比例来的。比如--autofocus-window 0.25,0.25,0.5,0.5 会设置一个窗口,这个窗口大小是图像的一半,并且在居中位置。
--lens-position Set the lens to a given position <string>
设置对焦位置。
- 0.0 --设置对焦位置为无穷远
- number --设置对焦位置为 1/number number是你设置的任意数值, 比如,如果设置2, 表示会对焦到0.5m的位置
- default -- 对焦到镜头超焦距相对于的默认位置
--output, -o #输出文件名 <string>
设置输出图像或者视频的文件名。 除了设置文件名之外,还可以指定输出的udp或者tcp服务器地址,从而将图像输出到服务器上。 有兴趣的可以查看后续tcp和udp的相关设置说明。
示例: libcamera-vid -t 100000 -o test.h264
--wrap #将输出文件计数器打包<number>
示例: libcamera-vid -t 0 --codec mjpeg --segment 1 --wrap 100 -o image%d.jpg
--flush #马上刷新输出文件
--flush会将每一帧图像写入的同时都马上更新到硬盘中,降低延迟。
示例:libcamera-vid -t 10000 --flush -o test.h264
静态图片拍摄设置参数
--qiality, -q #设置JPEG图像质量 <0 ~ 100> --exif, -x #添加而外的EXIF标志 --timelapse #延时拍照的时间间隔, 单位是ms --framestart #帧计数的开始数值 --datetime #用日期格式命名输出文件 --timestamp #用系统时间戳命名输出文件 -- restart #设置JPEG重启时间间隔 --keypress, -k # 设置回车按键拍照模式 --signal, -s #设置信号触发拍照 --thumb #设置缩略图参数 <w:h:q> --ebcoding, -e #设置图像编码类型。 jpg / png / bmp / rgb / yuv420 --raw, -r #保存原始图像 --latest #关联符号到最新保存的文件 --autofocus-on-capture #设置在拍照前做一次对焦动作
视频录制图像设置参数
--quality, -q # 设置JPEG指令 <0 - 100> --bitrate, -b # 设置H.264比特率 --intra, -g #设置内部帧周期 (只支持H.264) --profile #设置H.264配置 --level #设置H.264等级 --codec #设置编码类型 h264 / mjpeg / yuv420 --keypress, -k #设置回车暂停和录制 --signal, -s #设置信号暂停和录制 --initial #在录制或者暂停状态下启动程序 --split #切割视频并保存到另外的文件 --segment #将视频分割成多个视频段 --circular #将视频写入循环缓冲区中 --inline #在每个I帧中写入数据头(只支持H.264) --listen #等待TCP连接 --frames #设置录制的帧数
- 更多摄像头设置说明,请参考官方文档官方摄像头文档
前言
如果你使用的是Buster版本的镜像,系统默认安装的是Raspicam驱动,可以直接开启摄像头,然后使用。
如果使用的是最新的Bullseye系统,需要另外安装配置一下。
适用于OV5647,官方IMX219,官方IMX477.
安装Raspicam(可选)
打开树莓派终端,并输入以下指令安装驱动. 注意:此驱动暂时无法支持64位的树莓派系统。
sudo apt-get update cd sudo apt install cmake git clone https://github.com/raspberrypi/userland cd userland ./buildme cp build/bin/* ~/bin/
按照后之后需要重启系统
sudo reboot
调用摄像头
raspistill
raspistill指令用于拍摄静态图片。 示例:raspistill -o cam.jpg
raspivid
raspivid指令用于录制视频。 示例: raspivid -o vid.h264
raspiyuv
raspiyuv指令具有跟raspisitll相同的功能,不同的是raspiyuv不是输出jpgs等标准图像文件,而是从相机的ISP输出中生成YUV420或者RGB888图像文件。
大部分情况下,拍摄图像,用raspistill比较好,但是如果你想用未压缩的黑白图像的时候,可以选择使用raspiyuv指令。
示例:raspiyuv -o cam.jpg
指令设置选项
raspicam 指令在使用的时候,可以通过设置选项来调整图像最终成像效果。以下列出可用的设置选项以供参考.
--preview, -p #设置预览窗口<x, y, w, h>
用户可以通过设置x, y的值来设置预览窗口的位置, 设置w, h的值来调整预览图像的分辨率。
--fullscreen, -f #全屏预览窗口
将预览窗口全屏显示
--nopreview, -n #不显示预览窗口
关掉预览窗口,指令会直接输出图像或者视频到文件。
--opacity, -op #设置预览窗口透明度
设置预览窗口的透明度, 0 是不可见, 255 是全透明
--sharpness, -sh #设置图像锐度 (-100 - 100)
默认锐化值为0
--contrast. -co #设置图像对比度 (-100 - 100)
默认的对比度为0
--brightness, -br #设置图像对比度 (0 - 100)
默认亮度为50, 0是全黑,100是全白。
--saturation, -sa #设置图像饱和度 (-100 - 100)
默认饱和度是0
--ISO #设置快门感光度 (100 - 800)
设置拍照时的感光度
--vstab, -vs #开启视频稳定
只有视频录制模式有效,开启视频防抖。
--ev #设置EV补偿
设置图像的EV补偿值, 默认0
--exposure, -ex #设置曝光模式
可设置的曝光选项:
- auto: 自动曝光模式
- night: 夜间拍摄模式
- nightpreview
- backlight: 背光模式
- spotlight
- sports: 运动模式(运动模式下会缩短快门时间
- snow: 雪景模式
- beach: 海滩模式
- verylong: 长曝光模式
- fixedfps: 固定fps
- antishake: 防抖模式
- fireworks: 烟花模式
注:根据摄像头型号,有部分模式不可用
--flicker, -fli #闪烁避免
可设置的模式:
- off: 关闭防闪烁模式
- auto: 自动检测注频率
- 50Hz: 设置防闪烁频率是50Hz
- 60Hz: 设置防闪烁频率是60Hz
--awb, #设置自动白平衡模式
- off: 关闭自动白平衡
- auto: 自动白平衡模式(默认)
- sun: 晴天模式 (5000K ~ 6500K)
- cloud: 多云模式 (6500K ~ 12000K)
- shade:阴影模式
- tungsten: 钨丝灯模式(2500K ~ 3500K)
- incandescent: 白炽灯模式(2500K ~ 4500K)
- flash: 闪光灯模式
- horizon: 地平线模式
- greyworld: 如果使用的是不带红外滤光片的相机(比如NoIR), 可以修复因为缺少IR滤镜而导致的白平衡失调的情况
注:根据摄像头型号,有部分模式不可用
--imfx, -ifx #设置图像滤镜效果
可设置的图像滤镜效果:
- none: 无效果(默认)
- negative:颜色翻转
- solarise: 日照效果
- posterise: 海报效果
- whiteboard: 白板效果
- backboard:黑板效果
- sketch: 素描
- denoise: 去噪
- emboss: 浮雕
- oilpaint: 油画
- hatch: 纹理
- gpen: 铅笔素描
- pastel: 彩色铅笔
- watercolour: 水彩
- film: 胶片
- blur: 模糊
- saturation: 饱和
注:根据摄像头型号,有部分模式不可用
--colfx, -cfx #设置颜色效果<U:V>
U和V参数的设置范围是 0 ~ 255, 用来调整U和Y通道的数值。 比如: --colfx 128:128 会讲图像设置成单色图。
--metering, -mm #设置测光模式
可设置选项:
- average: 平均或者全幅测光
- spot:点测光
- backlit: 预设一个背光图像
- matrix: 矩阵测光
--rotation, -rot #设置图像旋转 (0 - 359)
可以通过角度参数设置图像旋转角度
--hflip, -hf #设置图像水平翻转
设置图像水平翻转
--vflip, -vf #设置图像垂直翻转
垂直翻转图像
--roi, #裁剪图像 <x, y, w, h>
根据参数裁剪图像,注意参数都是规划化在(0,0 ~ 1.0), 比如,如果要裁剪1/4图像,可以用指令 -roi 0.5,0.5,0.25,0.25
--shutter, --ss 设置快门速度/时间
设置快门时间(单位:ms)。 快门时间根据感光芯片的不同,可设置的最大快门时间不同。
型号 | 最大数字(ms) |
---|---|
V1 (OV5647) | 6000000 (6s) |
V2 (IMX219) | 10000000 (10s) |
HQ (IMX477 | 200000000 (200s) |
--drc, -drc #启用/关闭动态范围压缩
- off (默认)
- low
- med
- high
--stats, -st #通过静态图像帧来统计图像
--awbgains, -awbg
设置蓝色和绿色增益, 在设置 --awb off 的情况下生效
--analoggain, -ag
设置模拟增益值
--digitalgain, -dg
设置数字增益值
--mode, -md
设置传感器模式:
- OV5647
模式 | 分辨率 | 纵横比 | 帧率 | FoV | |
---|---|---|---|---|---|
0 | 自动选择 | ||||
1 | 1920 x 1080 | 16:9 | 1-30fps | 局部 | |
2 | 2592 x 1944 | 4:3 | 1-15fps | 全幅 | |
3 | 2592 x 1944 | 4:3 | 0.1666 - 1fps | 全幅 | |
4 | 1296 x 972 | 4:3 | 1 - 42fps | 全幅 | |
5 | 1296 x 730 | 16:9 | 1- 49fps | 全幅 | |
6 | 640 x 480 | 4:3 | 42.1 - 60fps | 全幅 | |
7 | 640 x 480 | 4:3 | 60.1 - 90fps | 全幅 |
- IMX219
模式 | 分辨率 | 纵横比 | 帧率 | FoV | |
---|---|---|---|---|---|
0 | 自动选择 | ||||
1 | 1920 x 1080 | 16:9 | 0.1-30fps | 局部 | |
2 | 3280 x 2464 | 4:3 | 0. 1-15fps | 全幅 | |
3 | 3280 x 2464 | 4:3 | 0.1 - 15fps | 全幅 | |
4 | 1640 x 972 | 4:3 | 1 - 42fps | 全幅 | |
5 | 1296 x 730 | 16:9 | 1- 49fps | 全幅 | |
6 | 640 x 480 | 4:3 | 42.1 - 60fps | 全幅 | |
7 | 640 x 480 | 4:3 | 60.1 - 90fps | 全幅 |
- HQ Camera
模式 | 分辨率 | 纵横比 | 帧率 | FoV | |
---|---|---|---|---|---|
0 | 自动选择 | ||||
1 | 2028 x 1080 | 169:90 | 0.1-50fps | 局部 | |
2 | 2028 x 1080 | 4:3 | 0. 1-50fps | 全幅 | |
3 | 4056x3040 | 4:3 | 0.005 - 10fps | 全幅 | |
4 | 1332x990 | 74:55 | 50.1-120 fps | 局部 |
--camselect, -cs
当系统接入多个摄像头时,选择摄像头, 0 或 1.
--annotate, -a #启用/设置注释
在元数据中使用位掩码的方式来表示参数,可以直接用加法表示。 比如, 12 可以表示显示时间(4)和显示日期 (8), 就是通过加法 4+8 =12表示的。
可设置的选项
值 | 参数说明 |
---|---|
-a 4 | 时间 |
-a 8 | 日期 |
-a 12 | 时间和日期,实际就是 4 + 8 |
-a 16 | 快门设置 |
-a 32 | CAF设置 |
-a 64 | 增益设置 |
-a 128 | 镜头设置 |
-a 256 | 动画设置 |
-a 512 | 帧数 |
-a 1024 | 黑色背景 |
-a "ABC %Y-%m-%d %X" | 显示文本 |
-a 4 -a "ABC %Y-%m-%d %X" | 显示自定义格式的时间/日期 |
-a 8 -a "ABC %Y-%m-%d %X" | 显示自定义格式的时间/日期 |
--annotateex, -ae #设置额外注解参数
--stereo, -3d
设置双目模式。
- sbs - 并排模式
- tb: -竖排模式
- off -关掉双目模式(默认)
--decimate, -dec
将双目图像的宽度和高度减半
--setting, -set
输出当前的摄像头设置
raspistill 设置参数
--width, -w #设置图像宽度 --height, -h #设置图像高度 --quality, 0q #设置JPEG质量 <0 ~ 100> --raw, -r #将原Bayer数据添加到JPEG元数据中 --output, -o #输出文件 <filename> --latest, -l #关联最后一帧图像到文件 <filename> --verbose, -v #打印详情 --timeout, -t #设置程序预览时间 --timelapse, -tl #设置演示摄影 --framestart, -fs #保存第一帧的编号 --datetime, -dt #用日期时间命名文件 --timestamp, -ts #用时间戳命名文件 --thumb, -th #设置缩略图参数 <x:y:qulity>, 默认为(64:48:35) --demo, -d #运行演示模式<ms》 --encoding, -e #按照指定格式编码, jpg, bmp或者png --restart, -rs #设置JPEG重启标志 --exif, -x #设置EXIF标记 --gpsdexif, -gps #设置实时exif 时间 (需要有GPS Dongle接入) --fullpreview, -fg #全屏预览 --keypress, -k #按键拍照模式 --signal, -s # 信号模式 --burst, -bm #抓拍模式
raspivid 设置参数
--width, -w #设置视频宽度 --height, -h #设置视频高度 --bitrate, -b #设置比特率 --output, -o #设置输出文件名 <filename> --listen, -l #使用网络连接的时候,等待网络连接 --versbose, -v #打印详情 --timeout, -t #设置预览时间 --demo, -d #运行演示 <ms> --framerate, -fs #设置帧率 --penc, -e #显示编码后的预览图像 --intra, -g #设置内部刷新周期 --qp, -qp #设置量化参数 --profile, -pf #指定H264配置文件, baseline / main / high --level, -lev #设置H264编码等级 --irefresh, -if #设置 H264内部刷新类型 cyclic / adaptive / both / cyclicrows --inline, -ih #插入PPS,SPS头 --spstimings, -stm #将时序信息插入到SPS块中 --timed, -td #定时切换录制和暂停功能 --keypress, -k #按键暂停录制 --signal, -s #根据SIGUSR1 切换暂停和录制状态 --split, -sp #在signal和keypress 模式下,每次重新录制的时候都会重新创建文件 --vectors, -x #矢量输出 --flush, -fl #写入视频数据后立即强制刷新输出数据缓冲区, 绕过了写入数据的任何操作系统缓存,并且可以减少延迟。 --save-pts, -pts #将时间戳信息保存到指定文件。 --codec, -cd # 指定编码器 H264 / MJPEG --initial, -i #设置启动是的初始状态 --segment, -sg #将视频流分割到多个文件中 --wrap, -wr #设置分割的最大值 --start, -sn #设置初始分割编码 --raw, -r #设置元数据文件名 --raw-format, -rf #指定元数据格式 yuv / rgb / grey
USB
测试USB摄像头
- 打开树莓派终端(使用Ctrl+Alt+T快捷键)
- 编辑modules文件
sudo nano /etc/modules
- 将一下语句加入文件中并保存
bcm2835-v4l2
- 打开树莓派终端, 输入指令安装luvcview软件
sudo apt install luvcview -y
- 安装完成之后,终端输入指令打开软件即可进行USB摄像头测试
sudo luvcview -s 1920x1080
fswebcam
安装
- 打开树莓派终端, 输入指令安装fswebcam软件
sudo apt install fswebcam
用法
- 输入命令fswebcam后跟文件名,将使用USB摄像头拍摄照片,并保存到指定的文件名:
fswebcam image.jpg
此命令将显示以下信息:
--- Opening /dev/video0... Trying source module v4l2... /dev/video0 opened. No input was specified, using the first. Adjusting resolution from 384x288 to 640x480. --- Capturing frame... Captured frame in 0.00 seconds. --- Processing captured image... Writing JPEG image to 'image.jpg'.
- 给图像设置分辨率:
fswebcam -r 1280x720 image2.jpg
- 全分辨率拍摄照片,不带有横幅:
fswebcam -r 1280x720 --no-banner image3.jpg
MJPG-streamer
-
将USB摄像头插上,查看是否找到设备,输入指令:
lsusb
- 其中USB2.0 Camera就是摄像头,说明找到usb设备了。
- 查看设备驱动是否正常:输入指令:
ls /dev/video*
- 其中video0就是摄像头驱动。
-
安装必要的库,输入以下指令:
sudo apt install subversion -y sudo apt install libv4l-dev -y sudo apt install libjpeg9-dev -y sudo apt install cmake -y
- 下载mjpeg-stream到树莓派:
sudo git clone https://github.com/jacksonliam/mjpg-streamer.git cd mjpg-streamer/mjpg-streamer-experimental sudo make all sudo make install
- 运行start.sh:
cd mjpg-streamer/mjpg-streamer-experimental/ sudo bash start.sh
- 用Firefox浏览器输入http://<树莓派IP地址>:8080,例如我的树莓派地址是192.168.10.20:
http://192.168.10.20:8080
- 此时应该可以看到摄像头的监控画面了。
资料
软件
- putty
- Panasonic_SDFormatter-SD卡格式化软件
- Win32DiskImager-烧录镜像软件
- nmap
- MobaXterm
- VNC-Viewer
- tigervnc
- Advanced_IP_Scanner
- Raspberry Pi Imager