5軸のロボットアームを製作する その1(キャチロボ2025、部品の選定、試作品の作成)

はじめに

 毎年9月頃にキャチロボバトルコンテストというお菓子を掴むロボコンがあって、私はこれまで大学の部活動で3年間参加していました。今年は後輩のサポートをしながら、ロボットアームを作りたかったので個人としても参加しました。

▼キャチロボバトルコンテストについてはこちら

https://catchrobo.net

 過去にAmazonで購入したロボットアームは重くて小型だったので、もっと大型で改造しやすいものが欲しいと考えていました。

 個人でハードウェアとソフトウェアの両方を扱いながら開発を進めました。その製作過程について、いくつかの記事で紹介していこうと思っています。

▼以前の記事はこちら

Node-REDを使ってみる その4(MQTT通信、ロボットアーム)

はじめに  今回は以前Amazonで購入したロボットアームを、Node-REDでMQTT通信を利用して制御できるようにしてみました。  これまではボタンで制御していたのですが、ネ…

ロボットアームにカメラを取り付けて映像を確認する(YOLO)

はじめに  以前の話ですが、Amazonで購入して動かせるようにしたロボットアームにカメラを取り付けて試していました。  YOLOによるリアルタイム検出も併用して、視野や…

設計の方針

 ロボットアームを設計するにあたって、最初に軸数について検討しました。実際に製品化されている4軸、5軸のロボットアームの動画があったので、参考にしました。

▼4軸では水平リンク機構で水平にしているようでした。

▼5軸では水平以外にも運ぶことができています。

▼過去の記事でも触っていたOpenManipulatorは4軸+エンドエフェクタです。

ROS1を使ってみる その3(Open Manipulatorの操作、Node-RED)

はじめに  今回はOpen ManipulatorのROS Serviceでの制御を確認し、Node-REDのノードでも操作してみました。  ROS Serviceを扱うのははじめてです。データ形式がややこ…

 研究では6軸や4軸のロボットアームに触れていたのですが、6軸ほどの自由度は不要なうえに制御が難しくなりそうだったので、5軸で設計を進めることにしました。

 今回のワークであるプチアソートは1箱あたり10gぐらいだったので、3つ積んだとしても30gぐらいです。

▼こんな感じの箱です。

 これまでの経験上、エンドエフェクタが重いと振動したり、支えるための部品が重くなったり、モータの出力を上げる必要があったりとややこしくなってしまいます。50gも掴めたら十分という想定で、エンドエフェクタがとにかく軽量になるように考えました。

 アームの長さは1mもあれば配置されている箱のほとんどが届きそうだったので、伸ばしたときに1mぐらいになるようにトルクを計算しました。市販の電子工作用ロボットアームだと30cmや40cmぐらいのリーチしか無いものが多いので、それよりも大きくなります。

 なお、モータはすべてサーボモータです。新しく買うと高いので、家に余っていたものから使うことにしました。

▼考えていたときのメモはこんな感じ。

 私は本来機械系分野なのですが、大学の授業でこういった計算をしたり、さらに動力部品を選定したりする機会というのは無いので、曖昧ではあると思います。

 大体のイメージができたので、トルクや重量をもとにサーボモータを選びました。

材料の選定

 エンドエフェクタ周りは軽量化のために、SG92Rを複数個使うことにしました。

 よく使われているSG90よりも少しトルクが大きいのですが、値段がそれほど変わらないのでいつもSG92Rを使っています。

▼SG92Rはこちら。

マイクロサーボ SG92R: 制御部品・駆動部品 秋月電子通商-電子部品・ネット通販

 トルクが必要な部分は20kgと書かれているサーボモータが6つほど余っていたので使いました。

▼ロボコンでもよく見かけますね。

▼このサイトでは寸法なども書かれていました。

 実際に製作するときは、以上の2種類のサーボを使いました。

 なお最初は360°連続回転するサーボモータを土台側で使っていたのですが、連続回転するとケーブルが絡まって切断されかねないので、270°回転のものに変えました。

▼こちらのサーボモータでも動いていました。試作のときだけ使いました。

▼以下のページに詳しく書かれています。

 今回は使っていませんが、GWSの2BBMGも家に余っていました。小型で意外とトルクが出ていた印象です。

▼こちらのサーボモータです。

https://akizukidenshi.com/catalog/g/g101968

▼過去にハッカソンで製作したロボットに使っていました。

スマホを運ぶロボット関連

ここではTechSeeker Hackathon 2023にて製作した、スマホを運ぶロボットに関する情報を集めています。 外観 実際の動作 関連記事 ▼Protopediaのページ

 Amazonで購入したロボットアームに使われていたサーボモータも試作のときに使ってみたのですが、トルクが足りなかったので変更しました。

▼これはMG995Rが使われていました。

試作品の作成

 設計とサーボモータが大体決まったので、試作しながら改良していきました。

 なお私が使っている3Dプリンターは最大でも20cm程度なので、長さが必要な部分は嵌め合わせて組み立てられるようにしました。

▼3DプリンターはPrusa MK4を使っています。

Prusa MK 4を使ってみる(3Dプリンター)

はじめに  ついに念願のマイ3Dプリンターを購入しました!Prusa MK4!  知り合いの方からPrusaの話を聞いていたのですが、Maker Faire Kyoto 2023のときに実物を見るこ…

 まずXIAO ESP32C3でサーボモータを動かし、ワークを掴んだまま保持できるか試してみました。

