PMXサーボを使ってみよう マイコンボードから制御「M5Stackから制御編」
PMXサーボは、UARTによるシリアル通信を持つ様々なマイコンボードから制御することができます。この記事では、M5Stackから制御する方法をご紹介します。
M5StackはArduinoIDEでプログラミングすることができます。弊社ではArduino向けライブラリを公開していますので、こちらを使用してPMXサーボを制御します。
※弊社では、M5Stack、及びプログラムに関連するお問い合わせは対応致しかねます。下記の記事は、使用事例として参考にご一読ください。
【関連記事】
PMXサーボを使ってみよう マイコンボードから制御「準備編」
PMXサーボを使ってみよう マイコンボードから制御「MemREAD編」
PMXサーボを使ってみよう マイコンボードから制御「MemWRITE編」
PMXサーボを使ってみよう マイコンボードから制御「MotorWRITE (位置制御)編」
PMXサーボを使ってみよう マイコンボードから制御「MotorWRITE (組み合わせ制御)編」
この記事で解説するArduino向けライブラリ、及びサンプルプログラムは、下記のページからダウンロードしてください。
PMXシリーズのサーボモータを制御するためのオンラインマニュアルを公開しています。PMXサーボを制御するための詳しい情報が記載されていますので、下記の解説と一緒にご一読ください。
■必要な製品
・M5Stack(M5Stack Basic V2.7で動作確認しました)
・バッテリー、または安定化電源(サーボの仕様に合わせてご用意ください)
・HV電源スイッチハーネス(任意)
HV電源スイッチハーネスのコネクタは、弊社ラインアップのバッテリのコネクタに対応します。弊社のバッテリをご利用の場合は、カシメ作業などを省くことができますのでスイッチハーネスを使用した方が便利です。別途安定化電源などをご利用いただく場合は、RS-485変換基板に電源ケーブルAが付属しますのでこちらをご利用ください。
以下は市販品をご利用ください。
・ユニバーサル基板(10×20程度)
・L字アングルヘッダピン(2.54ピッチ)×15ピン
・ピンソケット(2.54ピッチ) 4ピン×2セット
・はんだ、はんだごて
・三端子レギュレーター(5V1A)
こちらの例では秋月電子通商で販売している「低損失三端子レギュレーター 5V1A」を採用しました。
■基板を作成する
M5StackとRS-485変換基板をユニバーサル基板上でつなぎます。各端子をはんだ付けすればよいので非常に簡単です。
端子の接続先は下記の通りです。
M5Stack本体の右側の端子だけで全てつなぎ終えることができます。
表の「表記」は、本体裏側のシールに書いてある内容で、「端子名」は本体のボトムケースを外したときに露出する基板上のシールに書かれている名称です。
M5Stackは内部にバッテリを内蔵していますので、外部から給電をしなくても動作しますが、バッテリ容量が低いため、この例ではサーボの電源をM5Stackにも給電しています。ただし、「VOUT」端子から出力する電圧は電源-0.5Vの電圧(12Vであれば11.5V)であり、M5Stackに対しては過電圧になりますので、三端子レギュレータで5Vに降圧してからM5Stackの「5V」端子に接続しています。三端子レギュレータの回路は、素子付属の資料をご参照ください。
M5Stackへの給電はUSBバスパワーからも可能ですので、USBから給電する場合はM5の「5V」は接続しなくても動作します。
つなぎ終えると以下のような状態になります。
はんだ付けが終わった基板をM5Stackの右側に接続します。
RS-485変換基板を接続し、変換基板にサーボと電源を接続してください。
RS-485変換基板のスイッチを「実行」に切り替えます。
※シリアル端子はマイコンボードのUSBと併用していませんので「実行」のまま切り替える必要はありません。
■ライブラリを準備する
「PMX Library for Arduino」をダウンロードし、ダウンロードページの解説に従ってArduino IDEにインクルードしてください。
M5StackをArduino IDEでプログラミングするための準備は、『みんなのM5Stack入門』を参考にするとわかりやすいです。Arduino IDEからESP32ボードマネージャとM5Stackライブラリをインストールしてください。
■サンプルプログラムを実行する
公開中のArduino向けライブラリのサンプルプログラム『MemWRITE_MotorControl_Sample』を使用してサーボを動かします。サンプルプログラムは、Arduino Nano Everyに合わせてプログラムされていますので、以下の箇所を変更する必要があります。
1 |
#include <M5Stack.h> |
M5Stackを使用するため、プログラムの最初でM5Stack.hをインクルードします。
1 2 3 4 5 6 7 |
const byte EN_PIN = 2; const long BAUDRATE = 115200; const int TIMEOUT = 100; PmxHardSerial pmx(&Serial2,EN_PIN,BAUDRATE,TIMEOUT); const byte ServoID = 0; |
今回ご紹介している方法では、M5StackのTXD2 / RXD2へ接続していますので、引数のシリアルポートの指定を「&Serial2」に変更します。
Enableピンは変わらずGPIO2へ接続していますので、変更する必要はありません。
サーボの通信速度、IDが初期値の115200bps、ID0のままでしたらこの個所も変更ありません。
※M5Stackの仕様により、通信速度は115200bps以下でご利用ください。
1 2 3 4 5 6 7 8 |
//M5Stack初期化 M5.begin(); M5.Power.begin(); //LCD設定 M5.Lcd.fillScreen(BLACK); M5.Lcd.setTextSize(3); Serial.println("Sample"); |
M5Stackを使用するため、setup()関数の中に上記を追記します。
以上でサンプルプログラムの変更は完了です。
変更したプログラムの全文は下記になります。動作中にサーボから受け取ったデータをM5StackのLCDに表示できるようにしました。ご参考にしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
#include <Arduino.h> #include <M5Stack.h> #include <PmxHardSerialClass.h> #include <DataConvert.h> // サーボとArduino間の通信設定 const byte EN_PIN = 2; // EN(enable)ピンのピン番号 const long BAUDRATE = 115200; // 通信速度[bps] const int TIMEOUT = 1000; // タイムアウトまでの時間[ms] // インスタンス+ENピン(2番ピン)およびUARTの指定 PmxHardSerial pmx(&Serial2,EN_PIN,BAUDRATE,TIMEOUT); const byte ServoID = 0; //サーボのID番号 // 制御モードを指定する // 以下の各ビットを1にすると制御モードとして指定できます // Bit7:0 Bit6:0 Bit5:移動時間 Bit4:PWM Bit3:トルク Bit2:電流 Bit1:速度 Bit0:位置 byte controlMode = PMX::ControlMode::Position + PMX::ControlMode::Current; // 位置制御モード値+電流制御モード値 //byte controlMode = 0x01 + 0x04 // 数値でも指定できます。 // 応答データを指定する // 以下の各ビットを1にすると応答データとして指定できます // Bit7:入力電圧 Bit6:CPU温度 Bit5:モータ温度 Bit4:PWM出力 Bit3:推定トルク Bit2:電流 Bit1:速度 Bit0:位置 // receiveMode = PMX.ReceiveDataOption.Position # 位置情報を返す byte receiveMode = PMX::ReceiveDataOption::Full; // すべて返す //byte receiveMode = 0xFF // 数値でも指定できます。 void setup() { //M5Stack初期化 M5.begin(); M5.Power.begin(); //LCD設定 M5.Lcd.fillScreen(BLACK); M5.Lcd.setTextSize(3); M5.Lcd.setCursor(0, 0); M5.Lcd.print("SAMPLE"); //LCDにデータを表示 Serial.begin(115200); // PCと通信を開始する delay(500); // サーボが起動するまで少し待つ pmx.begin(); // サーボモータの通信初期設定 uint16_t flag; // 制御モードの設定します // MemWRITEコマンドで第三引数のwriteOptが0x01のときはトルクONでも強制的に書き込めます byte writeOpt = 1; flag = pmx.setControlMode(ServoID, controlMode, writeOpt); Serial.print("setControlMode="); Serial.println(flag, HEX); // 応答データ指定します flag = pmx.setMotorReceive(ServoID, receiveMode, writeOpt); Serial.print("setMotorReceive="); Serial.println(flag, HEX); // サーボのトルクをオンにします long receiveData[8]; flag = pmx.setMotorTorqueOn(ServoID, receiveMode, receiveData, controlMode); Serial.print("setMotorTorqueOn="); Serial.println(flag, HEX); /* // サーボのトルクをオフにする場合は下記の関数を実行します flag = pmx.setMotorFree(ServoID, receiveMode, receiveData, controlMode); Serial.print("setMotorFree="); Serial.println(flag, HEX); */ M5.Lcd.clear(); } void loop() { uint16_t flag; long receiveData[8]; // MotorWRITE関数で動作指令 long pos = 0; // 目標位置 long current = 500; // 目標電流値 int writeDataCount = 2; long writeDatas[writeDataCount] = {pos, current}; flag = pmx.MotorWRITE(ServoID, writeDatas, writeDataCount, receiveMode, receiveData, controlMode); Serial.print("MotorWRITE="); Serial.println(flag, HEX); // 目標地点に到達するまで待ちます delay(3000); // MotorWRITEDouble(組合せ2個)で動作指令 long targetVal1 = 18000; // 目標位置 long targetVal2 = 100; // 目標電流値 flag = pmx.MotorWRITEDouble(ServoID, targetVal1, targetVal2, receiveMode, receiveData, controlMode); Serial.print("MotorWRITE-Double="); Serial.println(flag, HEX); // MotorREADで現在の状態を確認 byte torqueSw; for(int i = 0; i < 100; i++){ // 目標地点に到達するまで待ちます delay(30); M5.Lcd.clear(); flag = pmx.MotorREAD(ServoID, receiveMode, receiveData, controlMode, &torqueSw); M5.Lcd.setCursor(0, 0); M5.Lcd.print("Pos="); //LCDにデータを表示 M5.Lcd.setCursor(120, 0); M5.Lcd.print(receiveData[0]); M5.Lcd.setCursor(0, 30); M5.Lcd.print("Speed="); M5.Lcd.setCursor(120, 30); M5.Lcd.print(receiveData[1]); M5.Lcd.setCursor(0, 60); M5.Lcd.print("Crnt="); M5.Lcd.setCursor(120, 60); M5.Lcd.print(receiveData[2]); M5.Lcd.setCursor(0, 90); M5.Lcd.print("Trqu="); M5.Lcd.setCursor(120, 90); M5.Lcd.print(receiveData[3]); M5.Lcd.setCursor(0, 120); M5.Lcd.print("PWM="); M5.Lcd.setCursor(120, 120); M5.Lcd.print(receiveData[4]); M5.Lcd.setCursor(0, 150); M5.Lcd.print("MTemp="); M5.Lcd.setCursor(120, 150); M5.Lcd.print(receiveData[5]); M5.Lcd.setCursor(0, 180); M5.Lcd.print("CTemp="); M5.Lcd.setCursor(120, 180); M5.Lcd.print(receiveData[6]); M5.Lcd.setCursor(0, 210); M5.Lcd.print("Volt="); M5.Lcd.setCursor(120, 210); M5.Lcd.print(receiveData[7]); } } |
M5Stackは、LCDやボタン、WiFiなど多彩な機能が一体になっており非常に便利なデバイスです。PMXサーボ搭載のロボットと組み合わせることで、サーボの状態確認や、指令を送ることもPCなしで実現できます。またネットワークからの指令も可能です。こちらの記事を参考に、ぜひご利用ください。
PMX-SCR-9203HVの詳細をみる PMX-SCR-9204HVの詳細をみる PMX-SCR-5203HVの詳細をみる PMX-SCR-5204HVの詳細をみる