서론

PLC의 데이터를 이용하여 PC의 동영상을 켜고 끄는 동작을 구현해보려고 한다.

 

참 많은 우여곡절이 있었다...

 

처음엔 라즈베리파이의 omxplayer를 이용하여 구현해보려고 했는데.... omxplayer-wrapper는 2.7버전에서 구동테스트를 하고, modbus는 3.5버전에서 구동 테스트를 하고....ㅋ

 

동영상 플레이어를 어떻게 제어할까 고민하다가 subprocess를 이용하여 다른 프로세스에 명령을 보내는(?) 방법을 찾아보던 중 pytube라는 패키지에 눈이 돌아갔다.

(나도 왜 돌아갔는지는 모르겠지만..ㅋ)

 

그런데 pytube를 아무리 설치해도 안되더라.... 자꾸 quote가 없다고 에러가 뜨는데 인터넷을 아무리 뒤져봐도 이 에러에 대한 원인을 찾을 수 없었다....ㅋㅋㅋ

 

그러던 중 내가 환경 설정을 아주 x같이 했다는 것 역시 깨닫게 되었고.... 오늘 python 가상환경에 대해서 한 걸음 더 나아갈 수 있었다.


본론

각설하고, 결국 최종적으로 결정한 나의 테스트 환경은 이러하다.

  • PC
    • ubuntu 16.04 LTS
    • python 3.7 with anaconda
    • python-vlc
    • pyserial
  • PLC
    • xg5000
    • LS 산전 제품

참 우여곡절이 많았다....

 

오늘 회사에 라즈베리파이를 들고가서 이것저것 테스트 해보려고 하다가 바보같이 micro sd카드를 뽀개먹었다. 그것도 케이스에 끼우다가...ㅋ

 

당연히 동작은 맛이 갔고... 나는 오늘 무엇을 해야하는가 고민하다가....

 

rasbian과 같은 리눅스 계열인 ubuntu를 이용하여 한 번 테스트를 진행해봐야겠다라고 결심을 하고 실행에 옮기기 시작했다.

 

그러던 중 서론에서 이야기 했던 pytube관련 issue를 만나게 되었고 삽질을 오질나게 했다는 것...ㅋ


아나콘다3 가상환경 설정

아나콘다..... python을 이용하여 프로젝트를 진행하다보면 다양한 패키지들을 활용하게 되는데 이러한 패키지 설치 환경을 구분해주는 일종의 프레임워크를 만들 수 있는 도구라고 볼 수 있을 것 같다.

 

나는 pytube라는 패키지 때문에 ubuntu에 아나콘다를 깔게 되었다.

 

처음에는 그냥 내가 프로젝트 해봤자 이 환경에서 얼마나 하겠어... 하고 그냥 초기의 ubuntu 환경에서 작업을 진행하려고 했다.

 

하지만 ubuntu 16.04 LTS에는 python 2.7 버전과 python 3.5 버전이 이미 깔려있더라....

pip으로 패키지를 깔면 2.7에 저장되고, pip3로 패키지를 깔면 3.5에 저장이 되고.... 설상가상으로 pytube는 계속 인터넷에 쳐도 안나오는 오류 메세지를 내보내고..ㅋㅋ

 

그래서 ubuntu에 아나콘다를 깔았다.

 

ubuntu에 아나콘다 까는 법

간단하다.

1. 아나콘다3 홈페이지에서 linux 버전의 아나콘다3를 다운받는다.(~~~~~.sh 파일임)

2. 다운받은 쉘 파일을 설치해준다.

$ bash Anaconda3-2019.03-Linux-x86_64.sh

3. 아나콘다에서 설치한 환경변수를 반영하기 위해서 bashrc를 읽는다(터미널을 껐다 켜도 된다)

$ source ~/.bashrc

4. 가상환경을 만든다.

아래는 conda에서 자주 쓰이는 명령어들이다. 진짜 많이 쓰이더라.

※ 설치
$ conda create -n [가상환경 이름] [파이썬 버전]
$ conda create -n py356 python=3.5.6

※ 제거
$ conda remove -n [가상환경 이름] --all
$ conda remove -n py356 --all
 
※ 확인
$ conda info --envs

※ 실행
$ conda activate [가상환경 이름]
$ conda activate py356

※ 종료
$ conda deactivate

5. 환경 변수를 설정을 하고 나면 다음부 ubuntu의 터미널을 키게 되면 앞에 저런게 붙는다. 아나콘다3의 root 환경이라는 의미다.

 

