24 Mayıs 2015 Pazar

STM32F429-DISCOVERY İLE HC-SR04 MESAFE SENSORU


          


 Bu çalışmamda daha önce radar projemde kullanmış olduğum mesafe sensörünü kullanarak stm32f429 kiti ile bağlantı kurup ve mesafeyi ölçümü yapacağım. Bu kiti üç ay önce almıştım fakat üniversitem o zaman başladığı için vakit bulamadığımdan kullanmaya başlayamamıştım. Bu çalışmamda basit bir mesafe ölçümü uygulaması yapılarak stm32f429 ile ARM'a giriş yaptım ve bu çalışmamada şimdilik kod yazımında hazır kütüphaneler kullanıldı. Kod'u yazarlen derleyici olarak Keil uVision5 programında  faydalanıldı.





      Yukarıdaki resim STM32F429 Discovery kitidir. Bu kit üzerinde kullan mikrodenetliyicimiz STM32F429ZIT6  ve üzerinde L32D20 ST NEMS 3- axis Gyroscope, Led(kırmızı, yeşil), Buton, USB OTG micro-B girişi, 2.4"" TFT LCD  vardır. STM32F429ZIT6  mikro denetleyicisi 2MB flash belleği, 256 KB RAM'i, 3 ADCs, 17TIMs,Uart, ethernet vardır. Bu denetliyici  ARM Cortex-M4 32-bit'tir. Dokunmatik ekranın özelliği TFT LCD (Thin-film-transistor liquid-crystal display) 240x320 dots.  Toplam 157 tane giriş ve çıkış pini vardır.



       Mesafe ölçümünde kullanacağım sensör HC-SR04'dür. Radar projemde genel olarak nasıl çalıştığını anlatmıştım. Şimdi kısaca tekrar yazacağım;


 40Khz frekansında bir ses sinyali verici sensörü ile ortama iletilir sonra bu gönderilen ses sinyali cisme çarparak geridöner ve

 
sensörü bu sinyali algılar. Mikro denetliyicimiz bu gönderilen ve gelen ses sinyalinin arasındaki zaman farkını hesaplayarak mesafe bulunur. Buda matematiksel olarak şöyle bulunur. Mikrodenetliyimiz HC-SR04 sensörü ile cisim arasındaki ses sinyalinin gidiş ve dönüş arasındaki zamanı ölçsün ve biz buna "t" diyelim. Ve daha sonra biz bu "t"'yi ses hızı ile çaparak 2'ye bölersek mesafeyi bulmuş oluruz. MESAFE=(t*Ses_Hızı)/2

Keil'de yazılan kodumuz ;


/* Include core modules */
#include "stm32f4xx.h"
#include
#include
/* Include my libraries here */
#include "defines.h"
#include "tm_stm32f4_delay.h"
#include "tm_stm32f4_disco.h"
#include "tm_stm32f4_emwin.h"
#include "tm_stm32f4_hcsr04.h"
/* GUI modules */
#include "button.h"
#include "DIALOG.h"
char ac[4];
char k[4];
int distance;
int x0 = 120;
int y0 = 120;


int main(void) {
  uint8_t i;

 /* Initialize system */
 SystemInit();
 
 /* Initialize delay functions */
 TM_DELAY_Init();

 /* Initialize LEDs */
 TM_DISCO_LedInit();
 /* Initialize emWin */
 /*This function initialize LCD, SDRAM, STMPE811 touch and GUI  !!!*/
 if (TM_EMWIN_Init() != TM_EMWIN_Result_Ok) {
  /* Initialization error */
  while (1) {
     /* Toggle RED led */
     TM_DISCO_LedToggle(LED_RED); 
     /* Delay */
   Delayms(100);
  }
 }

 if (!TM_HCSR04_Init()) {
  /* Sensor is not ready to use */
  /* Maybe wiring is incorrect */
  while (1) {
      TM_DISCO_LedToggle(LED_GREEN);
      Delayms(100);
  }
 }

   GUI_SetBkColor(GUI_WHITE);
   GUI_Clear();
    
 while (1) {
      GUI_SetPenSize( 5 );
      GUI_SetTextMode(GUI_TM_TRANS);
      GUI_SetFont(&GUI_FontComic18B_ASCII);
      GUI_SetColor( GUI_BLUE );
  
     GUI_SetTextMode(GUI_TM_TRANS);
     GUI_SetFont(&GUI_FontComic18B_ASCII);
     GUI_DrawArc( x0,y0,110, 110,-30, 210 );
 
   for (i=0; i<= 22; i++) {
     
     float a = (-30+i*10)*3.1415926/180;
     int x = -100*cos(a)+x0;
     int y = -100*sin(a)+y0;
   
      if (i%2 == 0)
        GUI_SetPenSize( 5 );
      else
        GUI_SetPenSize( 4 );
   
      GUI_DrawPoint(x,y);
     
      if (i%2 == 0) {
          x = -80*cos(a)+x0;
          y = -80*sin(a)+y0;
          sprintf(ac, "%d", 10*i);
          GUI_SetTextAlign(GUI_TA_VCENTER);
          GUI_DispStringHCenterAt(ac,x,y);
      }     
    }   
   
       distance = TM_HCSR04_Read();
       GUI_ClearRect(0, 200, 320, 240);
       GUI_SetColor( GUI_RED );
       sprintf(k, "%d",distance);
   
       GUI_SetFont(&GUI_Font8x16);
       GUI_DispStringAt("The result is: ",5,210); // Disp text
       GUI_SetColor( GUI_BLACK );
       GUI_SetFont(&GUI_Font24_1);
       GUI_DispStringAt(k,130,210);
       GUI_SetColor( GUI_RED );
       GUI_DispStringAt("cm",170,210); // Disp text
 
       GUI_SetColor( GUI_BLUE );
       GUI_SetPenSize( 4 );
       GUI_DrawLine( x0,  y0, -65*cos((-30+distance)*3.1415926/180)+120 , -65*sin((-30+distance)*3.1415926/180)+120);  
       GUI_Delay(10);
      GUI_SetColor( GUI_WHITE );
      GUI_DrawLine( x0,  y0, -65*cos((-30+distance)*3.1415926/180)+120 , -65*sin((-30+distance)*3.1415926/180)+120);


   }
}

Çalışma Videosu





 

Hiç yorum yok:

Yorum Gönder