2018年5月27日日曜日

ステッピングモータ 28BYJ をarduinoで動かしてみる

28BYJというステッピングモータを入手したので動かしてみた。
国内価格500円程度。
4相モータなのでHブリッジいらずで駆動させやすい。最近は4相モータ見かけなくなったなあ。



だいたい、このULN2003 インターフェースボードと一緒に売ってる。
これは単なるトランジスタアレイなのでコイルに与える位相信号は自ら作り出す必要がある。面倒だねえ。


接続はarduinoにそのまま刺してみた。+-はクリップで供給。これで問題なく動作したよ。詳しくはサンプルコード見てね。

サンプルコード。これは 4tronix Arduino のコードを丸ごと使わせてもらっている。2-2相励磁 で動いてるよ。原理はこのへん 2-2相励磁 を参照。
実測消費電流は139mA(無負荷)
トルクはまあまああるけど、指でグッと掴むと止まる。
// このサンプルコードは28BYJ-48の時計回り・逆回りを行うデモです。
// ULN2003 インターフェースボードを使用。つまりただのトランジスタアレイで駆動するだけ
// 28BYJ-48モーターは4相、8ビートモーター。
// 減速ギア非68倍。 1バイポーラ巻線。ステップ角は5.625/64。
// 動作周波数100PPS。電流92mA。
////////////////////////////////////////////////
//Base Code 
// 4tronix Arduino http://www.4tronix.co.uk/arduino/Stepper-Motors.php

int motorPin1 = 8;    // Blue   - 28BYJ48 pin 1
int motorPin2 = 9;    // Pink   - 28BYJ48 pin 2
int motorPin3 = 10;    // Yellow - 28BYJ48 pin 3
int motorPin4 = 11;    // Orange - 28BYJ48 pin 4
                        // Red    - 28BYJ48 pin 5 (VCC)

int motorSpeed = 1200;  //速度。数値が小さいほど速くなる。800以下は脱調して動かない
int count = 0;          // count of steps made
int countsperrev = 512; // number of steps per full revolution
int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

//////////////////////////////////////////////////////////////////////////////
void setup() {
  //declare the motor pins as outputs
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  Serial.begin(9600);
}

//////////////////////////////////////////////////////////////////////////////
void loop(){
  if(count < countsperrev )
    clockwise();
  else if (count == countsperrev * 2)
    count = 0;
  else
    anticlockwise();
  count++;
}

//////////////////////////////////////////////////////////////////////////////

void anticlockwise()    //反時計回り
{
  for(int i = 0; i < 8; i++)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}

void clockwise()    //時計回り
{
  for(int i = 7; i >= 0; i--)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}

void setOutput(int out)
{
  digitalWrite(motorPin1, bitRead(lookup[out], 0));
  digitalWrite(motorPin2, bitRead(lookup[out], 1));
  digitalWrite(motorPin3, bitRead(lookup[out], 2));
  digitalWrite(motorPin4, bitRead(lookup[out], 3));
}




1-1相励磁のも書いてみた。消費電流85mA程度まで落ちている。
トルクはかなり弱くなった。指で軸を掴むと止まってしまうくらい弱い。
赤文字部分が2-2相と比較した変更点。
// このサンプルコードは28BYJ-48の時計回り・逆回りを行うデモです。
// ULN2003 インターフェースボードを使用。つまりただのトランジスタアレイで駆動するだけ
// 28BYJ-48モーターは4相、8ビートモーター。
// 減速ギア非68倍。 1バイポーラ巻線。ステップ角は5.625/64。
// 動作周波数100PPS。電流92mA。
////////////////////////////////////////////////
//Base Code 
// 4tronix Arduino http://www.4tronix.co.uk/arduino/Stepper-Motors.php


int motorPin1 = 8;    // Blue   - 28BYJ48 pin 1
int motorPin2 = 9;    // Pink   - 28BYJ48 pin 2
int motorPin3 = 10;    // Yellow - 28BYJ48 pin 3
int motorPin4 = 11;    // Orange - 28BYJ48 pin 4
                        // Red    - 28BYJ48 pin 5 (VCC)

int motorSpeed = 2300;  //速度。数値が小さいほど速くなる。2000以下は脱調が起きる
int count = 0;          // count of steps made
int countsperrev = 512; // number of steps per full revolution
//int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
int lookup[4] = {B01000, B00100, B00010, B00001};  //1-1相

//////////////////////////////////////////////////////////////////////////////
void setup() {
  //declare the motor pins as outputs
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  Serial.begin(9600);
}

//////////////////////////////////////////////////////////////////////////////
void loop(){
  if(count < countsperrev )
    clockwise();
  else if (count == countsperrev * 2)
    count = 0;
  else
    anticlockwise();
  count++;
}

//////////////////////////////////////////////////////////////////////////////

void anticlockwise()    //反時計回り
{
  for(int i = 0; i < 4; i++)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}

void clockwise()    //時計回り
{
  for(int i = 3; i >= 0; i--)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}

void setOutput(int out)
{
  digitalWrite(motorPin1, bitRead(lookup[out], 0));
  digitalWrite(motorPin2, bitRead(lookup[out], 1));
  digitalWrite(motorPin3, bitRead(lookup[out], 2));
  digitalWrite(motorPin4, bitRead(lookup[out], 3));
}


[追記]

モータ停止状態でもコイルには電流が流れ続けます。
なので結構な発熱がある。
停止中に電流切るには
int lookup[9] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001, B00000};
などとやって、停止中は9番目の要素を意図的に呼び出すと吉。





.

0 件のコメント:

コメントを投稿