Home » 산딸기 가지고 놀기 » 라즈베리파이 GPIO 활용강좌 : 초음파 센서를 이용한 장애물 감지 RC카

라즈베리파이 GPIO 활용강좌 : 초음파 센서를 이용한 장애물 감지 RC카

 

안녕하세요 나무꾼 입니다.

오늘은 제가 작성한 강좌는 아니지만, 계획 중이였던 내용을 이미 구현하시니 유저분이 계셔서 대필을 해보았습니다. ㅎㅎ

아래 내용은 오로카 및 라즈베리파이 카페에서 활동 중이신 “코코짱” 님께서 라즈베리파이와 멀티파이 를 이용해 작업한 장애물 인식 RC카 의 내용입니다.

=====================================================================

안녕하세요 코코짱입니다.

이번에는 저번에 테스트한 모터 드라이버와 모터 그리고 초음파 센서를 이용해서 물체를 감지하면 피하는 로봇을 만들어보겟습니다.

우선 실험에 쓰일 재료는 이렇습니다.

  • 라즈베리파이
  • 멀티파이
  • SN754410
  • DC 모터x2개
  • 초음파 센서

이렇게 필요하고요 제것은 모터는 BM-700MG 이고 초음파센서는 HC-SR04 입니다.

HC-SR04

우선 모터는 저번 포스팅에서 테스트를 했으니 초음파 센서 테스트를 하겟습니다.

초음파 센서는 초음파를 보내서 반사되오는 시간을 측정하여 거리를 계산하는것입니다.

제 센서는 이렇게 생겼습니다.

보통 초음파센서에는 4개의 핀이 있는데요 VCC, Triger, Echo, GND 이렇게 있습니다.

VCC 와 GND 는 5v 라인에 연결하시면 되구요 Triger 핀과 Echo 핀은 라즈베리파이의 GPIO 핀에 연결해주시면 됩니다.

datasheet

이 사진은 센서의 작동원리를 설명해주는데요 말로 풀어서 설명하면

우선 triger 핀에 10us 정도의 High 신호를 주면 초음파센서는 40khz 펄스를 자동적으로 8번을 발생시킵니다.

펄스를 발생시킨 직후에 echo 핀은 high 되고 반사된 초음파가 감지 되었을때 echo 핀이 low 가 됩니다.

이 echo 핀이 high 였다가 low 가 되는데 걸리는 시간을 측정하여서 그 시간을 초음파의 속도/2(즉 58)로 나누면 거리가 나옵니다.

그러면 예제 코드를 이용해서 실험해보도록 하겟습니다.

예제 소스 위치는 http://ninedof.wordpress.com/2013/07/16/rpi-hc-sr04-ultrasonic-sensor-mini-project/ 이곳이고 오로카의 나무꾼님게서 도움을 주셨습니다.

위 소스대로 실행시키면 한번씩 밖에 안나와서 0.1 초마다 거리가 측정되게 소스를 수정했습니다.

 mkdir ultrasonic

작업 폴더 만드시고

nano ultrasonic.c

소스 파일을 생성합니다.

#include<stdio.h>
#include<wiringPi.h>

#define trigPin 5
#define echoPin 4

int main(void)
{
int distance=0;
int pulse = 0;
if(wiringPiSetup () == -1)
return 1;

pinMode (trigPin, OUTPUT);
pinMode (echoPin, INPUT);

for(;;)
{
digitalWrite (trigPin, LOW);
usleep(2);
digitalWrite (trigPin, HIGH);
usleep(20);
digitalWrite (trigPin, LOW);

while(digitalRead(echoPin) == LOW);

long startTime = micros();
while(digitalRead(echoPin) == HIGH);
long travelTime = micros() – startTime;

int distance = travelTime / 58;

printf(“Distance: %dcm\n”, distance);
delay(100);

}

}

소스를 입력하는데 define 부분의 숫자를 자신에 맞게 바꿔줘야하는데요..

