2016年5月10日 星期二

Parallax 雷射測距儀 + Arduino 範例

Parallax 雷射測距儀 

     使用的雷射測具裝置是 Parallax 的 Laser Range Finder - 2m偵測範圍是15CM~122CM解析度是1mm詳細規格請參閱原廠說明

https://www.parallax.com/product/28044

外觀長這樣

 顯示部分一樣是用 Nokia-5110-LCD  Library在這裡下載

https://github.com/adafruit/Adafruit-GFX-Library
https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library

        Parallax 的這光學測距裝置簡稱 LRF 是用雷射光束加上CMOS 影像感測器作為測距引擎,除了可直接輸出距離數據外還可輸出相對位置的數據供使用者自行計算也可以輸出捕捉到的完整圖像

  初步測試結果LRF在深色的場合幾乎100%可以正確測出距離白色的表面錯誤率較高透明表面非常困難超作.

      LRF 的指令都是 ASCII 可在一般終端機(Terminal)操作 LRF 是Open Source 的在 Parallax的網站可下載Schematic  PCB  Firmware等..設計資料,不過CPU 是用 Parallax 的 Propeller P8X32A,開發環境是用 Parallax 自己的 可自行下載



Arduino 程式碼

#include <SoftwareSerial.h>
#include <SPI.h>
#include <Adafruit_GFX.h>                                          //LCM 定義程式!!這三個要擺一起!!!
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544 (7, 6, 5, 4, 3);        //LCD 的腳位定義

#define rxPin    10  // Pin10 軟體串列埠輸入(這要連接到 LRF 的 SOUT pin)
#define txPin    11  // Pin11 軟體串列埠輸出  (這要連接到 LRF 的 SOUT pin)

#define BUFSIZE  16  // 設定緩衝區為16 Byte

// 重新命名軟體串列埠

SoftwareSerial lrfSerial =  SoftwareSerial(rxPin, txPin);

void setup()
{
  display.begin();                                 //這是 Adafruit_PCD8544  Library 定義的
  display.setContrast(60);                    //LCD 對比
  delay(1000);
  display.clearDisplay();                      // 清除LCD內容
  display.setTextSize(1);                      // 設定LCD自形大小
  display.setTextColor(BLACK);        //定義LCD顏色顏色

  // 設定 Pin

  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);

  //設定 Arduino Serial Monitor

  Serial.begin(9600);

  // 設定軟體串列埠

  lrfSerial.begin(9600);

  delay(2000);                        // 延遲2秒等 LRF啟動
  lrfSerial.print('U');               // 送出"U"字元
  while (lrfSerial.read() != ':');    // 等待 LRF回復 ':'    字元
  delay(10);                          // 延遲10mS
  lrfSerial.flush();                  // 清除緩衝區

  }

void loop()
{

  lrfSerial.print('R');         //送出 " R" 字元


  char lrfData[BUFSIZE];     // 資料數據緩衝區
  char offset = 0;                   // 偏移緩衝區
  lrfData[0] = 0;                    // 清除緩衝區  
  while(1)
  {
    if (lrfSerial.available() > 0) // 等待 LRF 寫資料
    {
      lrfData[offset] = lrfSerial.read();  // 將資料傳入緩衝區
      if (lrfData[offset] == ':')          // 如果收到字元 ":" 代表資料已經傳完,LRF 等待下一個命令
      {
        lrfData[offset] = 0;
        break;               // 跳出循環
      }
       
      offset++;
      if (offset >= BUFSIZE) offset = 0;
    }
  }

  display.display();
  display.clearDisplay();                             // 清除LCD內容
  display.print(lrfData);                              // 顯示測到的距離

  Serial.println(lrfData);                            // 送出距離資料到 Serial Monitor
  Serial.flush();                      
   
 }

成果


沒有留言:

張貼留言