ラベル 多脚 の投稿を表示しています。 すべての投稿を表示
ラベル 多脚 の投稿を表示しています。 すべての投稿を表示

2016年11月23日水曜日

プチロボS2 (GlueMotor)でニセ多脚ロボット

 一昨日、100円ロボット部のFacebookを見ていたら、GlueMotorというiPhoneの音声端子でラジコンサーボの制御パルスを生成して、サーボをコントロールできるという面白いものが紹介されていました。このGlueMotorをすぐ使えるように配線類を完成品としてキット化した「プチロボS2」というのが販売されていたので取り寄せて、さっそく心の赴くままにがらくた工作をしてみました。


 サーボで何か動きものというと、自分的にはやっぱり多脚ロボットが作りたいところですが、以前に作ったあんなのとか、こんなのではサーボの数が足りません。そこで今回はインチキをして、駆動脚として二脚だけをサーボで動かして、残りは飾りの脚をつけることでニセ多脚ロボットを作ってみようと思います。そう「脚なんて飾りですよ!!」です。

 早速、プチロボS2を開封して配線。サーボを直行させて付属の両面テープでくっつけて、駆動脚には手っ取り早く3Dプリンタで適当に作成した下写真のようなものを取り付けました。駆動脚は割りばしと輪ゴムで組んでもよかったかも。そのほうが、より100円ロボットらしさ?がでたかしら。


 この状態で一応動作テストをして、それっぽい動きを駆動脚で再現できることを確認。あとは残りの部分を頭の中のイメージだけを頼りに力技で作っていきます。

 で、出来上がったのがこれ。


 ボディは例によってアマゾンの段ボール製。飾りの脚は曲がるストロー。後は軸につまようじ。接着(固定)にホットボンドを使用。


 飾りの脚を動かすために駆動脚と針金で結んでいますが、実際には底面にボールキャスタがついていて、駆動脚でボールキャスタ引きずって動きます。


 動かしてみたところです。




2016年9月5日月曜日

牛乳パック四脚

 今回のがらくたは少し趣向を変えて、牛乳パック工作です。学校の夏休み期間が終わったこの時期になぜ牛乳パック工作かというと、先日、たまたま、Facebookで100円ロボット部というグループを見つけて、興味をもったからです。昔から、牛乳パックや紙コップ、ダンボール等をハサミで切ったり、テープで貼り付けている時は、頭のなかで「できるっかな、できるっかな~♪」という音楽が脳内再生される自分としては、Facebookを見て衝動的になにか作ってみたくなってしまいました。

 さて、では、何を作るかですが、第一弾としては、
   「牛乳パックを使いたい」
   「(一応ロボットっぽいものということで)モータで動かしたい」
   「(見た目だけでも)ロボット感のある動きをさせたい」
   「(モータやマイコン等の電装系以外は)100均または廃材等を積極利用したい」
といった幾つかのテーマを自分なりに用意して検討し、「牛乳パック四脚」を作ってみようと考えました。思いついた主な仕様としては、
   「牛乳パックのボディに脚が四本生えた外観」
   「1モータで四脚歩行で前進する」
   「モータは手持ちの『タミヤ楽しい工作シリーズ シングルギアボックス』で」
   (タミヤ楽しい工作シリーズ の各種パーツは当がらくた部屋標準在庫品で常に補充している)
   「脚やリンク等の板部品はダンボール(アマゾンの配送箱の底板)で」
   「関節やその他の機構もストロー、爪楊枝、竹ひご、はとめ等可能な限り日用品で」
