在前面的一篇文章中,描述了如何在树莓派3b+上安装ubuntu 64位系统,因为官方还没有发布正式版的64位系统,所以只有安装第三方系统,但是开发过程中会碰到各种奇怪的问题,比如缺少rasp-config,需要自己安装;比如gpio权限问题,每次重启都要重新赋权;比如通过WIFI SSH登陆时时不时WIFI会断开不稳定;比如树莓派官方摄像头无法驱动等等。所以在做需要用到GPIO,摄像头这些硬件通信的时候,安装官方的树莓派系统。

   最近又买了一个树莓派4B,原因是树莓派3B+我在做驱动直流电机实验的时候,使用的是面包板的电源线改造来的,他的输出电压是12V1A,是个DC头,我买了个DC转换头,引出了正极和负极,然后连上杜邦线,当时这两根线是带电的,我在操作的时候,不小心正极碰到了树莓派3B+的电路板,当时就看到了有火花,虽然当时树莓派没通电,但悲剧依旧发生了,我的树莓派3B+永远开不了机了,通电后始终是红色的灯亮,绿色的不亮。所以再次提醒,在接线的时候,一定要断电操作,不要带电操作,另外最好买一个树莓派外壳(虽然市面上大多数外壳都很丑),对树莓派有一定的保护作用,防止不小心碰到短路。

安装系统

   安装系统这里不赘述了,可以参考之前的文章 这讲一下如何配置SSH和WIFI,因为如果没买树莓派显示器的话,只有通过SSH的方式来操作树莓派了。

   当SD卡系统做好之后,在根目录先建一个名称为"SSH"的空白文件来开启SSH ,另外,在根目录新建一个名为“wpa_supplicant.conf”的文本文件,内容如下:

country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="wifiname"
psk="wifipwd"
key_mgmt=WPA-PSK
priority=1
}

   ssid为wifi名称,psk为WIFI密码,priority为优先级,1为最优先;如果有多个,可以填写多个network配置。

   直接配置,可以避免首先通过网线连接树莓派,然后通过路由器查看树莓派ip地址,然后进去再设置wifi的繁琐步骤。能连上WIFI之后,在路由器里直接查看IP地址,然后SSH上去操作即可。

更新软件源

   由于官方的软件源国内访问可能比较慢,所以需要更换软件源和系统源:

   修改软件源文件:

sudo nano /etc/apt/sources.list

  用#注释掉旧源:

#deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi

再添加新源,这里使用的是中科大的源:

deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi

nano的操作方法为,首先用sudo nano新建或修改,最后用“Ctrl+X",提示保存-y或放弃-n,按"y"即可保存修改。

   修改系统源:

sudo nano /etc/apt/sources.list.d/raspi.list

   用#注释掉旧源:

#deb http://archive.raspberrypi.org/debian/ buster main

   再添加新源:

deb http://mirrors.ustc.edu.cn/archive.raspberrypi.org/debian/ buster main

   设置完成之后,更新软件,更新系统:

sudo apt-get update
sudo apt-get upgrade
配置.NET Core环境

   跟前文里其实一样,首先取官网 找到.NET Core和ASP.NET CORE的最新安装包,目前地址如下,先下载:

wget https://download.visualstudio.microsoft.com/download/pr/56691c4c-341a-4bca-9869-409803d23cf8/d872d7a0c27a6c5e9b812e889de89956/dotnet-sdk-3.1.302-linux-arm.tar.gz
wget https://download.visualstudio.microsoft.com/download/pr/92e90ed5-dba3-427b-a876-8b46fe5e16b6/69cae4fe4a0ec6bc7585de6fa889fd66/aspnetcore-runtime-3.1.6-linux-arm.tar.gz

  解压:

mkdir dotnet-arm32
tar zxf dotnet-sdk-3.1.302-linux-arm.tar.gz -C $HOME/dotnet-arm32
tar zxf aspnetcore-runtime-3.1.6-linux-arm.tar.gz -C $HOME/dotnet-arm64

