標(biāo)題: 【Arduino】108種傳感器系列實驗(133)---GP2Y0A02YK0F紅外測距模塊 [打印本頁]

作者: eagler8    時間: 2019-10-4 15:26
標(biāo)題: 【Arduino】108種傳感器系列實驗(133)---GP2Y0A02YK0F紅外測距模塊
37款傳感器與模塊的提法,在網(wǎng)絡(luò)上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是不止37種的。鑒于本人手頭積累了一些傳感器和模塊,依照實踐出真知(一定要動手做)的理念,以學(xué)習(xí)和交流為目的,這里準(zhǔn)備逐一動手試試做實驗,不管成功與否,都會記錄下來---小小的進步或是搞不定的問題,希望能夠拋磚引玉。

【Arduino】108種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
實驗一百三十三:夏普GP2Y0A02YK0F 紅外測距傳感器模塊 20-150cm 距離傳感器










作者: eagler8    時間: 2019-10-4 15:33


紅外
是紅外線的簡稱,它是一種電磁波。它可以實現(xiàn)數(shù)據(jù)的無線傳輸。自1800年被發(fā)現(xiàn)以來,得到很普遍的應(yīng)用,如紅外線鼠標(biāo),紅外線打印機,紅外線鍵盤等等。紅外的特征:紅外傳輸是一種點對點的傳輸方式,無線,不能離的太遠(yuǎn),要對準(zhǔn)方向,且中間不能有障礙物也就是不能穿墻而過,幾乎無法控制信息傳輸?shù)倪M度;IrDA已經(jīng)是一套標(biāo)準(zhǔn),IR收/發(fā)的組件也是標(biāo)準(zhǔn)化產(chǎn)品。


作者: zh_jie_sjz    時間: 2019-10-4 17:18
這個東東很有意思
作者: eagler8    時間: 2019-10-4 21:58


紅外線(Infrared)
紅外線是太陽光線中眾多不可見光線中的一種,由英國科學(xué)家赫歇爾于1800年發(fā)現(xiàn),又稱為紅外熱輻射,熱作用強。他將太陽光用三棱鏡分解開,在各種不同顏色的色帶位置上放置了溫度計,試圖測量各種顏色的光的加熱效應(yīng)。結(jié)果發(fā)現(xiàn),位于紅光外側(cè)的那支溫度計升溫最快。因此得到結(jié)論:太陽光譜中,紅光的外側(cè)必定存在看不見的光線,這就是紅外線。也可以當(dāng)作傳輸之媒介。 太陽光譜上紅外線的波長大于可見光線,波長為0.75~1000μm。紅外線可分為三部分,即近紅外線,波長為(0.75-1)~(2.5-3)μm之間;中紅外線,波長為(2.5-3)~(25-40)μm之間;遠(yuǎn)紅外線,波長為(25-40)~l500μm 之間。

紅外線是波長介于微波與可見光之間的電磁波,波長在1mm到760納米(nm)之間,比紅光長的非可見光。高于絕對零度(-273.15℃)的物質(zhì)都可以產(chǎn)生紅外線。現(xiàn)代物理學(xué)稱之為熱射線。醫(yī)用紅外線可分為兩類:近紅外線與遠(yuǎn)紅外線。含熱能,太陽的熱量主要通過紅外線傳到地球。我們把紅光之外的輻射叫做紅外線(紫光之外是紫外線),肉眼不可見。

紅外線的發(fā)現(xiàn):公元1800年英國科學(xué)家"威廉·赫歇爾"發(fā)現(xiàn)太陽光中的紅光外側(cè)所圍繞著一種用肉眼無法看見的光源,波長介于5.6-1000μm的「遠(yuǎn)紅外線」,經(jīng)過這種光源照射時,會對有機體產(chǎn)生放射、穿透、吸收、共振的效果。美國太空總部(NASA)研究報告指出,在紅外線內(nèi),對人體有幫助4-14微米的遠(yuǎn)紅外線,從內(nèi)部發(fā)熱,從體內(nèi)作用促進微血管的擴張,使血液循環(huán)順暢,達到新陳代謝的目的,進而增加身體的免疫力及治愈率。 但是根據(jù)黑體輻射理論,一般的材料要產(chǎn)生足夠強度的遠(yuǎn)紅外線,并不容易,通常必須藉助特殊物質(zhì)作能量的轉(zhuǎn)換,將它所吸收的熱量經(jīng)由內(nèi)部分子的振動再發(fā)放較長波長的遠(yuǎn)紅外線出來。