といったところで進めることにしました。

 普段ですと四脚のロボットを作るのであれば各脚に2関節または3関節のサーボを用意して、四脚で12個のサーボを・・・となるのですが、今回は1モータで四脚を動かすので、まず、動作機構を検討することにしました。過去に作ったLEGOの記録や引き出しにころがっているロボットの残骸などを色々見た結果、以前にIchigoJamで動かしたタミヤ楽しい工作シリーズのリモコン昆虫の歩行機能を真似させてもらうことにしました。タミヤのこの透明ロボットのシリーズはアクリルロボットで有名な三井康宣さんの作品を商品化したものです。参考にしたリモコン昆虫は六脚ですが、その内四脚分の動作を模倣しました。
 まずは、動作やサイズ感のプロトタイプとして、四脚のリンク動作をLEGOで再現してみました。


 この動きを牛乳パックとダンボール脚で再現することを目指します。

 まずは、プロトタイプのLEGOを元にダンボール部品の図面を作成しました。ごく大雑把で簡単なものですが、印刷してダンボールに貼り付ければ、ダンボールを切るときに便利です。図面はフリーで使える(要メール登録)Draftsightという二次元CADを使いました。最近は二次元・三次元含めて非商用であればフリーで使わせてもらえる高機能なCADが提供されているので、自分のようなホビーユーザーにはありがたい限りです。ちなみに自分は二次元CADはDraftsight、三次元(3Dプリンタ用)はFusion360 を使わせていただいてます。感謝。


 ダンボールは Amazon の梱包箱の底板を使います。


 図を貼り付けて、(両面テープで貼りました)


 できるっかな、できるっかな~♪ 「ウゴウゴっ!」


 切り終わったパーツ。


 次に駆動系を用意。タミヤ楽しい工作シリーズのシングルギアボックスを最低速(344.2:1)のギア比の組み合わせで組み立て。




 モータはあとで取り付けることにしました。


 本体(胴体)となる紙パック。このために買って飲んだけど甘かった・・・。


 紙パックの上面を切り取って



 モータに線材をハンダ付けして


 それぞれの部品を組み上げました。紙パックだけだとペラペラなので、脚部品を切り出して余ったダンボールを底板に敷きました。


 レゴのプロトタイプを元に脚部品を組み立て


 反対側


 関節可動部にはストローで作った軸を通して、ダンボールのワッシャーで脚部品を両側から挟み込んで木工用ボンドでストロー軸とダンボールワッシャーを固定することで、回転可動できるようにしています。また、シングルギアボックスからの出力軸のクランクと脚部品は爪楊枝とセロテープで太さ調整をして接続しています。


 一通り組み上げたところで、大きなミスに気づきました。後ろ脚関節軸のストローの位置を誤って5mm程度後ろすぎる位置にあけてしまっていました。このため、ストロー軸が大きくたわんでしまっています。


 ただ、このストロー軸のすごいところは、上記の寸法ミスをストローの弾力で吸収してしまうところです。まあ、今回、偶然気がついた理由ですが・・・。これだけ歪んだ状態でも、弾力で吸収してなんとか動いてしまいました。こんなの、金属の軸だったら絶対動かないのに・・・。ストローすご過ぎ。今後の工作の材料として積極利用することに即決定。

 で、とりあえず、歩かせてみたところの動画です。


 こういう日用品で楽しむ工作っていうのもいいですね~。次は何作ろうかな?でっきるかな、でっきるかな♪~ ウゴウゴっ!









2015年4月26日日曜日

IchigoJam が楽しい

 一週間ほど前に、(mbed) LPC1114 を試した際にLPC1114つながりで、IchigoJam というLPC1114でBASICが使える子供向けコンピュータ(と言いつつ、これを楽しんでるのは、70後半~80年代にマイコンボードやパソコンをいじっていたおっさんたちだと思う)も入手して触ってみたんですが、これがなかなか楽しいおもちゃです。小学生時代にN-BASICにはじめて触った頃を思い出してしまいました。ところで、このIchigoJamはLPC1114を使っているので、BASICと言いつつマイコンっぽい機能も使えたりします。例えば、デジタルI/Oがいくつかとアナログ入力とI2CとUARTが1chずつあります。となると、当がらくた部屋としては、やはりうごきモノの載せてみたくなるわけです。

 そこで、今回はAmazonで1400円くらいで売っている、これで行ってみようと思います。

 このリモコン昆虫よりも若干大きくなりますが、タミヤのユニバーサルプレートにIchigoJamと電池ボックスを取り付け、このリモコン昆虫の上というか背中の部分に載せます。
 まず、IchigoJam 4つの穴すべてがユニバーサルプレートの穴位置とは揃わないので、内2つをユニバーサルプレートとも固定、残り2つはスペーサを立てているだけで固定はしていません。


 電池ボックス。今回は単4エネループ三本で。


 単純にモータOn/Offができればいいので、Digital出力+Hブリッジでもいいのですが、I2Cを使ってみたかったので、あえて、DRV8830 I2Cモータドライバを使っています。またいつものPSDセンサを前方部に取り付けて、アナログ入力(IN2)に接続しています。


 シールド(ドータボード)の真ん中辺にあるのは、電池から3.3Vを生成するためのDC-DCとモータ側とIchigoJam側を切り分けるためのI2Cレベル変換です。シールドを作ってはじめて気がついたんですが、このジャンパピン用のソケットの間隔って100mil単位になっていないようです。850milとかそんな感じの半端な幅です。なので、差し込むときは、ピンを曲げるような感じで半ば強引に挿し込みました。


 PS/2のコネクタがシールドの裏面をショートさせるので、絶縁テープでカバーをしています。


 みんな大好き、タミヤの楽しい工作シリーズ。リモコン昆虫。


 リンク機構で6脚を動かす仕組みになっています。大人が組立てても十分楽しいキットでした。以下、載せたところ。



 おなか側。


 動かしてみたところ。


 やっていることは、ごく単純。

