數位學習平台 ↗ EN 聯絡我們

登月小車 AMB82 MINI AI 自駕車(一)基礎認識:硬體安裝、馬達、OLED 與按鈕

登月小車 AMB82 MINI AI 自駕車(一)基礎認識:硬體安裝、馬達、OLED 與按鈕

本系列使用 登月小車(AMB82 MINI),從硬體安裝、蒐集與標註資料、訓練 YOLOv7-tiny 模型,一路做到能辨識交通標誌的自駕小車。這是第一篇。

1-1. 硬體安裝

因為AMB82 MINI 是沒有辦法直接裝在登月小車上的,所以我們會需要AMB82 Breakout 這塊轉接板。

因為AMB82 MINI 是沒有辦法直接裝在登月小車上的,所以我們會需要AMB82 Breakout 這塊轉接板。

AMB82 Breakout 有一面有AMB82 MINI 的安裝位置,這兩排母座可讓AMB82 MINI 安裝後,每個針腳向外各擴充一個插座。

AMB82 Breakout 有一面有AMB82 MINI 的安裝位置,這兩排母座可讓AMB82 MINI 安裝後,每個…

請將AMB82 MINI 與AMB82 Breakout 依照下圖方向安裝,以AMB82 Breakout 的金屬排插向下,將AMB82 MINI 旋轉180 度插上AMB82 Breakout 的安裝插座。

安裝好後鏡頭這邊為正面,OLED 那邊為背面。

安裝好後鏡頭這邊為正面,OLED 那邊為背面。

針腳與母座請確實安裝,按壓時請不要對OLED 施力,以免螢幕破裂。

針腳與母座請確實安裝,按壓時請不要對OLED 施力,以免螢幕破裂。

最後整個插上登月小車,記得先將登月小車的超音波模組取下再安裝。完成後如下圖所示:

最後整個插上登月小車,記得先將登月小車的超音波模組取下再安裝。完成後如下圖所示
最後整個插上登月小車,記得先將登月小車的超音波模組取下再安裝。完成後如下圖所示

1-2. 控制馬達

首先我們需要了解登月小車上有什麼功能,以及每個功能對應的腳位編號。這樣我們才能查詢連接到AMB82 MINI 的腳位是哪幾個?為了方便大家操作,我們已經整理了腳位對照圖給大家:

首先我們需要了解登月小車上有什麼功能,以及每個功能對應的腳位編號。這樣我們才能查詢連接到AMB82 MINI 的腳位是哪…

如果要控制馬達,對應的AMB82 MINI 腳位會是M1 馬達(右馬達) 腳位為4、1。M2 馬達(左馬達) 的腳位,依照對照圖則是5、2。

這些腳位數字皆對應你在Arduino IDE 編寫時,直接控制的腳位編號。也就是說控制馬達PWM 時,直接寫analogWrite(4, 200) 即可控制,不用另外查詢對應腳位。

我們馬上打開Arduino IDE 來實戰一下,關於如何把AMB82 MINI 加入Arduino IDE 的部分我們這邊不會教學,官方已經有詳細的內容,還沒設定的同學可以參考官方內容。

我們習慣在一開始會去定義每個腳位代表的意思,用整數變數方法來實現。除了在之後寫程式可以較清楚之外,若事後更動腳位,只要在開頭這裡做調整即可。

int M1A = 4;
int M1B = 1;
int M2A = 5;
int M2B = 2;

setup 的部分需要賦予每個腳位功能,因為我們要用來控制馬達,所以設定為輸出。

void setup() {
  pinMode(M1A, OUTPUT);
  pinMode(M1B, OUTPUT);
  pinMode(M2A, OUTPUT);
  pinMode(M2B, OUTPUT);
}

我們讓登月小車前進—>後退—>停止,然後不停循環。AMB82 MINI 在Arduino IDE 中預設的PWM 範圍是 0~255。我們只是在桌面測試,所以不需要全速這麼快,大約設定個120 吧!為了避免腳位設定錯誤造成登月小車失控,或是怕輪子轉動中不好拿取,我們讓停止的秒數設多一點。

void loop() {
  analogWrite(M1A, 120);
  analogWrite(M1B, 0);
  analogWrite(M2A, 120);
  analogWrite(M2B, 0);
  delay(1000);
  analogWrite(M1A, 0);
  analogWrite(M1B, 120);
  analogWrite(M2A, 0);
  analogWrite(M2B, 120);
  delay(1000);
  analogWrite(M1A, 0);
  analogWrite(M1B, 0);
  analogWrite(M2A, 0);
  analogWrite(M2B, 0);
  delay(5000);
}

完整程式如下:

int M1A = 4;
int M1B = 1;
int M2A = 5;
int M2B = 2;

void setup() {
  pinMode(M1A, OUTPUT);
  pinMode(M1B, OUTPUT);
  pinMode(M2A, OUTPUT);
  pinMode(M2B, OUTPUT);
}

void loop() {
  analogWrite(M1A, 120);
  analogWrite(M1B, 0);
  analogWrite(M2A, 120);
  analogWrite(M2B, 0);
  delay(1000);
  analogWrite(M1A, 0);
  analogWrite(M1B, 120);
  analogWrite(M2A, 0);
  analogWrite(M2B, 120);
  delay(1000);
  analogWrite(M1A, 0);
  analogWrite(M1B, 0);
  analogWrite(M2A, 0);
  analogWrite(M2B, 0);
  delay(5000);
}

請依照正常流程將程式下載到AMB82 MINI。

