1.3.3 ステッピングモーター

前書き

独自の設計により、ステッピングモーターはフィードバックメカニズムなしで高度な精度で制御できる。一連の磁石が取り付けられたステッパーのシャフトは、特定のシーケンスで正と負に帯電する一連の電磁コイルによって制御され、小さな「ステップ」で前後に正確に移動する。

部品

_images/list_1.3.3.png

原理

ステッピングモーター

ステッパーには、ユニポーラーとバイポーラーの2つのタイプがあり、使用しているタイプを知ることが非常に重要である。この実験では、ユニポーラステッパーを使用する。

ステッピングモーターは単相DC電源を使用する4相モーターである。適切な時系列でモーターのすべての相巻線に通電する限り、一歩一歩に回転させることができる。4相リアクティブステッピングモーターの概略図:

_images/image129.png

図では、モーターの中央にローター-歯車状の永久磁石がある。ローターの周りの0〜5は歯である。さらに外側には、8つの磁極があり、それぞれ反対側の2つの磁極がコイル巻線で接続されている。そのため、AからDまでの4つのペアを形成し、相と呼ばれる。スイッチSA、SB、SC、SDに接続するリード線が4本ある。したがって、回路では4つの相が並列になっており、1つの相の2つの磁極は直列になっている。

4相ステッピングモーターの動作原理は次の通りである:

スイッチSBの電源がオンになると、スイッチSA、SC、およびSDの電源がオフになり、B相の磁極がローターの歯0と3と整列する。同時に、歯1と4は、C相とD相の極を持つ互い違いに配列した歯を生成する。歯2と5は、D相とA相の極を持つ互い違いに配列した歯を生成する。スイッチSCの電源がオン、スイッチSB、SA、およびSDの電源がオフの場合、ローターはC相巻線の磁場と歯1と4の間の磁場の下で回転する。次に、歯1と4がC相巻線の磁極と整列する。一方、歯0と3はA相とB相の極を持つ互い違いに配列した歯を生成し、歯2と5はA相とD相の極を持つ互い違いに配列した歯を生成する。同様の状況が続いていく。A、B、C、D相に順番に通電すると、ローターはA、B、C、Dの順に回転する。

_images/image130.png

4相ステッピングモーターには、3つの動作モードがある:シングル4ステップ、ダブル4ステップ、および8ステップ。シングル4ステップとダブル4ステップのステップ角は同じであるが、シングル4ステップの駆動トルクは小さくなる。8ステップのステップ角は、シングル4ステップおよびダブル4ステップの半分である。したがって、8ステップの動作モードは、高い駆動トルクを維持し、制御精度を向上させることができる。

使用するステッピングモーターのステータには32個の磁極があるため、円には32ステップが必要である。ステッピングモーターの出力軸は減速装置セットに接続され、減速比は1/64である。ですから、最終出力シャフトは32 * 64 = 2048ステップを必要とする円を回転させる。

ULN2003

モーターを円に適用するには、ドライバーボードを使用する必要があります。ステッパーモータードライバ-ULN2003は7チャネルインバータサークルです。つまり、入力ピンが高レベルの場合、ULN2003の出力ピンは低レベルであり、その逆も同様です。IN1 に高レベルを供給し、IN2、IN3、IN4 に低レベルを供給すると、出力端 OUT1 は低レベルであり、他のすべての出力端は高レベルになります。チップの内部構造を以下に示します。

_images/image338.png

ULN2003チップと4つのLEDで構成されるステッピングモータードライバーを以下に示す。ボードでは、IN1、IN2、IN3、IN4が入力として機能し、4つのLED、A、B、C、Dは入力ピンの指示器である。さらに、OUT1、OUT2、OUT3、およびOUT4はそれぞれ、ステッピングモータードライバーのSA、SB、SC、およびSDに接続されている。IN1の値が高レベルに設定されると、Aが点灯し、スイッチSAの電源がオンになり、ステッピングモーターが1ステップで回転する。同様のケースが何度も繰り返される。したがって、ステッピングモーターに特定の時系列を与えるだけで、ステップごとに回転する。ステッピングモーターに特定の時系列を提供するために、ここでULN2003を使用する。

_images/image132.png

回路図

_images/image339.png

実験手順

ステップ1: 回路を作る。

_images/image134.png

C言語ユーザー向け

ステップ2: コードのフォルダーに入る。

cd /home/pi/davinci-kit-for-raspberry-pi/c/1.3.3/

ステップ3: コードをコンパイルする。

gcc 1.3.3_StepperMotor.c -lwiringPi

ステップ4: EXEファイルを実行する。

sudo ./a.out

コードが実行されると、入力「a」または「c」に応じてステッピングモーターが時計回りまたは反時計回りに回転する。

注釈

If it does not work after running, or there is an error prompt: "wiringPi.h: No such file or directory", please refer to Cコードが機能していませんか?.

