Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

Synology NAS(DS216+II)를 이용한 원격 컴퓨터의 전원 스위치 제어

개발자라면 다들 공감하시겠지만, 사실 업무와 공부의 경계가 많이 모호한 면이 있습니다. 이 때문에 회사 컴퓨터를 켜놓고 집에서 접속해야 할 경우가 종종 있는데요, 그렇다 해도 많지는 않아서 항상 켜놓기에는 전기 사용이 좀 아깝습니다. 하지만, 꺼놓고 퇴근하자니 또 집에서 필요해지면 아쉽기 때문에 그러는 것도 좀 망설여지는데요.

그래서 ^^ 만들었습니다. 회사 컴퓨터의 전원을 원격으로 제어가 가능하도록 하는 것입니다.




이를 구현하기 위해, 6년 전에 구매했던 - 먼지가 내려앉은 넷두이노를 꺼냈습니다. ^^

.NET Micro Framework - 넷두이노 플러스
; https://www.sysnet.pe.kr/2/0/1392

(새 버전의 넷두이노가 나와서 이제는 지원도 끊겨 버렸지만) 마지막 firmware 버전인 4.2.0.1로 업그레이드까지 하고 네트워크 구현까지 완료했지만... 아쉽게도 이더넷 LAN 포트가 접촉 불량 문제가 발생했습니다. 납땜의 문제는 아닌 것 같고 랜 소켓 자체가 내부에 이더넷 케이블과 접촉되는 공간이 유격이 발생한 듯 케이블을 살짝 움직일 때마다 네트워크 접속이 끊어져 버리는 것입니다.

할 수 없이 ^^; 다시 먼지가 쌓이도록 창고에 두고 그다음 제가 가지고 있는 보드 중,


후보로 떠오른 것이 "라즈베리 파이 제로 W"입니다. WiFi를 기본 제공하고 RPi의 특성상 PC 환경에 준하는 개발 환경을 가지고 있기 때문에 프로그램 작성도 매우 용이합니다.

한 가지 아쉬운 것은 제가 가지고 있는 "라즈베리 파이 제로 W"가 Data Pin 쪽에 헤더가 납땜되어 있지 않은 모델이라는 점입니다. (혹시, 제로 W 모델을 구매하시려는 분이 있다면 "with Headers" 모델을 추천합니다.)