請依照正常流程將程式下載到AMB82 MINI。

完成後移除Micro USB 線,並打開登月小車的電源,看看車子是否依照程式邏輯動作,前進—>後退—>停止。

完成後移除Micro USB 線,並打開登月小車的電源,看看車子是否依照程式邏輯動作,前進—>後退—>停止。

1-3. OLED 顯示與按鈕控制

AMB82 Breakout 提供OLED 與兩個按鈕,OLED 是使用I2C 通訊,走的是AMB82 MINI 預設的SDA 與SCL。按鈕A 是18,按鈕B 是7。

AMB82 Breakout 提供OLED 與兩個按鈕,OLED 是使用I2C 通訊,走的是AMB82 MINI 預設的…

直接實戰,從Arduino IDE 開一個新的視窗,我們會將兩個功能寫在一起測試。當我們按下按鈕A,OLED 就顯示Button A!,按下按鈕B,OLED 就顯示Button B!

AMB82 Breakout 使用的OLED 驅動是SSD1306,所以首先我們參考AMB82 MINI 控制SSD1306 的程式做設定,在這邊要特別注意的地方是,我們AMB82 Breakout 上的OLED I2C 位置是0x3C,這部分不能設定錯誤,否則會無法控制。

#include <Wire.h>
#include <Adafruit_OLED_libraries/Adafruit_GFX.h>
#include <Adafruit_OLED_libraries/Adafruit_SSD1306.h>

#define SCREEN_WIDTH  128
#define SCREEN_HEIGHT 64

#define OLED_RESET     -1
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

接著是定義按鈕與腳位的關係。

int ButtonA = 18;
int ButtonB = 7;

在setup 的地方我們會檢查是否有讀取到SSD1306,否則藉由序列埠顯示錯誤。接著設定兩個按鈕腳位為輸入功能。

void setup() {
    Serial.begin(115200);

    if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
        Serial.println(F("SSD1306 allocation failed"));
        while (true) {}
    }

    pinMode(ButtonA, INPUT);
    pinMode(ButtonB, INPUT);
}

按鈕沒有按下時,AMB82 MINI 會讀取到的訊號是true,按下的話則是false。我們依照這樣的規則編寫下方的程式,當誰的訊號為false,則是被按下,那我們就能針對被按下的按鈕顯示對應文字。

void loop() {
    if (digitalRead(ButtonA) == false) {
        display.clearDisplay();
        display.setTextSize(1);
        display.setTextColor(SSD1306_WHITE);
        display.setCursor(0, 0);
        display.println(F("Button A!"));
        display.display();
    }else if (digitalRead(ButtonB) == false) {
        display.clearDisplay();
        display.setTextSize(1);
        display.setTextColor(SSD1306_WHITE);
        display.setCursor(0, 0);
        display.println(F("Button B!"));
        display.display();
    }
}

完整程式如下:

#include <Wire.h>
#include <Adafruit_OLED_libraries/Adafruit_GFX.h>
#include <Adafruit_OLED_libraries/Adafruit_SSD1306.h>

#define SCREEN_WIDTH  128
#define SCREEN_HEIGHT 64

#define OLED_RESET     -1
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

int ButtonA = 18;
int ButtonB = 7;

void setup() {
    Serial.begin(115200);

    if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
        Serial.println(F("SSD1306 allocation failed"));
        while (true) {}
    }

    pinMode(ButtonA, INPUT);
    pinMode(ButtonB, INPUT);
}

void loop() {
    if (digitalRead(ButtonA) == false) {
        display.clearDisplay();
        display.setTextSize(1);
        display.setTextColor(SSD1306_WHITE);
        display.setCursor(0, 0);
        display.println(F("Button A!"));
        display.display();
    }else if (digitalRead(ButtonB) == false) {
        display.clearDisplay();
        display.setTextSize(1);
        display.setTextColor(SSD1306_WHITE);
        display.setCursor(0, 0);
        display.println(F("Button B!"));
        display.display();
    }
}

透過Arduino IDE 將程式下載到AMB82 MINI,試著按按兩個按鈕並觀察OLED。是否如程式邏輯那樣,按下按鈕A 或按下按鈕B 時有對應的顯示。

透過Arduino IDE 將程式下載到AMB82 MINI,試著按按兩個按鈕並觀察OLED。是否如程式邏輯那樣,按下按…

1-4. 電池充電

登月小車本身有充電電路,使用者不用把電池拔起來找專用充電器充電,只要一條Micro USB 線即可。登月小車出廠時有提供這條Micro USB 線(具備數據傳輸功能),你可以用它為AMB82 MINI 下載程式,或是為電池充電。

充電方法很簡單,只要將Micro USB 這頭接到車子上面的Micro USB 插孔,另一端USB 頭插到你常用的手機豆腐頭或電腦的USB 孔,就能對電池充電。

充電方法很簡單,只要將Micro USB 這頭接到車子上面的Micro USB 插孔,另一端USB 頭插到你常用的手機豆…

充電時記得關閉登月小車的電源,讓充電效率最大化。充電時登月小車為亮紅燈(如上圖所示),充飽的話則是綠燈。

總結

這個單元就是對產品基礎的認識與使用,只是開胃菜而已。下個單元我們就會進到如何蒐集資料?如何訓練模型?以及轉換成AMB82 MINI 能用的模型檔案,最終在程式中讀取與推論。

系列文章

  1. (一)基礎認識(本篇)
  2. (二)資料蒐集
  3. (三)資料標註
  4. (四)訓練模型與轉換
  5. (五)自動駕駛