梅.py "Python自習室" その3
Posted by arms22 on 2010年06月26日

梅.pyこと"Python自習室"に参加してきました。これで2回目の参加。なんかレギュラーメンバになりそうな予感。まったくPythonさわってないけどね。
5cmのワイヤ1本でACコンセントの電源周波数を計測できることを知ったので実験。過去にこの周波数を使って計時する時計があったらしい。何かのネタとして使えるかもしれないので実験してみた次第。
iPadを使ってみた。画面がおおきくてWEBページがみやすい、漫画も本も読める、タッチバッドキーボードもちゃんと使える。これなら普段使いように1つほしくなります。。うー、やばい。買っちゃいそうー。
Cdsを使って明るさ検出。なんだかArduinoが人気のようです。あんな人やこんな人までArduino。猫もしゃくしもArduino。みたいニャ。
梅.py "Python自習室" (mini Hack-a-thon) その3
http://tweetvite.com/event/umepy20100626
AC 50HzのクロックでLEDピカピカ その2
http://blog.goo.ne.jp/jj1wkn/e/3ff8256c898d268ebe05a344f246b819
商用電源周波数 - Wikipedia
http://ja.wikipedia.org/wiki/商用電源周波数
本日のテキスト。Arduinoのリファレンスとしてどうぞ。
オライリージャパン
売り上げランキング: 2343
↑だと物足りない人は「Prototyping Lab」がオススメ。
「作りながら考える」ためのArduino実践レシピ
オライリージャパン
売り上げランキング: 1414
Arduinoで遊ぼう - iPhoneのオーディオ端子を使って通信をする
Posted by arms22 on 2010年06月19日

目次
- Arduinoで遊ぼう - iPhoneのオーディオ端子を使って通信をする
- Arduinoで遊ぼう - iPhoneのオーディオ端子を使って通信をする(2)
イントロダクション

iPhoneのオーディオ端子を使ってArduinoと通信するライブラリ「SoftModem」を作ったよ。SoftModemはその名前のとおりソフトウェア・モデムのこと。ソフトウェアでデジタル信号と音声信号を相互に変換する。
通常、iPhoneとマイコンを通信させたい場合、Wi-FiかBluetoothを使うことになる。Wi-FiやBluetoothを使うにはマイコン側に無線モジュールが必要で、コストがかかるし、電力的に厳しくなる。JailBreak(脱獄)すればDockコネクタのシリアル端子を使ったアプリケーションが作れるが、そうして作ったアプリケーションはAppStoreで配布できない。
ソフトウェア・モデムなら追加の部品も数点、数百円のコストですむし、作ったアプリケーションはAppStoreで配布することもできる。今回、このSoftModemを使ってiPhoneと簡単なシリアル通信の仕方を紹介する。
ソフトウェア・モデムの元ネタは「iPhone Hacks」という本の記事で、この本ではPSoCマイコンを使ったiPhone用のキーボードや赤外線リモコンの作り方を紹介している。PSoCのコードとiPhoneのコードが次のURLで公開されていて、自由にダウンロードできる。iPhone側のアプリケーションのコードはiPhone Hacksのコードを流用させてもらった。
Perceptive Development Labs
http://www.perceptdev.com/labs/
仕組み
SoftModemはFSK(Frequency Shift Keying)=周波数偏移変調を使ってデジタル信号を音声信号に変換する。データ'0'の時は低周波数の搬送波を、データ'1'の時は高周波数の搬送波を送る。
次の図は1番目の波形がデジタル信号、3番目の波形が変調後の音声信号を表している。データが'1'の時は波形の間隔が短く、データが'0'の時は波形の間隔が長くなっているのがわかる。音声信号の受け側はこの周波数の違いをもとにデジタル信号を復元する。

