見出し画像

ESP32とL6470でモータを回してみた①

ESP32とL6470を使ってステッピングモータを回したシリーズの記事が増えてきたので「もくじページ」を作成しました。→もくじページのリンク

きっかけ

小学生のときキテレツ大百科(とくにキテレツの祖先のキテレツ斎さん)に感銘を受け、自分だけのロボットをいつかつくりたいと考えていました。
ロボットをつくるにあたって、まずは一番最初に思いつくモータを回す必要があり、ステッピングモータを回しました。

今回やったこと

  • 自作のESP32基板と秋月電子通商で購入した「L6470使用 ステッピングモータードライブキット」を使用し、 ステッピングモーターを回してみました。

  • Amazonで購入した激安のロジックアナライザを使用し、ESP32基板とL6470の通信内容を覗いてみました。

使用した部品や機器など

①ESP32基板
自分で設計したESP32ですが、もちろん他からの購入しても同じです。

②L6470使用 ステッピングモータードライブキット
秋月電子通商から購入しましたが、ストロベリー・リナックスでも同様の基板を購入できるようです。

③ステッピングモータ
こちらも秋月電子通商から購入したバイポーラー ステッピングモーター「 ST-42BYH1004」です。2相バイポーラステッピングモータであれば、なんでもいいです。

④ロジックアナライザ
モータを回すのとは直接関係ありませんが、ESP32とL6470の通信内容を覗きたいと思いAmazonから激安のロジックアナライザを購入しました。

セットアップや使い方はこちらのサイトを参考にさせてもらいました。
・ユカイ工学テックブログ:格安ロジックアナライザ+PulseView導入&UART信号を見る

組み立て

①ESP32とL6470モータコントローラを接続するケーブルを準備
左側がブレッドボードに接続する側で、右側がL6470に接続する側です。(配線を一度解体すると、再度配線するのが大変なのでラベルを貼っています)

②配線
このような回路で配線しました。モータ駆動用の電源はパワーサプライから8Vを供給しています。

モータを回転させるコード

1秒間回転し、1秒間停止するというプログラムを作りました(正確には生成AI に作ってもらいました)。
私はVSCode+PlatformIO の環境でプログラムを作成しています。

platformio.ini

[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200

モータを回転させるプログラム

#include <Arduino.h>
#include <SPI.h>

#define PIN_SS 5

// L6470に命令を送る関数
void transfer(uint8_t data) {
    digitalWrite(PIN_SS, LOW);
    SPI.transfer(data);
    digitalWrite(PIN_SS, HIGH);
}

void setup() {
    Serial.begin(115200);

    //********************************************
    //ESP32にどのプログラムが入っているか後から確認できるように、
    // 書き込んだプログラムの情報をシリアルモニタに表示(必須ではない)
    while (!Serial);
    Serial.println("=== ESP32 Program Info ===");
    Serial.println("Program: 260510_esp32_L6470_motor_test.cpp");
    Serial.print("Build Date: ");
    Serial.print(__DATE__);
    Serial.print(" ");
    Serial.println(__TIME__);
    Serial.println("==========================");
    //********************************************

    pinMode(PIN_SS, OUTPUT);
    digitalWrite(PIN_SS, HIGH);

    SPI.begin();
    SPI.setDataMode(SPI_MODE3);
    delay(200);

    // デバイスリセット
    transfer(0xC0); 

}

void loop() {
    // 1秒間、正転(Runコマンド 0x51 + 速度3バイト)
    transfer(0x51); 
    transfer(0x00); transfer(0x5F); transfer(0xFF); 
    delay(1000);

    // 1秒間、停止(SoftStopコマンド 0xB0)
    transfer(0xB0); 
    delay(1000);
}

プログラムの説明

L6470に命令を送る関数

loopから1バイトのデータが届いたら、SS(L6470側はCSピン)をHIGH→LOWに切り替えて、データをL6470に送り、SS(L6470側はCSピン)をLOW→HIGHに戻すだけのコードです。

void transfer(uint8_t data) {
    digitalWrite(PIN_SS, LOW);
    SPI.transfer(data);
    digitalWrite(PIN_SS, HIGH);
}

Runコマンド

データシートの60ページにRunコマンドの記載があります。
デバイスメーカーのデータシートはこちら

データシートのRunコマンド

Runコマンドは4バイトのデータで構成されています。1バイト目(上の表の2行目)のDIR部分に”1”を入れれば正回転、"0"を入れれば逆回転となります。
Windows標準の電卓アプリをプログラマーに変更し上の表に書いてある1バイト目の”01010001”を入力すると16進数の”51”となります。つまり、プログラム内の” transfer(0x51); ”はRunコマンドを意味しているのがわかります。
コマンドの残り3バイト(22ビット分)はスピードとなります。
ちなみに、プログラムは16進数で書くのが必須というわけではなく、2進数で記載してもよく1バイト目は”0b01010001”となります。

Runコマンドの16進数

その他設定部分

今回は特にモータの動作に関する設定はしておらず、モータにかかる電圧はデフォルトの「電源電圧に対して16%」となるようです。今回は8Vの電源に接続しているので1.28Vとなります。
使用しているステッピングモータは定格電圧が5Vなので、それと比べて十分小さい電圧であり壊れることはないと思っています。

結果

モータの動作

モータが1秒間回って、1秒間停止しています。
私のESP32はブレッドボードに取り付けた際に2列分の接続スペースが確保できるように設計していますので、L6470とロジックアナライザを同時に接続可能です。ちなみに左上のLEDがチカチカしているのがL6470で右下の見切れている黒いやつがロジックアナライザです。

ロジックアナライザの解析内容

・CH1:MOSI、CH2:MISO、CH3:CLK、CH4:/SS
・サンプリング周期:12MHz
・サンプルサイズ:1k
・Decoder:SPI
・トリガー:/SSの立ち下がり

MOSI(ESP32からL6470への送信)を見ると、ソースコードの0x51, 0x00, 0x0F, 0xFF の4バイトが送信されているのが確認できて面白いですね。
L6470は1バイトごとにCS (/SS)をLOWにする必要があり、信号からも1バイトごとにCSを上げ下げしているのが確認されます。(CSのLOWをトリガーにサンプリングしているので、1つ目のLOWは見切れています)
クロックは常に働いていると思っていたのですが、データを送るときだけ動いているんですね。
今回の通信内容であるRunコマンドに対するレスポンスはないので、MISO(L6470からの戻り)は変化がなくて正常のようです。

いいなと思ったら応援しよう!