레이블이 시리얼포트인 게시물을 표시합니다. 모든 게시물 표시
레이블이 시리얼포트인 게시물을 표시합니다. 모든 게시물 표시

2015년 3월 17일 화요일

NodeJS에서 시리얼 포트 사용하기

하드웨어 디바이스와 통신에 가장 쉽고 많이 사용되는것이 시리얼포트이다. NodeJS에서 시리얼 포트를 사용하려면 Chris Williams가 만든 serialport 모듈을 사용하면 된다.

먼저 serialport 모듈을 설치한다.

$ npm install --save-dev serialport

> serialport@1.6.2 install /home/test/node_modules/serialport
> node-pre-gyp install --fallback-to-build

[serialport] Success: "/home/test/node_modules/serialport/build/serialport/v1.6.2/Release/node-v11-darwin-x64/serialport.node" is installed via remote
serialport@1.6.2 ../node_modules/serialport
├── bindings@1.2.1
├── sf@0.1.7
├── nan@1.7.0
├── optimist@0.6.1 (wordwrap@0.0.2, minimist@0.0.10)
└── debug@2.1.3 (ms@0.7.0)
$ 

설치가 완료되면 시리얼 포트를 열어준다.

$ node
> var serialport = require("serialport");
undefined
> SerialPort = serialport.SerialPort;
{ [Function: SerialPort]
  super_:
   { [Function: Stream]
     super_: { [Function: EventEmitter] listenerCount: [Function] },
     Readable:
      { [Function: Readable]
        ReadableState: [Function: ReadableState],
        super_: [Circular],
        _fromList: [Function: fromList] },
     Writable:
      { [Function: Writable]
        WritableState: [Function: WritableState],
        super_: [Circular] },
     Duplex: { [Function: Duplex] super_: [Object] },
     Transform: { [Function: Transform] super_: [Object] },
     PassThrough: { [Function: PassThrough] super_: [Object] },
     Stream: [Circular] } }
> var serialPort = new SerialPort("/dev/cu.usbmodem14131", {
      baudrate: 9600,
      parser: serialport.parsers.readline("\n")
});
> serialPort = new SerialPort("/dev/cu.PL2303-00003014", {
... baudrate: 9600,
... parser: serialport.parsers.readline("\n")
... });
{ domain: null,
  _events: {},
  _maxListeners: 10,
  fd: null,
  paused: true,
  bufferSize: 256,
  readable: true,
  reading: false,
  options:
   { baudrate: 9600,
     parser: [Function],
     baudRate: 9600,
     dataBits: 8,
     stopBits: 1,
     parity: 'none',
     rtscts: false,
     xon: false,
     xoff: false,
     xany: false,
     bufferSize: 256,
     platformOptions: { vmin: 1, vtime: 0 },
     dataCallback: [Function],
     disconnectedCallback: [Function] },
  path: '/dev/cu.PL2303-00003014' }
> 

위에서 '/dev/cu.PL2303-00003014' 부분은 시스템에 맞게 바꿔주면 된다. 리눅스라면 보통 '/dev/ttyUSB0' 같은 이름이고 윈도우라면 'COM1' 같은 이름이 된다.

테스트하기 위해 아두이노에 0.1초마다 숫자를 하나씩 증가시켜 시리얼포트로 출력하도록 하는 스케치를 업로드 해 준다.

setup() { 
  Serial.begin(9600); 
} 

int i=0; 
void loop() { 
  Serial.println(i++); 
  delay(100); // poll every 100ms 
}

Reading from the port

시리얼포트에서 값을 읽어 화면에 표시하기 위해 다음의 코드를 작성해 'dump.js'라는 이름으로 저장해준다. 

var serialport = require("serialport"); 
var SerialPort = serialport.SerialPort; 

var serialPort = new SerialPort("cu.PL2303-00003014", { 
  baudrate: 9600, 
  parser: serialport.parsers.readline("\n") 
}); 
serialPort.on("open", function () { 
  console.log('open'); 
  serialPort.on('data', function(data) { 
    console.log(data); 
  }); 
});

이제 아두이노를 USB-to-Serial 케이블에 연결하고 dump.js를 실행한다.

$ node jump.js
...
5
6
7
....
^C
$ 

좀 더 상세한 정보와 예제 코드는 https://www.npmjs.com/package/serialport 를 참조하면 된다.

2011년 2월 26일 토요일

탈옥하지 않은 아이폰에 시리얼포트 사용하기: HiJack (Add serial port to un-jailbroken iPhone: HiJack)

UMich에서 아주 재미있는 프로젝트가 진행되었다. HiJack이라고 아이폰의 헤드폰 단자에 꼽아 외부 주변기기와 통신을 할 수 있는 디바이스를 만든 것이다.



아이폰의 30핀 독 커넥터에도 시리얼 포트가 있기 때문에 외부 디바이스를 연결할 수 있지만 이 경우 탈옥을 하지 않은 아이폰/터치팟의 경우 애플의 인증칩이 붙어 있어야만 동작하고 관련 자료를 구하는것도 개발자 프로그램에 가입해야만 가능하기 때문에 제약이 많았다.
물론 탈옥을 하고 나면 모든 제한이 사라지고 리눅스에서 시리얼 포트 사용하는것과 동일하게 사용할 수 있게 된다.

하지만 HiJack을 사용하면 탈옥을 하지 않은 순정 아이폰/터치팟에 시리얼포트 뿐 아니고 digital I/O를 제공해주기 때문에 여러가지 외부 디바이스를 손쉽게 아이폰에 인터페이스 할 수 있다.

당연히 지금까지 이런 방식을 사용하지 않았던건 아니다.
이미 위의 사진같이 Square라는 회사에서 아이폰용 신용카드 리더를 만들어 제공하고 있는데 이 역시 기본적으로 동일한 방식을 사용해서 통신을 하는 것이다.

단 차이는 사진의 리더기는 완성된 제품인데 비해 HiJack은 모든 관련자료와 필요한 소스코드까지 완전히 공개되어 있다는 점이다.

그리고 이 회로의 훌륭한 점은 헤드폰 잭은 스테레오라는걸 이용해서 아이폰에서 HiJack으로 데이터 전송은 왼쪽 모노 채널을 통해 보내고 오른쪽 모노 채널로는 지속적으로 22KHz 톤을 보내 HiJack에서는 그 톤은 energy harvesting회로를 통해 자신에게 전원을 공급하는데 사용한다.
약 47%의 변환효율을 보여 7.4mW의 전력을 공급한다.

데이터 전송 속도는 Bell 202 FSK modulation을 사용할 때는 300bps, Manchester encoding된 디지털 신호를 직접 사용하는 경우는 8.82kbps가 된다.

시리얼 포트 뿐 아니고 MSP430의 A/D나 digital I/O신호도 사용할 수 있기 때문에 아래 사진은 HiJack에 EKG모니터를 연결한 경우이다.




ECG Extension for HiJack from Thomas Schmid on Vimeo.



Hijacking Power and Bandwidth from the Mobile Phone's Audio Interface - Integrated Prototype from Thomas Schmid on Vimeo.



Hijacking Power and Bandwidth from the Mobile Phone's Audio Interface from Thomas Schmid on Vimeo.



SoilJack - A Low-Cost Phone Soil Moisture Meter from Thomas Schmid on Vimeo.

회로와 관련 소스는 http://code.google.com/p/hijack-main/ 에서 다운받을 수 있다.

좀 더 자세한 정보와 관련 논문은 프로젝트 홈페이지인 http://eecs.umich.edu/~prabal/projects/hijack/ 를 참조하면 된다.