저기서 conda activate를 수행하면 (base)가 [가상환경 이름]으로 바뀌는 것을 알 수 있다.

 

추가적으로 나는 ubuntu에 pycharm을 직접 깔아서 개발을 진행하려고 생각했다


pycharm-community 설치하는 법

너무 간단하다.

※ 설치
$ sudo apt install snapd snapd-xdg-open

$ sudo snap install pycharm-community --classic

※ 실행
$ pycharm-community

pycharm 가상환경 설정하는 법

1. 아나콘다 가상환경 생성(가상환경 이름 : test, python 버전 = 3.7)

$ conda create -n test python=3.7

 

2. 가상환경 생성 여부 확인 

$  conda info --envs

잘 생성 되었다


3. pycharm-community 실행(시간 조금 걸림... 아 겁나 느리네)

$  pycharm-community


4. Configure -> Settings 클릭

 

5. Project Interpreter -> 톱니바퀴 아이콘 -> Show All

 

6. 아까 만든 가상환경 설정에서 python interpreter 설정

 

7. 가상환경 선택

 

8.  새 프로젝트 생성

 

9. 아까 만든 인터프리터 설정 후 create

9.1 만약 인터프리터를 변경하고 싶다면 생성된 프로젝트-> Setting에서도 변경 가능

10. 생성된 프로젝트에서 pycharm에 존재하는 Terminal을 켜게 되면 프로젝트 생성 가능

 

11. 해당 터미널에서 설치하고 싶은 패지키 설치

 

12. 설치된 pip 패키지 정보들 확인

$ pip list

 

 

12.1 Setting(Ctrl + Alt + S) -> Project Interpreter에서도 확인 가능


다음으로는 vlc를 설치해서 프로젝트를 진행해보려 한다.

python-vlc로 동영상 제어하기

※ vlc player  설치
$ sudo apt-get install vlc

※ python-vlc  설치
$ pip install python-vlc

▼ 예제 코드 입력(파일 위치 수정이 필요할 경우 수정)

#-*- coding:utf-8 -*
#https://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__video.html#gabdbb7230cc3db78e73070ce10e679315

import vlc
import time
class Player():
    def __init__(self):
        self._instance = vlc.Instance(['--video-on-top', '--input-repeat=-1'])  #동영상 재생 반복
        self._player = self._instance.media_player_new()
        self._player.set_fullscreen(True)	#동영상을 전체화면으로 실행

    def play(self, path):
        media = self._instance.media_new(path)
        self._player.set_media(media)
        self._player.play()

    def stop(self):
        self._player.stop()

p=Player()
p.play('./videos/01.mp4')
time.sleep(5)
p.stop()
p.play('./videos/02.mp4')
time.sleep(5)

잘 동작하는 것을 확인할 수 있다.

 

▼ 간단하게 이런 식으로도 가능

import vlc
import time

player = vlc.MediaPlayer("./videos/01.mp4")
vlc.libvlc_set_fullscreen(player, True)
player.play()
time.sleep(5)

가상환경에서 외부 usb Serial 포트 연결

을 하기 위해서는 ubuntu에서 현재 사용자 계정이 Serial Port로 접근을 할 수 있게 권한을 설정해주어야 함.

root 계정으로 로그인
$ sudo su

passwd 입력

※ /dev 폴더로 이동
$ cd /dev


※ tttyUSB0 권한 등록
$ chown [사용자 계정 이름] ttyUSB0
chown mistive ttyUSB0

 

'PLC' 카테고리의 다른 글

[plc&pc 연동] nodejs를 이용한 modbus RTU 구현  (0) 2020.03.17


신경 써야 할 것

1. XBee S2C 모델은 공급 전압이 2.1V~3.6V이다. 즉, 라즈베리파이 같이 5V 입출력을 지닌 장치와 연결하여 사용하기 위해서는 추가적인 장치가 필요하다.


2. XBee의 초기 설정을 위해서 DIGI사의 XCTU라는 프로그램이 필요하다. (다운로드 받는데 심하게 느리다.)


3. 



0: 너 이거 왜하는데?

PLC와 PC 통신을 하려고 그런다.

1: 어떻게 할껀데?

일단 PLC와 PC 통신 하기 전에 usb to rs232 Converter를 이용해서 Tx로 쏜걸 Rx에서 받는 걸 파이썬(pyserial)으로 구현할꺼다.



서론 : 시리얼 통신이 뭔데?



