気の向くままに辿るIT/ICT/IoT
IoT・電子工作

Arduinoでステッピングモータ駆動の回転台を正転/逆転/停止

ホーム前へ次へ
Arduinoって?

Arduinoでステッピングモータ駆動の回転台を正転/逆転/停止

Arduinoでステッピングモータ駆動の回転台を正転/逆転/停止

2018/09/04
Arduino Nano/28BYJ-48-5V/ULN2003製ターンテーブルを正転・逆転・停止する回路

 Arduino/ステッピングモータ28BYJ-48-5V/モータドライバULN2003を使った回転台をボタン操作で正転、逆転、停止させてみるページ。

 停止時の電流はゼロ、正転(時計回り)・逆転(半時計回り)時の電流値は、0.08〜0.12A程度(安価なUSBデジタル電圧・電流計で計測)。

必要なモノ・使ったモノ

 使った材料は次の通り。

 別になくてもよい、もしくは、代替できれば何でも良い、その他の材料。

 テーブルには、前回のダンボール紙片に代えて今度は要らないコンパクトディスクを使いました。

 ミニバイスは、100円ショップのダイソー(有無は店舗による)で買ったもの。

 ちなみにターンテーブルに載っているのは、ESP32 DevKitC/DevKit開発ボード互換機。

回路・スケッチ

// 2-2相励磁
// このサンプルコードは28BYJ-48の時計回り・逆回りを行うデモです。
// ULN2003 インターフェースボードを使用。つまりただのトランジスタアレイで駆動するだけ
// 28BYJ-48モーターは4相、8ビートモーター。
// 減速ギア非68倍。 1バイポーラ巻線。ステップ角は5.625/64。
// 動作周波数100PPS。電流92mA。
// URL変わった模様。
// http://hp.hana-neko.com/archives/693
// => https://hp.hana-neko.com/archives/693
/*
モータ停止状態でもコイルには電流が流れ続けます。
なので結構な発熱があります。
停止中に電流切るには
 
int lookup[9] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001, B00000};
 
などとやって、停止中は9番目の要素を意図的に呼び出すと吉。
*/
////////////////////////////////////////////////
//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 lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
int lookup[9] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001, B00000};
 
const int btnL = 4; // 反時計回りボタン用
const int btnR = 5; // 時計回りボタン用
const int btnS = 6; // 停止ボタン用
//////////////////////////////////////////////////////////////////////////////
void setup() {
 Serial.begin(9600);
 //declare the motor pins as outputs
 pinMode(motorPin1, OUTPUT);
 pinMode(motorPin2, OUTPUT);
 pinMode(motorPin3, OUTPUT);
 pinMode(motorPin4, OUTPUT);
 
 pinMode(btnL, INPUT_PULLUP);
 pinMode(btnR, INPUT_PULLUP);
 pinMode(btnS, INPUT_PULLUP);
}
 
//////////////////////////////////////////////////////////////////////////////
void loop(){
 if(!digitalRead(btnR)) {
  while(digitalRead(btnS)) {
   if(!digitalRead(btnL)) break;
   clockwise();
  }
 }
 else if(!digitalRead(btnL)) {
  while(digitalRead(btnS)) {
   if(!digitalRead(btnR)) break;
   anticlockwise();
  }
 }
 else if(!digitalRead(btnS)) {setOutput(9);}
}
 
//////////////////////////////////////////////////////////////////////////////
 
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));
}

 スケッチは、オルゴールの回転体100均ターンテーブルを回すでも使わせて頂いたステッピングモータ 28BYJ をarduinoで動かしてみるの2-2相励磁を、コメントの通り、停止も含め、参照させて頂いた上、今回、こんな感じに書き換えました。

 削除した部分はともかく、追加・編集したのは、太字部分の2ブロック(URL変更部含めると3ブロック)。

 正転/逆転時に対となる逆転/正転ボタンの状態を評価、押された場合、breakする(whileループを抜ける)ことで即、反転します。(これを行わない場合、何れかの回転時は、停止しかできません。)

 停止の意味がなくなりますが、それはさておき、whileループしない場合は、タクトスイッチ押下ごとに時計方向、もしくは反時計方向に1ステップ動くだけ。

 回路は、信号線は、スケッチの通り、タクトスイッチは、冒頭写真の通り、ブレッドボードの絶縁された両サイドを利用し、タクトスイッチを挟んで各信号線と各GNDをそれぞれ対角に配線。

 なぜ、8回ループさせているのかは、ステッピングモータの仕様によるなど28BYJ-48については、ステッピングモーターを動かしてみよう。 elekit.co.jp(PDFがローカルにダウンロードされる)が、簡潔明瞭でわかりやすいと思います。

 ちなみに参照元スケッチに書いてある元となる4tronix Arduinoをたどると信号線1つとか2つとかでも動かせそうなことが書いてあり、1つのパターンは他の2本を停止させ、残り2本でもなんとか動かせたものの、他のパターンは再現できず。

ホーム前へ次へ