0

html-lint

今回のプロジェクトのページ

http://www.ok.sfc.keio.ac.jp/~sho/projects/lattemegane/

100点になりました

http://openlab.ring.gr.jp/k16/htmllint/htmllint.cgi?Stat=on&ViewSource=on&Method=URL&URL=http%3A//www.ok.sfc.keio.ac.jp/%7Esho/projects/lattemegane/

本屋でも探してこよう

1

勝手にモーニングコールをかける目覚まし時計

The alarm clock which performs a wakeup call automatically

(英語合ってるのか)

24日、小檜山研の最終発表で出してきた怪しい目覚まし時計がこれだ!

DSC01431.jpg

普通の時計なんだけど、上にDOCOMOの携帯電話を刺すコネクタが付いていて、目覚ましと共に誰かに電話をかける。

映像(8.5MB)ソースコード(AVR-GCC)

時間が無くて2日しかかけられなかったが、結構よく頑張ったと思う。

俺もこれが何なのか良くわからない。奇をてらってコンセプト無しに見たことのないモノを作ってみたらこんなのになった。

俺としては、もっとケータイをいっぱい刺せる様にしたら顔も知らない友達の友達にモーニングコールがかかったりとか面白いと思ったんだけど時間が無くて1つだけ。改良してもっともらしいコンセプトを付けてどこかに出すかもしれんね。

ケータイとの通信は去年のutaさんの資料と、NTTDOCOMO 自動車携帯電話サービスを利用するための技術参考資料が参考になった。57ページあたりから通信方法について書かれている。

ドコモのP506に接続できるデータ通信用ケーブルをバラして、

DSC01448.jpg

マイコンとの通信ケーブルにした。

600bps、ストップビット1、パリティ2のUARTで通信すれば普通に信号が送れる。変なコードを大量に送ると「ブースタヲカクニンシテクダサイ」とか言われてケータイが固まるが、解釈できないコードは無視される使用とのこと。

まずテストとして、atmega8からのUARTで写真を撮ってみた。

ソースコード(AVR-GCC)映像

ケータイが操作できる事がわかったので、ざっと設計して見た目を考えて

DSC01460.jpgDSC01461.jpgDSC01447.jpg050723_robustnessDiagram.jpg

結構うける外見になる事がわかった。

時:分表示の為の4桁の7セグメントLEDを作る。

DSC01417.jpgDSC01397.jpg

かなり気が狂いそうになる。というか見た目わからないけど、部品が足りなかったので3つの違う7セグでマトリクス点灯している。

さらにこの後、この向きじゃガワに入らない事が発覚して上下反転させるプログラムを書いた。面倒臭い…

ブレッドボード上である程度作る。7セグマトリクス点灯用のデマルチプレクサとして74HC154を使用。

DSC01407.jpg

一気に実装に。12時間後に発表だ。

DSC01432.jpgDSC01433.jpg

つーかブレッドボード横に置いてニコイチで実装していったんだけど、かなり綺麗な配置。職人的になってきた

ガワも作る。詰め込む。

DSC01427.jpgDSC01429.jpgDSC01434.jpgDSC01435.jpg

できた!とりあえずラックに入れておきます。残留する人使って下さい。

DSC01443.jpgDSC01445.jpg

鼻のスイッチを入れた方の目が光ります。確か右が時刻表示で、左がアラーム時刻設定だった筈。

本体裏のツマミ(ロータリーエンコーダー)を回すとアラーム設定ができます。時刻の方は携帯電話から取得して調整したかったんだけど、資料に載っていなかったので手動です。裏の小さいスイッチを押しながらツマミを回すと調節できます。

アラームで指定した時刻になるとブザーが鳴り、ケータイにコードを送って電話させます。

タイマを3種類(7セグマトリクス更新用、ロータリーエンコーダ監視、1秒を計測)回した。今回は8MHzで足りた。

1秒は、8MHzなので1024分周で8000カウントされたら1秒という事で16bitのタイマ/カウンタを使った。

一番苦労したのは時計としての状態管理。バウンダリが多いと管理が大変になる。

倒したらスヌーズになるとか考えて3面に傾斜スイッチを付けたり、そのせいで足りなくなった足を補う為にTINY2313を追加したりと終盤迷走したけどギリギリなんとかなって良かった。

提出したレポートが手書きの表紙とソースコードだけというのがアレだったけど_|‾|○

0

AVR – mega8でロータリーエンコーダを回す

2週間ぐらい前の事なので曖昧だが、ATmega8のタイマ/カウンタ1で秋月で100円のインクリメンタル型ロータリーエンコーダーを使ってみた。

DSC00968.jpg

写真下のマイコンは関係無い。

既にTiny26Lでやっている人がいたので参考にしながらさくっと書いた。

ソースコード(AVR-GCC)

んで数日後に書き直した。

ソースコード(AVR-GCC)動画

