こんにちは、はしもとです!
今回はHM-StarterKitの購入~迷路完走までの
特別連載「HM-StarterKitでマイクロマウスを始めよう」の第10回です。
前回は、ジャイロセンサの動作確認を行いました。
この記事では「マニュアルダウンロードページ(購入者限定)https://rt-net.jp/products/hm_starterkit-manual-download-page/」にてダウンロードしていただいたマニュアルpart3のP15~17にある「SPIとエンコーダ」の欄について簡単な解説と動作確認をしていきたいと思います。
※マニュアルダウンロードページを開くにはHM-StarterKit同梱のカードに記載されているパスワードが必要になります。
最初にエンコーダとは何かについて解説した後、サンプルプログラムで出てくる「SPI通信」という用語について解説します。最後にこれら2つの知識をもとに、
マイクロマウス HM StarterKit パート3『取扱説明書』ソフトウェア解説編のサンプルプログラムstep5を用いて、HMキットのエンコーダの動作確認を行っていきます。
それでは、まずエンコーダについてです。
エンコーダの解説
エンコーダとは?
エンコーダとは、モータの回転角度を出力するセンサです。
今回扱うHMキットのような移動ロボットでは、どれくらい移動したか、どの方向に移動したかをエンコーダを使うことで知ることができ、より高度な制御をすることができます。
エンコーダの種類と特徴
エンコーダの検出方式は大きく分けて以下の2種類に分けられます。
- 光学式
- 磁気式/電磁誘導式
これらのうち、本ロボットに搭載されているのは磁気式エンコーダです。磁気式エンコーダは、回転位置情報を磁界の変化として検出し、電気信号に変換して出力する方式です。
磁気式エンコーダの特徴は以下の通りです。
- 耐環境性が高い
磁界を乱さなければ、ちりやほこりなどの粉じんのある環境下でも使えます。 - 低コストで絶対角度を出力するエンコーダを製造可能
磁場の向きは、絶対角度が0°のときと絶対角度が180°のときでそれぞれ固有です(下図)。なので、磁気センサを内蔵した回転角センサICを使って現在の磁場の向きを検出することで、現在の絶対角度を出力することができます。絶対角度とは、モータの原点から回転した角度です。このような絶対角度を出力するエンコーダをアブソリュートエンコーダと呼び、絶対的な位置がわかる仕組みのため、たとえ電源が切れて再起動しても現在のモータの絶対角度を出力可能です。
光学式エンコーダでは、絶対角度を出力するエンコーダは複雑な構成になり高価になるのですが、磁気式を用いることで低コストに抑えられることができます。
より詳細な情報については以下のサイトをご参照ください。
「エンコーダ基礎知識」
https://www.akm.com/jp/ja/technology/technical-tutorial/basic-knowledge-encoder/
SPI(Serial Peripheral Interface)通信の解説
SPI通信とは?
同一基板に実装されたマイコンと周辺デバイス間の通信に使用されるシリアル通信のひとつです。Peripheralとは、コンピュータの周辺機器(エンコーダやA/Dコンバータなど)の総称です。なので、コンピュータの周辺機器とシリアル通信するインターフェースというのがSPIをそのまま訳したときの意味になります。では、具体的にどのように通信しているか見ていきましょう。
データを送受信するための通信線を1本だけ使用して、HIGH(3.3V)/LOW(0.0V)の電圧を連続的に変化させ、意味のあるデータを送受信する通信方式です。シリアル(serial)とは「直列」や「直線」という意味があります。シリアル通信では、使用する端子が少なくて済むので、マイコンと周辺機器を通信する際によく使用されます。
SPI通信の接続形態
SPI通信では、マスタ・スレーブが必要です。
マスタ・スレーブとは、複数の機器や装置、システムなどが連携して動作する際に、一つが管理・制御する側、残りが制御される側という役割分担を意味します。制御する側をマスタ、制御される側をスレーブといいます。
イメージとして、マウスとパソコンの画面のポインタがマスタ・スレーブの関係と思うとわかりやすいと思います。マウスはマスタ(制御する側)、画面に表示されるポインタはスレーブ(制御される側)です。
そしてSPI通信では、一つのマスタに対して複数のスレーブと通信が可能です。
SPI通信の通信方法
信号線
SPI通信では以下の4つの信号線を使ってマスタとスレーブで通信を行います。
- SIN ・・・ データ入力、MISO(Master Input Slave Output)ともいう。
- SOUT ・・・ データ出力、MOSI(Master Output Slave Input)ともいう。
- SCLK(Serial CLocK) ・・・ クロック信号、データの同期をとるために使います。
- SS(Slave Select) ・・・ スレーブセレクト信号、Low信号を受信したときアクティブになる信号。マスタは複数あるスレーブ機器のなかで、通信したいスレーブ機器のSS端子をLowに制御し通信を行います。
データの同期をとるとは?
SPI通信は、データの送信と受信が同時に行われます。このとき、データを受信したと同時に送信する側が勝手にデータを送り始めるため、受信側は届いた信号から、どこがデータの始まりでどこが終わりなのかを見分け、送信されて来たデータを正確に取り込む必要があります。このように受信側が送信側の信号にあわせてデータを正確に取り込めるようにすることを「同期をとる」といいます。
SPI通信の同期式の通信には、クロック信号と呼ぶ定周期の信号がデータと一緒に送られます。受信側はそのクロック信号を使って、どこからが送られてきたデータかを読み取ることでデータの送受信を正確に行います。
参考サイト:http://www.picfun.com/cpu12.html
通信の流れ
まずは、どのスレーブと通信をするかをSSをLowに駆動することで決めます。
次にマスタ側でSCLKを生成し、これが同期信号として使用されます。
このSCLK出力後、シフトレジスタにより1bitずつデータを交換し合い、データの送受信を同時に行います。このようにデータの送受信を同時に行うことで効率よく通信を行う事ができ、前回までに学習したI2C通信よりも速く通信を行うことが可能です。
サンプルプログラムstep5の動作確認
ではこれらの知識をもとにSPI通信を使ってHMキットのエンコーダ値を確認してみましょう。
サンプルプログラムの解説
まず、spi.c、spi.h をプロジェクトにインポートします。そして SPI 機能の初期設定を行う関数を呼び出します。(76行目)
init_spi_enc();
このinit_spi_enc関数が記述されているspi.cの287行目のコメントが間違っており、RSPIデータ長は10bitに設定しています。
RSPI0.SPCMD0.BIT.SPB = 0x9; //RSPIデータ長を16ビットに設定
次にどちらのエンコーダ IC と通信するかを選択するため、スレーブセレクトピンを設定します。スレーブセレクトの設定は次のレジスタの値を書き換えて行います。(83,88行目)
RSPI0.SPCMD0.BIT.SSLA = 0x02; //右車輪のエンコーダICと通信する RSPI0.SPCMD0.BIT.SSLA = 0x00; //左車輪のエンコーダICと通信する
このときサンプルプログラムのRSPI0.SPCMD0.BIT.SSLA = 0x00;のコメントアウト部分では、
RSPI0.SPCMD0.BIT.SSLA = 0x00; //SSL信号アサート設定(SSL2を使う)
と書かれていますが、正しくは
RSPI0.SPCMD0.BIT.SSLA = 0x00; //SSL信号アサート設定(SSL0を使う)
です。
一方で、88行目のコメントアウト部分は、//SSL信号アサート設定(SSL2を使う)です。
スレーブセレクトの設定を行った後に、それぞれのエンコーダの初期化処理を行います。(84,89行目)
サンプルプログラムでは、84,89行目の関数で引数に値を入れていますが、実際はこの変数は何も使われていないため、0x0000などほかの値でも動作します。
preprocess_spi_enc(0x1400); //Read Angle
初期化処理が終わったら、エンコーダから車軸の角度情報を読み込みます。角度情報を読み込むときは次のように記述します。(85,86行目)
これらの処理を行うと、data変数の中に 10bit の角度情報が入力されます。それを SCI_printf で出力し、値を確認します。
data = Get_enc_data(); //エンコーダ値取得 SCI_printf("R_Encdata_10bit,%d\n\r", ((int)(data & 0xFFFF)) & 0x2FFF ); //エンコーダ値表示
動作確認
こちらを参考に、サンプルの CS+「C:\ HM_StarterKit-master/Sample_Program/step5_spi_encoder」フォルダ内の「HM_StarterKit.mtpj」をビルドし、RFP を使って、C:HM_StarterKit-master/Sample_Program/step5_spi_encode/DefaultBuild」フォルダ内の「HM_StarterKit.mot」を書き込みます。書き込み後は、書き込み基板スイッチをFW側ではないほうに切り替え、Tera Termを起動してください。
もしシリアルポート設定が正しければ、以下の画像のように右車輪と左車輪の原点からどれくらい回ったかの絶対角度が出力されます。この出力は、360°を10bit、1024分割した出力です。
まとめ
- エンコーダとSPI通信についての簡単な解説を行いました。
- 最後にHMキットのサンプルプログラムを使ってエンコーダ値を表示させました。
お知らせ
手のひらサイズのマイクロマウスキット「HM-StarterKit」
33%OFFの特別価格で販売中!
製品ページはこちら

アールティロボットショップで購入する
また、6月10日(木)からは学生マイクロマウスサークルを対象としたプレゼントキャンペーンを開催予定です!詳細をお楽しみに!