作者: eagler8    時間: 2019-10-6 10:29
本帖最后由 eagler8 于 2019-10-6 11:11 編輯



紅外測距
隨著科學(xué)技術(shù)的不斷發(fā)展,在測距領(lǐng)域也先后出現(xiàn)了激光測距、微波雷達測距、超聲波測距及紅外線測距等方式。作為一種應(yīng)用廣泛、測量精度高的測量方式,紅外測距利用紅外線傳播時不擴散、折射率小的特性,根據(jù)紅外線從發(fā)射模塊發(fā)出到被物體反射回來被接受模塊接受所需要的時間,采用相應(yīng)的測距公式來實現(xiàn)對物體距離的測量。紅外測距最早出現(xiàn)于上世紀(jì)60年代,是一種以紅外線作為傳輸介質(zhì)的測量方法。紅外測距的研究有著非比尋常的意義,其本身具有其他測距方式?jīng)]有的特點,技術(shù)難度相對不大,系統(tǒng)構(gòu)成成本較低、性能良好、使用方便、簡單,對各行各業(yè)均有著不可或缺的貢獻,因而其市場需求量更大,發(fā)展空間更廣。其工作原理是,利用紅外信號遇到障礙物距離的不同反射的強度也不同的原理,進行障礙物遠(yuǎn)近的檢測。紅外測距傳感器具有一對紅外信號發(fā)射與接收二極管,發(fā)射管發(fā)射特定頻率的紅外信號,接收管接收這種頻率的紅外信號,當(dāng)紅外的檢測方向遇到障礙物時,紅外信號反射回來被接收管接收,經(jīng)過處理之后,通過數(shù)字傳感器接口返回到機器人主機,機器人即可利用紅外的返回信號來識別周圍環(huán)境的變化。



作者: eagler8    時間: 2019-10-6 10:43

GP2Y0A02YK0F
是夏普的一款距離測量傳感器模塊。它由PSD(位置靈敏探測器)和IRED 紅外發(fā)射二極管)以及信號處理電路三部分組成。由于采用了三角測量方法,被測物體的材質(zhì)、環(huán)境溫度以及測量時間都不會影響傳感器的測量精度。傳感器輸出電壓值對應(yīng)探測的距離。通過測量電壓值就可以得出所探測物體的距離,所以這款傳感器可以用于距離測量、避障等場合。


作者: eagler8    時間: 2019-10-6 10:44
zh_jie_sjz 發(fā)表于 2019-10-4 17:18
這個東東很有意思

是嗎,我還沒有實驗過呢
作者: eagler8    時間: 2019-10-6 10:50




作者: eagler8    時間: 2019-10-6 11:13

三角測量法
是通過測量目標(biāo)點與固定基準(zhǔn)線的已知端點角度來測量觀測目標(biāo)的距離。三角測量運用到天文測距時,可以根據(jù)地球自轉(zhuǎn)一天或一周時與觀測目標(biāo)產(chǎn)生的視覺差距,也稱作“周日地平視差”,來計算地月距離,此方法因地球半徑長度限制,只適合測量太陽系內(nèi)天體間的距離。光學(xué)三角測量法是一種最常用的一種光學(xué)三維測量技術(shù),以傳統(tǒng)的三角測量為基礎(chǔ),通過待測點相對于光學(xué)光學(xué)基準(zhǔn)線偏移產(chǎn)生的角度變化計算該點的深度信息。根據(jù)具體的照明方式的不同,三角法可以分為被動三角法和主動三角法。

紅外傳感器基于三角測量原理。紅外發(fā)射器按照一定的角度發(fā)射紅外光束,當(dāng)遇 到物體以后,光束會反射回來,如圖所示。反射回來的紅外光線被 CCD 檢測器檢測到以后,會獲得一 個偏移值 L,利用三角關(guān)系,在知道了發(fā)射角度 a,偏移距 L,中心矩 X,以及濾鏡的焦距 f 以后,傳感器 到物體的距離 D 就可以通過幾何關(guān)系計算出來了。


作者: eagler8    時間: 2019-10-6 11:31
非線性輸出
該系列的傳感器的輸出是非線性的。每個型號的輸出曲線都不同。所以,在實際使用前,最 好能對所使用的傳感器進行一下校正。對每個型號的傳感器創(chuàng)建一張曲線圖,以便在實際使用中獲得真實 有效的測量數(shù)據(jù)。下圖是典型的輸出曲線圖。




