ロボットハンド

曲げセンサーを使用してロボットハンドの制御を行ってみた。

このハンド自体はベクター1の時にもお世話になったまあくさんが設計・作成している。

この動画では親指~薬指に仕込んだ4つの曲げセンサーのアナログ値を取得し、データのブレを補正してからサーボを動かすプログラムを書いている。

5つめの曲げセンサーは手首に貼り付け、手首の曲げを検出している。

#include <Servo.h>
Servo myservo0;
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;

int pos0 = 90;
int pos1 = 90;
int pos2 = 90;
int pos3 = 90;
int pos4 = 90;

void setup() {
  myservo0.attach(3);
  myservo1.attach(5);
  myservo2.attach(9);
  myservo3.attach(10);
  myservo4.attach(11);
  Serial.begin(115200);
}

void loop() {
  // 曲げセンサーの値を取得
  int sensorValue0 = analogRead(A0);
  int sensorValue1 = analogRead(A1);
  int sensorValue2 = analogRead(A2);
  int sensorValue3 = analogRead(A3);
  int sensorValue4 = analogRead(A4);
  int sensorValue5 = analogRead(A5);
  
  Serial.print(" "); Serial.print(sensorValue0);
  Serial.print(" "); Serial.print(sensorValue1);
  Serial.print(" "); Serial.print(sensorValue2);
  Serial.print(" "); Serial.print(sensorValue3);
  Serial.print(" "); Serial.print(sensorValue4);
  Serial.println(" ;");

  int v0 = map(sensorValue0, 640, 800, 20, 160);
  int v1 = map(sensorValue1, 590, 780, 20, 160);
  int v2 = map(sensorValue2, 650, 820, 20, 160);
  int v3 = map(sensorValue3, 655, 820, 20, 160);
  int v4 = map(sensorValue4, 730, 830, 20, 160);

  pos0 = valc(pos0, v0);
  pos1 = valc(pos1, v1);
  pos2 = valc(pos2, v2);
  pos3 = valc(pos3, v3);
  pos4 = valc(pos4, v4);
  
  myservo0.write(valx(pos0));
  myservo1.write(valx(pos1));
  myservo2.write(valx(pos2));
  myservo3.write(valx(pos3));
  myservo4.write(valx(pos4));

  Serial.print(" "); Serial.print(pos0);
  Serial.print(" "); Serial.print(pos1);
  Serial.print(" "); Serial.print(pos2);
  Serial.print(" "); Serial.print(pos3);
  Serial.print(" "); Serial.print(pos4);
  Serial.println(" ;");
  delay(20);
}

int valx(int v){
  return 180 - v;
}

int valc(int pos, int x){
  int haba = 10;
  if(pos > x + haba){
    pos -= haba;
    if(pos < 20){ pos = 20; }
  }else if(pos < x - haba){
    pos += haba;
    if(pos > 160){ pos = 160; }
  }
  return pos;
}

指の曲げセンサーはPAXパワーグローブから抜き出したものを使用している。抵抗値は100kΩを使用。→参考

手首の曲げセンサーは千石電商かどこかで買った55mmの曲げセンサーを使っている。 抵抗値は10kΩを使用。→参考

各センサー、値がバラけているのは仕様かどうか不明だがシリアルモニタで確認しつつ、値を調整してmap関数を用いて適当に変換した。

※追記 → 値を一つずつシリアルプロッタで確認したほうがよいかも

サーボへの電源供給の為、その辺に転がっていた5V 10A電源を使用した所、指が暴れるような動作をした。

ロボ部定例会にて相談した所、色々と助言を受け、理解できない部分も多々あったがまとめると以下のような感じだった。

  • 電源のノイズ
  • 曲げセンサーが肌に直接触れている影響でセンサーの値が乱れる
  • センサー値は割り込み処理で平均化して取得すると良い

電源に関しては今は理解できないのでとりあえず乾電池駆動にして後から考える事にする。

指サーボ4つに対して乾電池4本、手首サーボ一つに対して乾電池4本を使用することで動作を確認できた。

曲げセンサーに関しては絶縁をしっかりすることにした。

触覚フィードバックを得るため、導線が触れたら振動モーターが反応する実験を行った。フィードバックがあると大分感覚が違う。

感圧センサーはアナログ値を読み取れるので便利そうだが面での検知しか出来ないと思われるので、この仕組みの接触検知センサーをもう少し工夫して自作したい。