树莓派4B 开发环境搭建
一.OS安装和设置
raspbian 操作系统安装
下载刷sd卡的工具
https://www.raspberrypi.org/software/
下载镜像
安装好工具后,运行工具,并选择下载好的镜像,刷到一张16G以上SD卡里,刷完将卡装到树莓派里,连上键盘鼠标和显示器,上电启动即可。
配置网络
a. wifi配置,
1.图形界面,可以直接在任务面板上选择.
2.修改配置文件
pi@raspberrypi:/ $ vi /etc/wpa_supplicant/wpa_supplicant.conf
#加入下面设备
network={
ssid="test" #wifi 名称
psk="password" #wifi 密码
key_mgmt=WPA-PSK
}
b.有线网络配置
1.图形方式
2.修改配置文件方式
pi@raspberrypi:/ $ vi /etc/dhcpcd.conf
#加入以下内容
interface eth0
static ip_address=192.168.1.99
static routers=
static domain_name_servers=
static domain_search=
修改apt软件源为国内源(清华)
sudo vi /etc/apt/sources.list
# 编辑 `/etc/apt/sources.list` 文件,删除原文件所有内容,用以下内容取代:
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi
sudo vi /etc/apt/sources.list.d/raspi.list
# 编辑 `/etc/apt/sources.list.d/raspi.list` 文件,删除原文件所有内容,用以下内容取代:
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
更新wiringpit版本到2.52, 使 gpio readall 正常运行
#显示 Pi 4B的针脚图,默认有错误
pi@raspberrypi:~ $ gpio readall
Oops - unable to determine board type... model: 17
#因为gpio的版本不是最新的,4b需要 2.52支持
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: Unknown17, Revision: 04, Memory: 0MB, Maker: Sony
* Device tree is enabled.
*--> Raspberry Pi 4 Model B Rev 1.4
* This Raspberry Pi supports user-level GPIO access.
#直接用apt-get更新不行,只能到2.50
pi@raspberrypi:~ $ sudo apt-get install wiringpi
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
wiringpi 已经是最新版 (2.50)。
升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 65 个软件包未被升级。
#要单独下载wiringpi最新版下载
pi@raspberrypi:/tmp $ cd /tmp
pi@raspberrypi:/tmp $ wget https://project-downloads.drogon.net/wiringpi-latest.deb
pi@raspberrypi:/tmp $ sudo dpkg -i wiringpi-latest.deb
(正在读取数据库 ... 系统当前共安装有 100025 个文件和目录。)
准备解压 wiringpi-latest.deb ...
正在解压 wiringpi (2.52) 并覆盖 (2.50) ...
正在设置 wiringpi (2.52) ...
正在处理用于 man-db (2.8.5-2) 的触发器 ...
#OK 可对了。
pi@raspberrypi:/tmp $ gpio readall
+-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | ALT0 | 1 | 3 || 4 | | | 5v | | |
| 3 | 9 | SCL.1 | ALT0 | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 1 | ALT5 | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | ALT5 | 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 4B--+---+------+---------+-----+-----+
vnc 设置
通过 realvncview 软件可以 远程连接 pi ,这样实际码代码可以在电脑上做,调试或发布时才把代码复制到pi.
pi 里打开 vncserver
电脑上装vncview就能连上了(确保电脑和pi的网络是通的,用pi的ip地址连)
二.Python设置
删除默认的python2.7版本
#删除版本
sudo apt-get autoremove python2.7
#将常用版本,链接为python
sudo ln -s /usr/bin/python3.7 /usr/bin/python
#同时将pip也改过来
sudo ln -s /usr/bin/pip3 /usr/bin/pip
更新pip源
#临时改为清华源,并更新pip
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U
#更新pip源(会自动改pip的配置文件)
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
安装wxpyhon:
正常用pip并不能安装上wxpython,有可能版本不兼容的问题. 可以用树莓派的软件管理,直接安装.
也可以直接在 wxpython 官网上载 后安装 https://extras.wxpython.org/wxPython4/extras/linux/gtk3/debian-10/
下载 demo https://extras.wxpython.org/wxPython4/extras/4.0.4/
三.常用软件安装
如果下载的镜像里没选(recommanded)装机推荐软件,可以在菜单里再安装即可(注意前面改apt的源要做,否则连国外源非常慢)
安装虚拟键盘(下面是用命令安装,同理也可以 add/remove software 界面里安装)
sudo apt-get install matchbox-keyboard
#如果出现键盘乱码,需要安装中文包
sudo apt-get install ttf-wqy-zenhei
获取SD卡ID 方法
cat /sys/block/mmcblk0/device/cid # linux2.6.26 后标记过时
cat /sys/class/block/mmcblk0/device/cid #目前最合适的方法
cat /sys/class/mmc_host/mmc0/mmc0:1234/cid
#上面都是链接到这个设备
cat /sys/devices/platform/soc/3f202000.mmc/mmc_host/mmc0/mmc0:1234/cid
cat /sys/devices/platform/soc/3f202000.mmc/mmc_host/mmc0/mmc0:1234/block/mmcblk0/device/cid
#!/bin/zsh
#取网卡地址
mac=`ssh pi@192.168.3.39 "/sbin/ifconfig -a" |grep ether |awk '{printf "%s", $2}'`
#ssh pi@192.168.3.39 "/sbin/ifconfig -a" |grep ether |awk '{mac= $2}'
#Cpu serial
cpu=`ssh pi@192.168.3.39 "cat /proc/cpuinfo" |grep Serial |awk '{print $3}'`
#取SD卡序列号
sd=`ssh pi@192.168.3.39 "cat /sys/class/block/mmcblk0/device/cid"`
print $mac,$cpu,$sd
#1.开机自动运行 p.py
pi@raspberrypi3b:~/dev $ sudo vi /etc/rc.local
#在exit 0 前加如下格式行。
...略...
sudo su pi -c "/bin/python /home/pi/p.py "
exit 0
#2. rc.local 只能在3b用,4b已经失效。可以改 /etc/profile 实现自动启动。
pi@raspberrypi:~ $ sudo vi /etc/profile
#在最后面添加以下
...略...
pyid=$(ps aux | grep 'python /home/pi/p.py' | grep -v grep | awk '{print $2}')
if [ $pyid ]; then
echo file started $pyid
else
python /home/pi/p.py&
fi
# 反向代理:实现通过访问 x.x.x.x:9999就是访问树莓派的5900
#在树莓派执行
sudo ssh -NfR 9999:localhost:5900 xulong@x.x.x.x
# 在 x.x.x.x 配置
vim /etc/ssh/sshd_config
GatewayPorts yes
#X11Forwarding no
#在树莓派生成key , 私密放在.ssh 公钥加入 x.x.x.x /.ssh/authorized_keys
#实现 从树莓派 到 x.x.x.x 的ssh连接免密码输入
ssh-keygen -t rsa
#id_rsa : put to client .ssh
#id_rsa.pub : put to server .ssh and cat id_rsa.pub >> authorized_keys
#查找代理进程
ps -aux |grep 'ssh -NfR'
#杀掉代理进程
kill $(ps aux | grep 'ssh -NfR' | grep -v grep | awk '{print $2}')
#自动填密码,连接服务器,并实现本地的反向代理
#!/bin/bash
pass='password'
/usr/bin/expect << EOF
set timeout 30
spawn ssh -NfR 9999:localhost:22 help@server -p 8888
expect {
"(yes/no)" {send "yes\r"; exp_continue}
"password:" {send "$pass\r"}
"*@*" {send "exit\r"}
}
expect eof
EOF
西门子plc的读写,可以用 snap7库,参考官网: http://snap7.sourceforge.net/
#西门子plc的连接
#下载 snap7
# https://sourceforge.net/projects/snap7/files/1.4.1/
# snap7-full-1.4.1.tar.gz
#copy 到树莓派里,解压然后编译
pi@dev:~/snap7-full-1.4.2/build/unix $ pwd
/home/pi/snap7-full-1.4.2/build/unix
pi@dev:~/snap7-full-1.4.2/build/unix $ ls
arm_v6_linux.mk i386_bsd.mk i386_solaris_gcc.mk x86_64_bsd.mk x86_64_solaris_gcc.mk
arm_v7_linux.mk i386_linux.mk mips_linux.mk x86_64_linux.mk
common.mk i386_solaris_cc.mk README.txt x86_64_solaris_cc.mk
#可以看到,arm 有v6 v7两个版本, 这时要查一下当前树莓派的cpu型号。
pi@dev:~/snap7-full-1.4.2/build/unix $ lscpu
Architecture: armv7l <<<<<<<<<<<<<<<<<<<<<<<<<<
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
#知道是v7版的,那么,编译时选相应的编译文件 (arm_v7_linux.mk)
pi@dev:~/snap7-full-1.4.2/build/unix $ make -f arm_v7_linux.mk all
g++ -c "../../src/sys/snap_msgsock.cpp" -O3 -g -fPIC -mword-relocations -pedantic -o ../temp/arm_v7/sys_snap_msgsock.o -I. -I../../src/sys -I../../src/core -I../../src/lib
g++ -c "../../src/sys/snap_sysutils.cpp" -O3 -g -fPIC -mword-relocations -pedantic -o ../temp/arm_v7/sys_snap_sysutils.o -I. -I../../src/sys -I../../src/core -I../../src/lib
#编译完后,在build/bin目录找到相应cpu平台目录,就有编译完成的相应库文件了。
pi@dev:~/snap7-full-1.4.2/build/bin/arm_v7-linux $ pwd
/home/pi/snap7-full-1.4.2/build/bin/arm_v7-linux
pi@dev:~/snap7-full-1.4.2/build/bin/arm_v7-linux $ ls
libsnap7.so
#复制库文件到 /usr/lib
pi@dev:~/snap7-full-1.4.2/build/bin/arm_v7-linux $ cp libsnap7.so /usr/lib
#重建库文件配置(注意要执行要不然,后面会出现还是找不到这个库文件的问题,会提示你要执行的)
pi@dev:~/snap7-full-1.4.2/build/bin/arm_v7-linux $ sudo ldconfig
# pip 安装 python-snap7
pi@dev:~/snap7-full-1.4.2/build/bin/arm_v7-linux $ pip install python-snap7
Defaulting to user installation because normal site-packages is not writeable
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple, https://www.piwheels.org/simple
Collecting python-snap7
Downloading https://www.piwheels.org/simple/python-snap7/python_snap7-1.0-py3-none-any.whl (27 kB)
Installing collected packages: python-snap7
Successfully installed python-snap7-1.0
#至此python就能正常连接西门子plc了。可以测试一下,库安装完整。
pi@dev:~/snap7-full-1.4.2/build/bin/arm_v7-linux $ python
Python 3.7.3 (default, Jul 25 2020, 13:03:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import snap7
>>> plc = snap7.client.Client()
>>>