성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>라즈베리 파이를 이용해 원격 컴퓨터의 전원 스위치 제어</h1> <p> 개발자라면 다들 공감하시겠지만, 사실 업무와 공부의 경계가 많이 모호한 면이 있습니다. 이 때문에 회사 컴퓨터를 켜놓고 집에서 접속해야 할 경우가 종종 있는데요, 그렇다 해도 많지는 않아서 항상 켜놓기에는 전기 사용이 좀 아깝습니다. 하지만, 꺼놓고 퇴근하자니 또 집에서 필요해지면 아쉽기 때문에 그러는 것도 좀 망설여지는데요.<br /> <br /> 그래서 ^^ 만들었습니다. 회사 컴퓨터의 전원을 원격으로 제어가 가능하도록 하는 것입니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 이를 구현하기 위해, 6년 전에 구매했던 - 먼지가 내려앉은 넷두이노를 꺼냈습니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > .NET Micro Framework - 넷두이노 플러스 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/1392'>http://www.sysnet.pe.kr/2/0/1392</a> </pre> <br /> (이제는 지원도 끊겨 버렸지만) 마지막 firmware 버전인 4.2.0.1로 <a target='tab' href='http://www.sysnet.pe.kr/2/0/1396'>업그레이드</a>까지 하고 네트워크 구현까지 완료했지만... 아쉽게도 이더넷 LAN 포트가 접촉 불량 문제가 발생했습니다. 납땜의 문제는 아닌 것 같고 랜 소켓 자체가 내부에 이더넷 케이블과 접촉되는 공간이 유격이 발생한 듯 케이블을 살짝 움직일 때마다 네트워크 접속이 끊어져 버리는 것입니다.<br /> <br /> 할 수 없이 ^^; 다시 먼지가 쌓이도록 창고에 두고.<br /> <br /> 그다음 제가 가지고 있는 보드 중,<br /> <br /> <ul> <li><a target='tab' href='http://www.sysnet.pe.kr/2/0/11372'>라즈베리 파이 제로 W</a></li> <li><a target='tab' href='http://www.sysnet.pe.kr/2/0/11595'>ESP8266(LiLon NodeMCU V3)</a></li> <li><a target='tab' href='http://www.sysnet.pe.kr/2/0/11597'>Thinary Electronic - ATmega328PB 아두이노 호환 보드</a> </li><br /> </ul> <br /> 후보로 떠오른 것이 "라즈베리 파이 제로 W"입니다. WiFi를 기본 제공하고 RPi의 특성상 PC 환경에 준하는 개발 환경을 가지고 있기 때문에 프로그램 작성도 매우 용이합니다.<br /> <br /> 한 가지 아쉬운 것은 제가 가지고 있는 "라즈베리 파이 제로 W"가 Data Pin 쪽에 헤더가 납땜되어 있지 않은 모델이라는 점입니다. (혹시, 제로 W 모델을 구매하시려는 분이 있다면 "<a target='tab' href='https://www.adafruit.com/product/3708'>with Headers</a>" 모델을 추천합니다.)<br /> <br /> [그림 - 출처 <a target='tab' href='http://www.icbanq.com/P008219607'>http://www.icbanq.com/P008219607</a>]<br /> <img width='305px' alt='raspberry_pi_zero_w_with_no_pin_header_1.jpg' src='/SysWebRes/bbs/raspberry_pi_zero_w_with_no_pin_header_1.jpg' /><br /> <br /> 그래서 저걸로 Data Pin을 제어하려면 핀 헤더를 납땜해야 하는 불편함이 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > How to solder header pins to the Raspberry Pi Zero (W) ; <a target='tab' href='https://www.youtube.com/watch?v=UDdbaMk39tM'>https://www.youtube.com/watch?v=UDdbaMk39tM</a> </pre> <br /> 가벼운 문제라면, 제가 인두기가 없습니다. ^^ 고민하던 차에 생각난 것이 바로 FTDI 장치입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PC에 연결해 동작하는 자신만의 USB 장치 만들어 보기 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11606'>http://www.sysnet.pe.kr/2/0/11606</a> </pre> <br /> FTDI 장치를 rpi에 연결하면 이후부터는 Serial port를 제어하는 방식으로 코딩할 수 있기 때문에 다음의 글에서 설명한 데로,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Raspberry PI Zero (W)에 FTDI 장치 연결 후 C/C++로 DTR 제어 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11716'>http://www.sysnet.pe.kr/2/0/11716</a> </pre> <br /> 간단하게 해결할 수 있습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 남은 작업은 FTDI의 GND 선과 DTR 신호를 컴퓨터에 연결하는 것입니다. 참고로 제가 가지고 있는 "GIGABYTE GA-Z87-HD3" 메인 보드는,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > GIGABYTE GA-Z87-HD3 ; <a target='tab' href='https://www.gigabyte.com/Motherboard/GA-Z87-HD3-rev-1x#ov'>https://www.gigabyte.com/Motherboard/GA-Z87-HD3-rev-1x#ov</a> </pre> <br /> 다음과 같은 PW+, PW- 핀 배열을 가지고 있습니다.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='turn_on_the_device_1.png' src='/SysWebRes/bbs/turn_on_the_device_1.png' /><br /> <br /> 따라서, FTDI의 GND를 PW-에 연결하고 DTR 선을 PW+에 연결하면 됩니다. <br /> <br /> <img alt='turn_on_the_device_2.png' src='/SysWebRes/bbs/turn_on_the_device_2.png' /><br /> <br /> 참고로, PW+와 PW-간의 전압을 측정해 보면 약 3.347V가 나옵니다. FTDI의 DTR 라인은 아두이노의 데이터 핀처럼 별도의 전원을 제공하는 것이 아닌, 단순히 선을 연결해 주는 동작만 하는 것이기 때문에 컴퓨터 전원 스위치를 켜는 용도로 사용할 수 있습니다.<br /> <br /> 이렇게 연결을 한 후, FtdiApp 프로젝트의 소스 코드를 다음과 같이 변경해 DTR 신호를 사람이 Power 스위치를 누르는 동안 정도의 시간만큼 ON 시켜 주는 것으로 바꿔줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > #include <stdio.h> #include <string> #include <vector> #include <iostream> #include <stdlib.h> #include <fcntl.h> #include <sys/ioctl.h> #include <unistd.h> using namespace std; int main(int argc, char *argv[]) { // http://xanthium.in/Controlling-RTS-and-DTR-pins-SerialPort-in-Linux string portNumber = "0"; string portName = "/dev/ttyUSB"; if (argc < 2) { cout << "FtdiApp [portNumber]" << endl; cout << "ex - set DTR on /dev/ttyUSB0" << endl; cout << "\t" << "FtdiApp 0" << endl; return 1; } portNumber = argv[1]; portName.append(portNumber); int fd = open(portName.c_str(), O_RDWR | O_NOCTTY); if (fd == -1) { cout << "NO Port: " << portName << endl; return 1; } int dtrFlag = TIOCM_DTR; ioctl(fd, TIOCMBIS, &dtrFlag); <span style='color: blue; font-weight: bold'>usleep(500 * 1000); // 500ms</span> ioctl(fd, TIOCMBIC, &dtrFlag); close(fd); return 0; } </pre> <br /> 자.. 이제 ^^ 컴퓨터 케이스를 열고 DTR, GND를 각각 PW+, PW- 선과 연결한 다음 Raspberry PI 콘솔에서 다음과 같이 실행해 주면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ ./FtdiApp.out 0 </pre> <br /> 컴퓨터가 켜지는 것을 볼 수 있습니다. 마찬가지로 한 번 더 실행해 주면, 운영체제가 (제어판의 전원관리에서 설정한 동작에 따라) Shutdown이나 최대 절전 모드로 들어가게 됩니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 주의할 것은, 반드시 DTR과 PW+를 연결하고 GND와 PW-를 연결해야 합니다. 컴퓨터 케이스의 Power Switch는 물리적으로 접점이 끊긴 것을 연결하는 것이기 때문에 +/- 극을 맞출 필요가 없지만 FTDI 장치는 극이 맞아야 합니다. 저도 내부적인 FTDI 장치의 배선을 몰라 자세하게 설명할 수는 없지만, 현상 자체는 DTR을 PW-, GND를 PW+에 연결하는 경우 그 순간 컴퓨터 전원이 들어오게 됩니다. 계측기로 + 단자를 DTR에 - 단자를 GND에 놓고 측정하면 저항이 무한대가 되지만, 그 반대로 하는 경우에는 약 250K 정도의 저항이 측정되는 걸로 봐서 선이 연결된 것과 유사한 역할을 하는 것 같습니다.<br /> <br /> 이제 나머지 문제는, "마감"을 훌륭하게 하는 것입니다. 대충 해 놓으면 동작은 하겠지만 실 사용 환경에서라면 좀 더 완성도를 높이는 게 좋습니다. 일단 FTDI와 라즈베리 파이를 연결하는 것은 USB 케이블로 깔끔하게 해결은 됩니다. 하지만 FTDI의 DTR, GND와 메인 보드 간의 연결을 하는 것은 그다지 매끄럽게 해결이 안 됩니다. 우선, 기존의 컴퓨터 케이스에 있는 Power Switch를 안 쓰는 걸로 가정하고 다음의 케이블을 사용할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PC 파워 전원 스위치 케이블/메인보드연결 ; <a target='tab' href='http://item.gmarket.co.kr/detailview/item.asp?goodscode=995567752'>http://item.gmarket.co.kr/detailview/item.asp?goodscode=995567752</a> </pre> <br /> <img alt='computer_power_cable_1.png' src='/SysWebRes/bbs/computer_power_cable_1.png' /><br /> <br /> Female Header 부분이 메인 보드의 Power Pin에 정확히 연결할 수 있기 때문에 편리하긴 한데 문제는 반대쪽 스위치를 잘라내고 FTDI의 DTR, GND에 연결하는 것이 불편합니다. 이 케이블의 선은 단선이 아닌 연선인데다 제가 가지고 있는 와이어 스트리퍼 기준으로,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Vessel 3500E-2 ; <a target='tab' href='https://www.eleparts.co.kr/goods/view?no=5803'>https://www.eleparts.co.kr/goods/view?no=5803</a> </pre> <br /> 24AWG(0.5mm)로 피복이 벗겨지는데 따라서 FTDI의 DTR, GND 소켓에 끼우기에는 너무 얇습니다. (악어 클립으로 집는 것도 그다지 권장할 수 없습니다.)<br /> <br /> 차라리 그보다는 <a target='tab' href='http://www.devicemart.co.kr/34217'>22AWG 단선</a>으로 "<a target='tab' href='http://item.gmarket.co.kr/detailview/item.asp?goodscode=995567752'>PC 파워 전원 스위치 케이블</a>"과 납땜으로 연결하거나, 아니면 <a target='tab' href='https://www.eleparts.co.kr/goods/view?no=5803'>Female-Female 케이블</a>을 <a target='tab' href='http://www.devicemart.co.kr/34217'>22AWG 단선</a>으로 FTDI와 납땜 없이 연결하는 것이 좋습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 그런데 결론적으로는, 라즈베리 파이도 사용하지 않았습니다. 왜냐하면 이게 영... 마감이 좋지 않습니다. ^^; 라즈베리 파이 용 케이스도 구매해야 하고 라즈베리 파이 쪽에 별도의 휴대폰 어댑터로부터 5VDC도 공급해야 합니다. 당연히 필요한 것이 아니냐??? 라고 할 텐데, 제가 다른 방법을 하나 더 찾아냈습니다. 바로 회사 컴퓨터 외에 늘 켜져 있는 NAS 장비를 이용하는 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Synology NAS(DS216+II)에 docker 설치 후 .NET Core 2.1 응용 프로그램 실행하는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11713'>http://www.sysnet.pe.kr/2/0/11713</a> </pre> <br /> 이건 다음에 다시 정리해서 올리겠습니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > AWG 규격 - 전선 규격: AWG(American Wire Gauge) 단위 - 선(Wire)의 굵기(직경)에 대한 미국 표준 규격으로 굵기가 굵어질수록 번호는 작아짐 - 단선: 직경 - 연선: 단면적에 의해 선번 - 일반 전자회로에서 보통 사용되는 전선은 AWG26 정도 케이블의 종류 * 계측 및 통신용 케이블 - 전기, 전자기기의 신호 전송용 - 실드 처리되어 노이즈를 줄임 - 선경: AWG 24 - RS232, RS422, RS485 등 통신 케이블에 주로 사용 - Encoder의 검출 신호, 위치 결정 제어로 사용되는 지령 펄스 신호, 속도 제어 등의 아날로그 신호, 케이블이 긴 경우의 신호 등은 트위스트 실드 처리된 케이블을 사용 * 하네스 용 와이어 - 용도: 몰렉스 커넥터 등 - 한쪽 또는 양쪽 끝 단에 클림프 처리되어 있음 - 선경: AWG 26 * 플랫 케이블(구형 컴퓨터에서 하드 디스크 연결 케이블) - IDC 케이블이라고도 함 - 일반적인 Data Bus용으로 많이 사용(컴퓨터 내부 데이터 등) - 한쪽 가장자리 케이블에 붉은 선 사용(혼선 방지) - Pitch: 2.54, 2.0, 1.27mm - 선경: AWG 28 </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1754
(왼쪽의 숫자를 입력해야 합니다.)