루덴스코드 Blog

LINX 를 사용하여 LabVIEW 와 Arduino 를 연결하는 것을 해보았다. 여기서는 아두이노와 이더넷실드를 결합한 후 UDP 통신으로 PC 에 일정한 데이터를 보내고, PC 에서 아두이노 쪽으로 일정 데이터를 보내는 작업을 해본다.


UDP 혹은 TCP 통신으로 아두이노를 사용하는 것은 일종의 제약을 뛰어넘는 일이다. 이제는 아두이노 혹은 다른 어떤 것이라도 UDP / TCP 통신만 지원된다면 LabVIEW 를 사용하여 제어가 가능하다는 뜻이다.


여기서는 Arduino UNO 뿐만 아니라 Arduino DUE 를 Ethernet Shield 와 결합하여 LabVIEW 와 통신하는 것을 보여준다. 


구글 유투브에 몇개의 동영상이 이러한 통신으로 LabVIEW 와 Arduino 간 신호를 전달하는 것을 보여주고 있다. 하지만 정작 제대로 된 정보는 찾기 어려웠다. 그래서 최대한 간단하게 UDP 를 이용하여 LabVIEW 와 Arduino 간의 신호전달을 만들어 보았다.


하드웨어와 소트드웨어는 다음과 같다. 


PC - LabVIEW with LINX

Arduino UNO + Ethernet Shield + 가변저항(SLIDE Potentiometer) 10k




하드웨어는 최대한 단순하게 해두었다. 가변저항의 양끝은 5V 와 GND 에 연결되었으며, 중간부분은 A0 아날로그 포트로 연결해 두었다. 이더넷실드의 아래에 아두이노 우노가 있다.


실험을 위해 두가지 예제를 여기에 둔다. 


I. 슬라이드 저항 없이 아두이노에서 랜덤하게 나온 값을 LabVIEW 로 전송하는 예제


1. 아두이노 프로그램


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
 Communication with LabVIEW by UDP Protocol:
 This sketch send udp signal to LabVIEW (PC)
 created 24 Feb 2016
 by JelicleLim 
 http://www.winduino.com
 */
 
#include <SPI.h>         
#include <Ethernet.h>
#include <EthernetUdp.h>  
 
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {  0xDE0xAD0xBE0xEF0xFE0xED };
IPAddress ip(1921680151);
 
unsigned int localPort = 8888;      // local port to listen on
long randomNumber;
 
// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];  //buffer to hold incoming packet,
String  ReplyBuffer;       // a string to send back
char sendBuf[10];
 
 
// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
 
void setup() {
  Ethernet.begin(mac, ip);    // start the Ethernet and UDP:
  Udp.begin(localPort);
 
  Serial.begin(9600);
  randomSeed(analogRead(5));
}
 
void loop() {
  static int intPulse = 0;
  intPulse++;
  int bufLength;
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("Received packet of size ");
    Serial.print(packetSize);
    Serial.print(" From ");
    IPAddress remote = Udp.remoteIP();
    for (int i = 0; i < 4; i++) {
      Serial.print(remote[i], DEC);
      if (i < 3) {
        Serial.print(".");
      }
    }
    Serial.print(", port ");
    Serial.print(Udp.remotePort());
 
    // read the packet into packetBufffer
    memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    Serial.print(" Contents:");
    Serial.println(packetBuffer);
 
    // send a reply to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    randomNumber = random(5);
    
    if (intPulse%50<25)     ReplyBuffer = String(5+randomNumber);
    else    ReplyBuffer = String(50+randomNumber);
    
    bufLength = ReplyBuffer.length();
    ReplyBuffer.toCharArray(sendBuf,bufLength+2);
    Udp.write(sendBuf);
    Udp.endPacket();
  }
  delay(10);
}
 
 
 
cs


아두이노 IDE 에서 위 예제를 아두이노로 다운로드한다. mac, ip, localport 등은 자신의 환경에 맞게 다시 설정한다.

아두이노 프로그램은 외부에서 아두이노로 UDP 패킷을 보내면 그것을 받아서 보낸쪽으로 다시 회신하는 방식이다. 보낼때 잡음이 섞인 구형파를 만들기 위해 25개의 Low Value 와 25 개의 High Value 를 순차적으로 보낸다.


2. LabVIEW 프로그램