コード

#include <stdio.h>
#include <wiringPi.h>

const int motorPin[] = {1, 4, 5, 6};
int rolePerMinute = 15;
int stepsPerRevolution = 2048;
int stepSpeed = 0;

void rotary(char direction){
    if(direction == 'c'){
        for(int j=0;j<4;j++){
            for(int i=0;i<4;i++)
                {digitalWrite(motorPin[i],0x99>>j & (0x08>>i));}
            delayMicroseconds(stepSpeed);
        }
    }
    else if(direction =='a'){
        for(int j=0;j<4;j++){
            for(int i=0;i<4;i++)
                {digitalWrite(motorPin[i],0x99<<j & (0x80>>i));}
            delayMicroseconds(stepSpeed);
        }
    }
}

void loop()
{
    char direction = '0';
    while (1)
    {
        printf("select motor direction a=anticlockwise, c=clockwise: ");
        delay(100);
        direction=getchar();
        if (direction == 'c')
        {
            printf("motor running clockwise\n");
            delay(100);
            break;
        }
        else if (direction == 'a')
        {
            printf("motor running anti-clockwise\n");
            delay(100);
            break;
        }
        else
        {
            printf("input error, please try again!\n");
            delay(100);
        }
    }
    while(1)
    {
        rotary(direction);
    }
}

void main(void)
{
    if (wiringPiSetup() == -1)
    {
        printf("setup wiringPi failed !");
        return;
    }
    for (int i = 0; i < 4; i++)
    {
        pinMode(motorPin[i], OUTPUT);
    }
    stepSpeed = (60000000 / rolePerMinute) / stepsPerRevolution;
    loop();
}

コードの説明

int rolePerMinute = 15;
int stepsPerRevolution = 2048;
int stepSpeed = 0;

rolePerMinute: 1分あたりの回転数。このキットで使用されるステッピングモーターのRPMは0〜17である。

stepPerRevolution: 1ターンのステップ数、およびこのキットで使用されるステッピングモーターには、1回転あたり2048ステップが必要である。

stepSpeed: 各ステップに使用される時間、main()では、それらに値を割り当てる。「(60000000/rolePerMinute)/ stepsPerRevolution」(60,000,000 us = 1分)

void loop()
{
    char direction = '0';
    while (1)
    {
        printf("select motor direction a=anticlockwise, c=clockwise: ");
        direction=getchar();
        if (direction == 'c')
        {
            printf("motor running clockwise\n");
            break;
        }
        else if (direction == 'a')
        {
            printf("motor running anti-clockwise\n");
            break;
        }
        else
        {
            printf("input error, please try again!\n");
        }
    }
    while(1)
    {
        rotary(direction);
    }
}

loop() 関数は、2つの部分(2つのwhile(1)の間にある)に大まかに分けられている:

最初の部分の目的は、key valueを取得することである。「a」または「c」が取得されたら、ループを終了して入力を停止してください。

2番目の部分はロータリー(方向)を呼び出して、ステッピングモーターを動作させる。

void rotary(char direction){
    if(direction == 'c'){
        for(int j=0;j<4;j++){
            for(int i=0;i<4;i++)
                {digitalWrite(motorPin[i],0x99>>j & (0x08>>i));}
            delayMicroseconds(stepSpeed);
        }
    }
    else if(direction =='a'){
        for(int j=0;j<4;j++){
            for(int i=0;i<4;i++)
                {digitalWrite(motorPin[i],0x99<<j & (0x80>>i));}
            delayMicroseconds(stepSpeed);
        }
    }
}

ステッピングモーターを 時計回りに回転させる ために、motorPinのレベルス状態要求は以下の通りである:

_images/image340.png

したがって、2層のfor文を使用してMotorPinの潜在的な書き込みを実装する。

Step1では、j=0、i=0〜4。

motorPin [0]は高レベル(10011001&00001000 = 1)で書き込まれる

motorPin [1]は低レベル(10011001&00000100=0)で書き込まれる

motorPin [2]は低レベル(10011001&00000010 = 0)で書き込まれる

motorPin [3]は高レベル(10011001&00000001=1)で書き込まれる

Step2では、j=1、i= 0〜4。

motorPin [0]は高レベル(01001100&00001000 = 1)で書き込まれる

motorPin [1]は低レベル(01001100&00000100 = 1)などで書き込

まれる。

また、ステッピングモーターを 反時計回り に回転させるために、motorPinのレベルステータスを次の表に示す。

_images/image341.png

Step1では、j=0、i=0〜4。

motorPin [0]は高レベル(10011001&10000000 = 1)で書き込まれる

motorPin [1]は低レベル(10011001&01000000 = 0)で書き込まれる

ステップ2では、j=1、i=0〜4。

motorPin [0]は高レベル(00110010&10000000 = 0)で書き込まれる