2014年8月9日土曜日

3Dプリンタで多脚ロボット

 3Dプリンタを導入して2週間が経ちましたが、実際に動かせるのは休みの日曜・祝日くらいなので、なかなか思ったように作業が進まないのですが、どうにか初作品のベース部分がそれっぽい形になってきました。









なんだかごちゃごちゃしてますが、六脚ロボットです。サーボはアマゾンで10個入り三千いくらで買ったSG90という小型のものです。動作精度やトルク・早さはもちろん期待できませんが、足の上げ下げ、左・中・右・・・くらいのおおまかな制御ができればいいだろうということで何よりもリーズナブルな価格で採用しました。

 サーボの制御は例によっていつものAdafruitのPCA9685搭載16chPWMコントローラです。まずは、Ardino Unoと接続してサーボ制御プログラムの作成。


 単純に足を上下前後に繰り返し動かすシーケンスですが、なんとなく前に進むことはできそうな動きをしているのでOKとします。

 さらに、3Dプリンタで作った目玉パーツを取り付けます。目玉の中にはスイッチサイエンスさんで入手した Adafruit の I2C接続 8x8 小型マトリックスLED を入れました。




 また、Arduino Uno をArduino Micro に置き換えて、ロボット上に実装しました。電源は搭載が難しそうなので、外部からの有線供給とし、この外部供給 5Vをサーボと制御系で併用するようにしました。ノイズ等での誤動作が心配ですが、パスコンを入れて試してみます。



 全体を組み立てて、



 背中に Arduino Microと


Adafruit 16ch Servo Driverを載せています。


 動かしてみたところ。



 歩き方が雑でぎこちないですが、どうにか動いています。ただ、はじめは、マトリックスLEDのI2Cアドレスを 0x70と0x71にしていたらサーボドライバがなぜか動きませんでした。マトリックスLEDのアドレスを0x71と0x72に変えたところ動くようになりました。別にサーボドライバ(0x40)とアドレスがかぶっているわけでもないですし、プログラム中で指定しているアドレスが間違っているわけでもなかったのですが、不思議です。原因不明。とりあえず今回のソースはかんな感じ。
#include <Wire.h>
#include <TimerOne.h>
#include <Adafruit_PWMServoDriver.h>
#include "Adafruit_16ch_Servo.h"

#include <Adafruit_GFX.h>
#include <Adafruit_LEDBackpack.h>

double SERVO_CENTER_PULSE_WIDTH = 1520.0; // サーボ信号。センターパルス幅。
double SERVO_MIN_PULSE_WIDTH = 720.0;  // サーボ信号。最小パルス幅。
double SERVO_MAX_PULSE_WIDTH = 2320.0;  // サーボ信号。最大パルス幅。

const int led_pin = LED_BUILTIN; // モニタLED。

// マトリックスLEDのアドレス指定。デフォルトは0x70。
static const uint8_t matrixAddress[] = {0x71, 0x72};

static boolean 
 output = HIGH,    // LED点滅フラグ。
 timerCallbacked = false; // タイマ割り込みフラグ。

static int
 actionSeq = 0,
 keepCount = 0;

uint8_t
 blinkCountdown = 100, // 瞬き用カウント。
 gazeCountdown = 75,  // 目玉向き用カウント。
 gazeFrames = 50;  // 目玉動く早さ。

