Breakout.js와 Arduino를 연동하는 Webapp구성을 해본다.

 * 웹기반으로 다양한 방법으로 접근이 가능함.


[Arduino 구성]

  Arduino는 온도센서(TM)를 사용하고 프로그램은 스케치예제에서 제공되는 Firmata 의   StandardFirmata를 보드에 다운로드하였다.


 서버로 구성될 Breakout.js에서는 Firmata를 기본으로하여 예제가 구성되어있다.

  참고로, Firmata에서 제공되는 도구를 이용하여 Arduino의 기본 모니터링 및 제어를 할 수 있다.

  a. Arduino 펌웨어 준비하기
    본 예제를 실행하기 위해서 아래와 같이 예제로 제공되는 StandardFirmata 펌웨어를 보드에 다운로드하였다.



  b. Firmata 도구 참조하기

   Arduino와 펌웨어가 바르게 준비되었는지 확인을 해본다. 먼저 Arduino 보더와 연결된 USB 케이블을 PC에 연결하고, Firmata 공식사이트에서 Mac용으로 프로그램을 다운로드하여 실행하면 Firmata test프로그램이 실행되고, Arduino Serial포트를 설정하면 아래와 같이 실행 결과를 확인할 수 있다.


Arduino에서 Breakout.js에 대한 준비는 완료되었다.


[Breakout.js 구성]

  Breakout.js는 I/O보드를 웹환경으로 인터페이스하는 Javascript기반의 오픈 웹서버환경이다. Breakout.js의 기본 예제는 Arduino 보드와 인터페이스를 위해서 Firmata 프로토콜을 사용하였다.



  a. Breakout.js 준비하기

    Breakout.js 공식 사이트에서 다운로드할 수 있다. 다운로드 후 폴더를 열면 아래와 같은 폴더들로 구성되어있다.


 

 b. 웹서버 파일 준비하기

    다운로드 한 폴더에서 예제 실행을 위해서는 dist, examples폴더의 파일이 필요하다.

    다른 위치에 폴더를 만들어 위 두 폴더를 복사하여 준비한다.

   * 웹서버 Root 폴더 : /Users/shinhyeongab/Developer Data/Breakout


 c. Breakout Server 시작하기

    다운로드 폴더의 server 폴더에 보면 OS별로 사용 가능한 서버 프로그램이 준비되어 있다. Mac에서 사용하려면 breakout_server-mac.zip의 압축을 풀고 Breakout Server.app를 실행하면 된다.


  - status 설정

   Arduino와 Serial 통신을 위한 포트를 설정과 서버 포트를 설정한다.

   * 설정하기전에 Arduino와 연결된 USB 케이블을 PC에 연결하여야 함. 

   현재, /dev/cu.usbmodem1431, 8887로 설정됨


 - settings 설정

   웹서버의 Root디렉토리를 설정합니다. 앞에서 준비한 웹서버 파일의 경로를 선택하고, 다중 접속이 필요하면 아래의 Enable Multi-Client Connections를 체크합니다.



  준비가 완료되면 아래의 Connect를 클릭하여 서버를 실행합니다.


[결과확인]

  Arduino의 펌웨어가 다운로드된 상태에서 PC에 연결되고, Breakout.js서버 설정을 완료하여 서버를 실행하면 보드의 정보를 Breakout.js에서 가져올수 있다.


결과를 확인하려면 PC에서는 http://localhost:8887/examples로 주소를 입력하면 기본 사이트가 열려진다. 기본 화면에서 Sensors 항목의 Temperature를 선택하면 아래와 같이 Arduino 보드의 온도센스 결과를 웹페이지에서 볼 수 있다.



Wifi 환경에서는 모바일 장치(iPad, Android 장치 등)으로 해당 PC주소의 페이지 경로로 가면 동일한 결과를 확인할 수 있다.


아래와 같이 맥북과 iPad에서 결과를 확인 할 수 있다.



'IOE > Arduino' 카테고리의 다른 글

Arduino에 디스플레이(LCD)를 달아보자!  (0) 2014.01.04
Arduino에 디스플레이(VFD)를 달아보자!  (0) 2013.12.07
Posted by 혀나미
,

R + Java + Arduino를 사용하여 온도 측정 및 데이터 시각화 환경을 구성


