Xavier's Blog

做更美好的自己

树莓派

树莓派

安装系统

官方烧录工具 Raspberry Pi Imager

下载地址:https://www.raspberrypi.org/downloads/

下载操作系统

官方地址:https://downloads.raspberrypi.org/ 官网下载选项中没有64位的Pi OS,可在清华源中下载、再解压:https://mirrors.tuna.tsinghua.edu.cn/raspberry-pi-os-images/raspios_arm64/images/

开启 SSH

烧录好的系统,默认不会开启 SSH。在TF盘符下,新建一个名为 ssh 的空文件(无扩展名) ssh连接到树莓派。默认用户名:pi,默认密码:raspberry

cat /etc/rpi-issue # 查看系统信息 armhf代表32位,arm64代表64位
lscpu              # 查看CPU信息 armv7代表架构32位,armv8第一个arm64架构
getconf LONG_BIT   # 查看系统位数
sudo passwd pi     # 修改pi用户密码
sudo passwd root   # 修改root用户密码

开机启动

supervisor

安装 supervisor

sudo apt install supervisor

默认会开机启动

应用配置

supervisor 管理应用的进程,需要对每个应用进行配置。在 /etc/supervisor/conf.d 中创建 xxx.conf,每个应用对应一个配置文件即可。 创建文件

sudo nano helloworld.conf

在窗口中添加

[program:helloworld]  ;程序的名称
command =  /root/www/HelloWorld ;执行的命令
directory = /root/www/ ;命令执行的目录
user = root  ;执行进程的用户
stopsignal = INT  
autostart = true  ;是否自动启动
autorestart = true  ;是否自动重启
startsecs = 1  ;自动重启间隔
stderr_logfile = /var/log/helloworld.err.log  ;标准错误日志
stdout_logfile = /var/log/helloworld.out.log  ;标准输出日志

保存,退出。 注意:文件中的每个分号之前必须有空格,不然会报错

supervisor

supervisorctl reload

或热重启,不会重启其他子进程

supervisorctl reread
supervisorctl update

为确保没有错误,可以正常启动,使用前文提到的查看supervisor状态的命令查看。或者查看要管理的进程是否启动,本例中可以使用下面的命令:

ps -ef | grep HelloWorld

常用命令

启用开机启动

systemctl enable supervisord.service

启动Supervisor

systemctl start supervisord.service

查看Supervisor状态

systemctl status supervisord.service

关闭所有任务

supervisorctl shutdown 

启动或关闭某个应用

supervisorctl stop|start program_name

查看所有任务状态

supervisorctl status 

用cron规划任务

cron是UNIX系统下常用的任务规划软件。你可以在cron中要求系统在特定的时间执行特定的任务。cron在系统中有一个运行着的守护进程。当系统时间符合某一条规划记录时,守护进程就会启动相应的任务。在树莓派应用行中运行下面命令,就可以找到cron的守护进程: 查看已有的定时任务

crontab -l
ps aux | grep cron

结果如下:

root       424  0.0  0.2   5072  2384 ?        Ss   14:40   0:00 /usr/sbin/cron -f
pi        6938  0.0  0.2   4280  2008 pts/1    S+   17:42   0:00 grep --color=auto cron

记录中的第一条,就是cron的进程。 如果想要规划任务,那么可以用下面的命令来编辑规划记录:

crontab -e

在规划记录中,每一行为一条记录,#开始的是注释。每一行记录又分为6列,用空格分隔,分别表示分钟(m,0-59)、小时(h,0-23)、一个月中的哪一天(dom,1-31)、月(mon,1-12)、一个星期中的哪一天(dow,0-6)、以及要执行的命令。在填写规划时间的时候,除了用数字,还可以用*,用来表示所有:

# m h  dom mon dow  command
 30 5  10   3   *   touch /tmp/test.log

上面表示每年3月10号5点30分,执行touch /tmp/test.log。

# m h  dom mon dow  command
 10 18  *   *   *   echo "Hello World" > /home/pi/log

每天的18点10分执行echo “Hello World” > /home/pi/log。 一列中,还可以规划多个时间点,例如:

# m h  dom mon dow   command
 10 2-4  *   *   *   echo "Hello World" > /home/pi/log

每天2:10、3:10和4:10执行。也就是说,“N-M”表示了从N到M的范围。

# m h  dom mon dow   command
 30 1,5  *   *   *   echo "Hello World" > /home/pi/log

每天1:30和5:30执行。也就是说,“N,M”表示了N和M两个时间点。

规划记录crontab保存后,cron就将按照规划,在对应的时间执行对应的命令。每个用户有一个自己的crontab,当cron要执行规划时,也会以相应的用户身份来执行。我是以pi用户修改保存的crontab,cron就会以pi的身份来运行各个命令。如果想修改其他用户的crontab,那么可以用-u关键字:

sudo crontab -e -u root

用cron来开机启动 cron除了做时间规划,还可以用于开机启动。在crontab中添加下面一行记录,就可以方便的实现:

@reboot touch /home/pi/reboot.log

文件保存位置

/var/spool/cron/

树莓派开启 crontab 日志

配置日志文件 rsyslog.conf

    pi@raspberrypi:~ $ sudo vim /etc/rsyslog.conf

