AVR

Windows10 + usbaspでAVRマイコンを使う

AVRマイコンとはAtmel社の製造しているマイコンである。Arduino(およびそのパチもん)に使われているのもAVRのMEGAシリーズというやつで、安くて小さく扱いやすいのが特徴である。他方、ほんとうに素のマイコンのまま売ってるので、直接USBでPCにつないでスケッチをWriteみたいなそういうカジュアルな使い方はまったくできない。ライタと呼ばれる書き込み装置を使ってマイコンにバイナリを転送することになるわけだ。

このライタにはたくさんの種類があり、まあどれを使ってもいっしょだと思うのだが、買うとそこそこの値段 1する。そこでUSBaspというオープンソースのAVRライタを自作することになるわけで、ご多分に漏れず僕の手元には大学の先生に言われるがままに作ったUSBaspと秋月で衝動買いしたAVRマイコンが多数あるわけだ(ここまで8年前の知識)。

AVRマイコンたち。ATMEGA88, ATTINY85など

AVRマイコンたち。ATMEGA88, ATTINY85など

学生時代に自作したusbasp

学生時代に自作したUSBasp

久々にライタとAVRマイコンが出土したので是非いじってみようと思うわけだが、何も思い出せないし当時のPCもないし、なんならWindows10用のドライバなど全く提供されていないのでどこから手を付けて良いかわからぬ。

Continue reading

Notes:

  1. といっても数千円なんだから、今考えれば買ってしまえばよかろうという感じである

NEX-5で微速度(タイムラプス)動画を撮る

ざっくりした手順は

  • インターバルリモコンを用意する
  • カメラを固定してお好きな間隔で写真を撮る
  • 1枚を1コマとして動画を作成
  • ウマー

以上。

インターバルリモコンを自作

インターバルリモコン?はソニーから発売されてないので、どこかから調達しなくてはいけない。自作して少量売っていた人もいたようなのだが、とっくに売り切れているので自作するしかない。

1. 純正リモコンの信号を見る

まず信号を知る必要があるので、ソニーのカメラのリモコンを調達する。たぶんテレビのリモコンと同じ方式だろうと高をくくり、秋月のセンサをオシロにつないで出力を見てみると普通に波形が見えた。テレビと同じで38kHzのキャリア波で信号を送っているらしい。

詳しいフォーマットは調べても分からなかったので、オシロの画面で時間をはかってみると、以下のことがわかった(ここでいうHighはLEDが発光している間のことを指す。秋月のリモコン用センサは出力が逆になるので注意)。テレビのフォーマット?と似てるっぽいので、全く同じかもしれない。特にH/Lの時間は多少誤差がありそう。

  • 2500usくらいHigh -> 500usくらいLowが開始信号
  • 続けて20bitのデータを送信
  • 1300usくらいHigh -> 500usくらいLow が1(と、いうことにする)
  • 700usくらいHigh -> 500usくらいLow が0
  • これを20回出すまでが1回の命令になる。リモコンはボタンが押されてる間、一連の信号を繰り返し続ける模様。

ソニーの純正リモコンのうち、NEXで使えるのはたぶん2個だけなので、この2つの信号をメモする。

  • 即時シャッター:{1,0,1,1,0,1,0,0,1,0,1,1,1,0,0,0,1,1,1,1};
  • 2秒後シャッター(集合写真に使うの?):{1,1,1,0,1,1,0,0,1,0,1,1,1,0,0,0,1,1,1,1};

2. 適当に信号を発信する

信号がわかったので、あとは赤外線LED(秋月で10個100円の、940nm, 55mWのものでOKだった)をこのとおりに光らせるだけである(さらっと書いてるけど、能力がないので割と苦労した)。僕が使えるのはAVRくらいなので、手元にあったATTiny45(8pinDIPなのでかわいい)で作ることにした。

回路はこんな感じ。電源はエネループ(単三)を直列に2本で、2.5Vくらいだけど動いた。3時間くらい1秒間隔で信号出しっ放しにさせてみたけど問題なく最後までいけたので電池の持ちは十分だと思う。たぶんだけどLEDの消費電流がちょっとAVRのドライブ能力を超えてた。気にしないけど。

実際には、空いてるポートにスイッチを付けて、その状態に応じてインターバルを変えられるようにしてあります。1秒から15秒まで対応。ただ、内蔵クロッ クを特に考えず使っているので、間隔はかなりいい加減です。ちゃんとやりたい人は外部クロックと割り込みでやらなきゃいけないんじゃないかな?

完成図

AVRとか難しくてよくわからないので、PWMを使って38kHzのキャリア波を作ることにした。Tiny45のソースはこんな感じ。

 

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>

int main(void){

    // 1MHzで動く想定
    DDRB  = 0b00000010; // led以外input
    PORTB = 0b00111101; // pull up

    TCCR0A = 0b00100001; //高速PWMだっけ
    TCCR0B = 0b00001000; // PWM stop

    OCR0A = 13; // MAX。たぶんこれで周波数決める。
    OCR0B = 6; // この値あたりでH/Lが切り替わるのでduty比を決める(たぶん)。

    const unsigned char shutter[] = {1,0,1,1,0,1,0,0,1,0,1,1,1,0,0,0,1,1,1,1};

    unsigned short i, num, interval;

    for(;;){

        for (num = 0; num < 5; num++){ //1回あたり5連続で送信する

            // start bit
            TCCR0B |= 0x01; // high
            _delay_us(2500);
            TCCR0B = 0b00001000; // low
            _delay_us(500);

            for (i = 0; i < 20; i++){ // ビット列部分

                if (shutter[i]){
                    // if 1
                    TCCR0B |= 0x01; // high
                    _delay_us(1300);
                }else{
                    // if 0
                    TCCR0B |= 0x01; // high
                    _delay_us(700);
                }

                TCCR0B = 0b00001000;
                PORTB &amp;= ~0x02;
                _delay_us(500);
            }

            // 1回の送信終了、間隔を空ける
            _delay_ms(11.25);

        }

        // インターバルを決める
        interval = 5;  

        for (;interval;interval--){
            _delay_ms(1000);
        }

    }

    return 0;
}

こんなかんじ。

PWMで38kHzのキャリアを出しているので、PWM制御レジスタをいじってPWM自体をOn/Offしてるだけ。かんたん!

 

撮る

リモコンができたら、あとはNEX-5(たぶんαでもいけるはず)のドライブモードをリモコンにあわせて放置して、電源を入れたリモコンをカメラにくくりつけるだけ。で、たくさん写真が自動で撮れるので、VirtualDubModあたりで動画にする。

富士山で天体写真を撮ってきたのがこちら(外気温3度くらい)。このときは10秒露光(+ノイズリダクション)を470枚くらい撮るのに3時間かかった。バッテリは満タンからスタートしたけどほぼ空になったので、その辺が限界なんだろう。

リモコンとしてはちゃんと動いているので満足です。