2012年7月3日火曜日

Mifare と Felica 同時対応

NXP の NFC チップ PN532 をつかった Adafruit の RFID reader shield と Arduino をつかって,Felica の IDm ? カード ID 8 バイトを読み出すことに成功した!ような気がする.
Mifare の UID とデータセクタの読み書きは,これまでサンプルコードもライブラリも拾ってこれるし,StrongLink 社ほかの安価なリーダでできていた.Felica もスイッチサイエンスなどがリーダモジュールなど販売していて SONY のサンプルコードなどがあるようだった.しかし,欧米では Felica はほぼ使われておらず,日本では Mifare がマイナーであるため,両対応のNFCの情報はとぼしかったのだ.
今回はPN532のユーザーマニュアル?とアプリケーションノート AN10609_3, PN532 C106 をもとにして,というかよく見たら Felica reader としてのコマンドサンプルが載っていたので,Adafruit の I2C PN532 ライブラリを参考にしながら自家製ライブラリを作った.GitHub の Arduino-sketches の libraries の RFID_PN532_I2C がそれだ.
これで両方に切り替えながらカードを検知すれば,両方式対応のカードリーダーができるであろう,きっと.

2012年6月17日日曜日

現実に帰納法の証明をつけパラドックスと喜ぶ人々

簡単に言うと数学屋(の一部?多く?)である.
「ご冗談でしょう,ファインマンさん」には,「彼らはさんざん考え議論して証明できると『うんうん明らかだ』とうなずきあっている.彼らが一生をかけたとしてもできることといえば,明らかなことだけなのである」とある.これは clear という言葉の意味を使ったイヤミだが,実際そういう傾向がある.
数学を愛する方々がお好みの「たのしいお話」の一群に,帰納法を使った「パラドックス」がある. 「人間みなハゲである」,「ごはんは何杯でも食べられる」というのを帰納法によって証明できる,というものである.Wikipedia によればギリシャ時代からあって欧米では Sorites Paradox と呼ばれるそうである.
「頭に髪の毛をいっぱいはやしている男はハゲではない.さて,毛を一本抜いたところでハゲではない男がハゲになることはない.だがしかしながらこの作業を続けるとハゲになるのは明らかではないか.」
「砂粒が山とある砂の山から,砂粒を一つ二つ取り去っても,砂の山であるのにかわりない.しかしこの作業を続け砂粒一つになれば,砂の山ではないではないか.」
これらのいにしえの問答のネタを数学的帰納法の証明に使って,「何本抜いてもハゲにならない」とか,「ごはん(米)はどれだけ食べてもおなかがいっぱいにならない」という話にすると,おもしろいのだそうである. そんなことよりギリシャやローマ時代から男性にとってハゲというのが悲哀の源であるのに変わりがないということのほうが興味深いと思うが,それはいいとしても.
sorites paradox は,ハゲとか砂の山といった言葉の曖昧さからおきる逆説だということになっているようだが,そんな数学は不完全な理論体系である,的な小難しいしかしわかりきっている議論をする必要すらないと思われる. というか,数学屋は,不思議でも何でもないことを,パラドクスと呼んで不思議がってよろこんでいるだけだ.

1.「ごはんはどれだけ食べてもおなかいっぱいにならない」
主張: 「今,おなかいっぱいではないとする.このとき,ご飯(米)を一粒を食べてもおなかいっぱいにならない. すると数学的帰納法により,ご飯をどれだけ食べても,いつまでもおなかいっぱいにならないではないか!」
あたりまえだ! ご飯を一粒ずつ食べていたら,いつまでも,おなかいっぱいにはならない.やってみたらわかるだろう.ご飯(米)以外のものを隠れて食べたら当然おなかいっぱいになるから,まあ2〜3日ご飯ばかり食べてみればいい.ご主張どおり,ご飯を一粒ずつ食べてもらう.ネットで調べると,茶碗一杯で3200〜3800粒ほどであるらしい.訓練すれば,くっついてかたまりになっていても1秒に一粒ぐらい確実に食べられるだろう.ご飯茶碗一杯ではカロリーもたりぬだろうから,一食ごとに2〜3杯食べていただく.一食につき2〜3時間かかることになるだろうか.ほかの生活は,夜寝るとか仕事とか,普段通りにしていたら,食事の時間が足りずにどんどんひもじくなっていくだろう.
一粒ずつ食べるなんて,と自分でした主張に自分でけちをつけるなら,「ご飯を一杯食べてもおなかいっぱいにならない」と修正してみたらいい.非常に多くの人が主張には時によって同意できないと言うだろう.
生物は,代謝する(定義).生きていればエネルギーを消費するし,エネルギーを得るために食べて消化する.食べるのにも,消化するのにも,時間がかかるのである.ファーブル昆虫記に,ヒジリオオフンコロガシ(スカラベ)の食事の観察が出てきたと思う.食べているそばから排泄するらしい.多くの野生動物は,いつも食べ物を探している. 数学は,時間の概念がないので,現実の話ができないのである.