Arduino는 온도센서를 이용하여 온도 데이터를 수집하여 Serial로 송신하고, Java에서 arduino에서 전송된 온도정보를 Serial로 수신하며, R에서는 Java에서 수신한 데이터를 가공하고 시각화하게 된다.


[Arduino 구성]

 온도센서(TMP 36)를 사용하여 온도 측정할 수 있는 회로를 구성 하였다.

  a. H/W 준비

    - Arduino UNO, USB cable, TMP 36, Wire *3, 

 

  b. 회로 구성


   c. 소스 구성

/* Original code from the Arduino Experimentation Kit Example Code             |

 * CIRC-10 .: Temperature :. (TMP36 Temperature Sensor) |

 * Amended to be used in Java/R

 */


//TMP36 Pin Variables

int temperaturePin = 0;


void setup()

{

  Serial.begin(9600);

}

 

void loop()                     // run over and over again

{

 float temperature = getVoltage(temperaturePin);  //getting the voltage reading from the temperature sensor

 temperature = (temperature - .5) * 100;          //converting from 10 mv per degree wit 500 mV offset

                                                  //to degrees ((volatge - 500mV) times 100)

 Serial.print("T");

 Serial.println(temperature);                     //printing the result

 delay(1000);                                     //waiting a second

}


float getVoltage(int pin){

 return (analogRead(pin) * .004882814); //converting from a 0 to 1023 digital range

                                        // to 0 to 5 volts (each 1 reading equals ~ 5 millivolts

}

  d. Arduino 프로그램 다운로드 및 실행

    위 소스를 Arduino 스케치에서 작성하고 USB케이블을 PC와 보드에 연결하여 

    다운로드하면 된다.


[Java 구성]

  R에서 디바이스간의 통신이 불가하여 R에서 Serial통신이 가능하도록 *.jar 라이버러리를 생성한다.

 본 소스에서는 Java에서 Serial 통신을 위하여 공개된 RXTX library를 활용하였다.

  a. RXTX library 준비

     사이트의 최신(rxtx-2.2pre2-bins.zip) library를 다운로드하여 압축을 풀고,

     OS환경에 맞는 파일을 Java 러이버러리 경로에 복사하여 사용한다.

      rxtx-2-2.2pre2-bins.zip

     

   Mac OSX 환경

    - 다운받은 *.zip파일의 압축을 풀고 rxtx-2.2pre2-bins폴더의 RXTXcomm.jar 파일과

    - 폴더 안에 mac-10.5폴더의 librxtxSerial.jnilib 파일을 복사하고,

    - /Library/Java/Extensions 폴더에 붙여 넣는다.


 b. Serial 통신 미들웨어 소스작성


import java.io.InputStream;

import gnu.io.CommPortIdentifier;

import gnu.io.SerialPort;

import gnu.io.SerialPortEvent;

import gnu.io.SerialPortEventListener;

import java.util.Enumeration;


public class SerialTemperature implements SerialPortEventListener {


    SerialPort serialPort;

    /** The port we're normally going to use. */

    private static final String PORT_NAMES[] = {

        "/dev/tty.usbmodem1431", // Linux

    };

    /** Buffered input stream from the port */

    private InputStream input;


    /** Milliseconds to block while waiting for port open */

    private static final int TIME_OUT = 2000;

    /** Default bits per second for COM port. */

    private static final int DATA_RATE = 9600;


    private String temperatureBuffer;


    public void initialize() {

        CommPortIdentifier portId = null;

        Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();


        // iterate through, looking for the port

        while (portEnum.hasMoreElements()) {

            CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();

            for (String portName : PORT_NAMES) {

                if (currPortId.getName().equals(portName)) {

                    portId = currPortId;

                    break;

                }

            }

        }


        if (portId == null) {

            System.out.println("Could not find COM port.");

            return;

        }


        try {

            // open serial port, and use class name for the appName.

            serialPort = (SerialPort) portId.open(this.getClass().getName(),

                                                  TIME_OUT);


            // set port parameters

            serialPort.setSerialPortParams(DATA_RATE,

                                           SerialPort.DATABITS_8,

                                           SerialPort.STOPBITS_1,

                                           SerialPort.PARITY_NONE);


            // open the streams                                                                                                                 

            input = serialPort.getInputStream();


            // add event listeners

            serialPort.addEventListener(this);

            serialPort.notifyOnDataAvailable(true);

        } catch (Exception e) {

            System.err.println(e.toString());

        }

    }



