はじめに

今更感はありますが、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でコンパイル時にエラーメッセージ出せるんですね... 勉強になりました。

これでできたファイルが

  • blink.sky
  • burn-nodeid.sky
  • example-coffee.sky
  • fader.sky
  • radio-test.sky
  • rt-leds.sky
  • sky-collect.sky
  • test-button.sky
  • test-cfs.sky
  • test-coffee.sky
  • test-deluge.sky

の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されているデータは左から順に

  1. ノードID
  2. パケットのシーケンス番号
  3. ホップ数
  4. 照度センサの値1
  5. 照度センサの値2
  6. 温度
  7. 湿度
  8. RSSI
  9. もっともよい隣接ノード
  10. 最も良い隣接ノードのETX
  11. 最も良い隣接ノードのETX
  12. lpm
  13. cpuのエネルギー
  14. 受信エネルギー
  15. 送信エネルギー
  16. ledのエネルギー

などなど、いろいろなデータが入っています。

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.


  添付編集
Last-modified: 2016-02-24 (水) 21:17:42 (3194d)