树莓派的使用

禁不住好评如潮,开始折腾树莓派。型号4B,操作系统Ubuntu server 20.04(无GUI)。

0、查看系统信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
echo ""
echo "----------当前计算机信息---------------"
# 显示当前系统及版本号
echo 系统版本:$'\t' `lsb_release -a 2>&1 | grep -i 'description' | cut -d$'\t' -f2`
# 显示内核及版本号
# Kernel=`uname -s -r`
echo 内核版本:$'\t' `uname -s -r`
echo ""

# 显示CPU信息
echo CPU型号:\(详细信息可使用 lscpu 查看\)
#grep -i 'model name' /proc/cpuinfo # Ubuntu桌面版本适用
grep -i 'model' /proc/cpuinfo
echo ""

# 显示显卡信息
#echo 显卡信息:
#lspci | grep -i 'vga' # Ubuntu桌面版本适用
echo PCI设备:
lspci
echo ""

# 显示网口信息
#echo 以太网信息:
#lspci | grep -i 'Ethernet' # Ubuntu桌面版本适用
#echo ""

# 显示内存信息
echo 内存容量:`grep -i 'MemTotal' /proc/meminfo | cut -d: -f2`
echo ""

# 显示硬盘信息
echo 硬盘信息:
lsblk -d -o NAME,SIZE,TYPE,MOUNTPOINT

echo ""
echo "-------------DONE---------------------"
echo ""

将上述命令存为shell脚本,如info.sh 然后执行即可

1
2
vi info.sh
bash ./info.sh

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
----------当前计算机信息---------------
系统版本: Ubuntu 20.04.1 LTS
内核版本: Linux 5.4.0-1026-raspi

CPU型号:(详细信息可使用 lscpu 查看)
Model : Raspberry Pi 4 Model B Rev 1.2

PCI设备:
00:00.0 PCI bridge: Broadcom Inc. and subsidiaries Device 2711 (rev 10)
01:00.0 USB controller: VIA Technologies, Inc. VL805 USB 3.0 Host Controller (rev 01)

以太网信息:

内存容量: 3831216 kB

硬盘信息:
NAME SIZE TYPE MOUNTPOINT
loop0 48.5M loop /snap/core18/1883
loop1 48.9M loop /snap/core18/1949
loop2 63.6M loop /snap/lxd/16103
loop3 59.9M loop /snap/lxd/18152
loop4 27M loop /snap/snapd/10494
loop5 27M loop /snap/snapd/10709
mmcblk0 14.9G disk

-------------DONE---------------------

1、修改软件更新源

  外网速度令人发指,改为国内镜像,速度快、ipv6不计流量,价格便宜量又足...

1
2
3
4
5
6
7
8
9
# 先保留备份
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 替换为清华镜像
sudo sed -i 's/http:\/\/ports.ubuntu.com/https:\/\/mirrors.tuna.tsinghua.edu.cn/' /etc/apt/sources.list

# 保留备份
sudo cp /root/.config/pip/pip.conf /root/.config/pip/pip.conf.bak >nul 2>&1
# python 源改为工大镜像
sudo pip config set global.index-url https://mirrors.njtech.edu.cn/pypi/web/simple

注1: 请在对系统进行修改前,对原始文件进行备份
注2: 如果使用apt更新时提示ssl错误,则先把 https://mirrors.tuna...改为 http://mirrors.tuna...更新,再使用https即可。

2、安装raspi-config,配置外设

1) 安装raspi-config

  进入工大镜像,找到最新的raspi-config(点击进入下载);

1
2
3
4
5
6
7
8
9
10
11
# 最新为 raspi-config_20210119_all.deb
wget -c -4 https://mirrors.njtech.edu.cn/raspberrypi/pool/main/r/raspi-config/raspi-config_20210119_all.deb -P /tmp
# 安装(会失败)
sudo dpkg -i ./raspi-config_20210119_all.deb
# 根据提示安装依赖库....
# sudo apt instal xxxxx
# 修复
sudo apt --fix-broken install
# 再次安装(应该会成功)
sudo dpkg -i ./raspi-config_20210119_all.deb
# done

2) 使用raspi-config配置树莓派

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 以下开始使用 raspi-config 配置树莓派
# SSH 开启远程登录,是应当第一个打开的服务
sudo raspi-config
# 进入3 Interface,启用 Camera, SSH, I2C, SPI, Serial Port,保存退出


