Raspberry Pi 및 Python 드라이브 레코더 사용

11783 단어 RaspberryPiPython
원래 라즈베리 파이에 관심이 많았기 때문에 드디어 얻은 라즈베리 파이와 카메라 모듈을 조합해 운전기록기를 만들 때의 노트를 만들었다.또한 OS 설치 및 기본 설정이 완료되었음을 전제로 합니다.

활용단어참조

  • Raspberry Pi 3
  • Raspbian Stretch Lite
  • Python3
  • 카메라 모듈
  • 자동차 충전기
  • USB 스토리지(도시바 16GB)
  • 프로비저닝


    특별한 점은 없고 라즈베리피에 카메라 모듈과 동영상 파일로 저장된 USB 메모리만 연결했다.(카메라는 먼저 테이프로 고정(^^;)이것만으로도 운전기록기가 될 수 있는 곳, 라즈베리피는 좋은 곳이다.

    카메라 모듈


    이번에 구입한 카메라 모듈은 여기 있습니다.
    정현 스마트 라즈베리 파이용 카메라 모듈

    전원 공급 장치


    Raspberry Pi3의 요구에 대응하는 전원 공급 장치인 2.5A는 차량에 실린 시가 콘센트를 통해 5.5A까지 공급할 수 있고 다른 용도로도 사용할 수 있는 다음 USB 자동차 충전기를 사용했기 때문이다.
    PISEN 차량 충전기 USB 커넥터×3(총 5.5A 출력)

    USB 메모리


    Raspberry Pi의 내장 디스크인 SD 카드의 크기는 여유가 없고 쓰기 횟수가 제한되어 있으며 애니메이션의 저장 목적지는 USB 메모리를 사용합니다.
    USB 메모리는 라즈베리파이에서 사용 실적이 확인된 동지가 제조한 USB 메모리를 사용한다.
    TOSHIBA16GB USB 플래시 메모리

    USB 스토리지 설정


    USB 메모리를 삽입하여 OS를 시작한 후 이번에도 다른 USB 장치를 삽입하지 않은 경우가/dev/sda에서 식별되었습니다.
    # lsusb
    Bus 001 Device 005: ID 0930:6544 Toshiba Corp. TransMemory-Mini / Kingston DataTraveler 2.0 Stick (2GB)
    
    # fdisk -l /dev/sda
    Disk /dev/sda: 14.5 GiB, 15518924800 bytes, 30310400 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    ext4로 USB 스토리지를 포맷합니다.
    # mkfs -t ext4 /dev/sda
    mke2fs 1.43.4 (31-Jan-2017)
    Found a dos partition table in /dev/sda
    Proceed anyway? (y,N) y
    Creating filesystem with 3788800 4k blocks and 948416 inodes
    Filesystem UUID: 5abc6e6d-bed2-4898-a263-13e07621deae
    Superblock backups stored on blocks:
            32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208
    
    Allocating group tables: done
    Writing inode tables: done
    Creating journal (16384 blocks): done
    Writing superblocks and filesystem accounting information: done
    
    다음은 운영체제가 시작될 때 자동으로 불러오기 위해/etc/fstab로 설정하지만, 그 전에/dev/sda에 대응하는by-path 이름을 확인하십시오.(/dev/sda 등 장치 이름이 항상 USB 메모리만을 가리키는 것은 아니기 때문이다. USB 메모리에 삽입된 포트는 바뀌면by-path 이름이 바뀌어야 하기 때문에 쉽게 바뀌지 않도록 주의해야 한다.)
    # ls -l /dev/disk/by-path | grep sda
    lrwxrwxrwx 1 root root  9 Mar 25 17:17 platform-3f980000.usb-usb-0:1.5:1.0-scsi-0:0:0:0 -> ../../sda
    
    상술한 값을 사용하여/etc/fstab로 설정합니다.USB 스토리지의 설치 대상은/data입니다.
    # cd /etc
    # cp -p fstab fstab.YYYYMMDD
    # vim fstab
    
    /dev/disk/by-path/platform-3f980000.usb-usb-0:1.5:1.0-scsi-0:0:0:0 /data  ext4  defaults        0       0
    
    마지막으로 OS 시작 시/data에 USB 스토리지가 설치되어 있는지 확인합니다.
    # mkdir /data
    # reboot
    
    # df -h /data
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda         15G   41M   14G   1% /data
    

    관련 비디오


    몇 개의 촬영용 소프트웨어를 비교한 결과, 이번에는 Python용 카메라 라이브러리인 Picamera를 사용했다.(처음에 motion을 사용하려고 했지만 Raspbian Stretch Lite에서 필요한 라이브러리를 찾을 수 없음)
    먼저 카메라를 사용합니다.
    
    # raspi-config
    
    [5 Interfacing Options  Configure connections to peripherals]
    [P1 Camera Enable/Disable connection to the Raspberry Pi Camera]
    [Would you like the camera interface to be enabled?]→[Yes]
    
    # reboot
    
    그리고 pip로picamera를 설치합니다.
    
    # pip3 install picamera
    
    picamera를 사용하여 쓴 애니메이션 촬영용 코드는 다음과 같습니다.
    movie.py
    #!/usr/local/bin/python3
    # -*- coding: utf-8 -*-
    
    import picamera
    import time
    import sys
    
    FILEPATH = '/data/'
    MOVIE_INTERVAL = 600
    
    def main(now):
        filename = FILEPATH + now + ".h264"
        with picamera.PiCamera() as camera:
            camera.hflip = True
            camera.vflip = True
            camera.resolution = (1024,768)
            camera.brightness = 70
            camera.start_recording(filename)
            time.sleep(MOVIE_INTERVAL)
            camera.stop_recording()
    
    if __name__ == '__main__':
        if len(sys.argv[1:]) != 1:
            print("Invalid argument.")
            sys.exit(1)
        main(sys.argv[1])
    
    코드 보충.
  • 애니메이션 파일을 USB 메모리의 설치 목적지/데이터 아래에 저장합니다.
  • 영상 촬영 시간은 10분
  • hflip방법과 vflip방법으로 카메라의 방향을 조정
  • resolution 방법으로 해상도 조정
  • brightness 방법으로 밝기 조정
  • 스크립트 매개 변수에 날짜와 시간을 전달한다고 가정합니다.
  • 또한picamera를 사용할 때 발생한 오류는 picamera 오류가 발생했을 때의 대상 방법에 적혀 있다.
  • 마지막으로 만든 Python 스크립트에 대한 패키지를 만듭니다.
    driverecord.sh
    #!/bin/zsh -x
    
    DATE=""
    
    while :
    do
        DATE=$(date "+%Y%m%d_%H%M%S")
        /usr/local/bin/movie.py "${DATE}"
        if [ $? -ne 0 ]; then
            echo "Camera Recording Error."
            exit 1
        fi
    done
    

    비디오 촬영 스크립트 자동 시작


    OS를 넣고 시작할 때 만든 애니메이션 촬영용 스크립트의 자동 시작 설정입니다.
    이번 Raspbian Stretch Lite 사용에 시스템d가 적용되었기 때문에 이전의/etc/rc.로컬 대신 시스템의 단위 파일을 만듭니다.
    /etc/systemd/system/driverecord.service
    [Unit]
    Description=run drive record during boot
    After=network.target
    
    [Service]
    Type=simple
    RemainAfterExit=yes
    ExecStart=/usr/bin/zsh -c "/usr/local/bin/driverecord.sh >> /data/camera_$$(/bin/date +%%Y%%m%%d_%%H%%M%%S).log 2>&1"
    
    [Install]
    WantedBy=multi-user.target
    
    나는 이 보도를 참고했다.정말 감사합니다.
    시스템이 운영체제를 시작할 때 임의의 프로그램을 실행합니다

    차에 싣다


    사진처럼 탑재되어 있습니다.여기서도 라즈베리 파이 본체의 고정 테이프가 활발합니다 (^^;)

    비디오 변환


    USB 메모리에 저장된 비디오 파일(h264)이 mp4로 변환되었습니다.
    변환 처리는 이번에 맥북에서 진행되었다.
    변환 프로세스를 위한 MP4Box를 포함하는 GPAC를 Mac에 설치합니다.
    https://gpac.wp.imt.fr/downloads/gpac-nightly-builds/
    Raspberry Pi에서 애니메이션 파일을 Mac의 적절한 디렉토리로 복사하여 요약하여 mp4로 변환합니다.
    # cd DriveRecord
    # scp -r "username@hostname:/data/*" .
    # ls -1 *264 | awk -F "." '{print $1}' | while read l; do MP4Box -fps 30 -add $l.h264 $l.mp4; done
    

    관련 비디오


    mp4에서 다시 변환·압축된gif이기 때문에 약간 거칠지만, 실제로는 조금 더 잘 찍을 수 있다.

    도전하다


    현재는 자동차 엔진이 멈추는 동시에 라즈베리피도 멈추기 때문에 OS와 디스크에 대한 불안과 다음 가동 시 OS의 시간이 혼란스러워지는 것이 과제다.
    우선 전원이 꺼진 후에도 이동(한 번, USB 메모리의 파일 시스템이 고장 나거나), 시간도 집 와이파이와 스마트폰의 온라인 환경에서 NTP를 사용하면 원상태로 회복할 수 있지만, 꺼진 버튼의 설치와 GPS를 통해 해결할 수 있기 때문에 따라잡을 수 있다면 좋겠다고 생각합니다.

    좋은 웹페이지 즐겨찾기