Arduino 공부 Serial

아두이노 툴에 소스를 작성하고 업로드를 누르면 과정이 이렇게 된다.

 

1. C/C++ 파일로 변환된다.

2. 컴퓨터가 알아먹는 010101 기계어 hex파일로 변환이 된다

3. 보드로 전송되고 실행이 된다.

 

RX = Receive 받는것

TX = Transmission 보내는것 이라고 생각하면 된다.

체크 표시가 컴파일이다.

 

 

프로그램 처음 실행을 시키면 setup, loop 함수가 보일거다

// 전처리부분 : 내부에서 사용할 라이브러리를 명시, 변수를 선언 (핀번호 셋팅)
void setup() {
  // 아두이노로 업로드 되면 한번만 실행 되는 함수
  // 아두이노 내부에서 전기 신호가 들어오면 setup이 먼저 호출
}

void loop() {
  // 아두이노에서 동작할 소스코드를 명시
  // 전원이 들어오는 동안은 무한으로 반복해서 실행될 명령문
  // loop안에 특정한 상황이 발생하면 코드를 멈추게 하거나 전원을 해제하지 않으면 끝가지 실행

}

그리고 먼저 센서를 연결해서 공부할게 아니라

시리얼부터 공부해보자.

 

void setup() {
	Serial.begin(9600);
}
void loop() {
    Serial.println("Hello World~~");
    delay(1000);
}

먼저 시리얼통신을 9600으로 설정 후

loop에서 Hello World~~가 출력되게 설정해놨다.

1초마다 발생되게끔 설정해놨다.

 

돋보기 버튼을 누르면 시리얼 모니터가 나오게 될거다

 

그리고 업로드를 해보자.

 

그럼 1초에 한번씩 출력이 될거다.

맨 밑에 보면 타임스탬프 표시라고 있다

이것은 몇시 몇초에 통신이 됬다 라는 표시이고

 

오른쪽에 보면 9600 보드레이트가 있다.

Serial.begin(9600) 했지 않았나? 이거랑 맞춰줘야 한다.

 

그리고 보드를 보면 TX에 깜빡깜빡 거리지 않나?

이게 아두이노에서 pc에게 보낼때 깜빡깜빡 거리게 된다.

 

 

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

void loop() {
  // 아두이노에 입력된 데이터를 읽어서 바로 출력하기
  // 데이터가 있으면 작업을 실행
  if(Serial.available()) { //데이터가 있으면 true
    Serial.println(Serial.read()); // 읽은 내용을 그대로 출력하기
  }
  
}

이거를 작성하고 업로드, 시리얼모니터를 보자.

 

A를 입력하면 아스키 코드로 65가 나올것이다.

이때 10 숫자도 같이 나오는 사람이 있다.

 

가운데 보면 line ending 없음 이라고 설정해줘야 10 이 출력이 안된다.

 

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

void loop() {
  // 아두이노에 입력된 데이터를 읽어서 바로 출력하기
  // 데이터가 있으면 작업을 실행
  if(Serial.available()) { //데이터가 있으면 true
    Serial.println(Serial.read()); // 읽은 내용을 그대로 출력하기
    delay(1000);
  }else{
    Serial.println("none");
    delay(1000);
  }
}

소스 설명은 주석으로 해뒀다.

 

void setup() {
  Serial.begin(9600);
}
void loop() {
  int intdata = 65;
  char chardata = 65;
  float floatdata = 65;
  Serial.println(intdata);
  Serial.println(chardata);
  Serial.println(floatdata);
  delay(1000);
}

이렇게 출력하면 각 데이터 타입에 맞게 출력이 되는걸 볼 수 있다.

 

int inputdata = 0;
void setup() {
  Serial.begin(9600);
}
void loop() {
  delay(1000);
  if(Serial.available()>0) {
    // 시리얼통신으로 입력되는 데이터를 변수에 저장
    inputdata = Serial.read();
    Serial.write(inputdata);
    // 바이너리(문자의 형태) 형태로
    Serial.print(",");
    Serial.println(inputdata);
    // 아스키코드 형태로
  }
}

if문에서 데이터가 있으면

입력을 받아 inputdata에 넣어주고

inputdata를 출력해준다.

 

wirte, print, println은 아두이노에서 PC로 보낼 때 쓰고

read는 PC에서 아두이노로 보낼 때 쓰인다

 

write는 바이너리(문자의 형태로)

print, println은 아스키코드로 표현된다.

 

 

예제 1)

입력된 값을 판단해서 입력된 문자가 100이상이면 "ok"

