Arduinoイーサネットシールドを使ってみた
創造工学演習でハードウェア系を作るネタの導入として、 Ethernet シールド付き Arduino を動かしてみた。単なるメモなので…
// 雛形のスケッチは、 // ..PATH../Arduino.app/Contents/Resources/Java // /hardware/libraries/Ethernet/examples/WebServer/WebServer.pde #include <ethernet.h> byte mac[] = { 0x02 , 0x11 , 0x22 , 0x33 , 0x44 , 0x55 } ; byte ip[] = { 192 , 168 , 2 , 88 } ; // byte gateway[] = { 192 , 168 , 2 , 1 } ; // byte subnet[] = { 255 , 255 , 255 , 0 } ; // Class-C Server server = Server( 80 ) ; void setup() { Ethernet.begin( mac , ip , gateway , subnet ) ; server.begin() ; Serial.begin( 9600 ) ; // 動作確認用に受信データを表示 } void loop() { Client client = server.available() ; if ( client ) { // an http request ends with a blank line boolean current_line_is_blank = true; while( client.connected() ) { if ( client.available() ) { char c = client.read(); Serial.write( c ) ; // 動作確認用に、受信データを表示 // if we've gotten to the end of the line (received a newline // character) and the line is blank, the http request has ended, // so we can send a reply if ( c == '\n' && current_line_is_blank ) { // send a standard http response header client.println( "HTTP/1.1 200 OK" ) ; client.println( "Content-Type: text/html" ) ; client.println(); // output the value of each analog input pin for (int i = 0; i < 6; i++) { client.print("analog input "); client.print(i); client.print(" is "); client.print(analogRead(i)); client.println("<br />"); } break; } if (c == '\n') { // we're starting a new line current_line_is_blank = true; } else if (c != '\r') { // we've gotten a character on the current line current_line_is_blank = false; } } } // give the web browser time to receive the data delay(1); client.stop(); } }
上記プログラムを検証&書き込みの後、ブラウザで http://192.168.2.88/ にてアクセスする。すると、シリアルモニタには下記の出力が得られた。 後半は、ブラウザがfavicon.icoを取得しようとしたアクセスが行われている。 しかし上記のプログラムは、何をGETしようとしたのか判別せずに、リクエスト末尾の 『空行』を見つけたら、アナログ値を出力しようとするだけ。 このため、Reload する度に、2回アナログ値サンプリングが行われる。
GET / HTTP/1.1 Host: 192.168.2.88 Connection: keep-alive User-Agent: Mozilla/5.0 ...Safari/532.5 Cache-Control: max-age=0 Accept: application/xml,application/xhtml+xml,text/html;... Accept-Encoding: gzip,deflate,sdch Accept-Language: ja,en-US;q=0.8,en;q=0.6 Accept-Charset: UTF-8,*;q=0.5 GET /favicon.ico HTTP/1.1 Host: 192.168.2.88 Connection: keep-alive User-Agent: Mozilla/5.0 ...Safari/532.5 Accept: */* Accept-Encoding: gzip,deflate,sdch Accept-Language: ja,en-US;q=0.8,en;q=0.6 Accept-Charset: UTF-8,*;q=0.5
ブラウザで、http://192.168.2.88/ で表示された結果は、下記の通り。 ちなみにアナログポートは、実験だし開放のまんまで、ゴミデータ。
analog input 0 is 393 analog input 1 is 331 analog input 2 is 282 analog input 3 is 286 analog input 4 is 269 analog input 5 is 284
創造工学演習・導入実験part2
昨日に続いて、創造工学演習の授業にて、ものづくりのために必要な予備知識を得るための、 導入実験2日目。
私の担当のPHPの実験では、Web応用においてPHPと自分で書いたC言語との データのやり取りといった必要性が出てくるため、system() 関数を使って、 プログラムを呼び出したり、C言語側でint main( int argc , char*argv[] ) ; によって、 コマンドライン引数を取得したり、プロセス帰り値の話をして、簡単な呼び出し実験。
そろそろ体育祭
そろそろ体育祭。 担任クラスの4年も下の学年の指導とか頑張ってるみたい。 苦労はあるけど体育祭が終わった後の、達成感は大きいし、 後少し頑張って下さい。
創造工学演習・導入実験
4年実験の最初の2回は創造工学演習の導入も兼ねて、 プロコンなどの参加に必要となりそうな子ネタ系の実験を行う。 ということで、私の担当は、PHPでの実験を行った。
まずは、インターネットの原理として、ブラウザのリクエストから、サーバからのHTMLが帰ってきて、 ブラウザが整形して画面表示といった基本を説明。 その後、CGIなどの原理を説明する。 この際に、実際にプログラムを作る場合には、 サーバ側のプログラム言語とブラウザ内で動くプログラム言語の違いとして、 Perl(CGI)、PHP、ServerSide-Java(Servlet)、ClientSide-JavaScriptの言語を紹介。 (そういえば、クライアント側言語としてのJavaを紹介し忘れてるなぁ…)
この後、PHPの基本文法を説明して、簡単なチャットプログラムを作ってもらう。 ファイル入出力は、簡単に説明できるようにということで、 file_get_contents() , file_put_contents() などを使ったもので説明を行った。
簡単なチャットができちゃったし、明日の後半(創造工学演習)では何を話そうかなぁ… 事例ということで、自分のドアの前の掲示板や自宅のリモコン制御環境の話を交えながら、 system() あたりで、別プログラムとの連携の話をしようかな….
変数と関数のデータ受け渡し
先週の制御構造の話の中で、説明できなかった、break , continue , switch-case 文について 解説を行う。break,continue では、forループのとび先などを交えて話した。
次に、変数の解説ということで、大域変数が原因で変になるプログラムの例として、 下記のようなネタを紹介しながら、大域変数が問題視される事例を紹介。
int i ; void foo() { for( i = 0 ; i < 2 ; i++ ) printf( "A" ) ; } void main() { for( i = 0 ; i < 2 ; i++ ) foo() ; }
この例を受けて、局所変数の重要性を説明し、 大域変数の寿命(起動から終了まで)、スコープ(プログラム全域)の話と、 局所変数の寿命(通常、ブロック突入から抜けるまで)、スコープ(該当ブロックの範囲内)といった 解説を行う。さらに、局所変数で static 宣言した場合の説明を行う。
次に、関数の引数の取り扱いということで、実引数・仮引数の値で一般的には、 『値渡し(Call by Value)』の原則を話す。この値渡しだけを使っていれば、 関数実行による呼び出し側への影響(副作用:side effect)を最小限にできることを説明する。 しかしながら、「大域変数は極力使いたくない」、「関数で共通に使うデータの受け渡し」 といった場合には、時として副作用も必要ということで、 ポインタを経由した書き換え『ポインタ渡し(Call by Pointer)』の話を説明する。
時間が中途半端に残ってしまったので、 C言語が、B言語→C言語→C++→Java/C#と発展していった経緯を紹介する。 特に、C++は、"Better C"(よりよいC言語)としても使われており、 今後の授業でも便利なC++の機能を織り交ぜて話をすることを前置きしておく。
話のネタで、C++の由来やC#の由来を雑談で話した。改めて、WikipediaのC#を見ると、 C#は「音楽の半音上げる」の意味や、「#は、++(改行)++の4つの+」の意味… とのネタが記載されている。ふーん….
2010年4月18日(第160回)
スタジオお休みにつき収録でお送りしました!
払下げPCのセッティング
情報処理センターの払下げPCのセッティングを行う。 払下げ時のパスワードを変更し、 ウィルス対策ソフトを入れ、Microsoft Updateとなった。 最後に、BIOSのNetworkBootを停止させる。 でも、実験で必要そうなソフトを追加インストールしないといけないし、 Sambaのドメインに登録して、使えるようにしたいしな…
10台まとめてセッティングだけど、きびきびと動かないマシンじゃ、 待ち時間が長い。んで、複数台並行作業なんだけど、どのマシンはどこまでやったのか… という状態で、作業のヌケがありそう…
創造教育開発センターのサーバ移転
創造教育開発センターにて、授業アンケート用に構築したサーバ(erd.ip.fukui-nct.ac.jp), 学内向けMoodleサーバ(兼f-leccs.jpのLDAPサーバ:moodle.ip.fukui-nct.ac.jp)を、 e-Learning室ができ、その中にサーバ室ができたことで、場所の移転となった。 移動とともに、ネットワークアドレスの変更などを行い、 情報処理センターにはNATテーブルや学内向けDNSの変更作業などをお願いする。
電子情報の無線LANのルータFERECでは、ユーザ認証にmoodleを使っているので、 その変更などを行い、ひとまず無事に移転完了。
午後からは、情報処理センターにて緊急連絡システムのPC群と同じラックに 入れていたので、配置変更に応じてラックの組み換え作業を行おうかな。 さすがに普通のPCラックに5台乗っけていたのは、元々異常だったし…
情報構造論ガイダンス
4EIの授業と言うことで、情報構造論のガイダンスぅ~と思っていたけど、 担任クラスだしインターンシップの希望調査の説明を行う。 それと、体育祭の参加種目決めもできていないので、後半30分を明け渡し、 残った時間でガイダンス。
まずは、例年通りに「プログラムを作るために考慮すべき要因」を聞いてみる。 色々出てきたけど、この授業でのポイントは、「処理速度」と「メモリ消費量」と「プログラムの簡単さ」 が重要であることを示す。 簡単さの中には、「納期」といった重要性も関係することを話し、これらの3要因は、 「トレードオフ」の関係にあり、一つの要因を優先すると、他の要因に悪影響の出る関係を、 具体的に話す。そして、この授業では3要因を評価したうえで適切にアルゴリズムを選べるようになることが目標と解説する。
単純検索の処理速度の評価
まずは、速度の評価ということで、配列から特定値を検索する処理の説明を行う。
int search( int array[] , int size , int key ) { for( int i = 0 ; i < size ; i++ ) { if ( array[ i ] == key ) return i ; } return 0 ; }
このプログラムで、最悪のケースであれば、 式の処理回数は、「i=0」1回、「i<size」は N+1 回、「if(…)return」がN回となる。 これより、N件の場合の処理時間T(N)は、 で示される。
例えば、「データN=1000件の検索が0.01[sec]であった場合、N=10000件では、 何秒かかるか?」 そのまま前述の計算式を当てはめると、未知変数が の2つであるため、時間を求めることはできない。 しかし、処理速度の見積もりでは厳密な値を知りたい訳ではない。
は、Nが巨大な値では無視できるほど小さな値であることから、 0.01[sec]=
で計算を見積もればいい。
次週は、このネタを2分探索法や、2重ループ処理に適用した場合の説明を予定。
プロコンアイデア:学研電子ブロックシミュレータ(ネタ)
1976年に学研から子供の電子回路の教材として、電子ブロックという製品があった。 正方形のブロックの中に、R,L,Cといった部品が入っていて、 ブロックを隣りあわせで配置すると、回路ができあがるというもの。 この復刻版が近年売り出されている。
# 昨日、学研の「大人の科学」でみつけて、思わず通販購入してしまった。
んで、プロコンでこのシミュレータを作れないか?と考えた。 ブロックの配置をするだけのエディタを作り、 その結果に応じてSPICE(有名な電子回路シミュレータ)の結線データを出力し、 SPICEを呼び出す機能があれば、面白いはず。
