This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| pt:examples:sensor:ultrasonic_distance [2015/12/16 18:54] – Criação deste novo documento. artica | pt:examples:sensor:ultrasonic_distance [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Sensor de distância por ultra-sons ====== | ||
| + | // | ||
| + | [HW] [[pt: | ||
| + | [AVR] [[pt: | ||
| + | [LIB] [[pt: | ||
| + | [LIB] [[pt: | ||
| + | |||
| + | ===== Teoria ===== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Um sensor de distância por ultra-sons determina a distância a um objecto através da medição do tempo necessário ao som ser reflectido de volta a partir do objecto. A frequência do som está algures no intervalo dos ultra-sons, isto assegura um direcção mais concentrada da onda sonora porque um som com alta frequência dissipa-se menos no ambiente. Um sensor de distância ultra-sónico típico consiste em duas membranas. Uma membrana produz um som, outra captura o seu eco. Basicamente, | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Os sensores ultra-sónicos têm variados usos na vida quotidiana. São usados para substituir fitas métricas em dispositivos de medição para locais de construção. Os carros são equipados com sensores de estacionamento ultra-sônicos. Além de medir distâncias, | ||
| + | |||
| + | ===== Prática ===== | ||
| + | |||
| + | O HomeLab está equipado com o sensor de distância ultra-sônico Devantech SRF04/ | ||
| + | |||
| + | Para usar o SRF04/SRF05 com o AVR, os pins de disparo e eco devem ser ligados a alguns dos pins AVR. Para medir o tempo, é adequado usar um temporizador de 16 bits, por exemplo o //timer3//. De seguida é apresentada uma função que é baseada no controlador Atmega2561 que executa todos os processos de medição - gera o sinal do disparador, começa o temporizador, | ||
| + | |||
| + | <code c> | ||
| + | #define ULTRASONIC_SPEED_OF_SOUND 33000 // cm/s | ||
| + | |||
| + | // Ultrasonic distance measuring | ||
| + | unsigned short ultrasonic_measure_srf05(pin triggerecho) | ||
| + | { | ||
| + | // Pin setup | ||
| + | pin_setup_output(triggerecho); | ||
| + | |||
| + | // Set timer 3 to normal mode | ||
| + | // with period of F_CPU / 8 | ||
| + | timer3_init_normal(TIMER3_PRESCALE_8); | ||
| + | |||
| + | // Create trigger pulse | ||
| + | pin_set(triggerecho); | ||
| + | | ||
| + | // Reset timer | ||
| + | timer3_overflow_flag_clear(); | ||
| + | timer3_set_value(0); | ||
| + | | ||
| + | // Wait ~10 us | ||
| + | while (timer3_get_value() < 18) {} | ||
| + | | ||
| + | // End trigger pulse | ||
| + | pin_clear(triggerecho); | ||
| + | | ||
| + | //short delay | ||
| + | sw_delay_ms(1); | ||
| + | | ||
| + | //set the pin as input | ||
| + | pin_setup_input_with_pullup(triggerecho); | ||
| + | | ||
| + | // Wait for echo start | ||
| + | while (!pin_get_value(triggerecho)) | ||
| + | { | ||
| + | // Timeout ? | ||
| + | if (timer3_overflow_flag_is_set()) | ||
| + | { | ||
| + | return 0; | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | // Reset timer again | ||
| + | timer3_set_value(0); | ||
| + | | ||
| + | // Wait for echo end | ||
| + | while (pin_get_value(triggerecho)) | ||
| + | { | ||
| + | // Timeout ? | ||
| + | if (timer3_overflow_flag_is_set()) | ||
| + | { | ||
| + | return 0; | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | // Convert time to distance: | ||
| + | // | ||
| + | return (unsigned long)timer3_get_value() * | ||
| + | ULTRASONIC_SPEED_OF_SOUND / (F_CPU / 4); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | A função apresentada permite ao utilizador escolher o pin de eco/ | ||
| + | |||
| + | <code c> | ||
| + | // The example program of the ultrasonic distance sensor of the HomeLab | ||
| + | // Measuring the distance is blocking. | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Pins of ultrasonic sensor | ||
| + | // Robotic HomeLab II | ||
| + | //pin pin_pin_trigger_echo = PIN(F, 2); | ||
| + | |||
| + | // Robotic HomeLab III | ||
| + | pin pin_trigger_echo = PIN(B, 2); | ||
| + | |||
| + | // Main program | ||
| + | int main(void) | ||
| + | { | ||
| + | unsigned short distance; | ||
| + | char text[16]; | ||
| + | |||
| + | // Robotic HomeLab II | ||
| + | // Switching to external sensors | ||
| + | /* | ||
| + | pin ex_sensors = PIN(G, 0); | ||
| + | pin_setup_output(ex_sensors); | ||
| + | pin_set(ex_sensors); | ||
| + | */ | ||
| + | |||
| + | // Initialization of LCD | ||
| + | lcd_gfx_init(); | ||
| + | |||
| + | // Clearing the LCD | ||
| + | lcd_gfx_clear(); | ||
| + | |||
| + | // Line selection | ||
| + | lcd_gfx_goto_char_xy(1, | ||
| + | |||
| + | // Name of the program | ||
| + | lcd_gfx_write_string(" | ||
| + | |||
| + | // Little delay | ||
| + | sw_delay_ms(100); | ||
| + | |||
| + | // Endless loop. | ||
| + | while (1) | ||
| + | { | ||
| + | // Measuring | ||
| + | distance = ultrasonic_measure_srf05(pin_trigger_echo); | ||
| + | |||
| + | // Was the measuring successful ? | ||
| + | if (distance > 0) | ||
| + | { | ||
| + | // converting the distance to text. | ||
| + | sprintf(text, | ||
| + | } | ||
| + | // Were there errors during the measuring ? | ||
| + | else | ||
| + | { | ||
| + | // Text of the error. | ||
| + | sprintf(text, | ||
| + | } | ||
| + | |||
| + | // Displaying the text on the LCD | ||
| + | lcd_gfx_goto_char_xy(3, | ||
| + | lcd_gfx_write_string(text); | ||
| + | |||
| + | // Little delay | ||
| + | sw_delay_ms(500); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Para se certificar-se de que o sensor ultra-sónico começou realmente a trabalhar, deve verificar-se se o pequeno LED, que está localizado na parte de trás do sensor, pisca a cada medição. | ||