초음파센서(DFROBOT : URM37)
DF로봇사의 초음파센서(Ultrasonic Sensor) 모듈은 MCU와 함께 설계되어 다양한 방법으로 제어와 출력이 가능하다. URM37 V4.0 Ultrasonic Sensor(판매번호 : SEN0001)로 14달러에 웹상에서 거래된다.
(안 보여지는 사진은 책으로 보세요..!!)
초음파센서 URM37 모듈은 여러 방식의 인터페이스를 지원한다.
- ECHO 핀의 Low 출력 길이 측정하여 거리 환산하는 방법
- DAC 핀의 아날로그 전압값을 측정하여 거리 환산하는 방법
- Serial 통신으로 명령어를 설정하고 주기적으로 ECHO 핀의 Low 출력을 거리로 환산하는 방법
모듈에는 ST사의 8비트 MCU STM8S003F3P6와 OPAMP가 함께 설계되어 있어 다음의 다양한 출력을 지원하도록 프로그램 되어 있다.
- DAC 핀 : 거리에 따른 아날로그 전압 출력, 6.8mv/cm
- MOTO 핀 : 서보모터를 연결하여 0 ~ 270도 전환이 가능하다.
- RX핀 핀으로 시리얼 코드로 입력 받아 들여서 TX 핀으로 온도 출력(동작안됨)
- 시리얼 통신 전압 레벨 선택 TTL(기본) 또는 RS232(모듈의 뒤 작은 버튼 누를 경우)
- 내부 EEPROM의 지정된 값으로 기본 설정을 변경할 수 있다.
- TX, RX를 이용하여 내부 EEPROM의 값을 읽고 쓸 수 있다.
어드레스 | 동작 |
0x00 | 클 때 동작하는 거리설정 값 |
0x01 | 작을 때 동작되는 거리설정 값 |
0x02 | 0xAA : 거리 측정모드, 다른값 : PWM 측정모드 |
0x03 | 0x00 : TTL 모드,
0x01 : RS232(이때 출력이 12V정도 되므로 5V MCU 바로 연결하면 파손됨) |
0x04 | 기본값은 25ms 주기로 측정하며 8비트의 Hex값으로 기록하면 된다.
예) 100ms 주기로 측정할 경우 100의 16진, 0x64를 기록한다. |
모듈에는 모두 9개의 핀으로 구성되어 있다. 왼쪽, 오른쪽 모두 2개의 센서가 있는데 귀 역할을 하여 방향을 알 수 있도록 의도한 것으로 보인다.
핀 번호 | 신호 | 동작 |
1 | VCC | 5V 전원 |
2 | GND | 그라운드 |
3 | NRST | Low일 때 동작하는 리셋 |
4 | ECHO | Low 신호의 폭이 1cm당 50us, 범위 : 0 ~ 25,000us |
5 | MOTO | 서보모터 회전각 제어 |
6 | COMP
/TRIG |
COMP:ON/OFF 모드로 내부에 설정된 기본값보다 작은 거리일 때 Low 동작
/TRIG:PWM 모드로 trigger 입력 |
7 | DAC | 아날로그 전압 출력, 1cm당 6.8mV |
8 | RX | MCU의 RX와 연결 |
9 | TX | MCU의 TX와 연결 |
코드는 모두 3가지 방식으로 실험하고 결과를 얻었다.
- ECHO핀의 Low폭 측정 방법 : MCoding_Sensor_T31_Ultrasonic_Sensor_ECHO_PRT
- DAC핀의 전압 측정 방법 : MCoding_Sensor_T31_Ultrasonic_Sensor_DAC_PRT
- EEPROM 설정 후 자동 거리읽기 방법 : MCoding_Sensor_T31_Ultrasonic_Sensor_ECHO_RXTX_PRT
MCoding_Sensor_T31_Ultrasonic_Sensor_ECHO_PRT
void pulseIn(void){
while(1){ // 무한 루프중 High로 올라가면 빠져나간다.
if(URECHO == 0) echo_pulse_low_time++; // Low일때는 카운트 증가
else break;
}
}
int main(void) { // Start Main.
setup();
URTRIG =1; //
time0_delay(50);
while(1){
URTRIG = 0;// TRIG, 초음파센서 시작 신호
URTRIG =1;
for(ulpass=0; ulpass<0xFFFFFF00; ulpass++){ // 무한정 기다리지 않기 위해
if(URECHO == 0){ // 최초 한번 Low 일경우 실행
echo_pulse_low_time = 0; // 카운트 초기화
pulseIn(); // High가 될때까지 카운트 증가
break;
}
}
// Echo 펄스의 로우 간격으로 거리 측정, 1cm 당 50us
// 마이크로프로세서 22MHz에서 실험 20cm당 764를 이용하여 비례식으로 구함
printf(“echo_pulse_low_time = %d , “, (int)echo_pulse_low_time);
printf(“Pulse Count Distance = %0.1f\n”, ((20.0 *(float)echo_pulse_low_time)/764.0));
time1_delay(1); // 1s delay
}
} // end main
MCoding_Sensor_T31_Ultrasonic_Sensor_DAC_PRT
int main(void) { // Start Main.
setup();
URTRIG =1; // COMP Mode
while(1){
URTRIG = 0;// TRIG
URTRIG =1;
// 초음파가 발사 되었다. 거리를 측정하자.
// DAC로 출력되는 아날로그 전압값으로 거리 측정 1cm당 6.8mV
ADC_SET_INPUT_CHANNEL(ADC, 1<<4);
ADC_START_CONV(ADC);
time0_delay(100);
while(ADC_IS_BUSY(ADC)); // 1 is ADC busy
adcain4 = ADC_GET_CONVERSION_DATA(ADC, 0);// v5
printf(“ADC = %d , “, adcain4);
ADC_volt = (VDD5 * adcain4) / (float)0x3FF; // 센서에서 나온 전압
printf(“ADC Volt = %0.2f, “, ADC_volt);
printf(“ADC Distance = %0.1f\n”, (ADC_volt/0.0068));
time1_delay(1); // 1s delay
}
} // end main
MCoding_Sensor_T31_Ultrasonic_Sensor_ECHO_RXTX_PRT
int main(void) { // Start Main.
setup();
ring_ini();
UART_Open(UART, 9600);
//Auto Measure Mode
UART_WRITE(UART, 0x44);
UART_WRITE(UART, 0x02);
UART_WRITE(UART, 0xAA);
UART_WRITE(UART, 0xF0); // 이후는25ms 마다 한번씩 거리 측정
time0_delay(50);
while(1){
for(ulpass=0; ulpass<0xFFFFFF00; ulpass++){ // 무한정 기다리지 않기 위해
if(URECHO == 0){ // 최초 한번 Low 일 경우 실행
echo_pulse_low_time = 0; // 카운트 초기화
pulseIn(); // High가 될 때 까지 카운트 증가
break;
}
}
// 초음파가 주기적으로 발사되므로 반사된 음파를 읽어 거리를 측정하자.
// Echo 펄스의 로우 간격으로 거리 측정, 1cm 당 50us
// 마이크로프로세서 22MHz에서 실험 20cm당 764를 이용하여 비례식으로 구함 printf(“echo_pulse_low_time = %d , “, (int)echo_pulse_low_time);
printf(“Pulse Count Distance = %0.1f\n”, ((20.0 *(float)echo_pulse_low_time)/764.0));
time1_delay(1); // 1s delay
}
} // end main
초음파센서 스펙
초음파 센서 모듈은 처음 구입하면 공장 기본설정(factory default setting)인 다음 상태로 되어 있으므로 EEPROM의 값을 변경하기 전에는 상태를 유지한다.
전기적인 특성과 크기는 다음과 같다.
공급전압 : DC3.3V~5.0V
소비전류 : 20mA 이하
사용온도 : -10℃ ~ 70℃
거리측정 : 5cm ~ 500cm
정밀도 : 1cm
Interface : RS232 (TTL), PWM
크기 : 22mm × 51 mm
중량 : 25g
시작합니다.
MCoding M0 보드를 이용하여 센서와 어떻게 인터페이스 하는지 기술서를 집필중입니다.
- 다양하고 많은 센서를 구입했습니다.
- 32Bit ARM Coretx-M0 54FDE 보드와 실험합니다.
- MDKARM 컴파일러를 사용하고 ANSI C 언어로 작성합니다.
- 실험하면 경기도 서현역의 폴리텍대학 융합기술연구원 (http://www.kopo.ac.kr/ctc/index.do)에서 강의도 진행합니다.
- 아날로그를 이용하여 대부분 센서 알고리듬을 만들지만 어려운 시리얼 통신도 많이 있습니다.
- 10월에 집필완료하고 출판사를 찾고 후에 출판계획이 있습니다.
- 사용되는 장비는 보드와 오실로스코프, 로직 해석기 입니다.