在文件中找到cron.*一行:

    #cron.*                     /var/log/cron.log

#号表示该行被注释掉了,去掉#号,后面是日志文件的全路径,改成:

    cron.*                    /var/log/cron.log

重新启动日志服务

    pi@raspberrypi:~ $ sudo service rsyslog restart

至此配置完成,以后crontab生成的日志文件就会输出到/var/log/cron.log中,查看日志文件:

    pi@raspberrypi:~ $ cat /var/log/cron.log

重启 crontab 服务

sudo /etc/init.d/cron restart

指定编辑器

Error opening terminal: unknown.
crontab: "/usr/bin/sensible-editor" exited with status 1
EDITOR=vim crontab -e

EC20

sudo minicom -D /dev/ttyUSB2 命令控制 AT + QGPS = 1 开启GPS采集 /dev/ttyUSB3 PPP拨号上网 /dev/ttyUSB1 GPS输出信息

无法 ping 通树莓派的 wlan0 口问题

原来是开启了AP隔离,关闭即可 在树莓派路由表上添加这样的一条路由就可以了:

sudo route add default gw 192.168.0.1  #192.168.0.1是无线路由器的地址

树莓派开机自动连接 Wi-Fi

树莓派使用的是 zero w 树莓派系统2021-03-04-raspios-buster-armhf-lite 电脑是mac系统 首先安装fuse-ext2使电脑可以挂载ext文件系统

查看分区

diskutil list
/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *31.9 GB    disk2
   1:             Windows_FAT_32 boot                    268.4 MB   disk2s1
   2:                      Linux                         31.6 GB    disk2s2

挂载

mkdir ~/Desktop/DISK
sudo mount -t fuse-ext2 /dev/disk2s2 ~/Desktop/DISK

卸载

sudo umount /dev/disk2s2

在sd卡/etc/network/目录下修改interfaces文件,内容如下

allow-hotplug wlan0
auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

在sd卡/etc/wpa_supplicant/目录下修改wpa_supplicant.conf文件,内容如下

network={ 
    ssid="你的WiFi的SSID"
    psk="你的WiFi密码"
    key_mgmt=NONE 
    priority=4 
} 

其中ssid表示WiFi的SSID号,key_mgmt表示加密类型,key_mgmt=NONE表示没有密码或者WEP,key_mgmt=WPA-PSK表示WPA/WPA2加密,psk表示密码,没有密码就不用写,priority表示优先级,大的优先连接,一般这两种就够了。

树莓派 zero w 开启串口打印

串口默认被蓝牙占用,参看链接https://www.raspberrypi.org/documentation/configuration/uart.md 需要关闭蓝牙,在 /boot/config.txt 文件中开头加入

dtoverlay=disable-bt

树莓派 zero w 设置串口输入

树莓派CPU内部有两个串口,一个PL001 UART和一个Mini UART。Mini UART没有时钟源,必须由内核提供时钟源,而内核频率本身是变化的,导致Mini UART速率不稳,无法正常使用。RPI ZERO W与以往老版本RPI不同,没有将PL011 UART分配GPIO中的UART(GPIO14和GPIO15),而是将其分配给了蓝牙模块。我们需要关闭蓝牙对PL011 UART的使用,恢复GPIO串口对PL011 UART的使用。

树莓派设置静态IP地址

在sd卡/etc/目录下修改dhcpcd.conf文件,内容如下

interface wlan0
static ip_address=192.168.4.1/24
nohook wpa_supplicant

WiringPi GPIO安装

wiringPi包括一套gpio控制命令,使用gpio命令可以控制树莓派GPIO管脚。用户可以利用gpio命令通过shell脚本控制或查询GPIO管脚。

更新列表:

pi@raspberrypi:~ $ sudo apt-get update

更新软件:

pi@raspberrypi:~ $ sudo apt-get upgrade

安装:

pi@raspberrypi:~ $ sudo apt-get install wiringpi

wiringPi包括一套gpio命令,使用gpio命令可以控制树莓派上的各种接口,通过以下指令可以测试wiringPi是否安装成功。

pi@raspberrypi:~ $ gpio -v
gpio version: 2.50
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Pi Zero-W, Revision: 01, Memory: 512MB, Maker: Sony
  * Device tree is enabled.
  *--> Raspberry Pi Zero W Rev 1.1
  * This Raspberry Pi supports user-level GPIO access.

查看GPIO图

pi@raspberrypi:~ $ gpio readall
 +-----+-----+---------+------+---+-Pi ZeroW-+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5v      |     |     |
 |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | ALT0 | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+-Pi ZeroW-+---+------+---------+-----+-----+

添加默认网关

sudo route add gw your_ipaddr

查看网关

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    303    0        0 wlan0
169.254.0.0     0.0.0.0         255.255.0.0     U     205    0        0 wwan0
192.168.1.0     0.0.0.0         255.255.255.0   U     303    0        0 wlan0

改变默认shell

sudo dpkg-reconfigure dash
no
ls -l `which sh`
lrwxrwxrwx 1 root root 4 Mar  4 22:45 /usr/bin/sh -> dash
ls -l `which sh`
lrwxrwxrwx 1 root root 4 Apr 21 04:18 /usr/bin/sh -> bash