0

シリアル通信マトリクスができんせん

さて、「IDがついたオブジェクトの配置によって、表示が変わる」というしくみはタンジブルメディアの設計でよくあるけど、どう実装するか?

RFIDを使うのはよくあるが、それだけだと「何が置いてあるか」がわかるだけで「何がどこに置いてあるか」はわからない。正解は「RFIDのアンテナを複数用意してリレーで切り替える」なのだが、それだとRFIDタグより小さいモノには使えない。RFIDタグは基本的にアンテナと水平にしなければならないし。

もう一つの方法として、接触通信でIDを返すという方法がある。要するにICをオブジェクトに埋め込んでしまって、電源を供給してやって、IDを吐かせるわけだ。

んでやってみた。

シリアル通信マトリクスシリアル通信マトリクス

7セグメントLEDとかをダイナミック点灯させる時に使うデマルチプレクサを使って、AT90S2313×3個からUARTでATMega168にIDを送る。

Read more

0

最近読んだ本、正月読む本

最近読んだ本とか。

インターネットについて—哲学的考察
ヒューバート・L. ドレイファス Hubert L. Dreyfus 石原 孝二
産業図書
売り上げランキング: 274840
おすすめ度の平均: 3.5

4 学習におけるリスクの役割
3 前著作の延長線上の作品ですね

1~3章は読んだので、4章と結論を読んで1冊読了。

4章では、インターネットによるコミットメントには、直接的経験も責任もリスクも当事者性もない事を危惧している。キルケゴールやハーバーマスが指摘した、情報を状況から引き抜いて大量に配布する事によって便利になるが、傍観的な観察者が生まれる「公衆」化の事。

俺が読むと当然バイアスがかかるので、じっくり冷静に結論を読んでみると、ドレイファスはそうインターネットを悲観しているわけではない。まあ使い方次第でしょ、と。

関連:s.h.log: 最近の本 – 影、影絵、情報的似姿

Read more

0

今日お勉強した分

わりと頑張った。タイマカウンタが攻略出来れば手持ちプロジェクト全部mega168に移行出来るんじゃないかな。関数のインタフェース揃える様に気を付けてるし

0

ATmega168でピン変化割り込み

ATmega88以降は全てのI/Oピンに「外部入力割り込み」が付いている。これは、それぞれのピンに電流がONになったり、OFFになったりするとイベントが起こるという事だ。

今まではmain()の中のループで各ピンをずっと監視し続けなければならなかったが、この外部入力ピンを使うと完全にイベントドリブンでプログラムを書ける様になる。ちなみにArduinoからは使えない機能です。

ATmega168 SIG_PIN_CHANGE0ATmega168 SIG_PIN_CHANGE0

■作った

PB1につながったスイッチを押した時に割り込み(SIG_PIN_CHANGE0)が発生し、UARTでPCに通知する。PB0のLEDも光らせる。スイッチを離すとLEDを消し、UARTで通知する。

SourceCode, hex, Makefile(avr-gcc 3.4.6)

■外部入力割り込みの仕組み

2箇所設定する必要がある。

1.「ピン変化割り込みレジスタ」でピン変化割り込みを許可する

2.入力割り込みを受け取るピンを「ピン変化割り込みマスクレジスタ」で指定する

ピン変化割り込み0,1,2(PCIE0,1,2)の3つがあり、それぞれPORTB,PORTC,PORTDに対応している。

つまり、割り込み1つで7~8個のピンを受け持つという所がINT0,INT1の外部入力割り込みと違う。

ATmega88のデータシートの41ページを見るとPCICRというレジスタのPCIE0ビットに1をセットしてやるとピン変化割り込み0が許可される事がわかる。

sbi(PCICR,PCIE0); // ピン変化割り込み0

Read more

0

ATmega168でAD変換

ATmega168でADコンバータも試した。

CdS(光量センサ)と10kΩの抵抗を使った。

ATmega168 ADC and UART

ADC0でAD変換した値を文字列に変換して、UARTでPCに送る

ADC0の値が700以上の時、LEDを点灯させる。700以下だったら消灯する。

動いているところ

■コード

SourceCode, hex, Makefile(avr-gcc 3.4.6)

AD変換の準備のadc_init()、実際にAD変換を行ない値(int)を取るadc_convert(int pin)、USARTで文字列を送る関数 usart_sendStr()、intをStringに変換するintToStr(int, buf)を作った。

s.h.log: Arduino – UART、LED、AD変換を試したでも書いたが

シリアル通信で送信できるのは8bitまで。AD値は10bit。

なので、そのままSerial.print()してしまうと上位2bitが飛んで変な値になる。

こういう時は

・上位2bit/下位8bitを2回に分けて送信し、PC側で連結する

・マイコン側で、AD値が0~50の時は’a’を送る/51~100の時は’b’を送るの様に、プロトコルを決める

・Stringにして送信して、PC側で数値に直す

・4で割ると、10bitの最大値1023が8bitの最大値255に納まる。ただし精度は4分の1になる

のどれかで対処する。

なので今回は文字列に変換して送ってみた。これが無いとデバッグとかやってられない。

Read more