int8_t
 eyeX = 3, eyeY = 3,  // 現在の目玉位置。
 newX = 3, newY = 3,  // 次の目玉位置。
 dX = 0, dY = 0;   // 位置の差分。

// サーボモータのモーション情報。
static int motion[11][17] = {
//  {ch0, ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8, ch9,ch10,ch11,ch12,ch13,ch14,ch15,time(x100ms)}
 {  0,  50,   0,   0,   0,  50,   0,   0,   0, -50,   0,   0,   0,   0,   0,   0, 3},
 { 20,   0, -20,   0,  20,   0,  20,   0, -20,   0,  20,   0,   0,   0,   0,   0, 3},
 {  0,   0,   0,  50,   0,   0,   0, -50,   0,   0,   0, -50,   0,   0,   0,   0, 3},
 {-20,   0,  20,   0, -20,   0, -20,   0,  20,   0, -20,   0,   0,   0,   0,   0, 3},
 {  0,  50,   0,   0,   0,  50,   0,   0,   0, -50,   0,   0,   0,   0,   0,   0, 3},
 { 20,   0, -20,   0,  20,   0,  20,   0, -20,   0,  20,   0,   0,   0,   0,   0, 3},
 {  0,   0,   0,  50,   0,   0,   0, -50,   0,   0,   0, -50,   0,   0,   0,   0, 3},
 {-20,   0,  20,   0, -20,   0, -20,   0,  20,   0, -20,   0,   0,   0,   0,   0, 3},
 {  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, -8},
 {  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 0},
 {  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 0}
};

// マトリックスLEDの目玉のアニメーションイメージ。開→閉。
static const uint8_t PROGMEM blinkImg[][8] = 
{
 {
  B00111100,   // 目を完全に開いた状態。
  B01111110,
  B11111111,
  B11111111,
  B11111111,
  B11111111,
  B01111110,
  B00111100
 },
 {
  B00000000,
  B01111110,
  B11111111,
  B11111111,
  B11111111,
  B11111111,
  B01111110,
  B00111100
 },
 { 
  B00000000,
  B00000000,
  B00111100,
  B11111111,
  B11111111,
  B11111111,
  B00111100,
  B00000000 
 },
 {
  B00000000,
  B00000000,
  B00000000,
  B00111100,
  B11111111,
  B01111110,
  B00011000,
  B00000000
 },
 {
  B00000000,         // 目を完全に閉じた状態。
  B00000000,
  B00000000,
  B00000000,
  B10000001,
  B01111110,
  B00000000,
  B00000000
 }
};

// 目をまばたくアニメパターン。全開→閉→全開の間を2段階。
static const uint8_t blinkIndex[] = {1, 2, 3, 4, 3, 2, 1};

// サーボオブジェクト。
Adafruit_16ch_Servo pwm = Adafruit_16ch_Servo();

// マトリックスLEDのオブジェクト。
Adafruit_8x8matrix matrix[2] = {
 Adafruit_8x8matrix(), Adafruit_8x8matrix() };

// タイマ割り込みのコールバック関数。
// フラグ更新を行い、実際の処理はloop()関数内でフラグをチェックして実行。
void timerCallback()
{
 timerCallbacked = true;
}

void setup()
{
 actionSeq = -1;
 keepCount = 0;

 // LED接続ポートを出力に設定。
 pinMode(led_pin, OUTPUT);

 // マトリックスLEDの開始。
 for (int i = 0; i < 2; i++)
 {
  matrix[i].begin(matrixAddress[i]);
 }

 // サーボPWMの開始と初期設定。
 pwm.begin();
 pwm.setPWMFreq(60);
 for (int i = 0; i < 16; i++)
 {
  pwm.setCenterPulseWidth(i, SERVO_CENTER_PULSE_WIDTH);
  pwm.setMinPulseWidth(i, SERVO_MIN_PULSE_WIDTH);
  pwm.setMaxPulseWidth(i, SERVO_MAX_PULSE_WIDTH);
 }
 pwm.setServoPosition(0, 0);
 pwm.setServoPosition(1, 0);
 
 // タイマ割り込みの初期化と開始。
 Timer1.initialize();
 Timer1.attachInterrupt(timerCallback, 100000);
 
}

