はじめに †今更感はありますが、Contikiをもっと把握しておきたいということでサンプルプログラムを片っ端から試してみることにしました。 まずはexamples/sky/MakefileのAPP変数やallをいろいろと修正。 CONTIKI = ../.. ifndef TARGET TARGET=sky endif APPS=deluge all: blink sky-collect rt-leds test-button test-cfs burn-nodeid fader example-coffee radio-test test-coffee test-deluge # tcprudolph0 %.tgz: %.ihex mkdir $(basename $<) ; \ mv $< $(basename $<) ; \ echo $(basename $<)/$(basename $<).ihex 600 > $(basename $<)/runfile ; \ tar czf $@ $(basename $<) CONTIKI_WITH_IPV4 = 1 CONTIKI_WITH_RIME = 1 include $(CONTIKI)/Makefile.include Makefileに CONTIKI_WITH_IPV4 = 1 CONTIKI_WITH_RIME = 1 と入っているということはIPv4とRIMEを使ってるみたいです。 APPSはapps/ディレクトリの中でリンクするプロジェクトです。 test-deluge.cをコンパイルするのに必要です。 makeするとnodeidを引数に付けないとだめだよと怒られます。 make nodeid=1 とかすると問題なくコンパイルが通ります。 このnodeidを指定しないとだめなことがどこに書かれているのか? Makefileに書かれているかと思ったらplatform/sky/apps/burn-nodeid.cに記述されていました。 #if NODEID printf("Burning node id %d\n", NODEID); node_id_burn(NODEID); leds_on(LEDS_BLUE); node_id_restore(); printf("Restored node id %d\n", node_id); #else #error "burn-nodeid must be compiled with nodeid=<the ID of the node>" node_id_restore(); printf("Restored node id %d\n", node_id); #endif #errorでコンパイル時にエラーメッセージ出せるんですね... 勉強になりました。 これでできたファイルが
の11個のファイルです。 tcprudolph0ってなんなんでしょうか。 とりあえず放置することにしました。 上から順番に解説です。 blink.sky †make blink.upload で書き込み。 1秒毎に全てのLEDが点滅するプログラムです。 動作確認に良いかもしれません。 platform/sky/apps/の中に入っているプログラムは基本的にはどの場所からでも make blink TARGET=sky とかやればコンパイルして試せます。 burn-nodeid.sky †make burn-nodeid.upload で書き込み。 ところがうんともすんとも言わない。 実体はplatform/sky/apps/burn-nodeid.cです。 覗いてみるとprintfでいろいろと書かれてます。 make loginしようとすると以下のエラーが。 fatal: Not a git repository: '../../.git' ../../tools/sky/serialdump-linux -b115200 /dev/ttyUSB0 ../../tools/sky/serialdump-linux: 1: ../../tools/sky/serialdump-linux: Syntax error: Unterminated quoted string make: *** [login] Error 2 これは実は既に解決済みで tools/sky/serialdump.c を修正する必要があります。 166a167 > #ifdef O_SYNC 169c170 < fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY | O_SYNC); --- > fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY | O_DIRECT); 171c172,174 < --- > #else > fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY | O_SYNC ); > #endif どうやらInstant ContikiだとO_DIRECTが使えないらしいです。 これで sudo make login してリセットボタンを押すと ../../tools/sky/serialdump-linux -b115200 /dev/ttyUSB0 connecting to /dev/ttyUSB0 (115200) [OK] Rime started with address 1.0 MAC 01:00:00:00:00:00:00:00 Contiki 3.0 started. Node id is set to 1. nullsec CSMA ContikiMAC, channel check rate 8 Hz, radio channel 26 uIP started with IP address 172.16.1.0 Starting 'Burn node id' Burning node id 1 Restored node id 1 という感じでIDが書き込まれて読み込まれるのが見えます。 TelosBではxmemにnodeidが記録されています。 が、Contikiのアドレス体系に書いているように、TelosBを使うときにはnodeidよりもds2411に入っているアドレスを使った方がよさそうです。 example-coffee.sky †to be updated. fader.sky †make fader.upload で書き込み。これもplatform/sky/appsに入っているプログラムです。 動作はLEDがフェードアウトしながら消えるというプログラムです。 中身を見てみると、高速に点滅させることでフェードアウトの効果を実装しています。 PT_SPAWNという見慣れない関数もありました。 スレッドを途中で作ることができるんですかね... radio-test.sky †to be updated. rt-leds.sky †make rt-leds.upload で書き込み。 LEDが高速に明滅します。 通常のblinkがetimerを使っているのに対してこれはrtimerを使っています。 sky-collect.sky †make sky-collect.upload で書き込み。 青色のLEDが光りっぱなしで何が起きてるのかよくわかりません。 困ったときのserialdump頼みということで make login してリセットをかけてみると Starting 'Test collect process' 'Depth indicator' とか出るもののやはり何も変わらない。 ソースコードを読むとbutton_sensorを読んでbuttun_sensorが押されるとcollect_set_sinkが呼ばれているのでsinkノードに設定できるのかなとボタンを押してみるとLEDが消えた。 何かが起こったようです。 そしてシリアルには 1 0 0 110 133 6754 1118 0 0 0 0 1012488 93946 12652 10363 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 848 1 1 0 115 120 6747 1122 0 0 0 0 1626952 145972 24068 12466 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 903 1 2 0 114 118 6745 1115 0 0 0 0 2247842 192170 29988 12466 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 905 1 3 0 114 118 6744 1114 65524 0 0 0 2862661 243924 38943 14574 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 912 1 4 0 112 135 6741 1114 65527 0 0 0 3483693 290021 50243 14574 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 911 のような感じでセンサデータらしきものが出力され始めます。 つまりsinkノードに指定するにはボタンを押せば大丈夫ということで、nodeid=2を持つセンサノードを一つ追加して実験してみました。 すると 2 0 1 116 140 6729 1060 0 0 0 0 609920 55815 6282 4293 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 47086 2 1 1 119 141 6730 1052 0 256 128 0 1200133 130039 16414 16603 1867 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24081 1 1 0 126 151 6569 1140 0 0 0 0 1232236 161842 32918 18982 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 868 2 2 1 121 144 6721 1037 0 256 46 0 1783806 211068 29630 32981 25448 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 62523 1 2 0 128 135 6582 1116 0 0 0 0 1833779 226344 48171 23420 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 866 と言う感じでノード2からのパケットを受信し始めます。 printfされているデータは左から順に
などなど、いろいろなデータが入っています。 test-button.sky †make test-button.upload で書き込みます。 make login でログインしてボタンを押すと照度センサの値を返します。 test-cfs.sky †make test-cfs.upload で書き込みます。 coffee file systemのドライバです。 xmemに書いて読んでというのを繰り返して終わるプログラムです。 test-coffee.sky †to be updated. test-deluge.sky †to be updated. |