然后将下面系统路径,加到 /etc/profile 文件的最后:

export DOTNET_ROOT=$HOME/dotnet-arm32
export PATH=$PATH:$HOME/dotnet-arm32

完成之后,在命令行里输入 dotnet --info ,如果能看到.NET Core和ASP.NET Core的相关信息,表示.NET 运行时环境安装成功。

运行.NET Core IoT程序

   如果初次运行.NET Core IoT程序,可能会报没有权限的错误,比如如下:

Unhandled Exception: System.UnauthorizedAccessException: 
Setting a mode to a pin requires root permissions. ---> 
System.UnauthorizedAccessException: Access to the path '/sys/class/gpio/gpio27/direction' is denied. ---> 
System.IO.IOException: Permission denied
--- End of inner exception stack trace ---
at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func`2 errorRewriter)

   这个在树莓派3B+时是没有这类错误的,如果不是安装树莓派官方系统,也可能有类似错误,可以使用临时对gpiomem添加管理员权限解决:

sudo chmod 777 /dev/gpiomem

  但是重启之后,依然会有此类问题,需要再次添加。所以需要把当前用户pi加入到gpio组里,让当前用户具有访问gpio的权限。

  首先查看该设备所属的组:

stat -c "%A %G" /dev/gpiomem

   会显示该设备所属的组为“gpio”,然后将pi加入到gpio组,该操作需要当前用户为root用户:

usermod -a -G gpio pi

如果不存在任何组,可以新建组:

addgroup gpio

添加权限:

chown root.gpio /dev/gpiomem
chmod g+rw /dev/gpiomem

  现在的操作都是暂时的,要在启动的时候就授予权限,需要在/etc/udev/rules.d文件夹下新建一个名为gpio.rules的文件,内容为:

KERNEL=="whatever", NAME="%k", GROUP="gpio", MODE="0660"

   再次运行程序,如果还有问题,则可能需要更新gpio的驱动了。

更新GPIO驱动

   其实我就遇到了这个问题,按照以上的操作之后,仍然报没有权限,这个问题在Github的.NET Core IoT上也有网友遇到过,可能是个通病,里面说到的解决方法为更新libgpiod:

wget https://raw.githubusercontent.com/adafruit/Raspberry-Pi-Installer-Scripts/master/libgpiod.sh
chmod +x libgpiod.sh
./libgpiod.sh

   需要注意,raw.githubusercontent.com 该地址已经被墙,国内无妨访问,我们可以在这里下载libgpiod.sh,然后上传到树莓派里执行脚本。需要提醒的是在树莓派运行.sh脚本的方法为:

sudo sh ./test.sh

   即可运行当前目录下,名为test.sh的脚本。

  按照上述方法,我遇到了问题,提示版本不对:

checking linux/version.h usability... yes
checking linux/version.h presence... yes
checking for linux/version.h... yes
configure: error: "libgpiod needs linux headers version >= v5.5.0"

  于是又996了一番,在GitHub上找到了遇到相同问题的网友的解决方法,新建一个 test.sh,将下属内容拷贝到改文件中,然后上传到树莓派上执行,一切完成之后。GPIO终于可以正常访问了。

apt-get install -y libtool pkg-config autoconf-archive python3-dev
apt-get install -y build-essential
wget https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/snapshot/libgpiod-1.1.1.tar.gz
tar xvf libgpiod-1.1.1.tar.gz
cd libgpiod-1.1.1

export PYTHON_VERSION=3
./autogen.sh --enable-tools=yes --enable-bindings-python --prefix=/usr/local

make
make install
ldconfig
 

 

 

参考


  1. wpa_supplicant.conf 配置
  2. 【树莓派】更新软件源和系统源
  3. https://github.com/aquaticus/nexus433/issues/21
  4. https://github.com/dotnet/iot/issues/524
  5. https://raspberrypi.stackexchange.com/questions/5289/permissions-on-dev-entries