「Arduinoを使ってPCレスでプチロボ操縦に挑戦!」をMS3Lで試してみた


はじめに

この記事は、共立プロダクツ事業所の2013年7月9日付の「Arduinoを使ってPCレスでプチロボ操縦に挑戦!」をブレッドボード上にコントローラもどきを作って実践してみた体験記です。

  • Arduino Uno
  • プッシュボタン x 1
  • 10KΩ抵抗 x 1
  • オスオス・ピンケーブル数本
  • ハードウェア:プチロボMS3L

(変更点)
- コントロール対象のサーボの動作は、一つだけにしたので、ボタンも一つにしました。
- 上記の記事はMS5L用の動作なので、動作についてもMS3L用にシンプルにしました。

今更なぜ・・・

一番端的な理由は、プチロボXLを持っていて、放置しておくのも勿体ないから、です。

XLのセットがあれば、Ms3Lの部品としても当然使えます。XLは、サーボモータを9個も使っているので、とても自分の手に負えないことに買ってから気づきました。せめて、3個なら私のような初心者にもなんとか扱える範囲です。Windows用の操作用のソフトがあるだけでなく、制御基板の回路図があったこともこの商品を選んだ理由の一つです。もっとも、回路上のPICのプログラムソースは開示されていないので、開示されている回路図だけでは動作の仕組みを理解するのには情報が不十分なのですが・・・

サーボモータは、秋月電子でも取り扱いされている、Tower ProのMG90Sです。これに、「プチブラケットL」をつけて、ロボットアームに仕上げていきます。ちなみに、MG90Sというのは、いろいろな会社が同じ規格で作っていて、まとめ買いを厭わなければ、一つ150円くらいでも手に入ります。タミヤのユニバーサルプレートなどと組み合わせられればいいのですが、穴の位置や大きさは全く違います。

■主な仕様
・電源:4.8~6.0V
・動作速度:0.1秒/60°(4.8V)、0.08秒/60°(6.0V)
・トルク:1.8kgf・cm (4.8V)
・デッドバンド幅:1μ秒
・動作温度範囲:0~55℃
・寸法:22.8×12.2×28.5mm
・配線:茶=GND、赤=電源[+]、橙=制御信号 [JRタイプ]
・サーボブラケット:材質/アルミニウム、板厚/1.0mm
・モジュールサイズ(すべてを組み合わせた状態):40.5(W)×50(D)×16(H)mm
・アーム長(回転軸中心からの長さ):22.5mm
・重量:約21g (incl. MG90S: 13.4g)

「1.8kgf・cm」って何?

0.18N.mくらいのようです。ネットで調べてみると、以下のビデオがありました。0:58秒あたり面白いグラフがあります。ペットボトルの開栓時、キャップが回り始めるときのトルクが、1.4N.mくらいで、ブリッジが外れる時が1.2N.mのようです。ペットボトルの種類やキャップのサイズによっても違うようですが、このサーボモーター一つでは、ペットボトルのキャップを開けることすら全くかなわないということなのですね。

^[1]

アーム長が22.5mmで、モジュールが50(D)mmということは・・・

また、トルクというのは軸にかかる負荷のことだと思いますので、そもそも、一番下にあるサーボモータは、上に何個のブラケットを乗せることができるかを考えてみました。

MS3Lは、上の図の枠の中の構造図のように組み立てられています。サーボモーターの横に書かれている「9」「5」「0」の数字は、WR-XX制御基板上のサーボモータのコネクタ番号です。簡易なサーボアームにはよくある構造で、平面2自由度ロボットして扱う(サーボモータ9は固定)ときに軸間の距離がちょうど50mmになるので計算がしやすいです。

このトルクでモジュールを理論上何個つけられるかを計算(第三のてこ?)してみたのですが、どうも感覚的に合わないので計算式が間違っているのか、摩擦とか関係しているのかよくわからないので、この点は、実際にモジュールを増やすときに考えよう・・・

やっていることは単純

ボタンを押したときに一度だけ、サーボモータ0と6を動かすというだけのもの。これではさすがに新しく学ぶことがないので、ソフトシリアルで通信しているのと、スイッチはプルアップ方式に変えました。

(改訂2020/1/10)
・スイッチ操作が阻害されるのでLED点滅削除。
・スイッチオフ時の動作を廃止。(誤作動防止)

softserial-puchirobo.ino
#include <SoftwareSerial.h>
SoftwareSerial mySerial = SoftwareSerial(2, 3); // RX, TX
const int BUTTON = 4;
int val = 0;

void setup() {                
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT);

  pinMode(BUTTON, INPUT); //スイッチ入力    
  mySerial.begin(38400);
  mySerial.listen();    //SoftwareSerialに切り替え    
}

void loop() {
  //制御用 データコード
  byte Datas[4][27] = {
  {253,26,6,1,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254},  //ダミー(使用不可)
  {253,26,6,1,9,30,0,0,0,0,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254},
  {253,26,6,1,9,110,0,0,0,0,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254},
  {253,26,6,1,9,70,0,0,0,0,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254}
  } ;

  //入力を読み取り
  val = digitalRead(BUTTON);

  //***入力*******************************************************
  if (val == HIGH) { 
    mySerial.write(Datas[1],26);
    delay(1000);
    mySerial.write(Datas[2],26);
    delay(1000);
    mySerial.write(Datas[3],26);
  } 
}

おわりに(所感と悩み)

それにしても、Aurduinoはライブラリや関数がそろい過ぎて、やりたいことは誰かが必ず上手な方法を見つけているので、C言語のような生臭さがなくて、やっていて拍子抜けしますね。

プチロボの制御基板にArduinoをつなぐというのは、発想としては誰でも思いつくと思います。また、そもそも共立プロダクツさんがこの組み合わせを「PCレス」として推奨しているわけですからきっと良い組み合わせなのだろうと思います。

が、私としては、ネットに全くつながらない形での構成にはもはや興味が持てないので、何とかROSにつながるようにしてみたい。もっとも、ROSにつなげるのであれば、直接ArduinoでVarSpeedServoを使ってサーボをコントロールする方が非同期でそれぞれのサーボを動かせるので好都合ではないか、と思うのですが、一方で、その場合は今度は電源供給の方法を別に準備しないといけないわけで、そうすると今度は小型の安定化電源を準備したりしないといけないし、昇圧にしても降圧にしても小型電源の回路IC化が進んでネットで数百円で変えてしまう時代なので大した手間ではないとは思うけれど、何かもったいないというか、ただ買ってきた回路をつなぐだけなのはバカバカしいし、8サーボ以上をコントロールしたくなったら(いつのことやら)困るし、まあ、シリアル通信について結構真面目に勉強する機会もできたし、こうやって学んでいることも今後何かの役に立つかもしれないし、別に自分はエンジニアじゃなく単に道楽でやっているだけなのだから自分の興味より世間に迎合した技術選択をする必要もないわけだし、ただ、Arduino IDEに慣れれば今後ESP-WROOM-32でWiFiでシリアル通信するということも可能だからわざわざWR-XXなんて特殊な制御基板を使う必要はないし、せめてPICのプログラムソースが開示されていれば、PICとROSの組み合わせという観点で学習の幅も広がるのだが、それも望めないな、などと、MS3Lの朴訥な動きを見ながら悶々とした一日でした。