wiringPi_Pinmap

저는 GPIO 23번 24번을 사용했습니다.

그리고

gcc -o ultrasonic ultrasonic.c -lwiringPi

이걸 입력해서 컴파일한 후 실행합니다.

 

이 동영상은 위의 소스대로 컴파일 후 실행시킨 동영상입니다.

이렇게 초음파 센서 테스트가 끝났으면 모터와 초음파 센서 소스를 결합시키면 됩니다.

#include <stdio.h>
#include <wiringPi.h>

#define M1 7
#define M2 0

#define M3 2
#define M4 3

#define trigPin 5
#define echoPin 4

int main(void)
{
if(wiringPiSetup() == -1)
return 1;

pinMode(M1, OUTPUT);
pinMode(M2, OUTPUT);
pinMode(M3, OUTPUT);
pinMode(M4, OUTPUT);

pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);

while(1)
{
digitalWrite (trigPin, LOW);
usleep(2);
digitalWrite (trigPin, HIGH);
usleep(20);
digitalWrite (trigPin, LOW);

while(digitalRead(echoPin) == LOW);

long startTime = micros();
while(digitalRead(echoPin) == HIGH);
long travelTime = micros() – startTime;

int distance = travelTime/58;

printf(“distance; %dcm\n”, distance);

digitalWrite (M1, HIGH);
digitalWrite (M2, LOW);
digitalWrite (M3, HIGH);
digitalWrite (M4, LOW);

if(distance<=30)
{
digitalWrite (M1, LOW);
digitalWrite (M2, HIGH);
digitalWrite (M3, LOW);
digitalWrite (M4, HIGH);
delay(1000);

digitalWrite (M1, HIGH);
digitalWrite (M2, LOW);
digitalWrite (M3, LOW);
digitalWrite (M4, HIGH);
delay(150);
}
if(distance<= 5)
{
digitalWrite (M1, LOW);
digitalWrite (M2, LOW);
digitalWrite (M3, LOW);
digitalWrite (M4, LOW);
delay(5000);
}
}
}

소스가 길어보여도 별거 없습니다..

일단 거리 측정을 계속 하다가 물체와의 거리가 30cm 이하로 감지가 되면 뒤로 후진후 오른쪽으로 꺽고 다시 직진하고

거리고 5cm 이하로 감지가 되면 5초간 정지하는 소스입니다.

이 소스를 마음대로 바꾸어도 좋으니 멋있는 로봇을 만들어 보시길 바랍니다.

그리고 후진 딜레이인 delay(1000); 과 우회전 딜레이인 delay(150); 은 자신의 모터에 맞게 수정하셔야 할겁니다.

참고로 delay(1) 은 1ms 입니다.

https://www.youtube.com/watch?v=Hsaomxrw4CU

 

위 소스의 테스트 영상입니다.

 

실제 주행 영상이구요.. 제건 모터 rpm이 빨라서 잘 멈추지도 않고 회전도 잘 되지도 않고 …

rpm이 낮은 모터로 하면 이것보다 훨씬 제어가 잘 될것입니다.

 

참고로 delay 잘못 쓰면 이렇게 막 로봇이 미쳐갑니다 …

다음번에는 zigbee 를 활용한 로봇 제어로 다시 돌아오도록 하겟습니다.

P.s :  원본 사진 및 자세한 사항은 제 블로그를 참고해주세요 ! 

 

산딸기마을 포스트 검색

공동제작 공동프로젝트 무상후원 기관

산딸기마을 기부하기

산딸기마을 방문자 현황

Flags Countries Visits Page views
South Korea 626063 1845660
United States 10882 26091
Japan 5011 13204
Germany 2755 5151
India 1897 2902
Canada 1729 4640
United Kingdom 1596 2642
Australia 1240 2901
Russia 1219 1677
China 1077 2239
Total Pageviews: 1936700