2018年5月27日 星期日

用 Arduino 控制樂拼伺服馬達


既然樂拼伺服馬達的接線造好了,接著是找出控制訊號的格式。我選了方便使用的 Arduino Nano 及用來方便切換馬達正負極的 L293D 來進行測試。


測試的概念是利用 Arduino Nano 的 D3 腳接 L293D 的 3,4EN 腳;D3 可以輸出 PWM 訊號,用來測試樂拼伺服馬達是否跟坊間的伺服馬達一樣,同樣使用 1.5ms 至 2.5ms 的方波訊號來決定角度。利用 Arduino Nano 的 D7 及 D8 接到 L293D 的 3A 及 4A。這兩隻腳的 HIGH, LOW 決定馬達順轉或 LOW, HIGH 逆轉。


把樂拼伺服馬達的 9V 接到 L293D 的 VCC2,同時也接到鋰電池的 +9V;把 GND 接到 GND,同時也接到鋰電池的 GND;把 C1 接到 3Y;把 C2 接到 4Y。到目前為止,接線已經差不多,只欠 L293D 自己的電源。把 VCC1 接到 Arduino 的 VIN 腳。我的 Arduino Nano 是由 USB 取電,所以 VIN 可當成 5V 輸出。

接線完成!之後就要編寫一個簡單程序進行測試:
//------------------------------------------------------------
//  LEGO Servo Controller
//------------------------------------------------------------
//  Platfrom: Arduino Nano + L293D + LEGO Power Function Servo
//  Copyrights Pacess Studio, 2018.  All rights reserved.
//------------------------------------------------------------

//  Constant values
const int servoEnablePin = 3;
const int servoControlPinA = 7;
const int servoControlPinB = 8;

//------------------------------------------------------------
//  60 = Center
//  200 = Side
int steering = 0;
int delta = 1;

//  0 = Clockwise
//  1 = Counter-clockwise
int type = 0;

//------------------------------------------------------------
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  pinMode(servoControlPinA, OUTPUT);
  pinMode(servoControlPinB, OUTPUT);
  pinMode(servoEnablePin, OUTPUT);

  //  Steering centered
  digitalWrite(servoEnablePin, LOW);
  setDirection();

  Serial.println("Please input a value:");
}

//------------------------------------------------------------
void setDirection()  {
  if (type == 0)  {

    //  Clockwise
    digitalWrite(servoControlPinA, LOW);
    digitalWrite(servoControlPinB, HIGH);
    return;
  }

  //  Counter clockwise
  digitalWrite(servoControlPinA, HIGH);
  digitalWrite(servoControlPinB, LOW);
}

//------------------------------------------------------------
void loop() {
  // put your main code here, to run repeatedly:
  char input[16];
  byte size = Serial.readBytesUntil('\n', input, 16-1);
  input[size] = 0;

  steering = atoi(input);
  if (steering > 0)  {
    Serial.println(steering);
    analogWrite(servoEnablePin, steering);
  }
  
  if (steering < 0)  {
    type = (type+1)&1;
    setDirection();
  }
}

結果發現,樂拼伺服馬達不像普請的伺服馬達,暫時只能做出 90 度的旋轉。數值為 60 置中,170 為 90 度。利用 C1 及 C2 的正反向決定順時針,還是逆時針。

沒有留言: