오픈소스 & 자료공유 게시판

Arduino Mega 2560 Digital IO Control

제품 및 환경

이 섹션은 예제 생성에 사용된 제품과 OS를 표시합니다.

아래의 제품을 비롯한 NI 소프트웨어를 다운로드하시려면 ni.com/downloads를 방문하십시오.

    소프트웨어

  • LabVIEW

Description

IN 으로 배열 선언된 접점은 계속 읽어서 Serial 로 출력 합니다.

OUT 으로 배열 선언된 접점은 Serial Interrupt 를 통해 프로토콜 확인 후 출력합니다.

제어 명령은 2자리 Digital IO 와 _ 언더바, 세자리 On Off 커맨드로 이뤄 집니다. On 은 스페이스 넣어 주셔야 합니다.

응답은 특정 프로토콜에 맞춰 나오며, INPUT 접점도 마찬가지로 프로토콜에 맞춰 출력합니다.

명령 응답 STX + ADDR + DigitalIO + State +ETX +CR + LF

입력 응답 STX + ADDR + DigitalIO 의 상태값...... +ETX +CR +LF

추가로.. ChatGPT 틀린부분 정말 잘 찾네요. 사랑합니다 ChatGPT.

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

  // Constant
  volatile bool state = false;  // Default value is LOW
  volatile int ch; // Default Channel No. is 13
  volatile int interruptFlag = 0; // Interrupt Flag

void setup() 
{
  // put your setup code here, to run once:

  // Open Serial port
  Serial.begin (9600);  // Baudrate
  Serial.setTimeout (500);  // Timeout

  // IO Pinmap
  const int IN[4] = {2,3,4,5};
  const int OUT[36] = {6,7,8,9,10,14,15,16,17,18,19,20,21,22,23,24,25,26,29,30,31,32,33,34,35,36,39,40,41,42,43,44,45,46,47,48};
  // pin0, pin1, pin13 are not use. Because pin0 and pin1 are Serial1 pin. and pin13 is connected Fulldown circuit.
  // pin11, pin12, pin27, pin28, pin37, pin38, pin49, pin50, pin51, pin52, pin53 is SPARE pin.

  const int LED = 13; // LED Test
  pinMode(LED,OUTPUT);

  // Set pinModes for INPUT pins
  for (int i=0; i<4; i++)
  {
    pinMode(IN[i], INPUT);
  }

  // Set piModes for OUTPUT pins
  for (int i=0; i<36; i++)
  {
    pinMode(OUT[i], OUTPUT);
  }

  // Protocol
  const int STX = 0x02;   // STX
  const int ETX = 0x03;   // ETX
  const int ADDR = 0x01;  // Address
  const int CR = 0x0D;  // Carriage Return
  const int LF = 0x0A;  // Line Feed

  //  Initialize InterruptFlag
  interruptFlag = 0;

}

void loop() 
{
  // put your main code here, to run repeatedly:

  // Read Digital Input State and Send Serial Message to PC 
  // make a message. STX(1) + ADDR(1) + Message(4) + ETX(1)

  // IO Pinmap
  const int IN[4] = {2,3,4,5};
  const int OUT[36] = {6,7,8,9,10,14,15,16,17,18,19,20,21,22,23,24,25,26,29,30,31,32,33,34,35,36,39,40,41,42,43,44,45,46,47,48};
  // pin0, pin1, pin13 are not use. Because pin0 and pin1 are Serial1 pin. and pin13 is connected Fulldown circuit.
  // pin11, pin12, pin27, pin28, pin37, pin38, pin49, pin50, pin51, pin52, pin53 is SPARE pin.

  // Protocol
  const int STX = 0x02;   // STX
  const int ETX = 0x03;   // ETX
  const int ADDR = 0x01;  // Address
  const int CR = 0x0D;  // Carriage Return
  const int LF = 0x0A;  // Line Feed
 
  if (interruptFlag == 0)
  {
      
    Serial.write(STX);
    Serial.write(ADDR);

    for (int i=0; i<4; i++)
    {
      int rIN = IN[i];
      Serial.print(digitalRead(rIN)?'1':'0');
    }

      Serial.write(ETX);
      Serial.write(CR);
      Serial.write(LF);

      delay (100);  // send message timming 100ms
    }

    if (interruptFlag == 1)
    {
      bool bstate = state;
      int ich = ch;
      
      if (bstate == true)
      {
        digitalWrite (ich,HIGH);
        Serial.write (STX);
        Serial.write (ADDR);
        Serial.print (ich);
        Serial.write ('1');
        Serial.write (ETX);
        Serial.write (CR);
        Serial.write (LF);
        
      }

      if (bstate == false)
      {
        digitalWrite (ich,LOW);
        Serial.write (STX);
        Serial.write (ADDR);
        Serial.print (ich);
        Serial.write ('0');
        Serial.write (ETX);
        Serial.write (CR);
        Serial.write (LF);
        
      }

      interruptFlag = 0;
      
    }
    
//  }
  

}

void serialEvent()
{
  // Serial Interrupt Event.
  
  if (Serial.available() >=6)
  {

    int dataSize = Serial.available();  // read Serial Data Size
    String received = Serial.readString();  // read Serial Data
  
    // received Serial Data is liked "16_Off".
    String CH = received.substring(0,2);  // 16
    String State = received.substring(3,6); // Off
    ch = CH.toInt(); // change volatile ch to int iCH

    if (State.equals("On "))
    {
      state = true;
      
    }

    if (State.equals("Off")) // State is String.
    {
      state = false; // state is bool.

    }

    // InterruptFlag On
    interruptFlag = 1;

  }
  
}

How to Use

Arduino Mega 2560 에 ino 파일 업로드 후 Serial 통신 예제로 통신 제어가 되는지 확인 합니다.

확인을 위해 13번 LED 가 OUTPUT으로 선언되어 있습니다.

Additional Information

Arduino IDE

LabVIEW 2016

NI-VISA

NI 커뮤니티에 있는 예제 코드 교환의 예제 코드는 MIT 라이센스로 라이센스가 부여됩니다.

의견
여리君
Active Participant
Active Participant
날짜

응답과 관련해서 1자리 수 접점을 제어하면, 정의한 프로토콜에 맞춰 데이터가 안나옵니다.

 

제어하는데는 이상이 없습니다.

 

관련해서 코드를 업데이트 했는데, 편집을 할 수가 없네요.

 

몇줄 되지 않으니 추가 해 보시기 바랍니다.

 

indexOf 로 문자를 찾아 입력된 명령을 처리해 주시면 됩니다.

 

응답은 한자리 수 접점일 경우 '0' 을 추가 해 주시면 됩니다.