2.「抜き打ちテストはできない」
主張: 「論理学の集中講義について,こんな掲示がされた:『来週月曜から金曜までのいずれかの日に,テストを抜き打ちで行う.その日をテストが行われる前にあらかじめ知ることはできないから,授業の期間中毎日しっかり勉強しておくように』.
これをみてある論理学が得意な学生が言った.『この抜き打ちテストは実施できない.木曜までにテストがなければ,金曜に行うことがあらかじめわかってしまうから,金曜にはできない.水曜までにテストがなければ,金曜にはテストができないから,木曜にするしかないことがあらかじめわかってしまい,木曜にもできない.同様に,水曜,火曜,そして月曜もできない.したがって,このような抜き打ちテストは不可能である.』 そうして安心していたところ,木曜に突然抜き打ちテストが行われた.」
あたりまえだ.まず抜き打ちテストが行われる日をあらかじめ知ることはできない,というのは,テストの日をテストが行われる前に論理的に導くことはできませんよ,ということであって,だから学生の結論「抜き打ちテストは実施不可能」という結論は,どの日にもテストが予想できない,という追認の結論を曲解しただけ. 論理的でなければ,あらかじめテスト日を予想をして,必ずあてることが可能である.これは,のむらしんぼ著「とどろけ一番」のプロテス3兄弟の奥義「トリプル答案固め」を応用すればいい. 集中講義も履修者は5名ぐらいはいるだろう.履修者を5名つのり,それぞれ月,火,水と一日ずつ予想することにする.すると,5人のうち一人は必ず「予想した日にテストが行われるので,前日にだけ勉強をすればいい」のだ.(それにしても,いくら誰も満点を取ったことがないほど難しいからといって,試験中に会話をしないでほしいプロテス三兄弟..)
そもそも,この学生の論理で,金曜に抜き打ちのテストができないのは,木曜までにテストをしなかった場合だけ.木曜にテストをした場合,金曜はテストをしなくていいし,逆に抜き打ちでもう一回してもいいのである.テストが行われないまま金曜になった場合には金曜にテストをすると抜き打ちにならないというのは事実だが,それを金曜になる前に,水曜,火曜に,勝手に常に成り立つ事実として使うのはおかしい. 数学は,時間の概念がないので,現実の話ができないのである.

すみませんひさしぶりにイラッとしたので書きました.

2012年5月20日日曜日

Arduino のプログラミングを自宅で(ステップ2)

Arduino IDE インストールの後,WinAVR コンパイラセットなどを導入して,実際にコンパイルしてみます.

Win AVR クロスコンパイラキットの導入

Arduino IDE にもコンパイラなどが含まれていますが,コマンドとして認識させるためのパスの設定に手間がかかるので,パソコンに詳しい人以外は, 別に WinAVR という Atmel 社のマイコン用の GNU C コンパイラや必要なツールが一つにまとめられたソフトウェアパッケージをインストールすると便利です.

インストーラ形式になっているので,現時点の最新版をダウンロードしてインストールします.

インストールすると,Windows のコマンドプロンプトで avr-gcc コンパイラなどが使えるようになります.

特製 Makefile のコピー

これで UNIX で行うのと似たような手順でプログラミング,コンパイル,Arduino へのアップロードができますが, コンパイルの時に動作クロックや対象チップ名が,リンクの時にアップロード可能な形式のバイナリファイルへの変換が, またアップロード時に使用するCOMポートの指定などが必要で,いちいち間違えないようタイプ入力するのが大変です. そこで,次の Makefile を作業するフォルダ(ディレクトリ)にコピーします.

特製 Makefile

この Makefile を使ったプログラミングとアップロードの作業は,次のようになります.
  1. 1. 作業するフォルダ(ディレクトリ)を作り,メモ帳などのテキストエディタでプログラムのファイル main.c を書き そのフォルダに保存する.ファイル Makefile もそこにコピーしておく.
    ※WinAVR をインストールすると,テキストエディタ Programmers NotePad もインストールされる. メニューは英語だがそちらのほうが便利.
  2. 2. コマンドプロンプト(スタートメニュー > すべてのプログラム > アクセサリー > コマンドプロンプト)をひらき, cd コマンドで作業フォルダへ移動する. マイドキュメント の中のディレクトリなら,cd ¥Users¥ユーザー名¥Documents¥ディレクトリ名 になる.
  3. 3. make とタイプしリターンキーを押す.make コマンドが Makefile を読んで,main.c をコンパイルする. 成功すると,main.elf, main.hex などの機械語ファイル,アップロード用プログラムファイルができるのでファイルリストをとって確認する.
  4. 4. プログラムする Arduino を USB ケーブルで接続する.接続した Arduino のCOMポート番号は,あらかじめしらべて控えておく. Arduino UNO の場合は make upload.uno.COM番号 とタイプしリターンキーを押す. Arduino Duemillanove の場合は make upload.due.COM番号 とする. プログラムが Arduino にアップロードされる.Arduino ボードのシリアル通信LEDが点滅し,コマンドプロンプトにはアップロード作業の進行状況を報告する表示が出る.エラーなく終了したら,成功しているはず.