그렇지 않으면 "fail" 메시지가 출력되도록 시리얼 통신하기

아스키로 평가하기

 

더보기
void setup() {
  Serial.begin(9600);
}

void loop() {
  if(Serial.read() >= 100) {
    Serial.println("ok");
    delay(1000);
  }else {
    Serial.println("fail");
    delay(1000);
  }
}

 

예제 2)

입력된 문자가 "A"이면 "ok", "a"이면 "fail" char형 변수를 선언하고 작업하기

더보기
char data = 0;
void setup() {
  Serial.begin(9600);
}

void loop() {
  data = Serial.read();
  if(data == 'A') {
    Serial.println("ok");
  } else if(data == 'a') {
    Serial.println("fail");
  }
}

 

※ read함수는 아스키코드 값을 반환 해준다.

 

//Serial.readString()의 사용 방법 -> 문자열 읽기

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

void loop() {
  if(Serial.available()) {
    String myvalue = Serial.readString();
    Serial.println(myvalue);
  }
}

 

다음 코드 출력물이 어떻게 될까?

1. t

est

 

2. t

test

 

3. t

출력안함

 

//Serial.readString()의 사용 방법 -> 문자열 읽기

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

void loop() {
  if(Serial.available()) {
    char myvalue = Serial.read();
    Serial.println(myvalue);
    String myvalue2 = Serial.readString();
    Serial.println(myvalue2);
  }
}

 

 

예제 3)

입력된 문자열이 arduino이면 "login" 아닌경우 "logout" 으로 출력

더보기
void setup() {
  Serial.begin(9600);
}

void loop() {
  if(Serial.available()){
    if(Serial.readString() == "arduino") {
      Serial.println("login");
    }else{
      Serial.println("logout");
    }
  }
}

 

 

// 시리얼통신으로 input된 숫자값을 가지고 비교하기
void setup() {
  Serial.begin(9600);
}

void loop() {
  int num = 0;
  if (Serial.available()) {
    num = Serial.parseInt(); // 숫자 입력해줌
    if(num>3) {
      Serial.println("test1");
    }else {
      Serial.println("etc");
    }
  }
}

read함수는 아스키코드를 반환해주니

parseInt() 함수를 사용해서 입력해주자.

 

예제4)

숫자를 입력 받아 A~F까지 평가해서 출력하기

90~100 A, 80~89 B, 70~79 C, 60~69 D, 0~59 F, 나머지 수 error출력

더보기
void setup() {
  Serial.begin(9600);
}

void loop() {
  if(Serial.available()) {
    int num = Serial.parseInt();
    if(num <= 100 && num >= 90){
      Serial.println('A');
    }else if(num <= 89 && num >= 80) {
      Serial.println('B');
    }else if(num <= 79 && num >= 70) {
      Serial.println('C');
    }else if(num <= 69 && num >= 60) {
      Serial.println('D');
    }else if(num <= 59 && num >= 0){
      Serial.println('F');
    }else{
      Serial.println("error");
    }
  }
}

 

 

// 두 수를 입력 받아 더해서 결과를 다시 출력하는 예제 - 통신(아두이노의 시리얼통신)
void setup() {
  Serial.begin(9600);
}

void loop() {
  if(Serial.available()) {
    int num1 = Serial.parseInt();
    int num2 = Serial.parseInt();
    int result = num1+num2;
    Serial.println(result);
  }
}

이렇게 하면 첫번째 수를 입력하고

나중에 두번째 수를 입력하기도 전에 0으로 인식해서 출력해버린다.

 

이때 해결방법은 이러하다.

// 두 수를 입력 받아 더해서 결과를 다시 출력하는 예제 - 통신(아두이노의 시리얼통신)
void setup() {
  Serial.begin(9600);
}

void loop() {
  if(Serial.available()) {
    int num1 = Serial.parseInt();
    while(Serial.available() == 0){}
    int num2 = Serial.parseInt();
    int result = num1+num2;
    Serial.println(result);
  }
}

사용자가 입력하기 전까지 아무코드도 실행되지 않는 효과를 볼 수 있다.

 

LED 맛보기

LED를 보면 2개의 선이 있는데 선 길이다 다르다.

 

긴다리는 +(전원연결) -(GND연결)

3V로 연결해야 한다.

220, 110 저항 연결해서 사용해야한다.

 

긴다리는 13번, 짧은 다리는 GND에 연결해보자.

 

그리고 파일->예제->01.Basic->Blink 실행하면 LED가 깜빡깜빡한다

 

댓글

Designed by JB FACTORY