ASRock BC-250 보드 RAZER CORE X CHROMA 에 설치하기 5

주문 제작 하였던 브라켓이 도착하였다.  재질은 철이 아니고 알루미늄이라 그런지 상당히 가볍고 잘못하면 휘어질 것 같은 느낌이 든다. 제작하고 수령하기 까지 거의 3주라는 긴 시간이 걸렸다. 원래 이렇게 까지 걸리진 않는데 원인은 가공 엔지니어로 부터 온 메일을 확인하지 않고 3일이나 흐른 뒤에 답장을 하였고, 연말 기간도 걸려서 늦어져 버렸다. BC-250 카드에 기존 브라켓을 제거하고 새로 설계한 브라켓을 달아보니 아주 잘 맞았다. 버튼도 잘 눌리고 이더넷, USB, DP 포트 모두 사용에 문제가 없다. 이렇게 보고 나서 알아차린 부분이지만 하단 쪽에 고정 다리를 추가한다는 것을 빼먹었다. 다시 만드는 건 금액도 만만치 않았기 때문에 수정해서 발주를 다시 넣지는 않을 예정이고 튼튼하게 고정하기 위해 다른 솔루션을 찾아 보려고 한다. 사실 브라켓을 설계한 건 설치 문제도 있지만 완성된 시스템이 외관상으로 봤을 때 튀는 부분 없이 완성도가 높아 보이길 원했기 때문이다. 이렇게 보니 모양도 그럴싸하고 원래 이런 제품일지도 모른다는 착각도 든다. 타공 모양도 벌집 모양으로 했으면 더 완벽했겠지만 만드는 동안에는 그런 생각 없이 만들었기 때문에 큰 후회는 없다. 장착 되어있던 USB 허브 보드 대신 사용될 PCB도 도착하였다. 기존 허브 보드와 비교하자면 사이즈만 많이 커졌지만 브라켓과 호환이 되는지 확인하였고 장착하는 데는 문제가 없을 것으로 예상하고 있다.  지금 보니 오디오 앰프가 꼭 있어야 했는지 살짝 욕심이 과했다는 생각도 든다. 조립에 사용될 부품들은 아직 수급 중이며 차근차근 조립을 해 나갈 예정이다. 먼저 설계했던 PSU 전원 컨트롤 보드는 다음과 같이 장착 되었고 주요 동작에는 큰 이상이 없으나 몇 가지 수정 사항이 생겼다. 수정 사항은 허브 보드을 새로 설계하면서 발생한 것으로 두 보드 간에 별도의 통신 선이 연결된다. 사실 이렇게 기능을 분리할 필요는 없었는데 첫 번째로 만든 보드에서 하드웨어 적으로 누락된 기능이 있기 때문에 허...

[Raspberry Pi] - rc카 만들기 #6 카메라(Pi Cam)




 #6 카메라(Pi Cam)


이번에는 로봇에 카메라를 달아 볼 것이다.
카메라의 쓰임은 원격 조종시 로봇 주변 환경의 탐사와, 동영상 혹은 스틸컷을 데이터로 남기기 위함이다. 또한 로봇에 장착된 AP에 접속한 기기들은 실시간 스트리밍 영상을 볼 수 있다.

카메라를 사용하시위해서는 환경 설정에서 카메라를 활성화 시켜주어야한다.
환경설정 - 인터페이스 옵션에 있다.



sudo raspi-config
코드는 듀얼 쇼크(DualShock4) 기준으로 작성되었다.


square 버튼다운시 스틸컷을 찍어 날짜 및 시간을 이름으로 외부 저장 장치에 저장된다.
circle 버튼다운시 동영상 스트리밍을 시작한다. 
왜 스크립트를 따로 만들어야 하는지는 조금있다 설명하겠다.
cross 버튼다운시 스트리밍을 종료한다.

