raspberry pi

raspberry pi

1、摄像头相关

1.1 拍照

raspistill -o image.jpg

1.2 录影

raspivid -o video.h264

默认录制5秒钟的视频,

1.3 视频串流到vlc

raspivid -o - -t 0 -vf -w 640 -h 360 -fps 25 | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

raspivid命令用来捕捉摄像头的视频

  • -o -    表示将视频输出到stdout
  • -t 0    表示视频捕捉时长,0表示无限
  • -vf    表示画面垂直翻转vertical flip
  • -w    宽度
  • -h    高度
  • -fps    视频帧率

cvlc是vlc的命令(所以树莓派本地也得安装有vlc)

  • -vvv    表示视频输入流
  • --sout    表示输出

然后启动电脑的vlc,选择菜单“媒体”-“打开网络串流”,输入URL:“rtsp://your.raspberry.pi.ip:8554/”,然后点击播放即可。

2、系统自带python2与python3两个环境

python --version
python2 --version
python3 --version
pip --version
pip3 --version

3、控制WS2812 LED灯带

参考https://learn.adafruit.com/neopixels-on-raspberry-pi?view=all

需要设备:LED灯带、面包板、杜邦线(连接线)。

网上大部分帖子都是说由于pi的GPIO针脚输出电压是3.3v,而WS2812 LED的控制针脚DIN需要的电压是5v。所以需要加一个3.3v-5v的电平转换器。但是实际上,这并不是必须的,3.3v同样可以驱动WS2812的控制信号。可能只有在灯带长灯珠多的情况下才不行吧?电力不够?sorry,我对电路并不了解。(我试过最长的灯带有200个灯珠,树莓派的GPIO针脚照样可以直接驱动LED的DIN控制信号。不过这时候就不能用树莓派来做LED的电源了,真的是电力不足,好像只能亮不到100个灯珠。需要给LED灯带外接一个5v,60w的电源,因为每个led灯珠功率大概是0.3w。)

我试验时候买的是下面这种,8个灯芯的灯条。

背面还得自己拿焊锡焊上针脚=。=#  还好那天带去单位叫设备室的人帮忙焊了。一个DIN控制信号输入,一个VOC电源输入,两个GND接地(实际上只接一个也是可以的,我也不知道它为啥要设计两个接地=。=)。

整个接好的电路如下图所示

a. 安装相关的python库

sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel

b. 示例代码

import board
import neopixel

pixels = neopixel.NeoPixel(board.D18, 8, brightness=0.2)
# 全部填充蓝色 
pixels.fill((0, 0, 255))
# 第0个节点红色
pixels[0] = (255, 0, 0)

c. 使用sudo运行(因为需要root权限来驱动GPIO针脚)

sudo python3 test.py

4、VNC远程桌面

一开始以为只要在raspi-config中开启vnc服务之后就能通过vnc viewer进程远程连接了。但是实际上,vnc server的默认配置是需要pi连接着显示器的。而我通常是没有连接显示器(叫做headless),那么这时候raspbian是不会自动开启图形桌面的,用vnc viewer连接时候只会显示黑屏并且提示"cannot currently show the desktop"。

想要通过vnc viewer远程连接headless的pi,需要在pi上启动vncserver的虚拟桌面。执行vncserver命令即可。

vncserver

然后记住输出的[vnc-server-ip: display-number],使用vnc viewer连接的时候记得加上这个序号即可。

关闭vnc虚拟桌面:

vncserver -kill :<display-number>

执行该关闭命令会直接关闭vnc虚拟桌面并切断原有的远程连接。

5、播放midi文件

omxplayer是pi内置的播放器,可以播放大部分音视频文件,但是并不支持播放midi。

omxplayer example.mp3

我想在pi上安装python的mido库来自己读取midi文件并播放,mido库本身只支持解析midi文件,它需要调用python-rtmidi(或其他)库来将midi消息发给外部设备(包括虚拟设备)。然后呢,因为并没有支持midi的外部硬件设备,所以希望能直接用pi的耳机接口播放声音,那么就需要在pi上安装软件合成器,然后让python-rtmidi将midi消息发给软件合成器,由它们来进行发声。