랩뷰쪽 프로그램은 Graphic 기반의 프로그램이라 소스를 설명하거나 보이는 것이 쉽지 않다. 여기에 간단하게 짠 프로그램 화면을 첨부한다.




실제로 프로그램을 만든다면 위와 같이 만들지는 않는다. 여기서는 이렇게 하면 된다는 것만 보이기 위해 모든 랩뷰적 프로그램 방법은 빼고 순차적으로만 넣었다.


a.UDP 를 연다 --> b.아두이노IP를 원하는 값을 쓴다 --> c.UDP를 닫는다. --> d.UDP를 연다 --> e.아두이노에서온값을읽는다 --> f.UDP를 닫는다. --> a로 돌아간다.


기본적으로 데이터전송은 [UDP열기-UDP쓰기-UDP닫기] 로 구성한다. 데이터확인은 [UDP열기-UDP읽기-UDP닫기] 로 구성된다. 여기서 실제 프로그램을 한다면 이렇게 매변 UDP 를 열고 닫을 필요는 없다. 한번 열고 계속 데이터를 읽거나 쓴 후 마지막에 닫아주면 된다. 다시 말하지만 위의 그림은 순서를 보이기 위해 억지로 만들어 둔 그림이다.



실행중인 화면이다. 아두이노에서 데이터를 받아서 그래프를 그린다. 




확인을 위해 아두이노쪽에서도 시리얼통신으로 전송받은 값을 보이도록 프로그램해 두었다. (위 그림 오른쪽 상단)




II. 슬라이드 저항으로 아날로그 인풋 값을 아두이노에서 LabVIEW 로 전송하는 예제


이 예제는 위 I 번에서 아두이노에서 나오는 값이 아날로그포트 0 번에서 나오는 값으로 하고, LabVIEW 쪽 프로그램은 동일하다.


1. 아두이노 프로그램


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
 Communication with LabVIEW by UDP Protocol:
 This sketch send Analog Value of A0 using udp signal to LabVIEW (PC)
 created 24 Feb 2016
 by JelicleLim 
 http://www.winduino.com
 */
 
#include <SPI.h>         
#include <Ethernet.h>
#include <EthernetUdp.h>  
 
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {  0xDE0xAD0xBE0xEF0xFE0xED };
IPAddress ip(1921680151);
 
unsigned int localPort = 8888;      // local port to listen on
 
// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];  //buffer to hold incoming packet,
String  ReplyBuffer;       // a string to send back
char sendBuf[10];
 
 
// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
 
void setup() {
  Ethernet.begin(mac, ip);    // start the Ethernet and UDP:
  Udp.begin(localPort);
 
  Serial.begin(9600);
}
 
void loop() {
  int bufLength;
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("packet size ");
    Serial.print(packetSize);
    Serial.print(" From ");
    IPAddress remote = Udp.remoteIP();
    for (int i = 0; i < 4; i++) {
      Serial.print(remote[i], DEC);
      if (i < 3) {
        Serial.print(".");
      }
    }
    Serial.print(":");
    Serial.print(Udp.remotePort());
 
    // read the packet into packetBufffer
    memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    Serial.print(" Received:");
    Serial.print(packetBuffer);
 
    // send a reply to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    ReplyBuffer = String(analogRead(A0));
 
    bufLength = ReplyBuffer.length();
    ReplyBuffer.toCharArray(sendBuf,bufLength+2);
 
    Serial.print(" A0:");
    Serial.print(sendBuf);
    Serial.println();
        
    Udp.write(sendBuf);
    Udp.endPacket();
  }
  delay(10);
}
 
 
 
cs



analogRead(A0) 로 받은 값은 String() 을 통해 문자열로 만들고, 그것을 다시 toCharArray() 로 문자배열로 만들어서 UDP로 전송했다. 나머지는 위 I 번의 예제와 거의 비슷하다.


2. LabVIEW 프로그램


위 I 번 예제와 동일하다. 실행 후 나오는 그래프는 아두이노에서 나오는 신호에 따라 달라진다. 슬라이드로 된 가변저항을 움직이면 그래프는 위와 아래로 변화한다.





III. Arduino DUE 와 Ethernet Shield 의 결합


아두이노 우노와 이더넷 실드를 결합하여 사용한 것과 동일한 방식으로 아두이노 두에(DUE)와 이더넷실드를 결합한 후 UDP 로 LabVIEW 와 통신할 수 있다.


이때 아두이노 프로그램은 동일하다. 

