MCoding MCodingSensor

센서에 관한 책을 집필중입니다.

Sensor Interface
초음파센서(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월에 집필완료하고 출판사를 찾고 후에 출판계획이 있습니다.
  • 사용되는 장비는 보드와 오실로스코프, 로직 해석기 입니다.

MCoding_FMCoding실험모습MCoding브레드보드JTAGMCoding먼지센서MCoding사운드디텍트센서MCoding_JTAG_브레드보드측면MCoding습기센서MCoding_습도온도센서

 

 

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다: