Synology NAS(DS216+II)에 FTDI 장치 연결 후 C#(.NET Core)으로 DTR 제어
라즈베리 파이의 경우,
Raspberry PI Zero (W)에 FTDI 장치 연결 후 C/C++로 DTR 제어
; https://www.sysnet.pe.kr/2/0/11716
아쉽게도 저 프로그램을 C#으로 만들 수는 없습니다. 왜냐하면 .NET Core가 제공되지 않기 때문입니다. 반면, Synology NAS(DS216+II)의 경우,
Synology NAS(DS216+II)에서 FTDI 장치를 C/C++로 제어
; https://www.sysnet.pe.kr/2/0/11733
docker를 통해 .NET Core 응용 프로그램을 실행하는 것이 가능하므로,
Synology NAS(DS216+II)에 docker 설치 후 .NET Core 2.1 응용 프로그램 실행하는 방법
; https://www.sysnet.pe.kr/2/0/11713
C#으로도 FTDI 장치를 제어할 수 있습니다. 간단하게 만들어 볼까요? ^^
우선,
기존에 C/C++ 예제로 구했던 read 프로그램을 기반으로 하겠습니다.
$ cp -r read ftdidtr
복사한 ftdidtr 디렉터리에서 Makefile을 다음과 같이 수정해 줍니다.
export CC = gcc
TOPDIR := $(shell cd ..; cd ..; pwd)
include $(TOPDIR)/Rules.make
APP = ftdidtr
all: $(APP)
$(APP): main.c
$(CC) main.c -o $(APP) $(CFLAGS)
clean:
-rm -f *.o ; rm $(APP)
그다음, main.c의 내용을 다음과 같이 "
라즈베리 파이를 이용해 원격 컴퓨터의 전원 스위치 제어"의 역할만 하도록 변경합니다.
$ cat main.c
/*
To build use the following gcc statement
(assuming you have the d2xx library in the /usr/local/lib directory).
gcc -o read main.c -L. -lftd2xx -Wl,-rpath,/usr/local/lib
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include "../../ftd2xx.h"
int main(int argc, char *argv[])
{
FT_STATUS ftStatus;
FT_HANDLE ftHandle0;
int iport;
DWORD libraryVersion = 0;
ftStatus = FT_GetLibraryVersion(&libraryVersion);
if (ftStatus == FT_OK)
{
printf("Library version = 0x%x\n", (unsigned int)libraryVersion);
}
else
{
printf("Error reading library version.\n");
return 1;
}
if(argc > 1) {
sscanf(argv[1], "%d", &iport);
}
else {
iport = 0;
}
printf("Opening port %d\n", iport);
ftStatus = FT_Open(iport, &ftHandle0);
if(ftStatus != FT_OK) {
/*
This can fail if the ftdi_sio driver is loaded
use lsmod to check this and rmmod ftdi_sio to remove
also rmmod usbserial
*/
printf("FT_Open(%d) failed\n", iport);
return 1;
}
printf("FT_Open succeeded. Handle is %p\n", ftHandle0);
FT_SetDtr(ftHandle0);
usleep(500 * 1000); // 500ms
FT_ClrDtr(ftHandle0);
FT_Close(ftHandle0);
return 0;
}
빌드 후 실행해 보면, 정상적으로 500ms 동안 DTR 신호가 On 되는 것을 확인할 수 있습니다.
C/C++로 구현을 했으니, 이제 C#으로도 당연히 구현할 수 있습니다. C#만큼 Native 모듈과 자연스러운 연동이 가능한 언어도 드문데요. ^^
FTDI 라이브러리를 빌드해서 얻은 libftd2xx.so, libftd2xx.so.1.4.8 파일 2개를,
$ ls /usr/local/lib
libftd2xx.a libftd2xx.so libftd2xx.so.1.4.8 libftd2xx.txt python2.7
C# .NET Core 프로젝트에 추가한 후 다음과 같이 소스 코드를 구성하면 됩니다.
using System;
using System.Runtime.InteropServices;
using System.Threading;
namespace FtdiDtr
{
class Program
{
[DllImport("libftd2xx.so")]
private static extern int FT_GetLibraryVersion(out int version);
[DllImport("libftd2xx.so")]
private static extern int FT_Open(int iport, out IntPtr ftHandle);
[DllImport("libftd2xx.so")]
private static extern int FT_Close(IntPtr ftHandle);
[DllImport("libftd2xx.so")]
private static extern int FT_SetDtr(IntPtr ftHandle);
[DllImport("libftd2xx.so")]
private static extern int FT_ClrDtr(IntPtr ftHandle);
static void Main(string[] args)
{
int version;
FT_GetLibraryVersion(out version);
Console.WriteLine("FT Version: 0x" + version.ToString("x"));
IntPtr ftHandle = IntPtr.Zero;
Console.WriteLine("Opening...");
int result = FT_Open(0, out ftHandle);
Console.WriteLine(result);
if (ftHandle != IntPtr.Zero)
{
FT_SetDtr(ftHandle);
Thread.Sleep(500);
FT_ClrDtr(ftHandle);
Console.WriteLine("Closing...");
FT_Close(ftHandle);
}
}
}
}
이후 docker 이미지를 생성하도록 Dockerfile 추가와 그에 맞게 csproj 파일을 변경하고,
.NET Core 콘솔 응용 프로그램을 배포(publish) 시 docker image 자동 생성
; https://www.sysnet.pe.kr/2/0/11708
배포(Publish) 후 생성된 이미지를 Synology NAS(DS216+II) 장비에 복사합니다.
Synology NAS(DS216+II)에 docker 설치 후 .NET Core 2.1 응용 프로그램 실행하는 방법
; https://www.sysnet.pe.kr/2/0/11713
c:\temp> docker save -o c:\temp\ftdidtr.img ftdidtr
c:\temp> pscp c:\temp\ftdidtr.img testuser@test_linux:/docker
그다음 Synology NAS(DS216+II) 측의 shell에서 docker 이미지를 로드하고,
$ docker load -i /volume1/docker/ftdidtr.img
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ftdidtr latest 205ea304ca0b 8 minutes ago 255MB
실행하면 됩니다.
$ docker run --rm ftdidtr
그런데, 위와 같이 실행하면
docker 호스트 측의 장비에 연결된 USB 장치를 인식하지 못하므로, 다음과 같이 실행해야 합니다.
$ docker run --rm --privileged ftdidtr
FT Version: 0x10408
Opening...
0
Closing...
테스트를 위해 Synology NAS(DS216+II)에 USB 케이블로 FTDI를 연결 후, DTR에 LED와 저항을 직렬로 3.3V 단자에 연결하면 docker run 시에 LED가 0.5 초 동안 불이 들어오는 것을 확인할 수 있습니다.
(
첨부 파일은 이 글의 예제 코드를 포함합니다.)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]