.. note:: こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。 **参加する理由は?** - **エキスパートサポート**:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。 - **学び&共有**:ヒントやチュートリアルを交換してスキルを向上させましょう。 - **独占的なプレビュー**:新製品の発表や先行プレビューに早期アクセスしましょう。 - **特別割引**:最新製品の独占割引をお楽しみください。 - **祭りのプロモーションとギフト**:ギフトや祝日のプロモーションに参加しましょう。 👉 私たちと一緒に探索し、創造する準備はできていますか?[|link_sf_facebook|]をクリックして今すぐ参加しましょう! .. _1.3.3_stepper_motor_c_pi5: 1.3.3 ステッピングモーター ========================== 前書き ------------ 独自の設計により、ステッピングモーターはフィードバックメカニズムなしで高度な精度で制御できる。一連の磁石が取り付けられたステッパーのシャフトは、特定のシーケンスで正と負に帯電する一連の電磁コイルによって制御され、小さな「ステップ」で前後に正確に移動する。 部品 ---------- .. image:: ../img/list_1.3.3.png 原理 --------- **ステッピングモーター** ステッパーには、ユニポーラーとバイポーラーの2つのタイプがあり、使用しているタイプを知ることが非常に重要である。 この実験では、ユニポーラステッパーを使用する。 ステッピングモーターは単相DC電源を使用する4相モーターである。 適切な時系列でモーターのすべての相巻線に通電する限り、一歩一歩に回転させることができる。 4相リアクティブステッピングモーターの概略図: .. image:: ../img/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の順に回転する。 .. image:: ../img/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 は低レベルであり、他のすべての出力端は高レベルになります。 チップの内部構造を以下に示します。 .. image:: ../img/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を使用する。 .. image:: ../img/image132.png 回路図 ----------------- .. image:: ../img/image339.png 実験手順 ----------------------- ステップ1: 回路を作る。 .. image:: ../img/image134.png :width: 800 ステップ2: コードのフォルダーに入る。 .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/c/1.3.3/ ステップ3: コードをコンパイルする。 .. raw:: html .. code-block:: gcc 1.3.3_StepperMotor.c -lwiringPi ステップ4: EXEファイルを実行する。 .. raw:: html .. code-block:: sudo ./a.out コードが実行されると、入力「a」または「c」に応じてステッピングモーターが時計回りまたは反時計回りに回転する。 **コード** .. code-block:: c #include #include 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<>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(); } **コードの説明** .. code-block:: c 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分) .. code-block:: c 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番目の部分は ``rotary(direction)`` を呼び出して、ステッピングモーターを動作させる。 .. code-block:: c 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<>i));} delayMicroseconds(stepSpeed); } } } ステッピングモーターを **時計回りに回転させる** ために、motorPinのレベルス状態要求は以下の通りである: .. image:: ../img/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のレベルステータスを次の表に示す。 .. image:: ../img/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)で書き込まれる まれる。