Monthly Archives: May 2019

マイクロマウス研修 Part13(岩本)

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

マイクロマウス研修(岩本)一覧
Part1Part2Part3Part4Part5Part6Part7Part8Part9Part10Prat11Part12、Part13

番外
Part8.1

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

こんにちは岩本です。
今回は、前回やりきれなかったサンプルプログラムSTEP6-3(run_ROT_PWM)の中身を確認していきたいと思います。
run.cに新しくプログラムは旋回のプログラムが追加されています。
49行目~57行目で直進の時と同様に目標ステップ数や加速度を決めて、60行目~74行目で右に曲がる時と左に曲がる時で、switch関数で分けてます。
その他は、直進と同じなので、省略します。

 

このまま、step7(P_control_run_usb)についても確認していきます。
このステップでは、センサでフィードバック制御をして、迷路の真ん中を走らせます。interrupt.cにcmt0とcmt1のプログラムが追加されています。
cmt0では、フィードバック制御について記載されています。

色々書いてありますが、使っているのはP制御のみです。下図に式の部分のみ抜き出してみました。
偏差は、左右のちらかの壁がなかった場合、計算が合わなくなってしまうため、壁がなかった場合、センサーの値が無効になります。そのため、片方のセンサーの値のみが有効な場合は、片方のセンサーの値を2倍にして帳尻を合わせています。
なお、上図52行目から63行目でD制御とI制御用の計算だけしてますが、制御では使ってません。ここから先は、自分で頑張ってやってみようということのようです。

また、P制御の操作量についてですが、通常の式では、”操作量 = 比例定数 × 偏差” で求められます。
しかし、速度が速い時と速度が遅い時で操作量が同じ場合、遅い時の方が急カーブになってしまいます。(スリップの可能性が出てくる。)
そのため、操作量に速度が掛けられています。0.001は速度を掛けた為、そのままだと操作量が大きすぎるため、調整しています。

cmt1では、4つのセンサの値を記録し、左右に壁が有るか無いかの確認をしています。

今回はここまでです。

続きを読む ›

Posted in Pi:Co Classic3 製作記


マイクロマウス研修(kora編)[25] モータマウント取り付け

こんにちは。koraです。

今回は、マイクロマウス基板にモータマウントを取り付けます。

モータマウントの作成

以前、Fusion360でマイクロマウスの車体3Dモデルを作成していました。

これを、DMM.makeの3Dプリントサービスを使って出力します。選べる素材のうち一番精度の良いアクリル(Xtreme Mode)を選択します。

選択した素材のデータルールに従って、DMM.makeにアップロードする3Dデータファイルを作ります。1つのファイルに最大10個のパーツを配置できるようです。造形サイズやパーツ間のクリアランスなのど仕様を考慮して、パーツをまとめます。

配置出来たら、コンポーネント全体を選択して、右クリックから「STL形式で保存」を行います。

これでCADデータから3Dデータに変換できたので、DMM.makeにアップロードして発注します。

モータマウントの取り付け

発注から1週間ほどで届いたものがこちらです。

これに、モーター、ベアリング、ピニオンギアなどを取り付けます。ちなみにモーターはMK06-4.5、ピニオンギアはモジュール0.3、歯数9の精密切削ピニオンギヤです。

組上がったユニットを、低頭ねじで基板にねじ止めします。タイヤもつけて、なんとなくマイクロマウスらしさがでてきたと思います。

次回

次回は、エンコーダ用のネオジム磁石を取り付けて、エンコーダの値を読み取りたいと思います。

続きを読む ›

Posted in DCマウス研修


shotaのマイクロマウス研修16[回路設計④ モーダドライバ・エンコーダ回路]

こんにちは、shotaです。

社員研修として、オリジナルマウスの製作しています。

[前回の記事]では物体検出センサ回路(壁センサ)について書きました。

今回はモータドライバ・エンコーダ回路について書きます。

モータドライバ・エンコーダ回路 ブロック図

モータドライバ・エンコーダ回路のブロック図はこのようになりました。

ブロック図中央のモータドライバは、ESP32から送られてくる正転・逆転や回転速度(PWM Duty)の信号を、モータ出力電圧に変換します。ブロック図下のエンコーダは、マウスのホイールに取り付けられた磁石の磁気を読み取り、ホイールの角度を出力します。