(via http://en.wikipedia.org/wiki/Frequency-shift_keying)
標準的なシリアル通信プロトコルではデジタル信号はスタートビット'0'から始まって、データ8bit、偶数パリティ1bit、ストップビット'1'が送られる。SoftModemではこれを少し拡張し、送信の前には音声信号の安定用に8~16bitの"1"=プリアンブルを送り、ストップビットの後に”押し出し”用の'1'を送っている。
iPhone側のサンプリング周波数やマイコンの処理速度から、FSKを使ったSoftModemの最高ビットレートは1200bpsあたりが限界(っぽい)。SoftModemが対応するボーレートと周波数の組み合わせ次のとおり。iPhone側のサンプリング周波数、44.1kHzを基準にボーレートと搬送周波数を決めている。
ボーレート | 126bps | 315bps | 630bps | 1225bps | 低周波数 | 882Hz | 1575Hz | 3150Hz | 4900Hz | 高周波数 | 1764Hz | 3150Hz | 6300Hz | 7350Hz |
SoftModemの受信
SoftModemはATmega328内蔵のアナログコンパレータを使って音声信号の解析を行う。アナログコンパレータで音声信号の立ち下がりを検出する。立ち下がりから次の立ち下がりまでの時間をTimer2でカウントし、周波数を特定する。周波数が分かれば0か1か分かるので、あとはボーレートに合わせてデジタル信号を復元する。
SoftModemの送信
送信はいたって簡単。送信するデータビットに合わせて、デジタルポートから矩形波を出すだけだ。プリアンブルを1byte毎に送信していると転送レートが極端に悪くなってしまうので、しばらく送信していなかった場合のみ送るようにしている。
回路図

iPhoneからの音声信号はC1を通って、R1/R2で2.5Vのバイアスをかけて6番ピンに接続する。7番ピンにアナログコンパレータの閾値用の電圧をかける。ArduinoからiPhoneへの信号はR3/R4で分割し、C2を通ってiPhoneのマイク端子に接続する。R5はiPhoneにマイクが繋がっていることを認識させる為に必要な抵抗。R6はVCC/2から250mVぐらい下げた電圧になるように調節する。
iPhoneのマイク端子

iPhoneのオーディオ端子は4極で根元からマイク、グランド、右チャンネル、左チャンネルとなっている。ちょっと変則的?
ライブラリのインストール
次のURLからライブラリをダウンロードして、Arduinoのライブラリフォルダ(OSXの場合~/Documents/Arduino/libraries、Windowsの場合My Documents/Arduino/libraries)にコピーしてください。
SoftModem
http://code.google.com/p/arms22/downloads/list?can=2&q=SoftModem+label%3AFeatured
SoftModemはATmega328のハードウェア資源であるTimer2を使います。その為、11番ポートへのanalogWriteとtone関数が使えません(ごめんなさい)。またデータ受信時はアナログコンパレータの割り込みが繰り返し入るのでその区間割り込みを禁止しているとデータを取りこぼすことがあります。
※※※注意※※※
SoftModemライブラリはアナログ信号を扱う部分が多いため、通信時にデータが壊れることがあります。SoftModemライブラリを使って通信を行う場合、データが壊れることを想定し、データが壊れても不具合がおきないよう注意してスケッチまたプログラムを作成してください。
サンプルスケッチ
SoftModemライブラリを使ったシンプルなターミナルスケッチです。スケッチをアップロードしたら、シリアルモニタを開いて使います。シリアルモニタから文字列を送るとArduinoを通してiPhoneに文字列が送られます。またiPhoneから送られてきた文字列はArduinoが受け取り、シリアルモニタに送ります。
#include <SoftModem.h> //ライブラリをインクルード
#include <ctype.h>
SoftModem modem; //SoftModemのインスタンスを作る
void setup()
{
Serial.begin(57600);
modem.begin(); // setup()でbeginをコールする
}
void loop()
{
while(modem.available()){ //iPhoneからデータ受信しているか確認
int c = modem.read(); //1byteリード
if(isprint(c)){
Serial.print((char)c); //PCに送信
}
else{
Serial.print("("); //表示できない文字はHexで表示
Serial.print(c,HEX);
Serial.print(")");
}
}
while(Serial.available()){ //PCからデータを受信しているか確認
char c = Serial.read(); //1byteリード
modem.write(c); //iPhoneに送信
}
}
SoftModemTerminal for iPhone

SoftModemTerminalはソフトウェア・モデムを使ったシンプルなiPhone用のターミナルアプリです。iPhoneとArduinoを4極のケーブルで接続して使います。iPhoneのオーディオ端子に何も接続していないと内蔵スピーカーから大きな音がでるので注意してください。昔懐かしい「ピーヒョロローガーガーピー」を聞きたい人は別ですが。。
※iPhone側の音量は最大にして使用してください。そうしないとArduinoはうまくデータを受信できません。※
このアプリはAppStoreで配布していないので、次のURLからソースコードをダウンロードし、ビルドして直接iPhoneにインストールしてください。このソースコードにはソフトウェアモデムのコードも含まれているので、これをベースにオリジナルのハードウェアとアプリを作って下さい。
SoftModemTerminal
http://code.google.com/p/arms22/downloads/list?can=2&q=SoftModemTerminal+label%3AFeatured
関連URL
Reinforce Lab - iPhone ソフトウェアモデム
http://sites.google.com/a/reinforce-lab.com/www/projects/iphone-software-modem
Togetter - まとめ「iPhoneモデム開発」
http://togetter.com/li/30190
モデム - Wikipedia
http://ja.wikipedia.org/wiki/モデム
Make Books
売り上げランキング: 37863
オライリージャパン
売り上げランキング: 8534
大人の科学マガジン vol.27 「ジャパニーノ」(その4)P.O.Vライブラリ
Posted by arms22 on 2010年06月06日

Japanino付録のP.O.V用にスクロールとスイング、フレームタイムの自動更新、非同期動作に対応したライブラリを作ったよ。P.O.Vまわりのコードをライブラリにすることでスケッチがすっきりするよ。このライブラリを使えば自分が書きたいスケッチに専念できるよ。そこそこ汎用的に作ってあるので、JapaninoのP.O.V以外でも使えると思うよ。うまく改良すれば16ドット幅のP.O.Vや回転するP.O.Vなんかにも対応できるはず。
ライブラリのインストール
次のURLからライブラリをダウンロードして、Arduinoのライブラリフォルダ(OSXの場合 ~/Documents/Arduino/libraries、Windowsの場合¥My Documents¥Arduino¥libraries)にコピーしてください。
JapaninoPOV-001
http://code.google.com/p/arms22/downloads/detail?name=JapaninoPOV-001.zip
サンプルスケッチ
#include <JapaninoPOV.h>
#define LEDPIN 7 // どのピンからLEDをつなぐか
#define SWPIN 6 // スイッチをつなぐピン
#define WIDTH 20 // 表示する幅
JapaninoPOV pov(LEDPIN,SWPIN);
//JapaninoPOV pov(LEDPIN);
// ビットマップ(画像)を定義
byte bitmap[] = {
0b00000000,
0b01000001,
0b01111111,
0b01000001,
0b00000000,
0b00000000,
0b00001110,
0b00011111,
0b00111111,
0b01111110,
0b00111111,
0b00011111,
0b00001110,
0b00000000,
0b00000000,
0b00111111,
0b01000000,
0b01000000,
0b00111111,
0b00000000,
};
void setup()
{
pov.setWidth(WIDTH);
pov.setFrameBuffer(bitmap,sizeof(bitmap));
//pov.setFrameTime(60);
//pov.setFrameTimeAutoDetect(true);
//pov.setScrolling(true);
pov.begin();
}
void loop()
{
//表示を更新する
pov.update();
}
スウィングさせて使う場合、コンストラクタのSyncPin引数を省略するか、setSyncPin関数をコールします。
JapaninoPOV pov(LEDPIN);
フレームタイムを設定したい場合、setFrameTime関数をコールします。引数はミリ秒です。
pov.setFrameTime(60);
フレームタイムを自動更新したい場合、setFrameTimeAutoDetect関数をコールします。SyncPinのLowからLowまでの時間を2で割った値を自動的に設定します。
pov.setFrameTimeAutoDetect(true);
スクロールさせたい場合、setScrolling関数をコールします。
pov.setScrolling(true);
学習研究社
売り上げランキング: 460
―「作りながら考える」ためのArduino実践レシピ
オライリージャパン
売り上げランキング: 3043
ラムネビー玉レンズ(上原ゼンジ式宙玉レンズ風)
Posted by arms22 on 2010年06月05日

うちのメガネの助手が上原ゼンジさん考案の「宇宙玉レンズ」をラムネのビー玉を使って作ったよ。アクリル版が手に入らなかったらしく、ビー玉の周りは厚紙で作ってある。だからビー玉の周りは真っ暗になっている。チップスターは海苔塩を選択。
家の近くの野良猫「みけ」を撮ってみた。ファインダーを除いていると上下逆さまになって、撮影し辛かった。腰だめに構えて撮ると良いみたい。ビー玉をもう少し大きく撮りたいところだ。ラムネのビー玉は完全な透明ではなく、少し模様なものが見えている。
上原ゼンジ写真実験室 - 宙玉レンズ
http://www.zenji.info/cn21/pg124.html
キッチュレンズ工房 ~ピンホールに蛇腹、
魚眼でレトロでアナログなデジタル写真を撮ろう!~
毎日コミュニケーションズ
売り上げランキング: 243390
Mad Science ― 炎と煙と轟音の科学実験54
Posted by arms22 on 2010年06月02日

Mad Scienceが届いたので、毎日少しずつ読んで、いや写真を眺めています。この本は54もの「炎と煙と轟音」の科学実験をわかり易い解説と、とても美しく鮮明な写真で紹介しています。これは科学的な読み物というより写真集といったほうが正解かな。
写真を見ているだけで実験を”した”気分になるけど、やっぱり自分で実験したくなる。「DIY水素」や「テルミット反応で鉄を作る」、「クッキー・ロケット」なんかがお手軽で楽しそうだ。ちなみにテルミットとクッキー・ロケットのページには赤いドクロマークと”絶対危険”と書かれている。本当に危険度マックスだ。迂闊に真似しようとしない方が良いだろう。でも実験したくなっちゃう。この本にはそんな誘惑がいっぱいです。
オライリージャパン
売り上げランキング: 1688
この本が好きな人は↓こっちの本も気に入ると思う。
オライリー・ジャパン
売り上げランキング: 205553