2012年7月14日土曜日

AVR ダイナミック点灯

Cです。

「ダイナミック点灯」とはめちゃくちゃ早い速度で、
点灯する物を切り替える事によって、複数の物が点灯しているように見せること。

下の写真は3桁表示されているように見えるが、実際には
同時に表示されているのは1桁で人間どもには、確認できない速さで
切り替わって表示されている。

何でこんな事をするのかというと、
1個ずつちゃんと表示してたらマイコンの足がいくらあっても足りないから。















#include<avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>
    unsigned char cnt=0;
    unsigned char seg[10] = {0b00111111, 0b00000110,
                             0b01011011, 0b01001111,
                             0b01100110, 0b01101101,
                             0b01111101, 0b00100111,   
                             0b01111111, 0b01101111};

ISR ( TIMER0_COMPA_vect ){
    static unsigned char sel=0;
    unsigned char dig1, dig10, dig100;
    static unsigned char i;
    dig1    = seg[cnt % 10];
    dig10   = seg[(cnt / 10) % 10];
    dig100  = seg[(cnt / 100) % 10];
    switch(sel){
        case 0: PORTB = 0b00000001;
                PORTD = dig1;
                break;
        case 1: PORTB = 0b00000010;
                PORTD = dig10;
                break;
        case 2: PORTB = 0b00000100;
                PORTD = dig100;
                break;
    }
    sel++;
    if(sel == 3){ sel = 0; }
   
    i++;
    if(i == 200){ cnt++; i = 0; }
}
int main(void) {
    DDRB = 0b11101111;  //PB4のみ入力
    DDRD = 0b11111111;  //すべて出力
    PORTB = 0b00010000; //
    PORTD = 0b00000000; //D初期化
    TCCR0A = 0b00000010;    //CTC
    TCCR0B = 0b00000101;    //約1kHz
    OCR0A = 5;              //5msで割り込む
    TIMSK0 = 0b00000010;    //COMPA割り込み
    sei();                  //全体割り込み許可
    while(1) {
    }
    return 0;
}

AVR PORTDチェック関数

Cです。
PORTDの出力チェックを実施する。
PD0~7にLEDでもつないでおこう。

#include<util/delay.h>

void PORTD_test(char w_cnt){

    char i;

    for(i = 0; i < w_cnt; i++){
        PORTD = 0b00000001;
        _delay_ms(200);
        PORTD = 0b00000010;
        _delay_ms(200);
        PORTD = 0b00000100;
        _delay_ms(200);
        PORTD = 0b00001000;
        _delay_ms(200);
        PORTD = 0b00010000;
        _delay_ms(200);
        PORTD = 0b00100000;
        _delay_ms(200);
        PORTD = 0b01000000;
        _delay_ms(200);
        PORTD = 0b10000000;
        _delay_ms(200);
    }
}

int main(void) {
    DDRD = 0b11111111;           //すべて出力
    PORTD = 0b00000000; //D初期化
    while(1) {
    PORTD_test(1);
    }
    return 0;
}

AVR

Cです。
メモリやタイマーなどを作ってきたんだけど。
これはマイコンを使うまでにいろんな基礎知識を養う為のものだった。

これからはマイコンメインでやっていく。半導体技術のすごさを身をもって感じた。

マイコンはAVRを選定した。

どんどん弄繰り回していこう。

2012年6月2日土曜日

ローカル DNSサーバ

Cです。

今日はDNSサーバの設定を書いておこう。
Debianだけど考え方とか設定内容はRHEL(CentOS)も一緒だ。

■フォワードオンリー設定
自分には問い合わせの回答を持たずに、別のDNSサーバに丸投げする設定。
別のDNSサーバから頂戴した回答は一定時間キャッシュとして保持する。

/etc/bind/named.conf.options <-これはdebian独特だけどnamed.confから読み込んでるだけ。

        version                 "aho";  <-bindのバージョンをばれないように設定しとこう
        max-cache-size          10M;  <-キャッシュ保存容量
        max-cache-ttl           604800; <-キャッシュ保持時間(1週間はちょっと長い?
        max-ncache-ttl          10800;  <-ネガティブキャッシュ保持期間
        recursive-clients       10;   <-再起問い合わせを受け付けるクライアント数
        allow-query { 192.168.24.0/24; 127.0.0.1; }; <-クエリを受け付けるIP
        forward only; <-フォワードしかしないよ
        forwarders { 8.8.8.8; }; <-丸投げ先


■ローカルDNSサーバ
ローカルネットワークでの名前解決に使うための設定。

/etc/bind/named.conf.local

        zone "localdomain.local" IN {
        type master;
        file "/etc/bind/localdomain.local/localdomain.local.zone";
};

zone "24.168.192.in-addr.arpa" IN {
        type master;
        file "/etc/bind/lcaldomain.local/lcaldomain.local.rev";
};


/etc/bind/localdomain.local/localdomain.net.zone <-正引き用


$TTL    604800
@       IN      SOA     hostname.localdomain.local   root.localdomain.local. (
                            20120604            ; Serial
                              604800            ; Refresh
                               86400            ; Retry
                             2419200            ; Expire
                              604800 )          ; Negative Cache TTL
;
@               IN      NS      localhost.
@               IN      A       192.168.24.70
gw              IN      A       192.168.24.1
hostname        IN      A       192.168.24.70


/etc/bind/localdomain.local/localdomain.net.rev <-逆引き用

$TTL    604800
@       IN      SOA     hostname.localdomain.local   root.localdomain.local. (
                            20120604            ; Serial
                              604800            ; Refresh
                               86400            ; Retry
                             2419200            ; Expire
                              604800 )          ; Negative Cache TTL
;
@               IN      NS      localhost.
                IN      PTR     hostname.
                IN      A       255.255.255.0
70              IN      PTR     hostname.
1               IN      PTR     gw.


クライアント側、サーバ側ともに/etc/resovl.confの設定をしておこう。

2012年5月21日月曜日

ライントレーサー

Cです。

 電子工作をまったくの0から初めて、ようやくこれくらいのものが作れるようになった。
時間かかりすぎだけど、まあいい。



これは「ライントレーサー」といわれる物で、電子工作の入門にはぴったりだ。
フォトトランジスタで地面のラインからの光の反射量によって電圧が変わり、
それを論理回路NOTに入れて、その出力をモータードライバへ送りモータを制御する。

今はマイコンでいろいろ片付けちゃうとおもうけど、
基礎から解りたい場合はマイコン無しではじめるほうが良い。


いろいろと再利用を考えてモジュール化しようとしたら線が大変なことになった。
回路用の5V電源はもちろん、センサー部分、各ICは取り外せるように作った。
次は、論理回路をたくさん使って何かやってみよう。