使用 raspberry pi 搭建延迟摄影平台(中)

数学

我们这里先玩玩简单的数学,估计一些事情。

存储:一张 a6000 的 RAW 大约 24M,如果一张 250G 的 SSD,大约能存 10k+ 多照片,这是什么概念呢,如果我们选择 30s 一张照片,一天能拍 2880 张照片,这个容量大约是 3.7 天,如果把拍摄间隔设置为 60s,这就能拍一个星期了。而如果换一张 1T 的 SSD(现在 40-50$),这就基本可以 1m/张拍摄一个月了。如果想把盘格式化成为 EXFAT,可以参看这个步骤

Raspberry Pi 4 似乎需要 5W 左右的功率,之前电池在 46% 的状况下显示能跑 16h,差不多满电能运行 32h,可以覆盖一整天多。如果按照标 256Wh 称来看,大约 2.1。这个差异可能在我们添加了更多设备的时候会显得有问题。但是至少我们可以对付一整天的拍摄。在白天我们可以考虑使用太阳能板对其充电,差不多补充 180Wh 就够了。正好买了块 100W 的太阳能板… 似乎换一个更大型号的电池,比如 Delta 2 Max(差不多两度电,8 倍)可以一次充电撑 10+ 天,记得中间通过 AC 补电两次就行。

物理

尝试使用 USB type A 给 a6000 供电,之前给 a5100 试过,可以开机,但是我之前拿 a5100 做 video camera,并不需要拍照,而这次需要拍照,发现按下去之后死机必须换电池才能重启。据说是因为这玩意拍照的时候电流很大(4A?),一般的 USB type A 只提供了 2.4A,根本撑不起来这个拍照操作。可能唯一可行的是从 USB type C 这个 60W 输出的地方借电了 =.= 另外点烟器那边 12V 的(100W max)降下来也行。事实上因为这个过程需要电压转换,DC buck converter 本身也可以变成一个瓶颈,我这里尝试了两个版本

  • 5V 升压:之所以看中它是因为它可以直接从 USB 取电,这样就不必搞个特殊的插头,买到的版本是基于 LM2596 的(亚麻连接),号称支持 3A 电流,实际上不能搞定拍照,只能用来挡摄像头。也尝试过在输出端加一个电容,不过似乎没啥帮助
  • 12V 降压:这个一般称为 mini 360(亚麻链接),这个当然可以拿更高的电压(比如 v-mount 电池)作为输入,12V 的话不少 LED 的电源,汽车的点烟器都可以作为输入。然后调整输出到 8V 左右即可。经过测试,似乎这个搭配可以在移动电源上或者另外搭配 12V 电源实现驱动相机拍照。经过一段时间实验,感觉尽管大多数情况下没有问题,但是偶尔似乎相机会死机导致重启,添加了一个电容之后似乎也不能完全解决问题,但是至少在快门速度较慢的时候可以连续拍摄 700+ 照片

其实如果看这些电池还挺有意思的,一般锂电池电压为 3.7V,而相机使用的多为 7.4V(也有叫 8V,因为锂电充满后可到 4+V,这个感觉是两节串联的结果),而很多照明的直流电灯具使用的 15V(差不多 4 节串联):

  • Sony 相机电池的 NP-FW50(早期 A 系列相机),NP-FZ100(最新的 A 系列相机),还有专门扩展用 NP-F*50(有 9/7/5 不同的容量和体积大小的选择)都是 7-8V,因此可以使用一个假电池转接而不需要使用 buck converter
  • V-mount 电池使用的 14-15V,容量可以大很多,甚至接近 EcoFlow River 2,但是一般不提供这么丰富的接口,转接灯具不需要额外的 buck converter,但是驱动相机的话需要
  • 感觉 EcoFlow 应该加设一个 dtap 输出 14-15V DC 用来驱动灯具。现在似乎只能用逆变器,效率感觉更低

似乎在使用降压策略的时候偶尔相机拍摄会失败,这个时候需要等待一段时间。只好软件来处理这个问题了。

算法(自动、半自动拍摄程序)