# 测试
i2cdetect -y 1
# 结果如下:注意40有个设备,如果没有接I2C设备,那么全部为空
# 0 1 2 3 4 5 6 7 8 9 a b c d e f
# 00: -- -- -- -- -- -- -- -- -- -- -- -- --
# 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 70: 70 -- -- -- -- -- -- --

注1: 当开启Camera,如果出现固件过时的错误时:

1
Your firmwave appears to be out of date (no start_x.elf). Please ...
解决方法:
1
2
3
4
5
# 查看boot分区所在的设备号,设备号可能是:/dev/mmcblk0p1 
df -h

# 将该设备号挂载在/boot上
mount /dev/mmcblk0p1 /boot

注2: 如果上述命令显示用户无权限,那么可以通过添加一个用户在来解决(以下方法未测试)

1
2
3
4
sudo groupadd i2c (group may exist already)
sudo chown :i2c /dev/i2c-1 (or i2c-0)
sudo chmod g+rw /dev/i2c-1
sudo usermod -aG i2c *INSERT YOUR USERNAME*

注3: 也可以通过配置文件打开spi/i2c/uart/1-wire等设备:sudo vi /boot/config.txt:

1
2
3
4
5
6
7
dtparam=spi=on
dtparam=i2c_arm=on
# For the best performance, tweak the I2C core to run at 1MHz.
# By default it may be 100KHz or 400KHz
dtparam=i2c_baudrate=1000000
enable_uart=1
dtoverlay=w1-gpio

参考:https://blog.csdn.net/sinat_25259461/article/details/108353324

3、安装 net-toolswireless-toolsI2C和蓝牙工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# net-tools -> ifconfig命令等
# wireless-tools -> iwconfig 命令等
sudo apt install net-tools wireless-tools i2c-tools

# 安装蓝牙
sudo apt install pi-bluetooth

# 蓝牙配置 /boot/firmware/syscfg.txt
# sudo bluetoothctl # 进入蓝牙控制

# 如果 wpasupplicant 没有安装,也需要这个软件
sudo apt install wpasupplicant
# 几个工具的使用:
# ls /sys/class/net/ # 查看网卡信息,树莓派输出: eth0 lo wlan0
# ifconfig # 以太网络参数
# iwconfig # 无线网络参数
# 扫描SSID
# sudo iwlist wlan0 scan | grep ESSID

# 安装g++, 安装RPi.GPIO时需要使用
sudo apt install g++

# 测试:
# ubuntu@ubuntu:~$ g++ -v
# Using built-in specs.
# COLLECT_GCC=g++
# COLLECT_LTO_WRAPPER=/usr/lib/gcc/aarch64-linux-gnu/9/lto-wrapper
# Target: aarch64-linux-gnu
# Configured with: ....
# Thread model: posix
# gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)

# 如果希望安装 gcc 10.xx版本可以使用,但无法编译安装RPi.GPIO
# sudo apt install g++-10

# 也可以安装build-essential,gcc/g++/make/dpkg等都安装了
# sudo apt install build-essential

4、配置无线网络

无线网络的配置有两种模式,1) 首次系统启动前,在已安装系统的SD卡上修改;2) 非首次启动,进入系统后修改(需要本地/SSH登录)

1) 第一种方式:

(未测试)进入SDK的system-boot分区,编辑network-config文件,添加 Wi-Fi 信息. network-config文件已经内含了一个简单示例:

1
2
3
4
5
6
7
wifis:
wlan0:
dhcp4: true
optional: true
access-points:
<wifi network name>:
password: "<wifi password>"

2) 第二种方式:

编辑/etc/netplan/01-netconfig.yaml文件(没有就创建)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
network:
version: 2
renderer: networkd
ethernets:
eth0:
optional: true
dhcp4: yes
# addresses:
# - 10.3.89.200/24
# gateway4: 10.3.89.1
# nameservers:
# addresses: [202.119.248.66,218.2.135.1]
dhcp6: yes
wifis:
wlan0:
dhcp4: true
optional: true
access-points:
"NJCD":
password: "PASSWORD"
"NJTech": {}

5、安装pythonpipopencv

1) 安装 python

  严格来说,这不叫安装。Ubuntu 20.04已经自带Python 3.8版本.如果只需要使用python 3,并且不愿每次都输入python3来执行脚本,那么简单的做一个软链接即可:

1
sudo ln -s /bin/python3.8 /bin/python

2) 安装pip

1
2
3
4
5
6
7
# 方法一,通过Ubuntu安装
sudo apt install python-pip
# 方法二:利用getpip.py安装,详见: https://pip.pypa.io/en/stable/installing/
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
# 使用管理员权限,
sudo python get-pip.py --proxy="http://[user:passwd@]proxy.server:port"

