木製ロボットアーム
このブログの最初の投稿で少し触れていましたが、やっとちゃんと紹介することが出来ました。
お気に入りの作品の一つです。
後述しますが、ロボットアーム本体は市販のキットを使用しています。
配線やプログラムは私のオリジナルです。
作り方
材料
- ロボットアーム本体×1、サーボモータ×4
- マイコン(Arduino互換機)×1
- 10kΩポテンショメータ(可変抵抗器)×4
- ブレッドボード×1
- ジャンパワイヤ(オス-オス)×19
- ブレッドボード用ジャンパワイヤ×4
ブレッドボード用ジャンパワイヤは、ジャンパワイヤ(オス-オス)で代用可能です。
ロボットアーム本体とサーボモータ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回)取得して平均値を取る、という平準化と呼ばれる作業を行っています。
今後の構想
せっかくのロボットアームなので、今後はリモートコントロールやアナログスティック(ゲーム機のコントローラについているもの)などを実装出来たらな、と考えています。
コメント