我们这里先探讨一个均衡算法,它适用于使用自动或者半自动曝光拍摄程序。之所以称为均衡算法,因为本质上它通过调整一些可调节的参数,在等量曝光超平面上进行选择。我们拿下面的例子来看,如果我们以 A 档拍摄,在固定光圈的情况下,调节 ISO 和曝光时间(快门速度)会产生一对等效的组合:比如相机给出在 ISO 100 下,曝光时间为 0.4s,那么我们可以获得 (100, 0.4), (200, 0.2), (400, 0.1) … 等等组合,如果我们对每个参数有所限制,如 ISO 在 100-400 之间,我们就会得到较少的选择。这时,我们增加一个选择的策略:ISO 越低越好,我们就得到了拍摄的参数 (100, 0.4)。当然,这里如果我们还增加曝光时间的限制可能还能进一步减少候选组合,同时通过在上面增加策略,也可以导致不同的结果。

这里有一个小小的 bug,一般相机自动/半自动程序会有一个曝光时间的上限,一般是 30s,这会导致当我们的曝光量慢慢上升到 ISO100 30s 后,我们并不会根据环境调整到下一档,这时我们需要允许程序主动调节 ISO 到更高的 ISO 120 看看曝光时间会不会变化(比如仍然停留在 30s 的话说明 ISO100 是欠曝的状态)。类似的,相机也有曝光时间的下限(如 1/4000s),我们也需要做类似的处理。

如果我们考虑复杂的情况,还允许我们修改光圈,这样候选空间就会变大到 3D,但是再怎么搞一共可能也就几百个选项,对于计算机来说很容易穷尽。

那么还有一个与此相关的参数是曝光补偿,这个与上面的参数不大一样。相机的程序曝光是将测光获得的统计量归一到中性灰获得的,而补偿就是在这个中性灰曝光上进行调整。比如如果觉得晚上相机的程序曝光有点过曝,我们就需要将补偿设为负的,而且白天如果天空占据画面太多可能导致欠曝,我们就需要将补偿设为正的。当然,如果觉得相机曝光程序比较准,其实没有必要设置这个。我们是否有必要为此改进程序呢?

连接

户外的连接是一个挺烦人的事情。之前讨论过一个路由器的方法,后来想到其实 raspberry pi 本身也可以作为路由器对不对?即它自己可以把自己设置为一个热点,这样一来手机就可以使用诸如 RaspController 这类软件完成连接了。那么我们如何做到这一点呢?

我们有两个思路:

  • 我们可以让 rpi4 自带的 wifi 连接到家里面的 wifi 上,如果连不上,我们就将其转换到 Host AP 模式,变成一个路由
  • 我们可以买一个 USB wifi 适配器,这样一来就有两个 wlan 设备,我们将自己的那个配置为连接家里面的网络,而另一个配置为 host AP 模式即可。

事实上,之前老版本的内核还需要为这类 USB 无线网卡编译内核模块,最近的已经内置了,TP-link 这种便宜 N/AC 协议的网卡可以轻松识别,剩下的主要是软件方面的配置,我们需要安装

sudo apt install hostapd dnsmasq

然后配置,这里我们可以看到

# lsusb
...
Bus 001 Device 003: ID 0bda:8179 Realtek Semiconductor Corp. RTL8188EUS 802.11n Wireless Network Adapter
...
# dmesg | tail -n 20
...
[   32.379476] usb 1-1.4: new high-speed USB device number 3 using xhci_hcd
[   32.480517] usb 1-1.4: New USB device found, idVendor=0bda, idProduct=8179, bcdDevice= 0.00
[   32.480552] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[   32.480568] usb 1-1.4: Product: 802.11n NIC
[   32.480583] usb 1-1.4: Manufacturer: Realtek
[   32.480596] usb 1-1.4: SerialNumber: 00E04C0001
[   32.605393] r8188eu: module is from the staging directory, the quality is unknown, you have been warned.
[   32.634939] usbcore: registered new interface driver r8188eu
[   32.714600] r8188eu 1-1.4:1.0: Firmware Version 11, SubVersion 1, Signature 0x88e1
# lsmod | grep 8188
r8188eu               331776  0
libarc4                16384  1 r8188eu
# iwconfig
...
wlan1     unassociated  ESSID:""  Nickname:"<WIFI@REALTEK>"
          Mode:Auto  Frequency=2.412 GHz  Access Point: Not-Associated
          Sensitivity:0/0
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=0/100  Signal level=0 dBm  Noise level=0 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