なんで書き直したかは記憶が定かではないのだが、とりあえず大した違いは無いしどちらも動く。昨日も古い方でデモしてきたばかりだし。

動作設定としてはこんな感じで

/** 動作設定 **/
#define FOSC 8000000 // 8MHz
#define BAUD 9600 // 9600bps
#define MYUBRR FOSC/16/BAUD-1 // UART分周率
volatile char uart_recv_data; // UART受信データ
/** ロータリーエンコーダ設定 **/
volatile char rot_state;
#define ROT_TCNT1 65536-32+1 // 8MHz 1024分周で1ms(1000Hz)

タイマ/カウンタ1を初期化する。main()から1回だけ呼び出す必要がある。

/* タイマ/カウンタ1オーバーフロー割り込み設定 */
void overflow1_init(void){
TCCR1B = (1<<CS12)|(0<<CS11)|(0<<CS10); // 256分周
sbi(TIMSK,TOIE1); // タイマ/カウンタ1オーバーフロー割り込み許可
TCNT1 = ROT_TCNT1; // 1ms毎に割り込み設定(ロータリーエンコーダー用)
}

ロータリーエンコーダー監視スレッド。割り込みなので書いておけば一定時間毎に実行される。

/* タイマ/カウンタ1オーバーフロー割り込み
ロータリーエンコーダー監視用 */
SIGNAL(SIG_OVERFLOW1){
TCNT1 = ROT_TCNT1; // タイマ/カウンタ初期化 1ms毎に割り込み設定
char past_state; // 1回前の状態
past_state = rot_state;
if(bit_is_set(PIND,PD3)){
if(bit_is_set(PIND,PD4)) // HH
rot_state = 1;
else // HL
rot_state = 0;
}
else{
if(bit_is_set(PIND,PD4)) // LH
rot_state = 2;
else // LL
rot_state = 3;
}
if((rot_state+3+1)%3 == past_state){ // 右回り
uart_send_str(&qute;R&qute;);
}
else if((rot_state+3-1)%3 == past_state){ // 左回り
uart_send_str(&qute;L&qute;);
}
}

書いてて10ms毎じゃない気がしてきたが、速い分には問題ないし、他にもタイマを回しているのだったら色々タイミングもずれてくると思うので適宜対処して下さい。

ロータリーエンコーダーの真ん中の足をGNDに接続し、左右の足をそれぞれマイコンのピンに接続。また、左右の足とマイコンのピンの間で、10kΩの抵抗を使ってプルアップする(VCCに接続する)

まあ写真の通り。

インクリメンタル型ロータリーエンコーダーは2本の線で4種類の回転状態を出力する。1クリック回す(カチッと言う)と、4種類の状態が一回りする。

とりあえず状態に0,1,2,3と名前をつけて、10ms毎ぐらいに状態を見に行くと、状態が1増えていたら右に回転、減っていたら左に回転みたいな感じでわかる。

■参考サイト

113.ロータリーエンコーダを使う

2343e-conv

AVR試用記-ロータリーエンコーダ

ELM – 接点入力と処理のコツ – ロータリーエンコーダの使い方

ところでタイマ/カウンタ、以前書いた時はイマイチわかってなかったのだが、タイマ割り込みが発生するのはTCCNxが8bitなら256、16bitなら65536になった時起こるとの事。つまりタイマ/カウンタオーバーフロー割り込みとはそういう事。

TCCNxが増えるタイミングは分周率(TCCRx)で決まる。64分周だったら、64クロック毎に1増える。分周なし、8、64、256、1024分周まで5段階あるのでそれでタイミングを調節できる。

また、TCCNxに直接書き込み、カウンタの初期値を設定する事もできる。これは割り込みが起こった瞬間に次の割り込みに備えて代入しなおす必要がある。

この2種類の方法で割り込みタイミングを操作する。

1

ATmega8を外部クリスタルで動かす

忙しいのでメモ程度に

外部クリスタルにするには

・ヒューズビット上位のCKOPTを0に

・ヒューズビット下位のCKSEL3~1を101~111に

する。

上位ビット書き換え

avrsp -fh11001001

下位ビット書き換え

avrsp -fl11111111

SUT1、SUT0、CKSEL0も参照。起動遅延時間の設定になっている。「外部クリスタル低速立ち上がり」にした。

20MHzで動かした。

セラロックは3本足だが、クリスタルは2本足。それぞれをXTAL1,XTAL2に接続する。GNDにつなぐ必要は無い。

ここ参考になる http://www.cek.ne.jp/~kunio.h/mega8.htm

0

ホパンキラー

電子おもちゃ設計論の最終課題として作った奴。

DNPハウスに出現するホパンを狩る。

DSC00871.jpg

速く使い切りたかったのでAT90S4433で実装した。あとwebcam解体した奴を組み込んだ。

スライド

動画

ソースコード(AVR-GCC)

まあ寝坊して最終発表には行けなかった訳だが。レポートは出した。単位は…来るかな?