可以看到,當(dāng) D 的距離足夠近的時候,L 值會相當(dāng)大,超過 CCD 的探測范圍,這時,雖然物體很近,但 是傳感器反而看不到了。當(dāng)物體距離 D 很大時,L 值就會很小。這時 CCD 檢測器能否分辨得出這個很小 的 L 值成為關(guān)鍵,也就是說 CCD 的分辨率決定能不能獲得足夠精確的 L 值。要檢測越是遠(yuǎn)的物體,CCD 的分辨率要求就越高。

從上圖中,可以看到,當(dāng)被探測物體的距離小于 10cm 的時候,輸出電壓急劇下降,也就是說從電壓讀數(shù) 來看,物體的距離應(yīng)該是越來越遠(yuǎn)了。但是實際上并不是這樣的,想象一下,你的機器人本來正在慢慢的 靠近障礙物,突然發(fā)現(xiàn)障礙物消失了,一般來說,你的控制程序會讓你的機器人以全速移動,結(jié)果就是," 砰"的一聲。當(dāng)然了,解決這個方法也不是沒有,這里有個小技巧。只需要改變一下傳感器的安裝位置,使 它到機器人的外圍的距離大于最小探測距離就可以了。如下圖所示。





作者: eagler8    時間: 2019-10-6 11:39

紅外測距傳感器特點
  1)遠(yuǎn)距離測量,在無反光板和反射率低的情況下能測量較遠(yuǎn)的距離;
  2)有同步輸入端,可多個傳感器同步測量;
  3) 測量范圍廣,響應(yīng)時間短;
  4) 外形設(shè)計緊湊,易于安裝,便于操作。

紅外測距傳感器應(yīng)用
  近期來全球自然災(zāi)害頻發(fā),像近期的四川、智利的大地震、日本海嘯,嚴(yán)重影響人類生命安全,而二次災(zāi)難又對營救者帶來了極大的風(fēng)險,這時搜救機器人就可以很好的代替營救者來搜救被困人群。傳感器是搜救機器人不可缺少的器件,機器人上有很多種傳感器,其中就有紅外測距傳感器。
  運動能力、感知能力、通訊能力和作業(yè)能力等幾個方面能力是搜救機器人必須具備的。搜救機器人的通訊作業(yè)能力需要依靠機器人良好的運動能力和感知能力,而機器人的運動能力和感知能力是建立在傳感器的有效發(fā)揮上的。紅外傳感器在搜救機器人上的應(yīng)用相當(dāng)于人眼的功能,利用的紅外測距傳感器發(fā)射出一束紅外光,在照射到物體后形成一個反射的過程,反射到傳感器后接收信號,然后利用圖像處理接收發(fā)射與接收的時間差的數(shù)據(jù)。經(jīng)信號處理器處理后計算出物體的距離。這不僅可以使用于自然表面,也可用于加反射板。測量距離遠(yuǎn),很高的頻率響應(yīng),適合于惡劣的工業(yè)環(huán)境中。
  機器人一只是近年來的熱點,機器人能做許多人所不能的事,尤其是在面臨大災(zāi)難后的搜救工作時,機器人就發(fā)揮出巨大的作用,機器人的功能是在傳感器的基礎(chǔ)上發(fā)展出來的,所以只有先進的傳感器技術(shù)才能制作出高性能的機器人。


作者: eagler8    時間: 2019-10-6 11:49


作者: eagler8    時間: 2019-10-6 11:51


作者: eagler8    時間: 2019-10-6 17:01


●光學(xué)建議
•該設(shè)備的鏡頭需要保持清潔。有灰塵、水或油等變質(zhì)的情況,這個裝置的特性。請在實際應(yīng)用中考慮。
•請不要洗。清洗會使光學(xué)系統(tǒng)的性能惡化等。
請確認(rèn)在實際使用中對化學(xué)品的耐受性,因為本產(chǎn)品不是針對洗滌而設(shè)計的。

●特性建議
•如果在發(fā)射器和探測器部分前面設(shè)置了光學(xué)濾波器,則具有發(fā)光二極管發(fā)射波長范圍(λ=850±70nm)的有效透過率應(yīng)為推薦使用。濾光片的兩面應(yīng)為鏡面拋光。而且,在某些情況下,根據(jù)防護罩與本產(chǎn)品之間的距離或防護罩,請在實際使用中充分確認(rèn)操作后使用。如果傳感器和檢測對象之間的傳感器的發(fā)射極附近有一個物體,請使用這個設(shè)備在充分確認(rèn)該傳感器的特性不會被物體改變之后。
•當(dāng)探測器暴露在陽光、鎢燈等的直射光下時,有些情況下它不能精確測量距離。請考慮探測器的設(shè)計,使其不受來自光源。
•有時不能精確測量鏡面反射鏡的距離。如果改變本產(chǎn)品的安裝角度,可以精確測量距離。
•如果反射物體的邊界線與材料或顏色等相差過大,以便減小測量距離偏差,建議設(shè)置傳感器發(fā)射中心和探測器中心之間的連線是平行的。