我安装了两个软件合成器,都是可以的。fluidSynth与timidity

sudo apt-get install fluidsynth
sudo apt-get install timidity

正常时候,我们使用aplaymidi -l命令列出系统支持的midi输出,列表是空的。(或者是有这个Midi Through,这其实是一个无效的输出)

5.1 fluidsynth

如果安装了fluidsynth,需要手工启动fluidsyncth服务:

fluidsynth --server --audio-driver=alsa -o audio.alsa.device=hw:1 /usr/share/sounds/sf2/FluidR3_GM.sf2
// --server 表示以服务进程启动
// --audio-driver=alsa 表示使用的音频驱动,alsa是linux通用音频驱动
// -o audio.alsa.device=xx 表示设置使用的声卡。
//     主板上的3.5mm音频接口以及HDMI口就是hw:0,0与hw:0,1,如果外接usb声卡就可能是hw:1
//     可以使用“aplay -l”命令来列出所有可用的声卡硬件
// FluidR3_GM.sf2 表示用来发声的“声音字体”(sound font,即音源,是预先录制好的各种乐器声音)

// 也可以使用fluidsynth直接播放midi而不事先启动fluidsynth服务
fluidsynth --audio-driver=alsa -o audio.alsa.device=hw:1 /usr/share/sounds/sf2/FluidR3_GM.sf2 music.mid

这时候再用aplaymidi -l命令检查会发现多了一个FLUID Synth输出端口。

aplaymidi music.mid -p 128:0

那么就可以使用命令“aplaymidi music.mid -p 128:0”来播放该midi了,同样在python中使用mido.get_output_names()也会有这个输出端口,那么就可以将midi消息发给该端口了。

作为daemon进程随机启动

linux的随机启动项还是用sysmtemd模块好些。

首先,从/usr/lib/systemd/user目录下找到fluidsynth安装时候生成的fluidsynth.service文件。其内容如下:

[Unit]
Description=FluidSynth Daemon
Documentation=man:fluidsynth(1)
After=sound.target

[Service]
EnvironmentFile=/etc/default/fluidsynth
EnvironmentFile=-%h/.config/fluidsynth
ExecStart=/usr/bin/fluidsynth -is $OTHER_OPTS $SOUND_FONT

[Install]
WantedBy=multi-user.target

然后,将该文件copy到/usr/lib/systemd/system目录,该目录是执行systemctl start/stop时候的默认查找路径。同时修改该文件中的两个变量:

SOUND_FONT 替换为 /usr/share/sounds/sf2/FluidR3_GM.sf2
OTHER_OPTS 替换为 -a alsa -o audio.alsa.device=hw:1

然后就可以用"systemctl start/stop fluidsynth"来启停fluidsynth守护进程了。

最后如果想将fluidsynth加入到开机启动中,只需要执行"systemctl enable fluidsynth"命令。该命令相当于在/etc/systemd/system目录添加一个符号链接,指向/usr/lib/systemd/system里面的xxx.service文件。/etc/systemd/system目录是systemd的开机启动目录。

5.2 timidity

如果是安装了timidity,同样需要手工启动timidity服务:

timidity -iA -OO

6、 GPIO针脚输出电流干扰3.5mm音频接口

做midi_led试验的时候,想要一边通过GPIO针脚控制LED灯带,一边通过3.5mm音频接口播放声音。但是结果是3.5mm音频接口连接的耳机只有吱吱吱的电流噪音,完全听不到其他声音。所以上网买了一个usb声卡,通过usb声卡外接音响或耳机,完美解决噪音问题,GPIO针脚与音频可以同时进行了。=。= 看来树莓派的板卡设计一般啊。

7、调整音量

使用alsamixer命令可以进入调整音量的字符界面。按F6还可以选择不同声卡(如果有外接声卡的话)

alsamixer

 

Leave a Reply

Your email address will not be published. Required fields are marked *

TOC