我们可以看到对应的 r8188eu 模块已经被自动的加载(从 firmware-realtek 包里面找到的固件),产生了一个新的 wlan1 设备。剩下的就是让 hostapd 为我们创建一个热点,不过很遗憾,这个内核自带的 realtek 模块可以上网,但不能作为 AP(what),我们还是得自己编译,下面是一些准备工作(参考这里),我们这次使用 dkms 简化编译过程(bullseye 下可行)

# echo "blacklist r8188eu" > /etc/modprobe.d/blacklist-r8188eu.conf
# apt install dkms raspberrypi-kernel-headers bc
# cd /usr/src
# git clone https://github.com/ivanovborislav/rtl8188eu.git rtl8188eu-5.13.3
# # edit rtl8188eu-5.13.3/Makefile
# # CONFIG_PLATFORM_I386_PC = n
# # CONFIG_PLATFORM_RPI_ARM64 = y
# dkms add -m rtl8188eu -v 5.13.3
# dkms autoinstall
# dkms status

搞完以后写个内核模块的配置文件

# echo "options 8188eu rtw_ips_mode=1 rtw_drv_log_level=4 rtw_power_mgnt=2 rtw_led_ctrl=1" > /etc/modprobe.d/8188eu.conf

重启后我们可以看到

# lsusb
...
Bus 001 Device 003: ID 0bda:8179 Realtek Semiconductor Corp. RTL8188EUS 802.11n Wireless Network Adapter
# # lsmod | grep 8188
8188eu               1925120  0
cfg80211              925696  2 8188eu,brcmfmac

注意这里通过之前的禁用 r8188eu 已经成功地将内核模块替换到我们编译的 8188eu 了。hostapd 配置文件参看这里。比较搞笑的是我之前用 wpa_supplicant 配置的自带的网卡,文件放在 /etc/wpa_supplicant/wpa_supplicant.conf 结果导致自动把 wlan1 也给连接上了家里面的 wifi,还以为 hostapd 不 work。解决方案也很简单

# mv /etc/wpa_supplicant/wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant-wlan0.conf

重启相关的服务后,

# systemctl unmask hostapd
# systemctl enable hostapd
# systemctl start hostapd

hostapd 就可以成功的配置 wlan1,

# iwconfig
...
wlan1     IEEE 802.11bgn  ESSID:"rpi4tl"  Nickname:"<WIFI@REALTEK>"
...

并且能在其他设备上看到这个热点了,我们需要进一步配置相关的网络。首先需要在 dhcpcd 里面配置作为 wlan1 网络上面的地址(因为自己变成了 router,没人分配地址,我们需要设置一个静态的地址),修改 /etc/dhcpcd.conf,最后加入两行

interface wlan1
static ip_address=192.168.1.3/24

然后需要在我们的 dhcp 服务器里面为连接上的终端(如手机)配置地址,我们可以在 /etc/dnsmasq.conf 加入如下信息

interface=wlan1
dhcp-range=192.168.1.5,192.168.1.100,255.255.255.0,12h

这样重启相关服务后,我们就可以开始测试链接,该链接不需要设置为自动连接。到此我们就有了一个自带热点的 rpi。当时购买的这个 TP-link 型号为 TL-WN725N(150Mbps 的卡,应该妥妥的够用了),好像也没打折 8$ 一个,如果买 SBC 没有无线网卡需要扩展的话还是一个不错的选择了。另外实测 Comfast CF-WU810N 这款(3-4$)使用 RTL8166eus 这个芯片可以同样被该驱动支持。

有了这个结合 systemd 启动用户的进程(如 screen / vncserver / server)我们就可以启动 raspberry 皮之后开启一个自己的热点,通过手机、平板连接之后就可以使用终端或者 vncviewer 操纵该设备了。

使用 raspberry pi 搭建延迟摄影平台(中)

留下评论