作者: eagler8    時間: 2019-10-6 17:06


作者: eagler8    時間: 2019-10-6 17:10




作者: eagler8    時間: 2019-10-6 17:36
  1. /*
  2.   【Arduino】108種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
  3.   實驗一百三十三:夏普GP2Y0A02YK0F 紅外測距傳感器模塊 20-150cm 距離傳感器
  4.   項目一:測試距離的方案之一
  5.   Module        UNO
  6.   VCC   ——   5V
  7.   GND  ——   GND
  8.   VO    ——   A0
  9. */

  10. int IRpin = 0;                                    // analog pin for reading the IR sensor
  11. void setup() {
  12.   Serial.begin(9600);                             // start the serial port
  13. }
  14. void loop() {
  15.   float volts = analogRead(IRpin) * 0.0048828125; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
  16.   float distance = 65 * pow(volts, -1.10);        // worked out from graph 65 = theretical distance / (1/Volts)
  17.   Serial.println(distance);                       // print the distance
  18.   delay(100);                                     // arbitary wait time.
  19. }
復(fù)制代碼



作者: eagler8    時間: 2019-10-6 17:38


作者: eagler8    時間: 2019-10-6 17:39


作者: eagler8    時間: 2019-10-6 18:27
  1. /*
  2.   【Arduino】108種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
  3.   實驗一百三十三:夏普GP2Y0A02YK0F 紅外測距傳感器模塊 20-150cm 距離傳感器
  4.   項目:測試距離的方案之二
  5.   Module        UNO
  6.   VCC   ——   5V
  7.   GND  ——   GND
  8.   VO    ——   A0
  9. */

  10. #define pin A0

  11. void setup () {
  12.         Serial.begin (9600);
  13.         pinMode (pin, INPUT);
  14. }

  15. void loop () {
  16.         uint16_t value = analogRead (pin);
  17.         uint16_t range = get_gp2y0a02 (value);
  18.         Serial.println (value);
  19.         Serial.print (range);
  20.         Serial.println (" cm");
  21.         Serial.println ();
  22.         delay (500);
  23. }

  24. //return distance (cm)
  25. uint16_t get_gp2y0a02 (uint16_t value) {
  26.         if (value < 70)  value = 70;
  27.         return 12777.3/value-1.1;        //(cm)
  28.         //return (62.5/(value/1023.0*5)-1.1);        //(cm)
  29.         //return ((67870.0 / (value - 3.0)) - 40.0); //gp2d12 (mm)
  30. }
復(fù)制代碼



作者: eagler8    時間: 2019-10-6 18:28


作者: eagler8    時間: 2019-10-6 18:56
  1. /*
  2.   【Arduino】108種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
  3.   實驗一百三十三:夏普GP2Y0A02YK0F 紅外測距傳感器模塊 20-150cm 距離傳感器
  4.   項目:測試距離的方案之三
  5.   說明;參考V-cm圖, 用查表法, 連接Vout到Arduino的A0引腳, 測量頻率20Hz
  6.   需要進一步校對與調(diào)整參數(shù)
  7.   Module        UNO
  8.   VCC   ——   5V
  9.   GND  ——   GND
  10.   VO    ——   A0
  11. */

  12. float distance[] = {20, 30, 40, 50, 60, 70, 80, 90, 100,  110,  120,  130,  140,  150};
  13. float voltage[14] = {2.5, 2, 1.55, 1.25, 1.1, 0.85, 0.8, 0.73, 0.7, 0.65, 0.6, 0.5, 0.45, 0.4};

  14. typedef struct {
  15.   float maxDistance;  //cm
  16.   float minDistance;  //cm
  17.   float offset; //cm
  18.   float distance; //cm,
  19.   int frequency;  //Hz
  20.   int pin;
  21. }SHARP;

  22. SHARP Sharp = {150, 20, 0, 0, 20, A0};

  23. void getDistance(SHARP* Sharp) {
  24.   float v = analogRead(Sharp->pin);
  25.   v = v / 1024.0 * 5;
  26.   int index = 0;
  27.   for(index = 0; index < 14; index++) {
  28.     if(v >= voltage[index]) {
  29.       break;
  30.     }
  31.   }
  32.   if(index == 0) {
  33.     Sharp->distance = 20;
  34.   } else if(index == 14) {
  35.     Sharp->distance = 150;
  36.   } else {
  37.     Sharp->distance = map(v, voltage[index], voltage[index-1], distance[index], distance[index-1]);
  38.   }
  39. }

  40. void setup() {
  41.   Serial.begin(115200);
  42. }

  43. void loop() {
  44.   static unsigned long lastTime = millis();
  45.   if(millis() - lastTime > 1000/Sharp.frequency) {
  46.     lastTime = millis();
  47.     getDistance(&Sharp);
  48.     Serial.println(Sharp.distance);
  49. //    int v = analogRead(Sharp.pin);
  50. //    Serial.println(v);
  51.   }  
  52. }