モータにはMK06-4.5を使用します。[アールティWebショップ]から購入できます。

この構成は、回路流用元の[HM-StarterKit]とほぼ同じですが、エンコーダのMA700が新規設計非推奨だったため、後継機のMA702に変更しています。

モーダドライバ回路図

回路図はこのようになりました。

モータドライバ回路は、モータドライブIC [DRV883のデータシート]に書かれている参考回路とほぼ一致します。それとは別に、モータ電流を滑らかにするためにインダクタ(L1, L2)を追加しています。

マイクロマウスで使うモータは小さいため、電気的時定数が小さい傾向が有ります。その場合、PWM入力に対して電流が反応しやすくなるため、電流スパイクが発生しやすくなります。この電流によりモータが発熱したり、制御が不安定になるという問題が有ります。

インダクタを追加した理由は、モータ電流を滑らかにし、モータの発熱と制御の不安定さを抑えるためです。

参考:[パルス出力ステージ(PWM)とチョークコイル – マクソンアカデミー]

 

ESP32と接続するピンは、PH(正転・逆転の切り替え)、EN(モータ出力制御(PWM))、SLEEPの3つです。PHとENは、右・左モータで独立しています。SLEEPは右・左共通です。

 

ESP32のピンアサインについては後ほどまとめて記事にしますが、ここでESP32のPWM機能について簡単に触れておきます。

ESP32 MCPWM機能について

ESP32でモータ制御をする場合、MCPWM機能を使います。MCPWMはMotor Control Pulse Width Modulator (MCPWM)の略です。まさに、モータ制御のための機能ですね。

MCPWM機能の全容は[ESP32のTechnical Reference Manual]を参考にしてください。MCPWMのAPIは[こちら]のページに書かれています。また、サンプルコードが[GitHub]に公開されているので、先にコードを読んだほうが機能を理解しやすいかもしれません。

ここでは、APIのドキュメントからMCPWMの機能をざっくりとまとめてみます。