    /**

     * This should be called when you stop using the port.

     * This will prevent port locking on platforms like Linux.

     */

    public synchronized void close() {

        if (serialPort != null) {

            serialPort.removeEventListener();

            serialPort.close();

        }

    }


    /**

     * This will be used by R to retrieve the temperature value

     */

    public synchronized Float read() {

        return Float.valueOf(temperatureBuffer.substring(1)).floatValue();

    }


    /**                                                                                                                                         

     * Handle an event on the serial port. Read the data and save it to the buffer                                                              

     */

    public synchronized void serialEvent(SerialPortEvent oEvent) {

        if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {

            try {

                int available = input.available();

                byte chunk[] = new byte[available];

                input.read(chunk, 0, available);


                String s = new String(chunk);

                if(s.contains("T")) {

                    temperatureBuffer = s;

                } else {

                    temperatureBuffer += s;

                }


            } catch (Exception e) {

                System.err.println(e.toString());

            }

        }

    }


}


  c. *.jar  파일 만들기

    소스를 컴파일하여 *.jar파일로 생성하여 R 프로그램 위치에 파일을 준비한다.

  • 소스 컴파일 : javac SerialTemperature.java
  • *.jar 파일 생성 : jar cf SerialTemperature.jar SerialTemperature.class
   Eclipse에서 생성시에는 RXTXcomm.jar를 Build path로 등록하고, 코드 구성 및 컴파일
   해야 하며, *.jar파일 생성은 export를 이용하여 간단하게 할 수 있다.

[R 작성]
  R에서는 *.jar 라이버러리를 사용하여 Arduino와 통신을 하고 온도 정보를 받아와서 
  데이터 처리 후 시각화 처리를 하게 된다.

  a. 준비하기 
    R 실행전에 아래의 패키지를 다운로드하여 설치하고, *.jar파일은 R 작업 경로에 
   복사하여 준비한다.
  • R 패키지 준비 : rJava, ggplot2
  • *.jar 파일 준비 : SerialTemperature.jar

 b. R 소스 작성


setwd('/Users/shinhyeongab/Documents/workspace/SerialTemperature/bin')

require(rJava)

require(ggplot2)


.jinit(classpath='SerialTemperature.jar')

ardJava <- .jnew('SerialTemperature')


.jcall(ardJava, returnSig='V', method='initialize')


tempCapture <- NULL

while(Sys.Date()<'2013-12-11') {

  system('sleep 5')

  try({

    ans <- .jsimplify(.jcall(ardJava, returnSig='Ljava/lang/Float;', method='read'))

    tempCapture <- rbind(tempCapture, data.frame(Time=Sys.time(), Temperature=ans))

    print(ggplot(tempCapture) + geom_line(aes(x=Time, y=Temperature)) + theme_bw())

  }, silent=T)

}                                


.jcall(ardJava, returnSig='V', method='close')



[실행하기]

a. Arduino 보드를 PC에 연결하면 온도정보를 송신함.

b. R의 실행을 맨 아래 앞까지 실행 함.

    * 마지막 줄은 Serial 통신 종료 코드 임.


[실행결과] 




 관련파일 : 

TemperatureRecorder.zip


참조 링크 : thermometer-R-using-Arduino-Java


'Big-Data > R Language' 카테고리의 다른 글

R 둘러보기  (0) 2013.11.09
Posted by 혀나미
,

R 둘러보기

Big-Data/R Language 2013. 11. 9. 09:12

R은 데이터 분석을 위한 통계계산과 그래픽스를 제공하는 Free Software 환경임.

R을 사용하려면 CRAN(The Comprehensive R Archive Network)사이트에서 R과 추가 Package를 다운로드해야 함.
R의 표준 메뉴얼은 오픈되어 있고, 한국에서도 개인이 오픈한 문서들이 있음.
R의 기본 사용자 UI은 단순한 기능으로 구성되어 있으며, 좀더 편리한 개발환경 구성을 위해서는 RStudio를 사용할 수 있다.




'Big-Data > R Language' 카테고리의 다른 글

R + java + arduino 기반 온도측정 장치 구성하기  (0) 2013.11.09
Posted by 혀나미
,