3) 通过pip安装常用的python第三方包和OpenCV

  OpenCV的部分依赖库,需要cmake联网下载,直接安装会出错,

1
2
3
4
5
6
7
8
9
10
11
# 首先安装常用的python库
sudo pip install -U numpy scipy matplotlib pandas lxml requests

# 安装 adafruit硬件操作库
sudo pip install -U RPi.GPIO smbus2 Adafruit-Blinka adafruit-circuitpython-busdevice \
adafruit-circuitpython-framebuf adafruit-circuitpython-motor \
adafruit-circuitpython-pca9685 adafruit-circuitpython-register \
adafruit-circuitpython-ssd1306 Adafruit-PlatformDetect Adafruit-PureIO

# 安装 OpenCV
sudo pip install -U opencv-contrib-python-headless

  OpenCV的安装如果能成功,可以略过以下步骤。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 以下为OpenCV源码编译安装,
# 基本过程为将源码(.tar.gz结尾)复制到一个临时文件夹内进行编译,
# 然后使用pip直接安装编译成功的whl文件。

# 首先安装cmake

sudo apt install cmake

# 进入管理员模式,一般情况,尽量避免在管理员模式下操作。
sudo su
find /root -name opencv-contrib*.tar.gz
# find会返回已经查找到的opencv-contrib*tar.gz的压缩包文件
cp /root/.cache/pip/xxx(一串路径)xx/opencv-contrib-python-headless-4.4.0.46.tar.gz /root
cd /root
tar xvfz opencv-contrib-python-headless-4.4.0.46.tar.gz

cd opencv-contrib-python-headless-4.4.0.46

# 我这里编译不成功的关键是缺少xfeatures2d,也可以禁用该模块,
mkdir -p opencv/.cache/xfeatures2d/boostdesc
mkdir -p .cache/xfeatures2d/vgg

# 进入opencv_contrib/modules/xfeatures2d/cmake目录,
# 打开download_boostdesc.cmake和download_vgg.cmake文件
# 需要下载的文件链接为:
# https://raw.githubusercontent.com/opencv/opencv_3rdparty/${OPENCV_3RDPARTY_COMMIT}/${file_name}
# 保存的文件名为 ${hash}-${file_name}
# 分别下载vgg和bootsdesc文件

# 截至 2020.1.20日编译时,下载的xfeature2d所需文件
# xfeatures2d/boostdesc/0ae0675534aa318d9668f2a179c2a052-boostdesc_lbgm.i
# xfeatures2d/boostdesc/0ea90e7a8f3f7876d450e4149c97c74f-boostdesc_bgm.i
# xfeatures2d/boostdesc/202e1b3e9fec871b04da31f7f016679f-boostdesc_binboost_064.i
# xfeatures2d/boostdesc/232c966b13651bd0e46a1497b0852191-boostdesc_bgm_bi.i
# xfeatures2d/boostdesc/324426a24fa56ad9c5b8e3e0b3e5303e-boostdesc_bgm_hd.i
# xfeatures2d/boostdesc/98ea99d399965c03d555cef3ea502a0b-boostdesc_binboost_128.i
# xfeatures2d/boostdesc/e6dcfa9f647779eb1ce446a8d759b6ea-boostdesc_binboost_256.i
# xfeatures2d/vgg/151805e03568c9f490a5e3a872777b75-vgg_generated_120.i
# xfeatures2d/vgg/7126a5d9a8884ebca5aea5d63d677225-vgg_generated_64.i
# xfeatures2d/vgg/7cd47228edec52b6d82f46511af325c5-vgg_generated_80.i
# xfeatures2d/vgg/e8d0dcd54d1bcfdc29203d011a797179-vgg_generated_48.i

# 使用pip正常安装opencv

pip install -U .

注意:上述安装过程中,可能需要安装相应的编译工具。

6、安装配置 nginxuWSGIflask

1) 安装;

1
2
sudo apt-get install nginx uwsgi uwsgi-plugin-python3
sudo pip install flask

2) 配置:

7、非管理员访问硬件:

使用管理员权限进行硬件操作太过危险,还是使用非管理员权限比较安全,以下将用户ubuntu添加至device用户组,修改device用户组,使之具有各个设备的访问权限:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

sudo groupadd devices

#sudo chown :devices /dev/i2c-0
sudo chown :devices /dev/i2c-1