エディタはメモ帳,ワードパッドなどなんでもいいが,どうしても emacs を使いたいなら Windows 用の emacs をダウンロードしてインストールすればいいでしょう.
ftp.gnu emacs ダウンロードサイト

2012年5月18日金曜日

Arduino の C やアセンブラプログラミングを自宅で(ステップ1)

Arduino を使って C/C++ やアセンブリのプログラミング演習ができますが,自宅のパソコンに必要なソフトウェア, 環境を準備する方法を説明します.

Windows PC の場合

大学の演習端末などは Linux など Unix 系であることが多く,学生用に販売されている PC も二つ以上 OS がインストールされ Linux が選択できることがあります. しかし,普段使わない人が Linux を使うのは面倒が多くメリットも少ないので,Linux なれしたこだわりがある人以外は,Windows でやった方がいいのです.どうしても emacs や X window を使う必要がある場合も Windows で動かすことはできます. メーカーが配付しているソフトウェアも,Windows 用が基本です.

Arduino IDE をダウンロードしてインストールする.

Arduino を使うときに最初に使用する,Arduino IDE は,簡単なスケッチで動作を確認したり,シリアルポートの番号をしらべたり, シリアルターミナルで Arduino の print 出力を見たりと便利に使えますし,コンパイラ gcc/g++ やプログラムのアップローダ avrdude を Arduino 専用にもっていますので,とりあえずインストールしましょう. 最新版はバージョン 1.0 です.大学で使っているもののバージョンと違っても,最新版にしておいたほうがよいでしょう.

ダウンロード http://arduino.cc/en/Main/Software

圧縮ファイルを展開して,フォルダごと Program Files (Windows 7 の場合 Program Files (x86) が適切な場合があります)にコピーして入れてください.フォルダの中の Arduino.exe を開いて起動してみてください. ためしに,短いスケッチをコンパイルしたり,アップロードしててみてください.

File > Examples > 1.Basic > Blink

Arduino を初めて USB ケーブルでつなぐと,ドライバのインストールを求められます. コピーしたフォルダに driver というフォルダがあってドライバはそこに入っていますから,マニュアルインストールが必要な場合は,そこから選んでインストールしてください. Arduino IDE でアップロードができたら,自分でコンパイルしたプログラムもアップロードできるようになったということになります.

2012年4月16日月曜日

マイコン・エレクトロニクス入門パック用パーツのメモ

抵抗 1/6 W カーボン
330Ω x8, 1kΩ x4, 4.7kΩ x4, 10kΩ x4, 1MΩ x1

可変抵抗 10kΩ
knob つき半固定 または パネルマウント linear 0.2" pin-point legs

キャパシタ 25~50V セラミック
0.1μF x4

小信号ダイオード
1N4148 x1

整流ダイオード
1N4007 x1

小信号 NPN (EBC) トランジスタ
PN2222/2N3904 x1

3mm LED x 3,
5mm RGB LED x1

5mm CdS or other photo sensor x1

TMP36 or other Analog Temp sensor x1

Davinci, Arduino Leonard ソフトウェア互換ボード

ATmega32U4 を使った Arduino 系ボードの Davinici/Leonard の長所は,まず標準的な USB デバイス(HID)としてキーボードやマウスのエミュレートができること.プレゼンテーションマネージャーのようなものだけでなく,バーコードリーダーと同じようにキーボードを自動で打つような入力装置が作れる.自作プログラムを動かすのがめんどうな iPad でも,USBキーボードとして,デジタルカメラ用USBリーダーを介したICカードリーダーやセンサーロガーを作れるのではないか.たぶんUSBメモリとしての動作もさせられるだろう.
次に,PCとの通信がチップ内蔵のUSBインターフェースなので,UARTのハードウェアシリアルポートは別に使えるということ.スケッチのアップロードや Monitor への出力とは別に,高速なシリアルポートを使える.
個人的には,ほんの少しボードが大きくなってでも,ピン配置が使いやすくなったほうがいいように思うが.

2012年1月1日日曜日

Arduino IDE 1.0, Strawberry Linux DaVinci (Leonardo ソフト互換)

Arduino 開発環境の 1.0 が公開されダウンロードできるようになってた。有効になっていないが、Arduino Leonardo など新しいボードバリエーションに対応しているらしい。エディタでテキストファイルを編集すると、メニューにあらわれるようになる。

SoftwareSerial が NewSoftSerial に置き換えられたのはよかったが、Print や Stream クラスなどもふくめ変更されている。WPrograms.h もなくなっている。自作のライブラリ群は、バージョン 1.0 以前と以降両方でコンパイルできるよう、書き換えねばならない。

Strawberry Linux の Leonardo 互換ボード、DaVinci をためしてみたが、Windows では必要になる USB ドライバが Windows 7 でインストールできない。もしかして 32bit 版 Windows しか対応していないドライバなのだろうか。8/16U4 をUSB/Serialインターフェースに使っている Arduino UNO ではそんなことなかった。。。
基本的に Teensy と同じだけれども、安価で国内で手に入るので、教材用として期待して試しているのだが。

Macintosh OS X では問題なしだが、今のブートローダや回路では、アップロード時には手動でリセットしなければならないようだ。なんとかならないか。。