יום שישי, 13 באפריל 2012

Arduino UltraSonic Sensor


אחרי הסקירה הקצרה שלי על Arduino הגיע הזמן שנגע בנושא הכי מעניין מסביב Arduino והוא החיישנים,
יש המון חיישנים שניתן לחבר ל Arduino ולממש בעזרתם המון מוצרים , החלטתי לעשות את המאמר הראשון על  Ultrasonic דרך פשוטה למדוד מרחקים ולשליטה במרחב התנועה של המוצר שלנו.

דרישות:
  • Arduino Uno
  • Arduino Prototype Shiled
  • Wires
  • Ultasonic Sensor Based SDM-IO Module


Ultrasonic
אני לא מומחה גדול בעיבוד אותות אבל אנסה בכול מקרה, מדובר על גלי קול בתדר גבוה שבני אדם לא מסוגלים לשמוע, הרכיב המרכזי במערכות Sonar, החיישן שולח גל קול ומחכה לגל החוזר במקרה ולא חוזר גל הדרך פנויה או שאינה בטווח החיישן, וכאשר יש גל חוזר ניתן לחשב את המרחק שלקח לגל קול לחזור לחיישן, אחד השימושים עבור Ultrasonic הוא "עיניים" , בדיוק כמו שזה נשמע נניח שנרצה לבנות שואב אבק ביתי שהסתובב לנו בבית באופן רנדומלי ,נוכל לבצע זאת בעזרת Ultrasonic שיבדוק אם הדרך עבור השואב שלנו פנויה ובמקרה שלא שהסתובב עד שהחיישן יחזיר שהדרך חופשית.





קיימים סוגים שונים של חיישנים חלקם מגיעים עם 3 ו 4 פינים, החיישן שלי מבוסס על SDM-IO Moudle עם 4 פינים,Vcc,Trig,Echo,Gnd.


נקודות החיבור עם ה Arduino




Arduino Protoype Shield
אחד התוספות החשובות בעבודה עם Arduino מאפשר לנו לפתח אב טיפוס ע"ג ה Arduino לפני יצירת ה Sheild שלכם, ניתן למצוא אותו ברשת במחיר ממוצע של 10 דולר.




מבנה סופי:




קוד:
 //time out  waiting for signal
 #define SDM_IO_TIMEOUT 1000

 //TrigPin in Arduino
 int TrigPin = 12;

 //EchoPin in Arduino
 int EchoPin = 13;

 unsigned long ultrasoundDuration;
 int timeout;
 unsigned long tStartPing = 0;
 int sensorValue = 0;
       
           void setup() {  
                                       //init the serial
                                       Serial.begin(9600);
                                      
                                       //pins setup 
                                       pinMode(TrigPin, OUTPUT);
                                       pinMode(EchoPin, INPUT);
                                    }


             void loop()  {  
              
                                   sensorValue = read_sdm_io_range();  
                                       if(sensorValue != 999)
                                       {
                                         //printing distanse value
                                         Serial.print(sensorValue); 
                                         Serial.println(" cm"); 
                                         //delay before new sample
                                         delay(300);     
                                       }
                               
                                   }
                                  
                                  
          //SDM-IO Ultrasonic Range Sensor distance function 
          float read_sdm_io_range() {  
                                                                   
                                       unsigned char pin = 0;
                                       unsigned int time_flag = 0;
                                                                  
                                        //send HIGH signal
                                        digitalWrite(TrigPin, HIGH);
                                                                   
                                        //wait 2 microsecond
                                        delayMicroseconds(2);
                                                                   
                                        //send LOW signal
                                       digitalWrite(TrigPin, LOW);
                                                                    
                                        //wait 10 microsecond
                                        delayMicroseconds(10);
                                                                   
                                        //send HIGH signal
                                        digitalWrite(TrigPin, HIGH);
                                                                   
                                       //getting system clock
                                       tStartPing = micros();
                                       timeout = 0;
                                       pin = digitalRead(EchoPin);
                                                   
                                       while(pin)  
                                       {   
                                          //waiting for response from EchoPin
                                           //break out when timeout

                                           pin = digitalRead(EchoPin);
                                            time_flag++;
                                                                        
                                            //break when time_flag equal to
                                            //timeout limit

                                             if(time_flag > SDM_IO_TIMEOUT)   
                                            {         timeout = 1;         break;       } 
                                         }
                                                                
                                         //calculate the response time  
                                         ultrasoundDuration = micros() - tStartPing;   
                                                                  
                                         //if timeout equal 1
                                            if (timeout)    
                                                 return 999; 
                                            else    
                                                 return ultrasoundDuration * 0.017;
                                                // result in cm
 }
פלט:


סיכום:
החיישנים הם החלק הבולט והמעניין ביותר בעבודה עם Arduino ומאפשר לנו ללכת צעד קדימה בעיצוב ובתכנון של מוצרי Embedded בהמשך אני אסקור עוד חיישנים רבים עבור מגוון רחב של שימושים.

זה חי...

אין תגובות:

הוסף רשומת תגובה