if joystick.get_button(0):
    #print("spuare pressed")
    now = time.localtime()
    file ='%04d-%02d-%02d-[%02d.%02d.%02d]' % (now.tm_year, now.tm_mon, now.tm_mday, now.tm_hour, now.tm_min, now.tm_sec)
    print('picture time' + file + '.png')
    call('sudo raspistill -v -p 100,100,400,300 -o /media/pi/PIC/' + file + '.png &', shell=True)
elif joystick.get_button(1):
    #print("cross pressed")
    print("raspivid and lt-test-launch kill")
    call("sudo killall raspivid && sudo killall lt-test-launch &", shell=True)
elif joystick.get_button(2):
    #print("circle pressed")
    print("video stream")
    call('/usr/bin/sudo /usr/bin/python3 /home/pi/PiCam.py', shell=True)
cs

동영상 스트리밍에는 gstreamer를 사용할 것이다.

make gstreamer
wget http://gstreamer.freedesktop.org/src/gst-rtsp/gst-rtsp-0.10.8.tar.bz2
bzip2 -d gst-rtsp-0.10.8.tar.bz2
tar xvf gst-rtsp-0.10.8.tar
cd gst-rtsp-0.10.8/./configure
make
동영상 스트리밍을 AP를 통해 전송할 것이다.
스트리밍을 할 IP주소를 정해주어야 하는데 AP와 Raspberry Pi는 이더넷 으로 연결 되어있기 때문에 eth0의 아이피를 적어주면 된다.
다만 if의 이름은 스트링이 아닌 바이트코드 형식이기 때문에 python3를 사용한다면 앞쪽에 b를 붙여주어야 바이트코드로 인식 한다. 

아래의 코드는 Raspberry Pi가 AP에 접속 될 때의 이더넷 아이피로 동영상을 전송한다.
스크립트를 따로 만들어 주어야 하는 이유는 지금까지 만든 메인 스크립트는 부팅시 자동으로 실행 되도록 앞서 설정해두었다. 문제는 메인 스크립트를 실행시 아래 코드가 포함 될 결우 아직 네트워크에 접속이 되지 않은 상태에서 IP를 불러오려고 하기때문에 인터럽트가 발생해 로봇은 작동하지 못한다. 

from subprocess import call
import socket
import fcntl
import struct
def get_ip_address(ifname):
    s = socket.socket(socket,AF_INET, socket,SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15]))[20:24])
camIP = b'eth0' #ethernet
local = b'lo'    #local
wlan0 = b'wlan0'#wifi
print("Network interfaces")
print("ether IP : " + str(get_ip_address(camIP)))
call('sudo raspivid -t 0 -h 720 -w 1280 -fps 25 -b 2000000 -p 100,100,400,300 -o - | gst-launch -v fdsrc ! h264parse ! gdppay ! tcpserversink host='
        + str(get_ip_address(camIP)) + ' port=5000 | gst-rtsp-0.10.8/examples/./test-launch "( tcpclientsrc host='
        + str(get_ip_address(cmaIP)) + ' port=5000 ! gdpdepay ! avdec_h264 ! rtph264pay name=pay0 pt=96 )" &', shell=True)
cs
고정IP를 이용하는 방법도 있는다.
하지만 그 방법은 다른 기기가 이미 해당 IP를 사용하고 있으면 자동할당이 되어버리기 때문에 공유기에 MAC주소에 IP를 고정시키는 기능이 없다면 이 방법을 사용하는 쪽이 속편하다. 세그먼트를 이용해 스트리밍 중인 아이피를 표시 해주는 것도 좋은 방법이다.

위 방법대로 하였다면 주소 열기 기능이 있는 플레이어를 통해 재생이 가능하다.
지연은 1초가 조금 안되는것 같다.
rtsp://192.168.1.100/test










Thx.

Comments

Popular posts from this blog

[POE] - 패스 오브 엑자일 획득키 F 의 사용법 (Path of Exile)

[AD보드] - 맥북 패널을 모니터로 만들기 ( LP154WP4-TLA1 )

[Arduino] - HC-06를 이용해 PC 와 Arduino 블루투스 연결