[그림 - 출처 http://www.icbanq.com/P008219607]
raspberry_pi_zero_w_with_no_pin_header_1.jpg

그래서 저걸로 Data Pin을 제어하려면 핀 헤더를 납땜해야 하는 불편함이 있습니다.

How to solder header pins to the Raspberry Pi Zero (W) 
; https://www.youtube.com/watch?v=UDdbaMk39tM

그런데, 제가 인두기가 없습니다. ^^




고민하던 차에, 생각난 것이 바로 제 책상에 있는 Synology NAS(DS216+II)입니다. 항상 켜져 있는 데다, 리눅스 운영체제가 올라가 있기 때문에 프로그램도 마음대로 올릴 수 있고 게다가 .NET Core 프로그램도 제작할 수 있습니다.

제어 환경이 결정되었으니, 이제 남은 문제는 어떻게 컴퓨터의 전원을 껐다 켰다 할 것이냐입니다. 사실 이것은 매우 간단한데, 컴퓨터 케이스의 전원 스위치 동작을 그대로 따라 해 주기만 하면 되기 때문입니다. 가령, 제가 가지고 있는 "GIGABYTE GA-Z87-HD3" 메인 보드는 다음과 같은 PW+, PW- 핀 배열을 가지고 있습니다.

turn_on_the_device_1.png

PW+와 PW- 간의 전압을 측정해 보면 약 3.347V가 나오는데, 그렇다는 것은 곧 컴퓨터 케이스의 전원 스위치가 말 그대로 "전선을 연결하는" 정도의 역할만 한다는 것이고, 외부에서 이것을 제어하려면 마찬가지로 별도 전원을 인가할 필요 없이 그냥 "연결"만 하면 되는 식입니다. 오호... 그러고 보니 그 용도로 딱인 장치를 전에 살펴본 적이 있습니다.

PC에 연결해 동작하는 자신만의 USB 장치 만들어 보기
; https://www.sysnet.pe.kr/2/0/11606

위의 글에서 설명한 FTDI 장치의 DTR 라인은 아두이노의 데이터 핀처럼 별도의 전원을 제공하는 것이 아닌, 단순히 선을 연결해 주는 동작만 하는 것이기 때문에 컴퓨터 전원 스위치를 켜는 용도로 사용할 수 있습니다.

따라서, FTDI의 GND를 PW-에 연결하고 DTR 선을 PW+에 연결하면 됩니다.

turn_on_the_device_2.png

이제 남은 작업은 NAS 장치에서 DTR 신호를 제어할 소프트웨어를 만드는 것인데 이 방법은 이미 아래의 글에서 모두 설명했습니다. ^^

Synology NAS(DS216+II)에서 FTDI 장치를 C/C++로 제어
; https://www.sysnet.pe.kr/2/0/11733

Synology NAS(DS216+II)에 FTDI 장치 연결 후 C#(.NET Core)으로 DTR 제어
; https://www.sysnet.pe.kr/2/0/11734

저는 docker를 이용해 C#으로 만든 .NET Core 프로그램을 제작해 올렸습니다. docker의 container 관리 덕분에 마치 NT 서비스처럼 재부팅 시에도 container를 자동 실행해 주므로 별도의 관리 절차는 필요하지 않았습니다.




자, 이제 ^^ 컴퓨터의 제어판에서 "Power Options"를 들어가 컴퓨터 전원 스위치가 눌렸을 때 "최대 절전 모드(Hibernation)"로 들어가도록 설정합니다. 그다음, 원하는 시기에 소프트웨어로 "FT_SetDtr/FT_ClrDtr" 신호를 전달하도록 하면 컴퓨터가 켜져 있는 경우 최대 절전 모드로 들어가고, 꺼져 있는 경우에는 컴퓨터가 켜지게 됩니다.

제 경우에는 전에도 다뤘던 Xamarin을 이용해,

Xamarin - 기존 리모컨 기능을 핸드폰의 적외선 송신으로 구현
; https://www.sysnet.pe.kr/2/0/11674

다음과 같이 안드로이드 프로그램을 만들어서,

turn_on_the_device_3.png

원격에서 제어할 수 있도록 했습니다. ^^




몇 가지 더 이야기를 해보면.

우선, 주의할 것이 하나 있습니다. FTDI 장치와 메인보드 간의 선을 연결 시, 반드시 DTR과 PW+를 연결하고 GND와 PW-를 연결해야 합니다. 컴퓨터 케이스의 Power Switch는 물리적으로 접점이 끊긴 것을 연결하는 것이기 때문에 +/- 극을 맞출 필요가 없지만 FTDI 장치는 극이 맞아야 합니다. 저도 내부적인 FTDI 장치의 배선을 몰라 자세하게 설명할 수는 없지만, 현상 자체는 DTR을 PW-, GND를 PW+에 연결하는 경우 그 순간 컴퓨터 전원이 들어오게 됩니다. 계측기로 + 단자를 DTR에 - 단자를 GND에 놓고 측정하면 저항이 무한대가 되지만, 그 반대로 하는 경우에는 약 250K 정도의 저항이 측정되는 걸로 봐서 선이 연결된 것과 유사한 역할을 하는 것 같습니다.

또 다른 이야기가 있다면 바로 "마감"입니다. 대충 해 놓으면 동작은 하겠지만 실 사용 환경에서라면 좀 더 완성도를 높이는 게 좋습니다. 일단 FTDI와 NAS를 연결하는 것은 USB 케이블로 깔끔하게 해결은 됩니다. 하지만 FTDI의 DTR, GND와 메인 보드 간의 연결을 하는 것은 그다지 매끄럽게 해결이 안 됩니다. 우선, 기존의 컴퓨터 케이스에 있는 Power Switch를 안 쓰는 걸로 가정하고 다음의 케이블을 사용할 수 있습니다.

PC 파워 전원 스위치 케이블/메인보드연결
; http://item.gmarket.co.kr/detailview/item.asp?goodscode=995567752

computer_power_cable_1.png

Female Header 부분이 메인 보드의 Power Pin에 정확히 연결할 수 있기 때문에 편리하긴 한데 문제는 반대쪽 스위치를 잘라내고 FTDI의 DTR, GND에 연결하는 것이 불편합니다. 이 케이블의 선은 단선이 아닌 연선인데다 제가 가지고 있는 와이어 스트리퍼 기준으로,

Vessel 3500E-2
; https://www.eleparts.co.kr/goods/view?no=5803

24AWG(0.5mm)로 피복이 벗겨지는데, 단선도 아닌 연선이어서 FTDI의 DTR, GND 소켓에 끼우기에는 너무 얇습니다. (악어 클립으로 집는 것도 그다지 권장할 수 없습니다.)

차라리 그보다는 22AWG 단선으로,

테프론선 0.6T (빨강) 1M 
; http://devicemart.co.kr/goods/view?no=34217

"PC 파워 전원 스위치 케이블"과 납땜으로 연결하거나, 아니면 Female-Female 케이블을 22AWG 단선으로 FTDI와 납땜 없이 연결하는 것이 좋습니다.




위에서 설명한 방법으로는, 아쉽게도 컴퓨터 케이스의 파워 스위치를 사용할 수 없습니다. (아니면 잘라서 납땜을 해야 합니다.) 물론, 그렇게 하면 불편할 것이기 때문에 방법을 좀 더 찾아봤고 그러다 알게 된 것이 바로 "무탈피 커넥터"입니다.

무탈피커넥터 (T-11)
; https://www.eleparts.co.kr/goods/view?no=6508906

T 타입의 커넥터는 기존 선을 (자르지 않으면서) 새로운 선과 연결할 수 있으므로 다음과 같이 납땜 없이도 간편하게 연결할 수 있습니다.

turn_on_the_device_4.jpg

그런데, 이것도 문제가 약간 있습니다. 위의 T 타입 커넥터가 연결할 수 있는 전선이 AWG24 ~ 20규격인데, FTDI 측의 22AWG 단선과는 잘 연결할 수 있지만 컴퓨터 케이스와 메인보드에 연결하는 Power 핀의 전선이 (아마도) 26AWG로 매우 얇아서 커넥터가 잘 잇지 못할 것 같았습니다. 하지만 설령 통전이 안 된다 해도 기존 선을 자르거나 하는 것은 아니기 때문에 밑져야 본전이라는 심정으로 부품 구매를 해서 연결 시도를 해봤는데요.

우선, 집에 있는 컴퓨터부터 테스트를 해봤습니다. 그러니까,,,, 아주 꽉 ^^; 눌러주면 연결이 됩니다. 확인을 위해 멀티미터로 통전 테스트를 하면서 진행했는데 통전이 될 때까지 꽉꽉 눌러주면 ^^; 됩니다. 그리고 회사에 있는 컴퓨터 역시, 그렇게 해서 잘 연결을 했습니다. 참고로, 손으로 누를 수 있는 정도가 아니므로 반드시 펜치 같은 도구가 있어야만 합니다.

암튼, 이렇게 해서 ^^ 그나마 지저분하지 않게 잘 마감을 했습니다.

커넥터의 종류
  전선-기판용 커넥터(Wire to Board)
    - 전선과 기판을 접속할 때 사용하는 커넥터
    - 핀 수 : 1핀에서 수십 핀까지 다양
    - Pitch: 2.00, 2.50, 3.50, 3.96mm 등 다양
    - 구성: 하우징(Housing), 웨이퍼(Wafer)

  핀 헤더(Pin Header) 및 헤더 소켓(Header Socket)
    - 종류: Single, Dual, Right angle 등
    - Pitch: 1.27, 2.0, 2.54mm
    - 사용하고자 하는 핀 수에 맞게 잘라서 사용

  IC 소켓
    - 종류: 일반 DIP 타입, Round 타입
    - IC를 반복하여 착탈 사용하는 경우에는 반드시 Round 타입의 소켓을 사용
    - 일반 DIP 타입은 장착 후 탈거 시 핀이 손상되어 재사용이 불가능함
    - 핀 수: 8, 14, 16, 18, 20, 24, 28, 32, 40핀 등

  D-SUB 커넥터
    - 컴퓨터와 주변기기를 접속할 때에 많이 쓰임
    - 종류: 전선 납땜 타입, 기판 납땜 타입, IDC 타입 등
    - 전선 납땜 타입의 경우 케이스를 사용하여 마감 처리
    - 9핀은 RS232 직렬 통신용으로 쓰이고, 25핀은 PC의 병렬 포트에 사용

  리본 케이블 커넥터
    - IDC(Insulation Displacement Connector)라고도 불림
    - PCB 간의 신호 전송을 위한 접속에 사용

  Circular 커넥터
    - 대형의 커넥터
    - 용도: 기계나 군용 장비의 신호 전달용, 전원 접속용
    - 구성: Plug, Receptacle

  터미널 블록
    - 전선의 접속점
    - 용도: 전선의 인입, 인출되는 곳에 사용, 전류의 과부하를 방지하고 전선의 유지보수를 한층 쉽게 할 수 있음
    - 단자 별로 허용 전류가 다른 만큼 적정 용량에 맞는 제품을 선정해 사용
    - 종류: 원터치 타입(Screwless), 유럽식 PCB 타입(미니어처 타입), 착탈식(헤더, 플러그) 타입, 배리어 PCB 타입, 릴레이 타입 등




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 7/18/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 16  17  18  19  20  21  22  23  24  25  26  27  28  [29]  30  ...
NoWriterDateCnt.TitleFile(s)
12895정성태12/31/20219212.NET Framework: 1126. C# - snagit처럼 화면 캡처를 연속으로 수행해 동영상 제작 [1]파일 다운로드1
12894정성태12/30/20217163.NET Framework: 1125. C# - DefaultObjectPool<T>의 IDisposable 개체에 대한 풀링 문제 [3]파일 다운로드1
12893정성태12/27/20218695.NET Framework: 1124. C# - .NET Platform Extension의 ObjectPool<T> 사용법 소개파일 다운로드1
12892정성태12/26/20216686기타: 83. unsigned 형의 이전 값이 최댓값을 넘어 0을 지난 경우, 값의 차이를 계산하는 방법
12891정성태12/23/20216612스크립트: 38. 파이썬 - uwsgi의 --master 옵션
12890정성태12/23/20216746VC++: 152. Golang - (문자가 아닌) 바이트 위치를 반환하는 strings.IndexRune 함수
12889정성태12/22/20219165.NET Framework: 1123. C# - (SharpDX + DXGI) 화면 캡처한 이미지를 빠르게 JPG로 변환하는 방법파일 다운로드1
12888정성태12/21/20217355.NET Framework: 1122. C# - ImageCodecInfo 사용 시 System.Drawing.Image와 System.Drawing.Bitmap에 따른 Save 성능 차이파일 다운로드1
12887정성태12/21/20219395오류 유형: 777. OpenCVSharp4를 사용한 프로그램 실행 시 "The type initializer for 'OpenCvSharp.Internal.NativeMethods' threw an exception." 예외 발생
12886정성태12/20/20217355스크립트: 37. 파이썬 - uwsgi의 --enable-threads 옵션 [2]
12885정성태12/20/20217591오류 유형: 776. uwsgi-plugin-python3 환경에서 MySQLdb 사용 환경
12884정성태12/20/20216658개발 환경 구성: 620. Windows 10+에서 WMI root/Microsoft/Windows/WindowsUpdate 네임스페이스 제거
12883정성태12/19/20217498오류 유형: 775. uwsgi-plugin-python3 환경에서 "ModuleNotFoundError: No module named 'django'" 오류 발생
12882정성태12/18/20216604개발 환경 구성: 619. Windows Server에서 WSL을 위한 리눅스 배포본을 설치하는 방법
12881정성태12/17/20217149개발 환경 구성: 618. WSL Ubuntu 20.04에서 파이썬을 위한 uwsgi 설치 방법 (2)
12880정성태12/16/20216922VS.NET IDE: 170. Visual Studio에서 .NET Core/5+ 역어셈블 소스코드 확인하는 방법
12879정성태12/16/202113158오류 유형: 774. Windows Server 2022 + docker desktop 설치 시 WSL 2로 선택한 경우 "Failed to deploy distro docker-desktop to ..." 오류 발생
12878정성태12/15/20218202개발 환경 구성: 617. 윈도우 WSL 환경에서 같은 종류의 리눅스를 다중으로 설치하는 방법
12877정성태12/15/20216875스크립트: 36. 파이썬 - pymysql 기본 예제 코드
12876정성태12/14/20216707개발 환경 구성: 616. Custom Sources를 이용한 Azure Monitor Metric 만들기
12875정성태12/13/20216434스크립트: 35. python - time.sleep(...) 호출 시 hang이 걸리는 듯한 문제
12874정성태12/13/20216400오류 유형: 773. shell script 실행 시 "$'\r': command not found" 오류
12873정성태12/12/20217526오류 유형: 772. 리눅스 - PATH에 등록했는데도 "command not found"가 나온다면?
12872정성태12/12/20217320개발 환경 구성: 615. GoLang과 Python 빌드가 모두 가능한 docker 이미지 만들기
12871정성태12/12/20217458오류 유형: 771. docker: Error response from daemon: OCI runtime create failed
12870정성태12/9/20216063개발 환경 구성: 614. 파이썬 - PyPI 패키지 만들기 (4) package_data 옵션
... 16  17  18  19  20  21  22  23  24  25  26  27  28  [29]  30  ...