Mastodon

Arduino 距離測量機

如果 Arduino 只是用來寫軟件那也太沒趣了,一定要用它來操作各種硬體!所以我在淘寶買了一堆不同的零件,今次就先試玩 LCM1602 IIC LCD 模塊和 US-100 超聲波距離感應器。

LCD 模塊

LCM1602是個很常見的 LCD 模塊,它可以顯示 2 行 16 個字,有背光 LCD ,還支援自定字符等操作。有了它就可以直接在 Arduino 上看見程式的輸出,不用靠電腦 console debug 了。

LCD

然而它的操作不簡單,一般來說它要 4 或 8 個 資料輸出外加 rs, rw, enable 的輸出,也就是說單是控制這個 LCD 已用上大部份 Arduino 的輸出了,不很化算。

這個 LCM1602 IIC 集成了PCF85741晶片,讓Arduino 可以透過 IIC 控制 1602 -- 這樣只要 2 個 analog IO 就可以控制 LCD 了,程式也簡化許多。

使用方法蠻簡單:安裝好相關的 library ,並在程式裡設定 LCD ,就可以跟普通 LCD 一樣操作這個 I2C LCD 了。

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Setup of LCM1602 driven by PCF85741
// A4 - SDA
// A5 - SCL
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  lcd.init();
  lcd.backlight();
  lcd.print("Hello, World!");
}

void loop() {}

超聲波距離感應器

讀幾本 Arduino 的書也有提到 PING 超聲波距離感應器。這種感應是機械人必備的零件。US-100 是國產的類似產品,雖然價格只是 1/10 (USD30.0 vs 人仔 20) ,但 US-100 的水準不差: 2-450cm 測距、溫度補償、Serial 或 GPIO 輸出。

US-100

這個例子中我用GPIO的方法測量:

  1. 先發一個高電平信號到 TRIG
  2. 等待 ECHO 輸出高電平信號
  3. 高電平信號的持續時間就是超聲波發射到返回的時間,測量的距離等於 (時間 * 音速 / 2) 。
void loop() {
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(50);
  digitalWrite(TRIG, LOW);

  time_echo_us = pulseIn(ECHO, HIGH);
  if (time_echo_us > 1) {
    len_mm = (time_echo_us * 34 / 100) / 2;
    Serial.print("Dist: ");
    Serial.print(len_mm, DEC);
    Serial.println("mm");
  }

  delay(1000);
}

US-100 的文件 有詳細的資料和 Serial 輸出的用法。

Arduino 距離測量機

結合以上兩者就可做一個超聲波距離測量機,把測量結果顯示到內置的 LCD 上。看看這個超簡易的機器的實際效果:

還不錯吧?除了機械人的感應外,US-100 還可以作偵測或開關,甚至用作簡單的輸入裝置,十分好玩!

完整的代碼請移玉步到 gist