PC 에 Arduino DUE 를 USB로 연결한 후 아두이노 IDE 에서 프로그램한다. [툴 >> 보드] 에 Arduino DUE 가 없다면 [툴>>보드>>보드매니저] 로 들어간 후 DUE 를 검색하여 나오는 것을 설치하면 된다.


보드 설치 후 보드는 Arduino DUE (Programming Port)로 맞추고, 포트는 아두이노 DUE 가 연결된 포트로 맞춘다음 업로드한다. 업로드할 프로그램은 위 I, II 번의 예제 어느 것이든 상관없다. 


LabVIEW 프로그램도 I, II 번의 것과 동일하다.


단 한가지 주의할 것은 Arduino DUE 는 3.3V 전압을 사용하므로 아날로그 인풋에 들어가는 전압이 3.3V 를 넘어서는 안된다. 즉, 슬라이드 가변저항의 양단 끝은 각각 3.3V 와 GND 로 연결 한 후 중간부분을 A0 에 연결해야한다. 5V 에 연결할 경우 DUE 보드가 파손될 수 있다. 전원 부분은 두번, 세번 주의를 기울이도록 한다.







IV. UDP 통신을 이용한 아두이노와 LabVIEW 사용에 관한 소고


TCP 통신을 이용해서도 이와 비슷한 실험이 가능하다. 하지만 UDP 통신을 선택한 것은 두가지 이유인데, 첫째 TCP 보다 쉽다는 것과 둘째, 약간의 전송 에러가 발생해도 괜찮을 데이터라는 가정에서 효율적이기 때문이다.


TCP 통신에 비해 UDP 는 중간에 패킷이 없어져도 크게 신경쓰지 않는다. 그래서 충분히 많은 데이터가 전송될 때, 이를테면 CCTV 같은 영상신호가 갈때, 중간에 한두 프레임정도 빠진다고 해서 크게 문제가 되지는 않는다. 마찬가지로 날씨 데이터를 얻어온다고 할때 1분에 하나씩 데이터가 갈때 한두개 빠진다고 해서 크게 문제가 되지는 않는다.


LabVIEW 를 통해 아두이노라는 지극히 저렴한 장비 - NI 의 하드웨어 가격과 비교하면 아두이노 정말로 껌값이다 - 를 사용할 수 있게 되고, UDP 통신을 통해 멀리 떨어진 곳에 있는 것도 충분히 제어할 수 있다. 물론 여기에 Modbus 등을 추가한다면 더 신뢰성있는 통신이 되겠지만 우선 이것만으로도 개인이 사용하기에는 충분히 괜찮은 장비임에 분명하다.



http://winduino.co.kr

made by JelicleLim (바람)






Comment +6

  • 제이 2016.10.20 21:38 신고

    글 잘봤습니다 저도 이거와비슷한걸 이용해 만드려는데 아두이노로 프로그래밍한거의 값을
    랩뷰로 읽을수있나요? 아두이노메가.이더넷실드 와이파이. 이 두개의 장비로만요

    • 아두이노와 이더넷실드의 조합으로 TCP/UDP 통신이 가능하고, 랩뷰에서도 TCP/UDP 통신이 가능합니다.
      양쪽에서 통신이 되면 당연히 통신 연결로 값을 전달할 수 있지요.

  • 1 2017.02.03 20:20 신고

    감사합니다

  • 따라쟁이 2017.03.22 18:12 신고

    자료 정말 감사 합니다.
    공유해 주신 덕분에 큰 도움이 되었습니다.

  • 글 잘 읽었습니다. 제가 하려는 것과 비슷한 포스팅이네요.
    하지만 저는 udp통신으로 스위치를 가지고 클라이언트 아두이노에서 서버 아두이노로 명령을 전달해서 릴레이를 제어하고싶습니다.

    1.스위치를 누른다.
    2. 클라이언트 아두이노가 udp 신호를 전송한다.
    3. 서버 아두이노가 udp 신호를 받아서 릴레이를 작동시킨다.

    이렇게 하는 것이 가능할까요?
    가능하다면 예제를 한번 포스팅 해 주실 수 있나요?

기본적으로 아두이노 우노와 아두이노 메가2560 에 대해서 LabVIEW 와 연결해서 사용하기 위해서는 시리얼통신을 사용했다. 몇년전 관련된 글을 쓸 때만 해도 LIFA 라는 도구를 사용해서 LabVIEW 와 Arduino 를 연결해서 사용할 수 있었다.


