Sławomir Węgrzyn V rok Koło Naukowe Techniki Cyfrowej dr inż. Wojciech Mysiński opiekun naukowy Ultrasonic Ranging Module on STM32F4 Obsługa ultradźwiękowego ź czujnika odległości na mikrokontrolerze STM32f4 Keywords: cortex m4 lcd ultrasonic ranging module Słowa kluczowe: stm32 cortex m4 lcd czujnik odległości 1. Ultradźwiękowy czujnik odległości HC-SR04 1.1. Opis Do pomiaru odległości wykorzystany został moduł HC-SR04. Jest to ultradźwiękowy czujnik umożliwiający pomiary odległości w zakresie od 2 do 400cm. Zasilany jest napięciem 5V DC, pobór prądu wynosi około 15mA. Posiada on cztery piny, dwa zasilające, oraz dwa do wyzwolenia pomiaru. Jego zaletą jest skuteczne tłumienie tła i pewnie wykrywanie obiektów niezależnie od rodzaju powierzchni. Pomiary są niezależne od typu materiału, światła, koloru i środowiska. Rysunek 1 Czujnik odległości HC-SR04 1.2. Zasada działania Pomiar polega na podaniu na wejście Trig impulsu napięciowego w stanie wysokim przez czas 10µs, który inicjuje 8 cykli fali ultradźwiękowej o częstotliwości 40kHz. Rysunek 2 Procedura pomiarowa
Fala po odbiciu od napotkanej przeszkody wraca do czujnika. Na wyjściu Echo dostajemy sygnał wysoki (5V), którego długość jest proporcjonalna do odległości. Producent zaleca aby minimalny odstęp między kolejnymi pomiarami wynosił 60ms. Rysunek 3 Zasada działania Wiedząc, że prędkość dźwięku w powietrzu wynosi 340m/s, można łatwo obliczyć, że fala dźwiękowa pokonuje 1cm w czasie 29µs. Wobec tego, możemy wyznaczyć prosty wzór, służący do przeliczenia czasu trwania impulsu na odległość: 1.3. Wykorzystanie Czujniki ultradźwiękowe ź znajdują zastosowanie w różnych dziedzinach życia. Bardzo dobrze sprawdzają ą się ę przy pomiarach poziomu zapełnienia zbiorników, głównie cieczami przeźroczystymi, roczystymi, a przede wszystkim w środowiskach gdzie ze względu na znaczne zabrudzenie nie jest możliwe zastosowanie czujników optycznych. Coraz częściej zastępują ą czujniki pojemnościowe i optoelektroniczne na liniach produkcyjnych, gdzie badane obiekty wykonane są ą z nietypowych materiałów (np. przeźroczyste szkło). Przykłady wykorzystania: Pomiar odległości Czujniki parkowania Alarmy samochodowe Roboty Linie produkcyjne Pomiar poziomu zapełnienia Rysunek 4 Przykłady wykorzystania
2. Mikrokontroler STM32F429 2.1. Parametry oraz możliwości Obsługa czujnika została wykonana na płytce ewaluacyjnej STM32F429 Discovery. Rysunek 5 Płytka Discovery mikrokontrolera STM32F429 Urządzenie wyposarzone jest w następujące komponenty: Mikrokontroler STM32F429: 32-bit rdzeń ARM Cortex-M4, fx=180mhz 2 MB pamięci Flash, 256 kb pamięci RAM Trzy 12-bitowe przetworniki A/C Dwa 12-bitowe przetworniki C/A Jednostka zmiennoprzecinkowa FPU Jednostka sygnałowa DSP Kontroler danych DMA
Moduł STM32F429-Discovery 64 Mbits pamięci SDRAM Wyświetlacz dotykowy LCD TFT 2.4 320x240 6 diod LED 3-osiowy żyroskop Dwa przyciski Układ zasilania z USB, +5V na 3.3V Debuger ST-Link/V2 2.2. Wyświetlacz LCD Parametry wyświetlacza: Rozdzielczość 240x320 px, 262K kolorów Przekątna 2.4 Sterowanie SPI (Serial Peripheral Interface) Obsługa za pomocą biblioteki ILI9341 Panel dotykowy obsługiwany dzięki STMPE811 Interfejs I2C Standard Peripherals Library Wyświetlacz sterowany jest za pomocą interfejsu SPI (Szeregowy Interfej Urządzeń Peryferyjnych) Jest to jeden z najczęściej używanych interfejsów komunikacyj- Rysunek 6 Wyświetlacz LCD nych pomiędzy systemami mikroprocesorowymi a układami peryferyjnymi takimi jak: przetworniki ADC/DAC, pamięci flash, karty SD, wyświetlacze. Komunikacja odbywa się synchronicznie za pomocą 3 lini: MOSI - (ang. Master Output Slave Input) - dane dla układu peryferyjnego MISO - (ang. Master Input Slave Output) - dane z układu peryferyjnego SCLK - (ang. Serial CLocK) - sygnał zegarowy (taktujący) 4 linia służy do aktywacji urządzenia. Rysunek 7 Przykład podłączenia urządzeń za pomocą interfejsu SPI Panel dotykowy obsługiwany jest z wykorzystaniem szeregowej, dwukierunkowej magistrali I 2 C. Składa się z dwóch dwukierunkowych linii: lini danych oraz lini zegara. Transmisja odbywa się ę szeregowo i synchroniczne.
Biblioteki SPI i I2c zostały wykorzystane z Standard Peripherals Library - jest to kompletny pakiet, składający się ze sterowników oraz zestawów przykładów dla wszystkich standardowych urządzeń peryferyjnych mikrokontrolera STM32F4xx. 3. Obsługa Czujnika HC-SR04 3.1. Obsługa czujnika oraz podłączenie Do wyzwolenia pomiaru, w przerwaniu obsługiwanym przez Timer 7, generowany jest impuls o czasie trwania 10µ µs. Następnie podawany jest na końcówkę ę PD3, która podłączona jest do pinu Trig. Do pomiaru czasu trwania impulsu na wyjściu Echo wykorzystany został Timer2. Timer inicjowany jest przez podanie sygnału na końcówke PA0, która jest ustawiona jako wejscie alternatywne. Następnie w przerwaniu zliczany jest czas trwania impulsu powrotnego. Czas trwania przeliczany jest na odległosć w cm, za pomocą prostego wzoru podanego wcześniej. odleglosc=(float)(hcsr04.delay_us)*(float)(hcsr04_ =(float)(hcsr04.delay_us)*(float)(hcsr04_wart_2_cm); HCSR04.delay_us czas trwania impulsu powrotnego w HCSR04_WART_2_CM = 0.017 = czas, w którym fala przebywa 2cm Rysunek 8 Podłączenie czujnika to płytki Discovery
3.2. Ustawienie portów wejść i wyjść Funkcja służąca do ustawienia pinu PD3 jako wyjście, oraz PA0 jako wejście alternatywne inicjujące Timer2. void HCSR04_InitIO(void) GPIO_InitTypeDef GPIO_InitStructure; // Trigger-Pin RCC_AHB1PeriphClockCmd(HCSR04_TRIGGER_CLK, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIOD->BSRRH = GPIO_Pin_3; // Echo-Pin RCC_AHB1PeriphClockCmd(HCSR04_ECHO_CLK, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode PIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM2); 3.3. Uruchomienie Timerów Częstotliwość sygnału wejściowego do Timera7 wynosi Prescaler ustawiamy na wartość 83, wiec czestotliwość TIM7 wynosi 1MHz. Aby uzyskać czas trwania impulsu 10 s, Period ustawiamy na wartość 9. Dzięki temu otrzymujemy okres występowania zdarzenia przepełnienia równy 10 s. Rysunek 9 Schemat blokowy
Funkcja służąca do uruchomienia timerów: void HCSR04_InitTIM(void) TIM_ICInitTypeDef TIM_ICInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE); TIM_Cmd(TIM7, DISABLE); TIM_TimeBaseStructure.TIM_Period=HCSR04_TIM7_PERIOD; TIM_TimeBaseStructure.TIM_Prescaler=HCSR04_TIM7_PRESCALE; TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure); TIM_ARRPreloadConfig(TIM7, ENABLE); //Timer 2 tryb pomiaru RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_PrescalerConfig(TIM2, HCSR04_TIM2_PRESCALE, TIM_PSCReloadMode_Immediate); TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_PWMIConfig(TIM2, &TIM_ICInitStructure); TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1); TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable); 3.3. Uruchomienie sprzętowego kontrolera przerwań NVIC oraz funkcje przerwań void HCSR04_InitNVIC(void) NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);
void TIM2_IRQHandler(void) uint32_t start,stop; if(tim_getitstatus(tim2, TIM_IT_CC1) == SET) TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); start=tim_getcapture1(tim2); stop=tim_getcapture2(tim2); HCSR04.delay_us=start-stop; stop; HCSR04.t2_akt_time++; void TIM7_IRQHandler(void) if (TIM_GetITStatus(TIM7, TIM_IT_Update)!= RESET) TIM_ClearITPendingBit(TIM7, TIM_IT_Update); HCSR04.t7_akt_time+=10; 4. Prezentacja działania urządzenia 4.1. Pomiar powierzchni oraz kubatury pomieszczeń Zaprezentowany układ może być przydatny przy obliczaniu powierzchni oraz kubatury pomieszczeń. Aby dokonać ć pomiaru przykładamy czujnik do jednej ze ścian i naciskamy przycisk Pomiar. W programie zostanie zapisana wartość pomiaru. Następnie powtarzamy czynność dla drugiej ściany. Na wyświetlaczu automatycznie pokazana zostanie obliczona wartość powierzchni. Aby uzyskać objętość wykonujemy trzeci pomiar. Rysunek 10 Przykład działania programu
4.1. Czujnik parkowania Układ możemy ż też ż wykorzystać jako czujnik parkowania. Jego zasada działania opiera się na tej samej zasadzie jak opisane powyżej, czyli na metodzie pomiaru czasu powrotu echa fali ultradźwiękowej emitowanej przez czujnik. Sensory pracują jednocześnie jako nadajniki i odbiorniki fal emitowanych przez nie i odbitych od przeszkody. Odległość od przeszkody jest obliczana na podstawie czasu powrotu odbitej fali do sensora. Na wyświetlaczu wietlaczu odległość podawana jest liczbowo, oraz wyświetlana wietlana jest graficznie za pomocą paska, który zmienia swój kolor, im bliżej przeszkody się znajdujemy. Układ może zostać wyposażony ony w buzzer, który sygnałem dźwiękowym będzie sygnalizował odległość krytyczną. Rysunek 11Przykład działania czujnika parkowania 5. Podsumowanie Zastosowanie przetworników ultradźwiękowych umożliwia uzyskanie w miarę dokładnych wyników pomiaru odległości w stosunkowo prostym układzie. Ich największą zaletą jest bardzo dobry stosunek ceny do jakości. Nie wykazują także szkodliwego oddziaływania na człowieka. Jednak pomiar w zakresie małych jak i bardzo dużych odległości obarczony jest błędem. Następną z wad jest także mały zasięg.