void loop()
{
 
 if (timerCallbacked)
 {
  timerCallbacked = false;

  digitalWrite(led_pin, output);
  output = !output;

  if (keepCount == 0)
  {
   // 次のシーケンスを実行。
   actionSeq++;

   // シーケンス番号が0で停止。負で数だけステップ戻る。
   if (motion[actionSeq][16] == 0)
    while(true);
   if (motion[actionSeq][16] < 0)
   {
    actionSeq = actionSeq + motion[actionSeq][16];

    if (actionSeq < 0) actionSeq = 0;
   }

   // サーボモータ位置設定。
   for (int i = 0; i < 16; i++)
   {
    pwm.setServoPosition(i, (double)motion[actionSeq][i]);
   }
   keepCount = (int)motion[actionSeq][16];
  }
  
  keepCount--;

  
  for (int eye = 0; eye < 2; eye++)
  {
   // マトリックスLEDのクリア。
   matrix[eye].clear();

   // ウィンク動作。
   matrix[eye].drawBitmap(0, 0,
    blinkImg[
     (blinkCountdown < sizeof(blinkIndex)) ?
      blinkIndex[blinkCountdown] : 0
    ], 8, 8, LED_ON);

   // カウンタ減して、0ならランダムに次の瞬きまでのカウントをセット。
   if (--blinkCountdown == 0) blinkCountdown = random(5, 180);

   // 目玉部分の描画。
   if (--gazeCountdown <= gazeFrames)
   {
    matrix[eye].fillRect(
     newX - (dX * gazeCountdown / gazeFrames),
     newY - (dY * gazeCountdown / gazeFrames),
     2, 2, LED_OFF);

    if (gazeCountdown == 0)
    {
     eyeX = newX; eyeY = newY;
     do
     {
      newX = random(7); newY = random(7);
      dX = newX - 3; dY = newY - 3;
     }
     while ((dX * dX + dY +dY) >= 10);
     dX = newX - eyeX;
     dY = newY - eyeY;
     gazeFrames = random(3, 15);
     gazeCountdown = random(gazeFrames, 120);
    }
   }
   else
   {
    matrix[eye].fillRect(eyeX, eyeY, 2, 2, LED_OFF);
   }
  }

  // マトリックスLEDの表示更新。
  for (int i = 0; i < 2; i++)
  {
   matrix[i].writeDisplay();
  }
 }

}


Visual Microでのプロジェクトはこちらにあります。

2013年6月16日日曜日

LEGO MINDSTORMS STAR WARS DARK SIDE DEVELOPER KIT AT-AT を組み立ててみました。

 LEGO MINDSTORMS STAR WARS DARK SIDE DEVELOPER KIT AT-AT を組み立ててみました。まず、ベースユニットとなる「Xフレーム」というのを組み立てます。
 前後の脚の軸を駆動するギアをそれぞれ組合たせて、真ん中で前後のシャフトを傘歯ギア三昧で結合しています。



 マイクロスカウタを載せて、


 Xフレームができました


 ここにAT-ATの歩行機構と外観を構成していきます。


 まず、上脚(腿?)部です。



 次に下脚(膝から下?)を組み立てます。AT-ATらしい足首の部分の形状も再現されています。



 四脚でたったところ。説明書通りに組み立てていくだけですが、なんかワクワクして楽しいです。



 背中部分の外装を付けます。独特の形状でイメージが膨らみます。



 顔(頭)の部分です。


 本体と結合して、出来上がり。なかなか想像力を掻き立てる姿です。



 作業机の上はあまりにもごちゃごちゃなので、床において写真を何枚か。





 おしりもかわいい。

 マイクロスカウタで動かしてみたところです。


 よちよちした感じとうか、ぎこちない感じが、本物(映画中)のAT-AT ぽくっていい感じ。歩行の傾きに合わせて首がゆらゆらゆれるのもいい感じ。動画を撮影しながら、脳内ではスター・ウォーズのテーマ曲と惑星ホスの雪の世界が広がっちゃっています。

 それにしても、マイクロスカウタの1軸のモータ出力で、よくこんな動きができるなぁと感心させられます。自分は機械系ではないので、LEGOのリンクやカムを使った想像を越える動きには驚かされるばかりです。