さて、「IDがついたオブジェクトの配置によって、表示が変わる」というしくみはタンジブルメディアの設計でよくあるけど、どう実装するか?
RFIDを使うのはよくあるが、それだけだと「何が置いてあるか」がわかるだけで「何がどこに置いてあるか」はわからない。正解は「RFIDのアンテナを複数用意してリレーで切り替える」なのだが、それだとRFIDタグより小さいモノには使えない。RFIDタグは基本的にアンテナと水平にしなければならないし。
もう一つの方法として、接触通信でIDを返すという方法がある。要するにICをオブジェクトに埋め込んでしまって、電源を供給してやって、IDを吐かせるわけだ。
んでやってみた。
7セグメントLEDとかをダイナミック点灯させる時に使うデマルチプレクサを使って、AT90S2313×3個からUARTでATMega168にIDを送る。
デマルチプレクサには74HC153を使った。
ABCDでY0~Y15を選択してやると、Y→GNDがつながる。
んで何かダメだったので、またやり直します……
どうも74HC153の中を通すとUARTの信号がおかしくなる?気がする。2SC1815とか普通のトランジスタだと大丈夫だったんだけどな。
ってここまで書いて気付いた。Y→GNDが繋がるって、GNDをATMega168のRXDに接続したら74HC153が動くわけないじゃん(;´Д`)
徹夜に加えて、ビールとレッドブルは相殺されるとか言ってふざけてるんじゃなかったな。全然意味わかんねえ回路作ってるぞ俺…
あとその残留明けで秋葉原にいって、色々足りない部品を買ったりお参りしたりした。シリアル通信マトリクスで使うコネクタとか(USBのミニピンって4ピンで格好いいしぴったりだな)、超小さい900円のwebcamとか、TINY2313が秋月で120円とか。ああ低電圧版のTINY2313Vも買っておけば良かった。1.8Vから動くってのが萌える。できておる喃
ついでに90S2313のプログラムも貼っておこう。UARTでIDを延々と吐き続ける。
#include <avr/io.h>
#include <avr/interrupt.h>
/** 動作設定 **/
#define FOSC 4000000 // 4MHz
#define BAUD 9600 // 9600bps
#define MYUBRR FOSC/16/BAUD-1 // UART分周率
#define TRUE 1
#define FALSE 0
#define NULL '\0'
#define sbi(BYTE,BIT) BYTE|=_BV(BIT) // BYTEの指定BITに1をセット
#define cbi(BYTE,BIT) BYTE&=~_BV(BIT) // BYTEの指定BITをクリア
volatile unsigned char uart_recvData; // UART受信データ
/* UARTで文字列送信 */
void uart_sendStr(char *str){
while(*str != NULL){
loop_until_bit_is_set(USR,UDRE);
UDR = *str++; // 1文字送信、1文字進む
}
}
/* No Operation */
void nop(int count){
int i;
for(i = 0; i < count*100; i++){
}
}
/* PORT設定 */
void port_init(void){
DDRB = 0xff;
sbi(PORTB, PB0);
DDRD = 0xff;
}
/* UART設定 */
void uart_init(unsigned char baud){
UCR = (1<<TXEN)|(1<<RXEN)|(0<<RXCIE); // 送信許可、受信許可、受信完了割り込み不可
UBRR = baud; // ボーレート設定
}
int main(void){
port_init(); // PORT設定
uart_init(MYUBRR); // UART設定
sei(); // 割り込み許可
for(;;){
uart_sendStr("2313_0\r\n"); // 文字列送信
}
}