2012年09月10日

プロペラマイコンをArduinoのように扱うArduino IDEベースの開発環境作りかけてみた

Arduino IDEでArduinoを扱うように、Parallax社のPropellerマイコンを扱えたら楽しいかも?と先日プロペラブの@kama_AGEさんと話していて、これは是非やってみたいなーと思いまして、やってみることにしました。
名前ですが、Propeller版Arduinoということで、Propduinoかな?と考えました。

しかし、ググると既にArduinoライクなマイコンボードの名称に使われてましたので、Pellerduinoかな?とググると何もひかからなかったので、Pellerduino(ペラデュイーノ)という名称にしてみました。


以下のような事が出来ればいいな、ということを考えました。
(1)PropellerマイコンのIDEをArduino IDEベースで作る(Arduino IDEの知識だけでほぼ使える)
(2)コンパイラはPropeller gcc
(3)ArduinoのAPI相当品を用意する
(4)Arduinoライブラリをロードするようにcogに各種モジュール(例:USBホストとか、ビデオ出力とか)をArduinoライブラリと同じ手順でロード設定でき、即座に派手な動かし方ができる
(5)各cogに別々なCのソースを手軽にロードして並列動作させる
とか。

特に、プロペラの作法を勉強しなくても、手軽にArduino APIで既存のPropeller用の各種モジュールを手軽に使用出来る環境になったらいいな、という理想です。

というわけで、早速作り始めてみました。
まだまだ作りかけたばかりなのでろくにプロペラならではの事は出来ませんが...^^;

環境はひとまず手持ちのMacOSX向けですが、Arduino IDEのソースはマルチプラットフォームなので多少の手直しで各環境で動くのだろうと思います。

コンパイラは、Propeller gccです。
http://code.google.com/p/propgcc/

ボードはPropellerマイコンのQuickStartボードを持っていたのでそれ向けにしました。
画面はデザイン何も変更していません。。色は変えようかなと思っています。
propelleride_ss.jpg
例えば、PropellerのQuickStartボードの青色LED1個を点滅させる場合、以下のようなスケッチになります。
void setup()
{
  pinMode(23,OUTPUT);
}

void loop()
{
  digitalWrite(23,HIGH);
  delay(1000);
  digitalWrite(23,LOW);
  delay(1000);
}
GPIO関連のAPI等はArduino APIもどきを作りましたので、感覚的にはArduinoスケッチっぽいです。

ボードのLEDが流れるような動きをするスケッチですと、こんな感じになります。PIN_LEDxは、QuickStartボード用のボードサポートファイルを用意し、そこで提供するようにしています。
const int pinTable[8] = {
    PIN_LED0,
    PIN_LED1,
    PIN_LED2,
    PIN_LED3,
    PIN_LED4,
    PIN_LED5,
    PIN_LED6,
    PIN_LED7
};

void setup()
{
    int i;
    for(i=0;i<8;i++){
	pinMode(pinTable[i],OUTPUT);
    }
}

void loop()
{
    int i;
    static int c = 0;

    for(i=0;i<8;i++){
	if(c % 8 == i){
	    digitalWrite(pinTable[i],HIGH);
	} else {
	    digitalWrite(pinTable[i],LOW);
	}
	delay(10);
    }
    c++;
}

上記の2スケッチを動作させているところの動画を撮ってみました!

今回いじったおかげで、Arduino IDEのソースの理解を深められたかなーと思います。
もう少し完成度を高めて、公開させていただきたいなーーと思っています。

Vixen(ビクセン) 双眼実体顕微鏡 ミクロボーイ 30倍 2122-00
Vixen(ビクセン) (2011-04-11)
売り上げランキング: 32928
posted by いしいっち at 23:31| Comment(0) | TrackBack(0) | コンピュータ | このブログの読者になる | 更新情報をチェックする

2012年08月21日

UDP Hole PunchingでNAT越えの実験をしてみた

