秋月 5 finger 制御編 (前編)

 いろいろと怪しい点がありましたが、なんとか組み立てまで完了しました。(組み立て中の記事)


http://dl.ftrans.etr.jp/?d4daeeb3f85a48179d9ee8f04aa6679387fa1232.jpg


 さて、引き続いて制御に移りますが、肝心のサーボ仕様が全く記載されていません。


 1個多く入っていたので、それを使って実験しようと思っているんですが、そもそも幾ら得しちゃったんだろう?と相場を調べに秋月サイト内を検索しましたら、なんか似たようなのが出てきましたよ。



 色違いなだけで全く同じ形状をしたサーボホーンという部品も付属してるので、きっとこれの類似品でしょう。
 Servo.h に対応してるとあるので、素直に使わせていただきましょうか。


 サーボの動作電圧は 4.8V とのことですが、ESP32/ESP8266 だと少しだけ工夫が必要です。
 きちんと作るのは5指の時にやるとして、トルクが足りないだけで動作テストくらいには一応は動くんじゃないか?、と 3.3V で試してみることにします。


■Servo.h が使えない ESP32 向け(ESP8266も可)

const int pin = 4;

// degree, delay, degree, delay ...
const int job[] = {90, 5000, 0, 5000, 180, 5000};

void setDegree(int degree = -1)
{
  const int degree_0 = 500;       // 0.5ms at 0 degree
  const int degree_180 = 2400;    // 2.4ms at 180 degree
  const int pulse_width = 20000;  // 20ms

  if(degree < 0)
  {
    int freq = 1000000 / pulse_width;
  
#ifdef ESP32
    ledcAttachPin(pin, 1);     // for PWM
    ledcSetup(1, freq, 10);
#endif
#ifdef ESP8266
    analogWriteFreq(freq);
#endif
    
  } else {
    int pulse = (degree_0 + degree * (degree_180 - degree_0) / 180.0F);
    if(pulse < degree_0)
      pulse = degree_0;
      
    pulse = 1023 * pulse / pulse_width;
  
#ifdef ESP32
    ledcWrite(1, pulse);
#endif
#ifdef ESP8266
    analogWrite(pin, pulse);
#endif
  }
}

void setup() {
  // put your setup code here, to run once:
  setDegree();
}

void loop() {
  static int job_pos = 0;
  // put your main code here, to run repeatedly:
  if(job_pos < sizeof(job) / sizeof(job[0]) - 1)
  {
    setDegree(job[job_pos]);
    job_pos++;
    
    delay(job[job_pos]);
    job_pos++;
  } 
}


■Servo.h が使える Arduino 向け(ESP8266を含む)

#include <Servo.h>

const int pin = 4;

// degree, delay, degree, delay ...
const int job[] = {90, 5000, 0, 5000, 180, 5000};

void setDegree(int degree = -1)
{
  static Servo servo;
  if(degree < 0)
    servo.attach(pin);
  else
    servo.write(degree);
}

void setup() {
  // put your setup code here, to run once:
  setDegree();
}

void loop() {
  static int job_pos = 0;
  // put your main code here, to run repeatedly:
  if(job_pos < sizeof(job) / sizeof(job[0]) - 1)
  {
    setDegree(job[job_pos]);
    job_pos++;
    
    delay(job[job_pos]);
    job_pos++;
  } 
}


 動画までは撮ってませんが、バッチリ作動♪


http://dl.ftrans.etr.jp/?916eac8a29ae402896c03482abc3e9ce3503a6d2.jpg http://dl.ftrans.etr.jp/?3307a19c1c3e4b8ebf73a7a3384cc396aeca31f8.jpg


 これから5指に対応させるとして、さてこいつに何をやらせようか・・・
 ま、作りながら考えることにしよう。。。


 続きを書く予定です。


(追記)2017/12/18
 後編を書きました。