motorPin [1]は低レベル(00110010&01000000 = 0)で書き込まれる

まれる。

Python言語ユーザー向け

ステップ2: コードのフォルダーに入る。

cd /home/pi/davinci-kit-for-raspberry-pi/python/

ステップ3: EXEファイルを実行する。

sudo python3 1.3.3_StepperMotor.py

コードが実行されると、入力「a」または「c」に応じて、ステッピングモーターが時計回りまたは反時計回りに回転する。

コード

注釈

以下のコードを 変更/リセット/コピー/実行/停止 できます。 ただし、その前に、 davinci-kit-for-raspberry-pi/python のようなソースコードパスに移動する必要があります。

import RPi.GPIO as GPIO
from time import sleep

motorPin = (18,23,24,25)
rolePerMinute =15
stepsPerRevolution = 2048
stepSpeed = (60/rolePerMinute)/stepsPerRevolution

def setup():
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)
    for i in motorPin:
        GPIO.setup(i, GPIO.OUT)

def rotary(direction):
    if(direction == 'c'):
        for j in range(4):
            for i in range(4):
                GPIO.output(motorPin[i],0x99>>j & (0x08>>i))
            sleep(stepSpeed)

    elif(direction == 'a'):
        for j in range(4):
            for i in range(4):
                GPIO.output(motorPin[i],0x99<<j & (0x80>>i))
            sleep(stepSpeed)

def loop():
    while True:
        direction = input('select motor direction a=anticlockwise, c=clockwise: ')
        if(direction == 'c'):
            print('motor running clockwise\n')
            break
        elif(direction == 'a'):
            print('motor running anti-clockwise\n')
            break
        else:
            print('input error, please try again!')
    while True:
        rotary(direction)

def destroy():
    GPIO.cleanup()

if __name__ == '__main__':
    setup()
    try:
        loop()
    except KeyboardInterrupt:
        destroy()

コードの説明

rolePerMinute =15
stepsPerRevolution = 2048
stepSpeed = (60/rolePerMinute)/stepsPerRevolution

rolePerMinute: 1分あたりの回転数。このキットで使用されるステッピングモーターのRPMは0〜17である。

stepPerRevolution: 1ターンのステップ数、およびこのキットで使用されるステッピングモーターには、1回転あたり2048ステップが必要である。

stepSpeed: 各ステップに使用される時間。それらに値を割り当てる:「(60/ rolePerMinute)/stepsPerRevolution」(60s = 1分)。

def loop():
    while True:
        direction = input('select motor direction a=anticlockwise, c=clockwise: ')
        if(direction == 'c'):
            print('motor running clockwise\n')
            break
        elif(direction == 'a'):
            print('motor running anti-clockwise\n')
            break
        else:
            print('input error, please try again!')
    while True:
        rotary(direction)

loop() 関数は、大きく分けて2つの部分に分かれている(2つのwhile(1)にある):

最初の部分の目的は、key valueを取得することである。「a」または「c」が取得されたら、ループを終了して入力を停止してください。

2番目の部分はロータリー(方向)を呼び出して、ステッピングモーターを動作させる。

def rotary(direction):
    if(direction == 'c'):
        for j in range(4):
            for i in range(4):
                GPIO.output(motorPin[i],0x99>>j & (0x08>>i))
            sleep(stepSpeed)

    elif(direction == 'a'):
        for j in range(4):
            for i in range(4):
                GPIO.output(motorPin[i],0x99<<j & (0x80>>i))
            sleep(stepSpeed)

ステッピングモーターを時計回りに回転させるために、motorPinのレベルステータスを次の表に示す:

_images/image342.png

したがって、2層のfor文を使用してMotorPinの潜在的な書き込みを実装する。

Step1では、j=0、i=0〜4。

motorPin [0]は高レベル(10011001&00001000 = 1)で書き込まれる

motorPin [1]は低レベル(10011001&00000100=0)で書き込まれる

motorPin [2]は低レベル(10011001&00000010 = 0)で書き込まれる

motorPin [3]は高レベル(10011001&00000001=1)で書き込まれる

Step2では、j=1、i= 0〜4。

motorPin [0]は高レベル(01001100&00001000 = 1)で書き込まれる

motorPin [1]は低レベル(01001100&00000100 = 1)などで書き込

まれる

また、ステッピングモーターを反時計回りに回転させるために、motorPinのレベルステータスを次の表に示す。

_images/image343.png

Step1では、j=0、i=0〜4。

motorPin [0]は高レベル(10011001&10000000 = 1)で書き込まれる

motorPin [1]は低レベル(10011001&01000000 = 0)で書き込まれる

Step2では、j=1、i= 0〜4。

motorPin [0]は高レベル(00110010&10000000 = 0)で書き込まれる

motorPin [1]は低レベル(00110010&01000000 = 0)で書き込まれる

まれる。

現象画像

_images/image135.jpeg