LEGOでUFOキャッチャーを作ってみた。

=====================
2011/11/27 記述

 


LEGOでUFOキャッチャーを作ってみました。デルタロボットの機構を採用しました。アームの操作には、Android携帯を使ってます。主要部品は、Android, Arduino, 自作モータードライバシールド、NXT,モーター4つ、LEGOブロックです。

==================
2011/12/05 更新

解体前に記念撮影。ダンボール箱が邪魔だ〜。

Galaxy Tabのスクリーンショット画面です。



















========================
2011/12/08

アスキー.jpで紹介されました。


Make: Tokyo Meeting 07に出展します。→出展しました。

========
2011/11/30記載
 
12月3、4日に開催されるMTM07に出展します。

出展内容は、




3)頒布品

です。

当日、よろしくお願いします。

=================
2011/12/05更新

MTM07に参加してきました。
10:30ごろに会場に到着後、今回の出展物を並べていきます。
思っていたよりUFOキャッチャーの展示物をスムーズにくみ上げることができ、調整に要する時間も少なかったです。コンパクトに作品を纏め上げる力がつきつつあるようです。

会期中は、小さな子供さんが(3歳が最年少!)特に興味をしめしてくれて、楽しそうに遊んでくれたので展示してよかったです。中には、リピーターになってくれた子もいました。
今回、デルタロボット方式を採用し、各モーターを個別に上下移動させる方法をとりました。上下左右にアームを制御できないので、遊んだ方は操作に手間取っていましたが、かえってこの点がゲーム性を高めてくれて、達成感を得たようです。


反省点としては、アームを開く機構。
シリンダーの弁の切り替えにモーターを使っているのですが、トルク不足?のため、アームを開けないことがありました。アスキーさんに取材してもらった時も、アームを開くことができず、なくなく手動で切り替えました。

展示作品で気になったものをつらつらと。

うちの子がとても気に入った作品。何度も遊んでいました。
魚の口に指を入れるとかみます。pogoplugが使われています。


モーター1個であの”犬”を表現したレゴ作品。
作者は、謙遜されていたが、モーター1個で4足を制御している点がいい。
こういう作品をどんどん作って、メカ的センスを身に着けたいな。


空中配線版Arduinoを瓶に入れるプロジェクト。


MINTIAのケースに液晶やLED、基板を入れるプロジェクト。
表面実装のLEDを手付けで200個以上つけた作品をみせてもらいました。


ADKを使ったアプリ。MTM07で、ADKを使った作品を展示している人が意外と多かったです。自分もメッセージボードを出せばよかったかな。


LEDを使った時計作品。
ネタとしては定番ですけど、表現の仕方で印象が変わります。
自作のLEGOボックスに入れた時計アプリも気に入っているんですけど、何が違うのかな。
完成度かな?


念願だった、arm22さんに2年越しにお会いできました。うれしかった。


ルービックキューブ本体にモーターを仕込んで、みずから動いてしまおうという作品。
発想がぶっとんでいて、大好きだな。
モーターを6つ使って、動いているそうです。



NXT用 コネクタのピンアサイン情報

2011/11/20
NXTのコネクタのピンアサイン情報をまとめます。


コネクタのピンアサイン情報です。コネクタを裏から見たピン情報です。


出力側(A, B, C)ポートのピンアサインです。
入力側(1, 2, 3, 4)ポートのピンアサインです。



2011/11/29 

NXTコネクタをDIP化する基板を作成しました。
  


Arduino用にNXTインタフェースシールドキットを作成しました。

 回路図 
 

 写真
  


 作成例
モータードライバ回路
 

NXT - Arduino間の通信プログラム例

NXTに自作電子機器を接続するには、いくつか方法があります。
今回は、i2c通信を使ったArduino-NXTの通信例を紹介します。

1)接続図
NXTのポート1とArduino間をi2Cで接続します。

NXTのポート1のピン情報は、こちらで紹介しましたが、i2c通信で使用する場合、ピンアサインは、pin5:CLK, pin6:Dataです。
Arduinoのピンアサイン情報は、A4 pinがData, A5 pinがCLKです。

2)NXT側のプログラム
   1 import lejos.nxt.*;
   2 
   3 public class I2CDevices {
   4    
   5    
   6    public static void main(String[] args) throws Exception {
   7            int addr = 0x2;
   8            int reg = 0x2;
   9            byte val = 0x10;
  10            
  11            
  12            I2CSensor[] sensors = {
  13                            new I2CSensor(SensorPort.S1)};
  14            
  15            while (!Button.ESCAPE.isPressed()) {
  16                    if(Button.RIGHT.isPressed()){
  17                            lsendData(sensors[0], addr, reg, val);
  18                    }
  19 //                       val++;
  20            }
  21    }
  22    
  23    static void lsendData(I2CSensor sensor, int addr1, int reg1, byte val1) {
  24            sensor.setAddress(addr1);
  25            
  26            //Executes an I2C write transaction.
  27            sensor.sendData(reg1, val1);
  28    }
  29 }

