最近我的树莓派被用于作原型机了
只好重新用新的板子重新配置
下载系统镜像
镜像下载地址,这里有许多可选镜像,我用的是raspbian
我之前是在windows下用win32diskimager往sd卡里刷系统的
这次准备用dd(方便批量操作),在mac下.参考这篇文章:Mac下给SD卡安装树莓派Raspbian系统
2018.1.28更新: 推荐使用: etcher
安装系统
这里我们讨论两种情况,新买的sd卡和已经安装过系统的sd卡(重刷)
新的sd卡
一般新买的卡都已经格式化好了,这是最简单的情况, 按照Mac下给SD卡安装树莓派Raspbian系统的做法就行,微软下快速格式化可能会有问题(没有做分区)
这里复述一下核心内容:
1
2
3
4
5
6
7
|
df # 查看当前已经挂载的卷
# 假设设备文件为:/dev/disk1s1 ,( 通过查看设备名判断)
diskutil unmount /dev/disk1s1 #卸载
diskutil list # 确认设备 (通过存储大小)
# 安装系统
dd bs=4m if=pi.img of=/dev/rdisk1 #我的速度大概是17m/s
diskutil unmountDisk /dev/disk1 #卸载设备
|
至此,系统就刷好了
重刷装有系统的sd卡
如果是重刷装有系统的sd卡,我们需要先把SD卡还原成初始状态:
- 下载bootsector.img
- dd bs=4m if=./bootsector.img of=/dev/rdisk1 # 假设设备为disk1
然后格式化sd卡(我把它格式化为MS-DOS(FAT)),至此你就可以把它当做新卡,用处理新卡的方式安装系统了
登录系统
我只买了树莓派,没有买高清转接头之类的东西,没打算把树莓派连到屏幕。那么我们如何登录系统,进行操作呢
首先使用网络连接树莓派网口,然后找个扫描ip的软件,我用的是fing(mac和iphone都有),手机/电脑只要和树莓派在同个网络里,就可以找到它(通过设备名) (ps: brew cask install fing)
然后ssh登录即可,用户名和密码分别是:pi/raspberry (11-25版本可能需要先进用屏幕登录在raspi-config里开启ssh:A SECURITY UPDATE FOR RASPBIAN PIXEL) 文章提到如果你想默认默认ssh只需要在sd卡/boot/里加上ssh
文件就行,内容无所谓,可以为空
树莓派3代自带无线网卡,我们把无线网卡连上wifi,之后就不需要,细节下文再说
配置
输入sudo raspi-config
开始设置,相关设置可以看说明
#Expand Filesystem
扩展 SD 卡上可用的空间, 否则你会觉得怎么可用空间这么小
VNC借由网络,可发送键盘与鼠标的动作及即时的屏幕画面
VNC与操作系统无关,因此可跨平台使用
我在mac下使用RealVNC
1
2
3
4
|
sudo apt-get install tightvncserver # 安装
vncserver :1 # 启用 ,之后在 vnc client里输入 ip:1即可进入图形界面
# vncpasswd # 修改密码
# 使用这个更清晰
|
supervisor文件为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/etc/supervisord.conf.d/vncserver.conf
[program:vncserver]
user = pi ; 用哪个用户启动
environment = HOME="/home/pi",USER="pi"
directory = /home/pi/mylab ; 程序的启动目录
command = /usr/bin/vncserver :1
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = false ; 不需要自动重启
;startretries = 3 ; 启动失败自动重试次数,默认是 3
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /tmp/vncserver.log
;stopsignal = QUIT
|
换国内源
1
2
3
|
#sudo vi /etc/apt/sources.list ,使内容变为
deb http://mirrors.aliyun.com/raspbian/raspbian/ jessie main non-free contrib
deb-src http://mirrors.aliyun.com/raspbian/raspbian/ jessie main non-free contrib
|
修改hostname
sudo vim /etc/hostname
无线网络
如果你直接在命令行里配置可以参考:树莓派 Raspberry Pi 设置无线上网
修改配置文件:/etc/network/interfaces
:
1
2
3
4
|
auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa.conf
iface default inet dhcp
|
之后在/etc/wpa.conf
里加上你的无线热点(可以添加多个):
1
2
3
4
5
6
|
network={
ssid="xxx"
key_mgmt=WPA-PSK
psk="xxx"
id_str="myiphone"
}
|
无线网卡的控制命令为:
1
2
3
|
sudo ifup wlan0 #启用
sudo ifdown wlan0 #关闭
sudo service network-manager restart #重启
|
更直观的配置方式可以使用VNC client进入图形环境里
如果你外接了usb网卡,记得加驱动,诸如(sudo apt-get install firmware-realtek
)
如果有错,查看日志:/var/log/syslog
树莓派作为无线AP
使用create_ap
1
2
3
4
5
6
7
8
|
git clone https://github.com/oblique/create_ap
cd create_ap
sudo make install
#安装依赖
sudo apt-get install util-linux procps hostapd iproute2 iw haveged dnsmasq #dnsmasq 是dns服务器
sudo create_ap wlan0 eth0 wwjpi3 wwjpipass --no-virt # https://github.com/oblique/create_ap/issues/185
# 加到supervisor里 #/usr/bin/create_ap wlan0 eth0 wwjpi3 wwjpipass --no-virt
|
树莓派的地址为:192.168.12.1
, 路由器的地址为 192.168.0.1
进一步的发挥空间,我们可以把它当做一个钓鱼热点(已经运行了53端口DNS服务器)
注意:如果同时使用无线ap和普通wifi网卡,建议开机后再加入wifi网卡,然后ifup启用,否则可能导致热点无法开机启动
DHCP服务
1
2
3
4
5
6
7
|
sudo apt-get install dnsmasq
# vim /etc/dnsmasq.conf
interface=wlan0 #可能会影响wifi_ap
bind-interfaces
address=/#/192.168.12.1 #将对所有网站的访问重定向到本机
sudo service dnsmasq restart
|
连接VPN
安装客户端: sudo apt-get install pptp-linux
使用root用户创建/etc/ppp/peers/vpn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
pty "pptp XXX.XXX.XXX.XXX --nolaunchpppd"
name 用户名
password 密码
remotename PPTP
require-mppe-128
require-mschap-v2
refuse-eap
refuse-pap
refuse-chap
refuse-mschap
noauth
persist
maxfail 0
defaultroute
replacedefaultroute
usepeerdns
|
启动/断开vpn:
蓝牙
树莓派3自带蓝牙
1
2
3
4
5
6
|
/etc/init.d/bluetooth status # 查看蓝牙状态
sudo bluetoothctl #进入蓝牙程序,替代了原来的bluez-simple-agent
# 之后按照步骤连接
# 试一首歌
apt-get install mpg123
mpg123 mp3_uri
|
蓝牙图形界不稳定,命令行的操作为
1
2
3
4
5
6
7
8
|
bluetoothctl
power on
scan on
agent on
pair #DD:8E:F1:CA:B8:9F #my bb8
trust DD:8E:F1:CA:B8:9F
connect DD:8E:F1:CA:B8:9F
quit
|
参考:
如果蓝牙连接好 却无法播放声音,可能是默认的声音输出是系统声卡,设置PulseAudio Volume Control
,在设置里把bcm2835设置为off
音频相关
- play
- mplayer/mpg123
- sox 录音
- alsamixer 调节音量
1
2
|
sox -d /tmp/recording.wav
play /tmp/recording.wav
|
坑
使用蓝牙音箱时,尽量不要同时将树莓派作为作为热点,否则可能导致声音卡顿
PyAudio
1
2
|
sudo apt-get install libportaudio0 libportaudio2 libportaudiocpp0 portaudio19-dev
sudo pip install PyAudio
|
其它
我的编程环境
1
2
3
4
|
sudo apt-get install vim git tmux ack-grep lynx
# 我的vim配置文件
wget https://raw.githubusercontent.com/wwj718/wwj718-vim/master/wwj718_vim_vimrc -O ~/.vimrc
|
jupyter lab (开发环境)
1
2
3
4
5
6
7
8
9
10
11
12
13
|
sudo pip install pip --upgrade -i http://pypi.douban.com/simple
sudo apt-get install python-dev
# jupyter
sudo pip install jupyter -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
sudo pip install jupyterlab -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
sudo jupyter serverextension enable --py jupyterlab --sys-prefix
# jupyter lab --notebook-dir="." --no-browser --port 5000 --ip=0.0.0.0
# vim ~/.bashrc
# alias jupyterlab="jupyter lab --notebook-dir="." --no-browser --port 8888 --ip=0.0.0.0"
# jupyter notebook --no-browser --port 5000 --ip=0.0.0.0
# 属于jupyter作为开发环境
|
建议使用jupyterlab
1
2
3
4
|
wget https://raw.githubusercontent.com/rupa/z/master/z.sh -O ~/z.sh
# 在.bashrc添加 ~/.bashrc
echo . ~/z.sh > ~/.bashrc
# souce ~/.bashrc
|
GPIO相关
I2C
如果要用Adafruit_LED_Backpack,需要开启I2C
1
2
3
4
5
6
7
|
sudo apt-get install python-smbus
sudo apt-get install i2c-tools
sudo raspi-config #advanced options
sudo vim /etc/modules # add i2c-bcm2708 and i2c-dev
# reboot
# test
sudo i2cdetect -y 1
|
系统管理与监控
Linux Dash
A beautiful web dashboard for Linux
1
2
3
|
git clone https://github.com/afaqurk/linux-dash
cd linux-dash
sudo python https://github.com/afaqurk/linux-dash
|
默认80端口
摄像头
我使用的是官方摄像头,连上后
sudo raspi-config #Enable Camera
查看是否正常:ls /dev/video*
,如果有video0就正常,如果没有,则 sudo modprobe bcm2835-v4l2
,写入/etc/rc.local以保证开机运行
###截个图
1
2
|
sudo apt-get install fswebcam
fswebcam -r 1280x720 /tmp/image1.jpg
|
motion
监控与动作捕捉(像素变化)
sudo apt-get install motion
配置:`sudo vim /etc/motion/motion.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
daemon off #on则后台运行
stream_localhost off #可以局域网内访问,否则只能localhost访问
webcontrol_localhost off
quiet on
videodevice /dev/video0
framerate 2 #30 很流畅 但是时间快
stream_maxrate 1 #30
auto_brightness off
#target_dir /home/pi/camera_data
ffmpeg_output_movies on #输出视频(变化)
output_pictures off #输出图片
width 640
height 480
threshold 500 #灵敏度,变化的像素,决定是否捕捉
max_movie_time 5 #拍摄时间
logfile /tmp/motion.log
#noise_level 60
# event
|
运行 :sudo motion
访问:ip:8081
默认存储在/var/lib/motion
在python中调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import pygame
import pygame.camera
from pygame.locals import *
# initialize
pygame.init()
pygame.camera.init()
# capture a image
camera = pygame.camera.Camera("/dev/video0", (640, 480))
camera.start()
image = camera.get_image()
pygame.image.save(image, "image.jpg")
camera.stop()
|
建议使用python3.6,pygame可直接使用pip安装
使用pyenv文档参考: python多版本安装笔记
记得先安装依赖
1
2
3
|
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev
|
机器视觉
pip install opencv-python
在树莓派上目前无法使用 https://github.com/skvark/opencv-python/issues/13
需要编译安装:Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pi
netdata
Get control of your servers. Simple. Effective. Awesome
1
2
3
4
5
6
7
|
apt-get install zlib1g-dev uuid-dev libmnl-dev gcc make git autoconf autoconf-archive autogen automake pkg-config curl
git clone https://github.com/firehol/netdata.git --depth=1
cd netdata
# build it, install it, start it
sudo ./netdata-installer.sh
# 访问ip:19999
|
相关数据:
1
2
3
4
5
6
7
|
- the daemon at /usr/sbin/netdata
- config files in /etc/netdata
- web files in /usr/share/netdata
- plugins in /usr/libexec/netdata
- cache files in /var/cache/netdata
- db files in /var/lib/netdata
- log files in /var/log/netdata
|
卸载:sudo ./netdata-uninstaller.sh
如果要监控nginx,需要做些配置:netdata nginx,The spectacles of a web server log file
1
2
3
|
编译nginx
--with-http_stub_status_module
|
supervisor
Supervisor process control system for UNIX
1
2
3
4
5
6
7
8
|
#切换到sudo用户
pip install supervisor
#echo_supervisord_conf > /etc/supervisord.conf #默认用这个
mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf #这个配置Ajenti才能管理
mkdir /etc/supervisord.conf.d
# 修改配置文件,include区段修改为 files = /etc/supervisord.conf.d/*.conf
# 开机自启 . 往/etc/rc.local加入/usr/local/bin/supervisord
|
supervisor的web管理端口为9001,需要开启
添加新的进程配置,可以使用下边介绍的Ajenti来做, 配置信息会被直接写入:/etc/supervisor/supervisord.conf
更多细节参考:使用Supervisor来管理进程
demo
/etc/supervisord.conf.d/socket_ipc.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[program:socket_ipc]
user = root ; 用哪个用户启动
directory = /home/pi/mylab/raspberrypi_lab ; 程序的启动目录
command = /usr/bin/python socket_ipc.py ;
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = false ; 不需要自动重启
;startretries = 3 ; 启动失败自动重试次数,默认是 3
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /tmp/socker_ipc.log
;stopsignal = QUIT
|
gotty可以把terminal分享到web,默认端口是8080
1
2
|
# 下载https://github.com/yudai/gotty/releases ,我下的是gotty_linux_arm.tar.gz
gotty -w vim #把vim已编辑方式分享出来,分享vim就够了,vim可以切换到bash
|
如果我们把8080端口用ngrok分享出来(ngrok用supervisor管理),实际就是一个后门,用作开发调试十分方便
Ajenti可以让你很简单地配置不同的常规服务程序,如Apache/nginx、Samba、BIND、Squid、MySQL、cron、防火墙等等
十分适合非技术用户配置系统应用,可以看做服务器管理面板
1
2
3
4
5
6
|
wget http://repo.ajenti.org/debian/key -O- | apt-key add -
echo "deb http://repo.ajenti.org/debian main main debian" >> /etc/apt/sources.list
sudo apt-get install ajenti
sudo apt-get install build-essential python-pip python-dev python-lxml libffi-dev libssl-dev libjpeg-dev libpng-dev uuid-dev python-dbus
# sudo easy_install -U pip #先升级,16.5.27的版本原始pip可能报错
sudo pip install ajenti-panel ajenti.plugin.dashboard ajenti.plugin.settings ajenti.plugin.plugins
|
默认端口8000,默认登录信息为:root:admin
,之后修改密码之类的都在控制面板里边做
配置文件为:/etc/ajenti/config.json
默认开机自启
国内源安装nodejs
1
2
3
4
5
6
|
#注意编译非常慢
wget https://npm.taobao.org/mirrors/node/v6.9.1/node-v6.9.1.tar.gz
tar zxvf node-v6.9.1.tar.gz
cd node-v6.9.1.tar.gz/
./configure
sudo make install
|
坑
09-23的版本坑多
zip包mac下无法解压
在linux和window下都行
ssh端口拒绝
ip能ping通,ssh端口关闭,怀疑是ssh server没有开启
nmap -p 22 xxx 测试关闭,fuck
建议下载5-27版本,所有版本在这里:downloads.raspberrypi.org
2018.1.10更新(基于2017.11.29版本)
初始化配置SSH(修改boot)
在 boot
分区新建一个文件,空白的即可,文件命名为 ssh
. 默认用户名密码为:pi:raspberry
无屏幕和键盘配置树莓派WiFi
注意: 2017.11.29号的版本(Stretch),无法使用.详情见Raspbian Stretch: Wifi not starting on boot
目前只使用于Stretch之前的版本(2019.11.07更新: 最新的Buster版本没有问题!)
在树莓派的 /boot
目录下新建 wpa_supplicant.conf
文件,按照下面的参考格式填入内容并保存 wpa_supplicant.conf
文件
1
2
3
4
5
6
7
8
9
10
|
country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="WiFi-A"
psk="12345678"
key_mgmt=WPA-PSK
priority=1
}
|
建议使用有线网线先进入系统,打开vnc,然后在桌面中使用图形化方式连接wifi(之后永久有效)
2017.11.29版本中scratch2、node-red、minecrafe都正常!
vnc
关于vnc的参考这里:VNC (VIRTUAL NETWORK COMPUTING),这篇文章关于配置minecraft部分无效
默认用户名也是:pi:raspberry
使用vnc玩minecraft
要使用vnc玩minecraft,参考How do I enable the experimental direct capture feature from the command line?
在/root/.vnc/config.d/vncserver-x11
添加
1
2
3
4
5
|
CaptureTech=raspi
ExperimentalRaspiCapture=1
ServerPreferredEncoding=JPEG
|
重启vncserver:sudo systemctl restart vncserver-x11-serviced
如果你觉得清晰且慢,可以试试:vncserver
noVNC
1
2
3
4
|
git clone https://github.com/novnc/noVNC
# 安装好tightvncserver之后
./utils/launch.sh --vnc localhost:5901
# open: http://raspberrypi.local:6080/vnc.html?host=raspberrypi.local&port=6080
|
http://raspberrypi.local:6080/vnc.html?host=raspberrypi.local&port=6080
remote gpio
raspi-config
, enable Remote GPIO
之后使用python-gpiozero控制即可,文档参考:Configuring Remote GPIO.之后你就可以在mac下使用python代码控制树莓派的gpio(pip install gpiozero pigpio
)
1
2
|
export GPIOZERO_PIN_FACTORY=pigpio
export PIGPIO_ADDR=10.10.100.183
|
1
2
3
4
5
6
7
8
9
10
|
from gpiozero import LED
from time import sleep
red = LED(17)
while True:
red.on()
sleep(5)
red.off()
sleep(5)
|
也可以在scratch2中添加树莓派扩展,这样就可以在scratch2中利用remote gpio来与硬件交互
测试工具
shell 下使用gpio
列出所有pin: gpio readall
1
2
3
4
5
6
7
|
# gpio用的mode是wPi,而gpiozero用的是BCM,所以pin17对应wpi的pin0
gpio mode 0 out
gpio read 0 # 0
gpio write 0 1
gpio read 0 # 1
gpio write 0 0
gpio read 0 # 0
|
2018.01.30更新
pi zero w可以可以直接使用pi3的镜像。其中的异同参考:SD Cards Images for Pi 3 and Pi Zero
参考