▼こんな感じのエンドエフェクタを設計しました。

 ツメが回転して、壁に挟むようにして掴めるようになっています。

▼XIAO ESP32C3によるサーボモータの制御については以下の記事でも紹介しています。

XIAO ESP32C3を使ってみる その2(analogWrite関数、サーボモーター)

はじめに  今回はXIAO ESP32C3で、analogWrite関数とサーボモーターの制御を試してみました。  サーボモーターについては、既存のライブラリが使えませんでした。そこで…

 以下のコードでテストしました。

const int servoPins[3] = {D0, D1, D2}; // D0, D1, D2
int angles[3] = {90, 90, 90};       // 初期角度
unsigned long lastPulseTime = 0;
const int period = 20; // ms

void setup() {
  Serial.begin(115200);
  for (int i = 0; i < 3; i++) {
    pinMode(servoPins[i], OUTPUT);
    digitalWrite(servoPins[i], LOW);
  }
  Serial.println("SG90制御開始:形式 = ピン番号 角度(例:1 120)");
}

void loop() {
  // 20msごとに全サーボにパルス出力
  if (millis() - lastPulseTime >= period) {
    lastPulseTime = millis();

    for (int i = 0; i < 3; i++) {
      int pulseWidth = angleToPulse(angles[i]);
      digitalWrite(servoPins[i], HIGH);
      delayMicroseconds(pulseWidth);
      digitalWrite(servoPins[i], LOW);
    }
  }

  // シリアル入力処理(角度更新)
  if (Serial.available()) {
    String input = Serial.readStringUntil('\n');
    input.trim();
    int spaceIndex = input.indexOf(' ');
    if (spaceIndex > 0) {
      int pin = input.substring(0, spaceIndex).toInt();
      int angle = input.substring(spaceIndex + 1).toInt();

      if (pin >= 0 && pin < 3 && angle >= 0 && angle <= 180) {
        angles[pin] = angle;
        Serial.print("D");
        Serial.print(pin);
        Serial.print(" → ");
        Serial.print(angle);
        Serial.println("度に設定");
      } else {
        Serial.println("形式: 0〜2 角度(0〜180)");
      }
    } else {
      Serial.println("形式エラー:例 1 90");
    }
  }
}

// 角度をパルス幅に変換(SG90対応)
int angleToPulse(int angle) {
  return map(angle, 0, 180, 500, 2400);
}

 シリアルモニタで角度を指定できるようになっています。

▼問題なく掴めていました。

 ゴムなどを貼り付けて滑らないようにする必要があるかもしれないなと思っていたのですが、特に問題なく掴めていました。

 ワークを掴めることは分かったので、アーム部分の設計も進めていきました。

▼最初に設計したものはこんな感じ。まだ土台の固定部などは設計していません。

 20cmの部品を十字の凹凸で嵌め合わせて、延長できるようにしています。Prusa MK4のおかげというのもありますが、寸法ピッタリに設計するとピッタリ嵌ります。凸部は面取りした方が嵌めやすかったです。

▼1mぐらいあるので、大体のワークに届きます。

▼最終的にワークを置く場所には余裕で届きます。

▼後の動画で出てきますが、実際に組み立てたものはこんな見た目です。

 CADでは分かりにくいところですが、配線が長くなるので束ねる必要があります。今回は結束バンドで固定すればいい感じでした。

基板について

 以前Amazonのロボットアームを購入したときに作成した基板がありました。今回はその基板に追加する形で作成しました。

▼以下の記事で紹介しています。

ちょっと買い物:ロボットアームを動かしてみる

はじめに  今回はAmazonで買ったロボットアームを動かしてみました。本来の目的はサーボモーターを安くたくさん入手したかったということなのですが、キット化されたもの…

▼購入したものはこちら

 マイコンはESP32を使っています。

▼6つのサーボモータを制御するための12個のボタンを用意していました。

▼こんな感じで動いていました。

 ロボコンの製作ではいつもESP32とPS4のコントローラによる通信で操作していました。元々ボタンで操作できていたところをコントローラの入力に変えるだけだったので、プログラムも簡単に実装できました。

▼ESP32とPS4のコントローラの接続については以下の記事でも紹介しています。

ESP32を使って、PS4コントローラとBluetooth接続する

はじめに  今回はESP32を使って、PS4のコントローラとのBluetooth接続をしました。ロボコンで使っているところを見たことがあります。最近はSwitchのコントローラで操作…

ESP32を使って、PS4コントローラとBluetooth接続する:ライブラリ修正編 その1

はじめに  以前の記事で、ESP32とPS4コントローラのBluetooth接続をしました。コンパイルエラーが多発して結構苦労しました。  ライブラリに問題があって、そのままだと…

動かしてみる

 実際に机に固定して、基板上のボタンで動かしてみました。

▼動きが速いと、かなり揺れが大きいという印象です。トルクは問題なさそうでした。

▼エンドエフェクタの動きもいい感じです。

 なお配線が短いと、そのせいで引っかかりそうになっていたので、長くする必要がありました。サーボモータのQIコネクタは外れやすいので、コネクタも含め作り直しました。

最後に

 トルクの計算はしているものの、実際に動くかは分からなかったので、意外と問題なく動いていることに驚きました。サーボモータはもっと非力だと思っていました。3Dプリンターのおかげで試作と検証を高速で繰り返すことができました。ここまでで万博に向けた製作と平行して1か月ぐらいかと思います。

 この後さらに改良を進めていきました。また別の記事で紹介しようと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です