sudo chown :devices /dev/spidev0.0
sudo chown :devices /dev/spidev0.1
sudo chown :devices /dev/gpiochip0
sudo chown :devices /dev/gpiochip1
sudo chown :devices /dev/gpiomem
sudo chmod g+rw /dev/i2c-0
sudo chmod g+rw /dev/i2c-1
sudo chmod g+rw /dev/spidev0.0
sudo chmod g+rw /dev/spidev0.1
sudo chmod g+rw /dev/gpiomem
sudo chmod g+rw /dev/gpiochip0
sudo chmod g+rw /dev/gpiochip1

sudo usermod -aG devices ubuntu

测试时发现,貌似仅在当前session中执行后有效(原因不明),可以将上述命令作为服务,每次启动自动运行一次:

创建启动服务my-start-up

1
sudo vi /etc/init.d/my-start-up

添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
### BEGIN INIT INFO
# Provides: ferret
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Make devices accessiable at boot time
# Description: None.....
### END INIT INFO

# 将用户添加至devices组,以直接访问外设

sudo chown :devices /dev/i2c-1 #(or i2c-0)
sudo chown :devices /dev/spidev0.0
sudo chown :devices /dev/spidev0.1
sudo chown :devices /dev/gpiochip0
sudo chown :devices /dev/gpiochip1
sudo chown :devices /dev/gpiomem
sudo chmod g+rw /dev/i2c-1
sudo chmod g+rw /dev/spidev0.0
sudo chmod g+rw /dev/spidev0.1
sudo chmod g+rw /dev/gpiomem
sudo chmod g+rw /dev/gpiochip0
sudo chmod g+rw /dev/gpiochip1

sudo usermod -aG devices ubuntu

# 退出,重新登录,测试
i2cdetect -y 1

执行以下命令,创建启动服务

1
2
3
4
5
6
7
8
9
10
11
12
13
# 自动创建
sudo update-rc.d my-start-up defaults

# 如果创建失败,以下可以手动创建
# 手动创建
# cd /etc/rc2.d
# sudo ln -s ../init.d/my-start-up S20my-start-up
# cd /etc/rc3.d
# sudo ln -s ../init.d/my-start-up S20my-start-up
# cd /etc/rc4.d
# sudo ln -s ../init.d/my-start-up S20my-start-up
# cd /etc/rc5.d
# sudo ln -s ../init.d/my-start-up S20my-start-up

8、使用红外遥控

安装:

1
2
3
4
5
# 安装libgpiod库
sudo apt install libgpiod2
# 安装 adafruit-circuitpython-irremote
sudo pip install adafruit-circuitpython-irremote

需要注意,adafruitblinka库自带一个libgpiod_pulsein,使用file命令查看,为32位版本,需要使用64位替换:
1
2
3
4
5
6
7
8
file /usr/local/lib/python3.8/dist-packages/adafruit_blinka/microcontroller/bcm283x/pulseio/libgpiod_pulsein

# 以下为编译`libgpiod_pulsein`64bit版本
sudo apt install libgpiod-dev
#git clone https://github.com/adafruit/libgpiod_pulsein.git
cd libgpiod_pulsein/src
make

待续

X、更新Ubuntu和各个python

1) 添加一个alias,方便更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sudo vi ~/.bash_aliases

# 复制添加以下内容至 ~/.bash_aliases文件
alias pipupdate ='sudo pip install -U numpy scipy matplotlib pandas lxml requests RPi.GPIO \
smbus2 opencv-contrib-python-headless adafruit-circuitpython-ssd1306 \
Adafruit-Blinka adafruit-circuitpython-busdevice Adafruit-PureIO\
adafruit-circuitpython-framebuf adafruit-circuitpython-motor \
adafruit-circuitpython-pca9685 adafruit-circuitpython-register \
Adafruit-PlatformDetect adafruit-circuitpython-mpu6050 \
adafruit-circuitpython-lsm9ds0 adafruit-circuitpython-adxl34x \
adafruit-circuitpython-vl53l0x adafruit-circuitpython-pcf8591'

# 激活
sudo source ~/.bash_aliases

XX、题外话

  1. 如果使用的是树莓派自己的系统(2020-12-02-raspios-buster-armhf-lite,非ubuntu),首先需要卸载自带的vim-common 安装完整版的vim,才能正常使用vim。

1
2
sudo apt remove vim-common
sudo apt install vim

  2. 如果希望在 Ubuntu Server下使用桌面,命令:

1
sudo apt insatll ubuntu-desktop