※ここに提示している画像は[ESP-IDF Programming Guide]内のものを使用しています

  • MCPWMユニットは2つあり、それぞれのユニットが3つのペア(A,

続きを読む ›

Posted in DCマウス研修, ブログ, 研修


マイクロマウス研修(kora編)[24] STM32マイコンでSPI通信

こんにちは。koraです。

今回は、新型マウスのSPI通信を設定します。

CubeMXの設定

今回製作したマイクロマウスは、STM32F732マイコンに搭載されている3つのSPIのうち2つを使用します。左右のエンコーダがSPI1に、ジャイロセンサがSPI2に接続してあります。

Pinoutの設定

ピンの設定画面でSPI1とSPI2の設定を行います。

  • MISO (Master In Slave Out)
  • MOSI (Master Out Slave In)
  • SCK (Serial Clock)

SPI通信では、マスタが通信相手を切り替えるためのCSピン (Chip Select あるいは SS: Slave Select) が必要なので、GPIOピンを割り当てます。同時に、System Core → GPIO → Configurationを開いて、GPIOにわかりやすいラベルを付けます。

  • CS_ENCR (右側のエンコーダ)
  • CS_ENCL (左側のエンコーダ)
  • CS_GYRO (ジャイロセンサ)

このときGPIO output level (GPIOピンの初期状態) はHighにしておきます。CSピンはアイドル状態がHigh、通信中がLowとなるためです。

SPI Modeの設定

ピンの設定が済んだら、SPI1とSPI2のModeを設定します。

  • Mode: Full-Duplex Master (受信と送信を同時に行えるモード)
  • Hardware NSS Signal: Disable (ソフト的にCSピンを使う)

SPI1 Configurationの設定

エンコーダMA702のデータシートを読むと、次のような仕様になっています。

  • Data order: MSB first
  • Clock rate: 最大25MHz
  • SPI mode: Mode0とMode3をサポート※

そこで、SPI1のConfigurationを次のように設定します。

  • First Bit: MSB first
  • Baud Rate: 13.5 MBits/s
  • Clock Polarity: High
  • Clock Phase: 2 Edge

SPI2 Configurationの設定

ジャイロセンサICM20648の仕様に合わせます。データシートによると、

  • Data order: MSB first
  • Clock rate: 最大7MHz
  • Clock Phase: クロックの立ち上がりでデータ受信

となっていますので、次のように設定します。

  • First Bit: MSB first
  • Baud Rate: 6.75 MBits/s
  • Clock Polarity: High
  • Clock Phase: 2 Edge

※SPI通信は、クロックの極性 (クロックのアイドル状態) とクロックの位相 (データ受信のタイミング) について4つのモードが定義されています。
参考:ANALOG DEVICES AN-1248 アプリケーション・ノート

クロックの極性
クロックの位相

Mode 0
アイドル状態がLOW
クロックの立ち上がり(1番目のエッジ)にデータ受信

Mode 1
アイドル状態がLOW
クロックの立ち下がり(2番目のエッジ)にデータ受信

Mode 2
アイドル状態がHIGH
クロックの立ち下がり(1番目のエッジ)にデータ受信

Mode 3
アイドル状態がHIGH
クロックの立ち上がり(2番目のエッジ)にデータ受信

ジャイロセンサの動作確認
SPI通信用の関数

CubeMXのGENERATE CODEボタンを押すと、今回設定したSPI関連のコードが生成されます。

SPI通信でマイコンからデバイスへ送信するには、HAL_SPI_Transmit()関数を使います。第一引数がSPIハンドラ、第二引数がデータバッファ、第三引数がデータバッファのサイズ(バイト)、第四引数がタイムアウトの時間(ms)です。反対にデバイスからデータを受信するとき、HAL_SPI_Receive()関数を使用します。引数はさきほどと同様です。
なお、通信を開始する前にHAL_GPIO_WritePin()関数で、通信したいデバイスのCSピンをLowにして、通信を終えた後Highに戻します。

ジャイロセンサ用のモジュール

これを踏まえたうえで、ジャイロセンサのモジュールを作ります。まず、Srcフォルダに以下のようなgyro.cというファイルを作ります。

gyro_init()関数を呼び出せばジャイロセンサの初期設定がまとめて行われ、gyro_update()関数を呼び出せばジャイロの角速度情報をまとめて読み込めます。

次に、Incフォルダにgyro.hというファイル名でヘッダーファイルを作ります。他のソースファイルでこのヘッダーファイルをインクルードすれば、gyro_init()関数とgyro_upate関数を呼び出せるようになります。

最後に、main.cに次のコードを追加します。

ジャイロセンサ動作確認プログラムの実行

ビルドしてCubeProgrammerでマウスに書き込みます。
TeraTermに次のような角速度が表示されると成功です。

次回

ジャイロの値は取れたので、次回はエンコーダを試してみたいと思います。モータマウント・タイヤ・磁石などを取り付けて、エンコーダの動作を確認します。

続きを読む ›

Posted in DCマウス研修


マイクロマウス研修(kora編)[23] STM32マイコンでシリアル通信

こんにちは。koraです。

今回はシリアル通信を使ってマイコンからPCにデータを送れるようにしたいと思います。

HALを使ったシリアル通信

HAL_UART_Transmit()関数を使用します。第一引数がUARTハンドル、第二引数が送信データバッファへのポインタ、第三引数が送信するデータのバイト数、第四引数がタイムアウトの時間です。

この例では、まず送信データバッファとして1バイト符号なし整数uint8_tの配列msg[]を作り、文字列”hello world!”と改行コード”\n\r”で初期化しています。
次にUART1のハンドルのポインタと、配列msg[]のポインタを指定し、strlen()関数でバッファのバイト数を求め、100msをタイムアウト時間として指定しています。

マウスに書き込んで実行すると、Tera Termに次のように表示されます。

printfを使ったシリアル通信

HAL_UART_Transmit()を使ってもいいのですが、引数がたくさんあって毎回書くのは面倒です。というわけで、お馴染みののprintfを使えるようにします。

まず、main.cにstdio.hのインクルードを追加します。

次に、標準出力をUARTに出力する関数を定義します。ちなみにこのとき、Srcフォルダにsyscalls.cファイルが必要です。

setbuf()は入出力に使用するバッファを設定する関数です。ここでは標準出力stdoutにNULLを指定してバッファを使わないよう設定しています。こうしないとprintfがうまく動かないようです。

無限ループの中で、printf()を呼び出します。今度は”hello printf!”が表示されます。

実行した結果、目論見通り”hello printf!”が出力されました。

次回

次回からはマウスに搭載した各種センサの動作確認をしたいと思います。

続きを読む ›

Posted in DCマウス研修