【電子工作】木製ロボットアームの作り方

木製ロボットアーム 電子工作
木製ロボットアーム
この記事は約4分で読めます。

木製ロボットアーム

使用楽曲:わたあめ雲 by クラウンジ

このブログの最初の投稿で少し触れていましたが、やっとちゃんと紹介することが出来ました。
お気に入りの作品の一つです。

後述しますが、ロボットアーム本体は市販のキットを使用しています。
配線やプログラムは私のオリジナルです。

作り方

材料

ブレッドボード用ジャンパワイヤは、ジャンパワイヤ(オス-オス)で代用可能です。

ロボットアーム本体とサーボモータ4つがセットになっているキットが売っていますので、これを使います。

配線

配線が多いので複雑に見えますが、要はサーボモータとポテンショメータをそれぞれ4つずつ並列につないでいるだけです。

プログラム

//ロボットアームをポテンショメータ4つで操作する。

#include <Servo.h>

#define SV0_PIN 5 //サーボモータ0PVM用のピン
#define SV1_PIN 6 //サーボモータ1PVM用のピン
#define SV2_PIN 9 //サーボモータ2PVM用のピン
#define SV3_PIN 10 //サーボモータ3PVM用のピン

#define TH0 180    //サーボモータ0の回転角
#define TH1 180    //サーボモータ1の回転角
#define TH2 135    //サーボモータ2の回転角
#define TH3 60     //サーボモータ3の回転角

#define PM0_PIN 0 //ポテンショメータ0のアナログピン
#define PM1_PIN 1 //ポテンショメータ1のアナログピン
#define PM2_PIN 2 //ポテンショメータ2のアナログピン
#define PM3_PIN 3 //ポテンショメータ3のアナログピン

//サーボピン番号、回転角、ポテンショメータピン番号をそれぞれ配列化
int sv_pin[4] = {SV0_PIN, SV1_PIN, SV2_PIN, SV3_PIN};
int th[4] = {TH0, TH1, TH2, TH3};
int pm_pin[4] = {PM0_PIN, PM1_PIN, PM2_PIN, PM3_PIN};


Servo myservo[4];


void setup() {
  // put your setup code here, to run once:
  for(int i = 0; i <= 3; i++){
    myservo[i].attach(sv_pin[i]);
  }
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  for(int i = 0; i <= 3; i++){
    mv_servo(i);
    delay(10);
  }
}

void mv_servo(int sv_no){
  //ポテンショメータの値のゆらぎを平準化する
  int ar = 0;
  for(int i = 0; i < 30; i++){
    ar += analogRead(pm_pin[sv_no]);
  }
  ar /= 30;
  //ポテンショメータから読み込んだ値に基づいてサーボモータを回転させる
  myservo[sv_no].write((float)(1024 - ar)/1024 * th[sv_no]);
}

このロボットアームを製作しながら学んだのですが、analogReadでポテンショメータの電圧を読み取る場合、つまみを動かさなくてもanalogReadの読み取り値が変動するのですね。
Arduino側の微妙な電圧の変化などが原因のようです。

このことを意識しないでコードを書いた結果、何の操作もしていないのにロボットアームがプルプル動いてしまいました。

そこで、ポテンショメータからの読み取り値を複数回(30回)取得して平均値を取る、という平準化と呼ばれる作業を行っています。

今後の構想

せっかくのロボットアームなので、今後はリモートコントロールやアナログスティック(ゲーム機のコントローラについているもの)などを実装出来たらな、と考えています。

コメント

タイトルとURLをコピーしました