Hermit Under the Cliff

[Arduino] 아두이노 코딩봇 만들기 (11) - 초음파 센서 추가하기 본문

Personal Projects/아두이노 코딩봇

[Arduino] 아두이노 코딩봇 만들기 (11) - 초음파 센서 추가하기

AnonymousDeveloper 2022. 3. 3. 12:47

이번에는 위와 같이 초음파 센서를 추가하여 장애물과의 거리를 측정할 수 있게 만들어 보려고 합니다.

초음파센서는 위 사진에서 보시는 것과 같이 두 개의 눈 같은게 있는데 (아래쪽에 있는겁니다.)

하나는 Trig 다른 하나는 Echo이며 Trig에서 보낸 초음파 신호가 Echo에 도달할 때 까지의

시간을 측정하여 장애물과의 거리를 알아 낼 수 있습니다.

초음파 센서의 동작

초음파의 이동속도는 초당 340m 이므로 거리는 시간 x 속도의 공식으로 구할 수가 있습니다.

이를 아두이노 코드로 작성을 하면 아래와 같습니다.

int ultraSonic_trig = 7;
int ultraSonic_echo = 6;
int distance;

void setup() {
  pinMode(ultraSonic_trig, OUTPUT);
  pinMode(ultraSonic_echo, INPUT);
}

int getDistance()
{
  digitalWrite(ultraSonic_trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(ultraSonic_trig, LOW);
  distance = pulseIn(ultraSonic_echo,HIGH) * 340 /2 / 10000;
  return distance;
}

우선은 Trig/Echo로 사용할 핀을 지정해 주고 PinMode를 설정해 줍니다.

거리를 구하는 것은 Trig에 High 신호를 약 10 마이크로초 만큼 인가를 해 준뒤,

pulseIn 함수를 통해 echo에 신호가 도달한 시간을 가져옵니다.

이를 초음파의 속도인 초당 340을 곱하고

왕복을 했으니 다시 2로 나눈뒤, cm로 값을 얻어오기 위해 10000을 나누어 줍니다.

 

초음파 센서의 동작을 확인했으니, 이제 이것을 이전에 짰던 펌웨어에 넣어 주겠습니다.

switch(target){
      case 'M': // Motor control
        break;
      case 'L': // Led control
        break;
      case 'U': // Ultrasonic sensor control
        distance = getDistance();
        Serial.println(distance);
        break;
    }

loop함수 안에 있는 switch문에 아래와 같이 U로 시작하는 명령어 일때,

초음파 센서를 동작하여 값을 읽어 온 뒤 바로 serial에 값을 써 주는 것을 추가 합니다.

@U0# 의 명령으로 시리얼에 장애물과의 거리를 출력할 수 있게 됩니다.

 

이제 mBlock extenstion 빌더로 들어가 펌웨어를 새로 업데이트 해주고

블록도 아래와 같이 추가해 줍니다.

Upload transcode는 아래와 같이 간단하게 code 영역에 getDistance()를 호출만 해주면 됩니다.

한참 고생하던 부분은 아래의 라이브 모드였는데요,

이상하게도 시리얼을 통해 읽는 것이 원하는 대로 동작하지도 않고,

근본없는 mBlock은 제대로된 메뉴얼도 존재하지 않았고

로그를 보려고 Web에서 미리보기를 하면 이상하게 시리얼 값이 더 제대로 읽혀지지도 않고

그 와중에 제가 제일 싫어하는 자바스크립트는 어떻게 사용해야 할지도 모르겠고

좀 힘들게 어찌저찌 대충 값을 읽어오는 코드를 아래와 같이 작성하긴 했습니다.

조금만 더 공부하면 더 좋은 방법이 있을 것 같긴 한데,

뭐 이걸로 돈을 벌 것도 아니고 따님이 사용하기에 적당하게만 되면 만족이니

이 정도에서 만족하기로 합니다.

실제 사용은 라이브 모드보단 업로드 모드를 더 이용해서 할 거라는 나름 자기 최면도 걸어 주고요.

 

어쨌건 이렇게 새로 추가된 장애물과의 거리를 구하는 블록을 통해

아래와 같이 장애물이 발견 되면 회전을 해서 피해가는 로봇을 코딩 할 수 있게 되었습니다.

간단하게 블록에 대해서 설명해 주고 옆에서 조금 도와주었더니

10살이 된 따님께서도 위와 같은 코드를 짤 수 있게 되었습니다.

이 코드를 보드에 업로드 하여 장애물이 있을때 로봇이 회전하여 피하는 것을 확인하니

참으로 즐거워 하시더군요.

 

참고로, 지난번 포스트들에도 링크를 항상 드렸지만, 아래 깃허브에 가시면

펌웨어 및 mBlock extension의 모든 코드를 확인하실 수 있습니다.

https://github.com/reitn/OlbinBot

 

GitHub - reitn/OlbinBot: Olbin Coding bot based on Arduino and Mblock

Olbin Coding bot based on Arduino and Mblock. Contribute to reitn/OlbinBot development by creating an account on GitHub.

github.com

 

Comments