最近我的树莓派被用于作原型机了

只好重新用新的板子重新配置

下载系统镜像

镜像下载地址,这里有许多可选镜像,我用的是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借由网络,可发送键盘与鼠标的动作及即时的屏幕画面

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:

1
2
pon vpn
poff 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

z

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 nginxThe 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

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

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 17 out
gpio read 17 # 0
gpio write 17 1
gpio read 17 # 1
gpio write 17 0
gpio read 17 # 0

2018.01.30更新

pi zero w可以可以直接使用pi3的镜像。其中的异同参考:SD Cards Images for Pi 3 and Pi Zero

参考