시리얼 통신이 무엇일까?


단어를 이해하기 위해서는 각 단어의 의미를 먼저 알아보는게 좋다.


통신은 지나가는 유치원생한테 물어봐도 대충 무슨 의미인지는 알겠고... 시리얼... 시리얼...


시리얼? 이미지 검색결과


이 시리얼을 의미하는 것은 절대 아닐테고....(죄송합니다)


시리얼은 Serial. 즉 직렬이란 의미이다.


직렬의 반대는 그럼 병렬일텐데...


A컴퓨터와 B컴퓨터가 서로 통신한다고 쳤을 때 병렬은 한 번에 여러개의 데이터를 전송할 수 있다. 왜냐? 병렬이니깐

하지만 병렬로 A컴퓨터와 B컴퓨터를 연결하면 돈이 많이들겠다. 왜냐?? 세상에 공짜는 없으니깐 말이다. 한 번에 여러 개의 데이터를 보낸다는 의미는 말그대로 전선이 많이 들어갔다는 소리다.


반대로 직렬은 그럼... 선이 한 개이고 이 하나의 선만으로 데이터를 전송하는 것이다.


자.... 그럼 하나의 선만으로 어떻게 데이터를 주고 받을 것인가?


컴퓨터는 알다시피 머리가 상당히 나빠 0이랑 1밖에 모른다. 당연히 전선이 하나만 연결이 되어있으니깐 두 컴퓨터간에 약간의 약속이 필요하다. 그게 바로 baud rate(보레이트)라고 하는 놈이다.


만약 A컴퓨터가 0000 1111 0101 1010 이라는 데이터를 보내고 싶어한다. 그런데 B라는 놈은 000 011 110 101 101 0 과 같은 식으로 데이터를 받았다고 치자. 그럼 두 놈이 원활한 의사소통이 되겠는가? 당연히 될 수가 없다.


그래서 일반적으로 serial 통신을 할 때는 baud rate를 통신하려는 기기끼리 서로 맞춰준다.



그리고 또 솔직히 말하면 serial 통신이 전선이 딱 하나만 있는 건 아니다. 송신선과 수신선이 서로 나뉘어져 있어 송신과 수신을 동시가 할 수 있는 것도 있고(full duplex) 송신선과 수신선이 하나로 이루어져 있어 한 번에 송신과 수신을 할 수 없는 놈도 있다.(half duplex)


또한 단순히 전압의 차이만을 이용하여 회로 구성이 간단하지만 노이즈에 좀 취약한 가장 기본적인 시리얼 통신인 RS-232가 있고, 232에서는 송신선을 하나의 전선으로 구성했다면, 2개의 전선을 이용하여 그 2개의 전선의 전위차를 가지고 통신하는 RS-422, 485와 같은 Serial 통신 방법 등 다양하게 있다.


각 시리얼 통신의 차이를 구글에 검색해보면 정말 잘 나와있는 글들이 많으니 시리얼 통신 설명은 여기까지 하겠다.


준비물



1. RS233 to usb converter
2. Jump Cable(female - female)
3. 컴퓨터

만 있으면 테스트 해볼 수 있다.


준비 과정


1. 위의 그림처럼 점프 케이블을 이용해 RS232의 Rx와 Tx를 연결시켜준다.



2. ["Win + X" -> 장치관리자]에서 "USB Serial Converter"가 있는지 확인한다.


3. 만약 연결이 안되었거나, 앞에 느낌표가 있으면 온라인으로 드라이버 찾기 하면 자알 찾아준다.


4. 처음 연결해서 드라이버를 설치하면 컴퓨터를 껐다 켜야 제대로 인식한다.



5. 위의 사진처럼 USB Serial Port의 번호(COM3)를 확인한다.


6. pip install pyserial을 이용하여 pyserial을 설치해주고


7. 아래의 코드를 한 번 집어넣어본다.

import serial

ser = serial.Serial("COM3", 115200, timeout = 1)
while True:
print("insert op :", end=' ')
op = input()
ser.write(op.encode())
print("R: ", ser.readline())

if op is 'q':
ser.close()


8. 참고로 COM 포트 번호는 사람마다 다 다를 수 있다.


9. 출력 결과는 이와 같이 Rs232에서 출력한 값을 받아오는 것이다. 


10. 앞에 b는 byte 표시다. byte 타입의 문자열로 보내는 이유는(op.encode()) 유니코드로 보내면 에러 떠서 못받는다.




























+ Recent posts