최근에 다시 LabVIEW 를 돌아볼 일이 있어 LIFA 를 함께 살펴보았다. LINX 라는 새로운 톨이 그 자리를 차지하고 있었고, 생각보다 간편하게 잘 만들어져 있었다. 


PC 에 LabVIEW 가 설치되어 있다고 가정하면 LINX 를 설치하고 그대로 따라가기만 하면 아두이노에 펌웨어를 넣어주고 기본 예제까지 실행시켜준다. 




구글에서 Arduino Labview LINX 를 검색하면 다운받을 수 있는 사이트로 쉽게 연결된다.

(사이트링크)


위 링크를 클릭했으면 화면중앙의 [리소스] - [LINX 다운로드] 를 클릭한다.





클릭하면 일반 링크에 대한 것과는 달리 VIPM 을 설치했는지 설치할것인지 등을 묻는다. VIPM 은 VI Package Manager 의 약자로 Labview 의 vi 와 관련된 라이브러리를 관리하는 프로그램이다. 설치되어 있으면 그냥 다운이 진행되고 다음과 같은 화면이 나오게 된다. 아직 설치되지 않았다면 설치하면 된다. 화면에 설치방법과 링크가 있으니 읽으면서 진행한다.




위 화면에는 Uninstall 이라는 버튼이 있다. 하지만 여러분의 PC는 VIPM 은 설치되었지만 아직 LINX를 설치하기 전이므로 Uninstall 이 아니라 Install 이란 버튼이 있을 것이다. Install 을 눌러 인스톨을 진행하면 된다. 약간의 시간이 걸리고, 몇번 PC 를 재부팅하라는 메시지가 나온다. 그대로 따라하면 된다. 


설치가 끝났으면 모든 창을 닫고 Labview 프로그램을 실행시킨다. 

새프로젝트를 만들고, 새 vi 를 만들고, 도구(T)를 클릭하면 MakeHub 라는 항목이 추가되었고 그 안을 보면 LINX 가 만들어졌다. 여기서 두번째 LINX Firmware Wizard 를 클릭한다.




LINX Firmware Wizard 라는 창이 뜬다.




자신이 가지고 있는 아두이노를 PC 에 연결한다. 필자는 Arduino , Arduino Uno , Serial/USB 를 선택했다. 과거 LIFA 가 아두이노만을 지원했다면 LINX 는 아두이노 외에 몇가지 보드를 추가로 지원한다.


모두 설정했으면 Next 를 누른다. 그러면 PC 에서 아두이노로 펌웨어가 전송된다. 이때 주의할 것은 호환보드 사용시 드라이버를 PC 에서 인식하지 못할 수 있다. 호환보드를 사용하고 있다면 미리 그에 맞는 드라이버를 설치해 두고 아두이노 IDE 에서 아두이노를 프로그램이 제대로 전동되는지를 확인해 보아야한다.


다시말해서 이 과정을 시작하기 전에 Labview 에 대해서 기본 프로그램을 할 줄 알아야하며, 아두이노도 IDE 를 사용해서 예제정도는 아두이노에 전송해 넣고 제대로 작동하는지 확인해야한다. 




Next 를 누르면 COM 포트를 정하는 칸이 화면 중앙에 보인다. 오른쪽 작은 삼각형을 클릭해서 자신의 아두이노 포트를 선택해준다. 이 포트는 아두이노 IDE 에서 사용하던 포트다. 혹시 모른다면 


제어판 >> 시스템 및 보안 >> 시스템 >> 장치관리자 >> 포트 를 클릭해서 자기 아두이노가 연결된 포트를 확인할 수 있다. 이 사진은 윈도우10 환경에서 찍은 것이라 조금 다를 수 있으니 자신의 운영체제에서 장치관리자를 찾아서 포트를 확인하도록 한다.





Next 를 클릭하면 다음과 같은 화면이 나오며 펌웨어 전송이 시작된다.




펌웨어전송이 끝난 화면이다. 여기서 Launch Example 를 클릭해서 제대로 되었는지 확인해본다.




클릭하면 다음과 같은 vi 가 화면에 뜬다.




여기서부터는 vi 를 가지고 알아서 블럭다이어그램을 보고, 라이브러리를 구경하고, 예제를 살펴보면 된다.




간단한 예제이다. 버튼 클릭으로 13번 LED 를 ON/OFF 한다.