復(fù)制代碼



作者: eagler8    時間: 2019-10-6 18:57


作者: eagler8    時間: 2019-10-6 19:24
  1. /*
  2.   【Arduino】108種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
  3.   實驗一百三十三:夏普GP2Y0A02YK0F 紅外測距傳感器模塊 20-150cm 距離傳感器
  4.   庫地址:https://github.com/guillaume-rico/SharpIR
  5.   項目:測試距離的方案之四
  6.   Module        UNO
  7.   VCC   ——   5V
  8.   GND  ——   GND
  9.   VO    ——   A0
  10. */

  11. #include <SharpIR.h>

  12. #define ir A0    //模擬輸入引腳
  13. #define model 20150    //傳感器型號
  14. // ir: the pin where your sensor is attached
  15. // model: an int that determines your sensor:  1080 for GP2Y0A21Y
  16. //                                            20150 for GP2Y0A02Y
  17. //                                            100500 for GP2Y0A710K0F
  18. //                                            430   for  GP2YA41SK0F
  19. //                                            (working distance range according to the datasheets)

  20. SharpIR SharpIR(ir, model);

  21. void setup() {
  22.   // put your setup code here, to run once:
  23.   Serial.begin(9600);
  24. }

  25. void loop() {
  26.   delay(500);

  27.   unsigned long pepe1 = millis(); // takes the time before the loop on the library begins

  28.   int dis = SharpIR.distance(); // this returns the distance to the object you're measuring


  29.   Serial.print("Mean distance: ");  // returns it to the serial monitor
  30.   Serial.println(dis);

  31.   unsigned long pepe2 = millis() - pepe1; // the following gives you the time taken to get the measurement
  32.   Serial.print("Time taken (ms): ");
  33.   Serial.println(pepe2);
  34. }
復(fù)制代碼



作者: eagler8    時間: 2019-10-6 19:26


作者: eagler8    時間: 2019-10-6 19:44


作者: eagler8    時間: 2019-10-6 20:03


作者: 電子酷酷    時間: 2019-10-25 11:12
你好 看的你的寫的 很詳細(xì) 很好
作者: eagler8    時間: 2019-11-20 11:06
電子酷酷 發(fā)表于 2019-10-25 11:12
你好 看的你的寫的 很詳細(xì) 很好

謝謝鼓勵
作者: ahlc    時間: 2019-11-21 22:01
很棒很有創(chuàng)意
作者: eagler8    時間: 2019-11-25 10:18
ahlc 發(fā)表于 2019-11-21 22:01
很棒很有創(chuàng)意

謝謝鼓勵

作者: dcd    時間: 2019-12-3 21:32
這個圖形化編程是那個軟件
作者: eagler8    時間: 2019-12-16 12:57
dcd 發(fā)表于 2019-12-3 21:32
這個圖形化編程是那個軟件

是Mind+
作者: ssw2020    時間: 2020-6-22 09:46
樓主可以考慮開個小店了,邊做實驗邊把自己的實驗成果分享,有興趣的又可以跟隨著你的實驗筆記進行測試,這種思路真的很棒
作者: eagler8    時間: 2020-10-24 15:46
ssw2020 發(fā)表于 2020-6-22 09:46
樓主可以考慮開個小店了,邊做實驗邊把自己的實驗成果分享,有興趣的又可以跟隨著你的實驗筆記進行測試,這 ...

謝謝鼓勵,作為初學(xué)者,通過發(fā)帖,也是學(xué)習(xí)的一種辦法
作者: 314267271    時間: 2020-11-18 16:19
非常有用
作者: eagler8    時間: 2020-11-23 21:59
314267271 發(fā)表于 2020-11-18 16:19
非常有用

謝謝鼓勵
作者: yyyy99    時間: 2020-12-1 14:15
你好,我想STM32上使用這個傳感器,但是我不知道ADC的電壓轉(zhuǎn)換成距離的公式。請指教




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1