3)Arduino側のプログラム
   1 #include <Wire.h>
   2 
   3 byte command[10];
   4 byte val = 0;
   5 int lengthofdata = 0;
   6 
   7 void setup()
   8 {
   9   Serial.begin(9600);
  10   
  11   //Wireライブラリを初期化し、I2Cバスにマスタかスレーブとして接続
  12   //address: 7ビットのスレーブアドレス。省略した場合は、マスタとしてバスに接続します。 
  13   Wire.begin(1);               // join i2c bus with address #2
  14   
  15   /*スレーブデバイスで、マスタからデータのリクエストが来たときに呼ばれる関数を登録します。 */
  16   Wire.onRequest(requestEvent); // register event
  17   
  18   /*スレーブデバイスで、マスタからデータが送られてきたときに呼ばれる関数を登録します。 */
  19   Wire.onReceive(receiveEvent);
  20 }
  21 
  22 void loop()
  23 {
  24   int i;
  25   if(lengthofdata !=0){
  26 //    Serial.print("a");
  27     for(i=0; i< lengthofdata; i++){
  28       Serial.print(command[i], HEX);
  29     }
  30   }
  31   
  32   lengthofdata = 0;
  33   delay(100);
  34 }
  35 
  36 /*-------------------------------------------------------
  37 interrupt handler. don't execute too much. execute in loop.
  38 --------------------------------------------------------*/
  39 void receiveEvent(int gotbytes)
  40 {
  41    /*マスタデバイスでは、requestFrom()を実行したあと、
  42    スレーブから送られてきたデータを読み取るときに使用します。
  43    スレーブがマスタからのデータを受信するときにも使用します。*/
  44   int i;
  45   
  46   for(i=0; i<gotbytes; i++){
  47    command[i] = Wire.receive(); 
  48   }
  49   
  50   lengthofdata = gotbytes;
  51 }
  52 
  53 /*-----------------------------------------------------------
  54 interrupt handler. don't execute too much. execute in loop.
  55 -----------------------------------------------------------*/
  56 void requestEvent()
  57 {
  58    /*スレーブデバイスがマスタからのリクエストに応じてデータを送信するときと、
  59    マスタがスレーブに送信するデータをキューに入れるとき使用します。
  60    マスタではbeginTransmission()とendTransmission()の間で呼ばれます。 */
  61   Wire.send(val);    //ack = 0
  62 }
  63


4)NXTの左ボタンを押すたびにArduinoに2, 0x10を送信します。
受信したArduinoは、COMポートに0x2, 0x10を送信します。


Fusion PCBに基板を注文してみた。

2011/11/03
久しぶりにCADを使って、回路図をひいてみた。 注文先は、Fusion PCB。 うまくできるといいな。
送信者 201111
気になっていること。 
・面付けは、サイトによるとsilkscreenに線を描ければよいと思うが、どうなんだろう。
・ドリルで穴を開ける練習するのを忘れた。
・ユニバーサル基板のようにスペース部分に穴をあけたが受け入れてくれるか?追加料金は、発生するのか?

2011/11/22、基板が到着。19日と3週間弱で到着。


箱を開けるとこんな感じで梱包されてました。 
 


基板を1枚取り出してみました。まずまずの出来。
XBeeのロゴがない。ロゴ表示部分は、レイヤーが違ったのかな。ライブラリーを後で確認してみよう。
面付けを示したシルクがない。レイヤーを間違えた? 

参考までに基板の発注から発送までの履歴を。


基板の切り出し、どうしよう。
基板カッターを買いたいところだけど意外と高いし、作業スペースをとられる。
秋葉原に作業場所がないかな。

ArduinoとEthernet Shiledと 秋月電子LED電光掲示板とLEGO

前回のエントリー では、時計アプリを作りました。

今回は、ニュース情報、為替情報、天気情報を表示するように機能を追加しました。
ニュース情報、天気情報は、Yahoo! RSSサービスを利用しています。
為替情報は、Yahoo!ファイナンス情報からレートを取得してます。

また、数字、平仮名、漢字、カタカナ、記号などのフォント表示にも対応しています。フォントデータは、東雲フォントデータをSDメモリに保存し、電光掲示板用に変換しています。

電光掲示板を駆動するソフトは、@arm22さんのライブラリをベースに16x16ドットに拡張しました。

筐体は、もちろんLEGOで作りました


 全体像
左上:為替レートを表示
上部にスイッチがあり、ボタンを長押しすると表示する情報を切り替えます。

左下:時計
右上:Yahoo ! トップニュース
右下:Yahoo ! 天気情報
 
送信者 201111
動画
 



2011/11/15 追記
電子工作テスト2011に参加するためにプロモーションビデオを作成しました。