http://winduino.co.kr

made by JelicleLim (바람)


Comment +9

  • yoom 2016.09.20 17:04 신고

    아두이노 스케치에서는 포트인식되고 예제 실행도 되는데 랩뷰에서는 안되는데 어떻게해야할까요?

  • 1 2017.02.03 19:59 신고

    감사합니다

  • 1 2017.02.04 12:59 신고

    사진을 못올려서 첨부 합니다
    Open Serial.vi >>
    Initialize.vi >>
    Initialize Device.vi >>
    Serial Open.vi
    이라는 에러가 뜨는데,,, 도움을
    받을수 있을까요?

    • https://www.labviewmakerhub.com/doku.php?id=libraries:linx:start

      사이트를 확인해보십시오.

      1. 결과 중 일부로 문제를 해결할 수 없습니다. 원인을 알아야하는데, 그러기위해서는 사용한 PC 에 대한 것 - 운영체제, 설치된 프로그램, 악성코드 감염여부 등 - 을 알아야합니다.

      2. LabVIEW 버젼도 확인해야 하고, 어떻게 설치되어있는지 확인해 보세요. 가능하면 다시 처음부터 설치해 보세요.

      3. LINX 를 설치하셨다면 그것도 처음부터 여러 가이드에서 지시한 것을 그대로 따라하셨는지도 확인해 보세요.

      4. 아래 링크를 보시면서 빠진 부분이 있는지 확인해보세요. 랩뷰와 외부 장치가 연결되어야 하는데, 일반적으로 Com 포트를 사용하는 장치가 설치되어 있어야 합니다. 보통 NI-VISA 를 설치하면 됩니다. 그게 빠져 있을수도 있습니다.

      https://www.labviewmakerhub.com/doku.php?id=libraries:labview:start

  • Yoon 2017.06.04 21:06 신고

    예제 실행은 되는데 저희가 MPU-6050으로 가속도계를 만들어서 진동을 측정하려고합니다.
    아두이노(ide)에 코드를 입력해서 하면 측정이됩니다.
    랩뷰로는 어떻게 해야 측정이되는지 알 수 있을까요?

    • LINX 로는 별도의 아두이노 코딩을 사용할 수 없습니다. 아두이노는 랩뷰 프로그램에서 읽어들일수 있게 되어 있는 포트로 아날로그 값이나 디지털값을 전달만하게 합니다. 즉, 가속도센서등을 달고, I2C, SPI 통신등을 사용하려면 LINX 를 쓰시면 안됩니다.

      아두이노와 ethernet 실드를 결합해서 TCP/UDP 통신을 이용해서 랩뷰와 통신을 해야 합니다.

  • Yoon 2017.06.04 21:50 신고

    IDE에 코드를 입력해서 arduino compatible compiler for labview 를 통해서 시리얼 모니터로 값을 읽는 것까지는 가능한데
    arduino compatible compiler for labview 에서 읽은 값을 그래프로 보고 싶은데 어떻게 해야하는지를 모르겠습니다. 아예 초보라...

    • 질문에 도움을 드리지 못할것 같습니다. arduino compatible compiler for labview 는 제가 사용해 본적이 없습니다. 그래서 그 프로그램을 이용해서 아두이노에서 읽은 값을 LabVIEW 쪽으로 보내는 것은 제가 도움을 드리지 못할것 같네요.

      그리고 아직 LabVIEW 프로그램에 익숙하지 않으시다면 아두이노가 아니라 먼저 LabVIEW 부터 공부를 하셔야 할것 같습니다. 다른 언어에 비해서 쉽기는 하지만 그렇다고 아무 준비없이 막 사용할 수 있는 정도는 아닙니다. 적당한 책을 고르셔서 두번 정도는 살펴보시기 바랍니다.

      그 다음에 하드웨어 연결을 위해서 VISA 와 TCP/UDP 통신 부분을 공부하시면 아두이노와 PC 간 통신을 LabVIEW 를 이용해서 하는 방법을 익히실 수 있을 겁니다.

      솔직히 책에는 바로 나오지 않는 조금은 깊은 부분입니다. 책부터 천천히 살펴보셔야 할것 같습니다. ^^

      마지막으로 초보라고 스스로 느끼시면 이건 포기하시는게 좋습니다. 스스로 초보딱지를 뗄 정도는 되었다고 판단되었을때 다시 시도해 보세요.