昨日、AndyVisionWi-Fiを作ったよの記事を本ブログに書きました。
Andy自身でネットワークに繋がるなら、インターネット越しの遠隔制御したい、と思うところです。しかもカメラついてたら、楽しそうだし。。


さて、インターネットを介して複数の機器が連携したい場合、それぞれにグローバルIPが割当たっていれば特に問題なく通信はできるでしょうけれども、もし、それぞれの機器がルーターにぶら下がっているような場合、中継サーバなどを用いない場合、直接機器間で通信をどのように確立するか?という課題が発生します。

そこで、オールマイティな手法ではないようですが、大抵のルーター環境で使えそうなのが、UDP Hole Punchingという手法ということのようです。
この手法を使用すると、たとえばルーターAに繋がった機器aとルーターBに繋がった機器b同士が、ダイレクトにUDP通信できる、ということでした。いわゆる「NAT越え」の手法の一つだそうです。

UDPホールパンチングの何故UDPのパケットをダイレクトに機器間でやりとりできるか?の理屈は、ググるといろいろ出てきますので端折るとして、実際にコードを作成し、パケットを送受信させてみて、どんな感じか実験してみることにします。

ネットワークA : イーモバのポケットルーターに繋がってるPC1
ネットワークB : 光回線+バッファロールーターに繋がってるPC2
PC1とPC2とでUDPで直接お話し出来してみる、という実験です。

とりあえず、Rubyにて、実験用のコードを作ってみます。

PC1で1st.rb <ネットワークBのグローバルIP>として起動します。
次に、PC2で2nd.rb <ネットワークAのグローバルIP>として起動します。

すると、1st.rb側で既に開いてる穴に向かって2nd.rbからのUDPパケットが到着します。
1st.rb側は、2nd.rbからのUDPパケットの送信元情報を使用して、2nd.rb側に
パケットを投げますと、同様に2nd.rb実行側にも穴が開いてるのでパケットが届きます。

というわけで、いとも簡単にNAT越えできちゃいました!
実際に複数の機器間通信をやりたい時には、接続相手の管理をインターネット上の別サーバに行わせた上で、機器同士が通信をはじめれば良いのでしょうね。

1st.rb
#!/usr/bin/ruby

require "socket"

ipaddr = ARGV[0]
port = 25000

printf("Accessing to %s:%d...",ipaddr,port)
STDOUT.flush

udp = UDPSocket.open()
sockaddr = Socket.pack_sockaddr_in(port,ipaddr)
udp.bind("0.0.0.0",port)

udp.send("Hello",0,sockaddr)

count = 0

msg,inet_addr = udp.recvfrom(65535)
printf("Packet received.message=[%s]\n",msg)
p inet_addr

sockaddr2 = Socket.pack_sockaddr_in(port,inet_addr[3])

while(true)
  udp.send(sprintf("Send from 1st.rb:Count %8d\n",count),0,sockaddr2)
  count += 1
  sleep(0.5)
  p udp.recv(65535)
end

udp.close
2nd.rb
#!/usr/bin/ruby

require "socket"

ipaddr = ARGV[0]
port = 25000

udp = UDPSocket.open()
sockaddr = Socket.pack_sockaddr_in(port,ipaddr)
udp.bind("0.0.0.0",port)

udp.send("Hello",0,sockaddr)

count = 50000

while(true)
  udp.send(sprintf("Send from 2nd.rb:Count %8d\n",count),0,sockaddr)
  count += 1
  p udp.recv(65535)
end

udp.close
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
Dustin Boswell Trevor Foucher
オライリージャパン
売り上げランキング: 325

たのしいRuby 第3版
たのしいRuby 第3版
posted with amazlet at 12.08.21
高橋 征義 後藤 裕蔵
ソフトバンククリエイティブ
売り上げランキング: 6858
posted by いしいっち at 23:30| Comment(0) | TrackBack(0) | コンピュータ | このブログの読者になる | 更新情報をチェックする