2013年 12月 23日

AVR のタイマー計算機

というのを作ってみた。

AVR に限らないけど、マイコンで時間を測るにはCPUクロックを数えるわけですが、欲しい時間に対して分周比とかを求めるのが面倒なのでかいた。

F_CPU は CPU クロック数、Seek Freq. のほうに欲しい周波数または時間間隔を入れて、Calculate を押すと、各分周比において CTC でいくつを設定すればいいか、あるいはオーバーフローでいけるかどうかとかを出す。

16MHz で 1msec を測りたい場合、

Pre-scaler:1, 16bit Timer CTC:16000
Pre-scaler:8, 16bit Timer CTC:2000
Pre-scaler:64, 8bit Timer CTC:250
Pre-scaler:256, no result for 62.5
Pre-scaler:1024, no result for 15.625

このようにでる。この場合は 8bit タイマーで 64 分周して CTC を 250 に設定したらよい。

2013年 11月 30日

Web Audio (JavaScript) で RTTY (周波数偏移変調) をデコード

RTTY (ラジオテレタイプ = 無線による文字伝送) というものがありまして、大変昔昔に考えられた通信プロトコルなのですが、アマチュア無線では一応現役のデジタルモードであります。

RTTY で通信すること自体にはあんまり興味沸いてなかったのですが、プロトコル自体には興味があったので、Web Audio と絡めて、試しに実装をしてみました。

RTTY のプロトコル

そもそも RTTY はラジオテレタイプの総称なのですが、アマチュア無線においては典型的には以下のようなプロトコルのようです。

  • 170Hz シフトの FSK (複数の周波数を切り替えて信号を伝達する)
  • 5bit の ITA2 コード Baudot Code (ボーコード) で、スタートビット1bit、ストップビット1.5bit の非同期方式
  • 速度は 45.45 ボー (22msecごとの符号)

さらに、無線機とのインターフェースとしては AFSK (Audio? FSK)、直接FSK というのがあって、前者は LSB モードの音声としてオーディオ帯域を入力するもの。後者はキーイングに応じて無線機側で直接送信周波数を 170Hz シフトさせるものです。

AFSK だとマイク入出力だけで無線機とのインターフェイスが完結するので接続は簡単になりますが、無線機に表示されている周波数と実際発射される周波数にズレが生じたり、ALC の調整とか、電波の質とか、送信が少々面倒です。まぁしかしとにかく AFSK として実装をしました。

なので、送信側としては 2125Hzの「マーク」符号 (=ビット1に相当) と、シフトされた「スペース」符号 (=ビット0に相当) を作ります。

Baudot Code

RTTY が開発された当初には ASCII コードとか存在しなかったようです。

5bit しかないので、アルファベットと数字・記号をシフトコードで切り替えながら送受信することになってます。なので、シフトコードの受信にミスると文字化けが起こります。

出力 (送信)

まずデバッグしやすくするため、送信側から作りました。デバッグには既存の MMTTY を wine で起動してマイク経由で適当にやりました。仕様通りに信号を変調すればいいので送信は比較的楽です。ただ、以下の点にハマりました。

  • LSB モードの復調結果を取り込むことを前提としているので、マークとスペースの位置が反転する (スペースが170Hzアップシフトになる)
  • 下位ビットからの送信

入力 (受信)

まぁ当然めんどうくさくて、とりあえず同期検波を実装してみました。マーク周波数、スペース周波数それぞれについて、I と Q (1/4位相ずれ) 信号を作ってやるやつです。それで直流になるので、あとは頑張って22msec分のサンプルを数えながらデコードしています。

この方法だと特にフィードバックとかがいらず、ストリーム1パスで処理できるので気が楽でいい感じです。

今回は JS 側でフィルタとか書きたくなかったので、最後のほうまでダウンサンプリングせず、できるだけ Web Audio の API で実装してみました。単に面倒だったのと、Web Audio の知見を溜めようという狙いです。I/Q な信号が2本なので、合計4チャンネルの信号を作って一気に1つのローパスフィルタノードに入れたりして結構楽しい感じです (ただ、こうするとチャンネル間で干渉するっぽい)。オシレーターノードを使ってもっと綺麗に書けないかと思ったけど、かえって面倒だったので素直に sin/cos してます。

ちなみにローパスとハイパスの Q 値は 0 以上の場合、カットオフ周波数付近がなぜか増幅されるという挙動になるのでハマりました。減衰傾斜が急になるのだとばかり思っていたら全然違った。バンドパスの場合の Q 値は上げても減衰傾斜が急になるだけです。

2013年 11月 25日

Mac の Time Machine が今何をバックアップしているのか? を知る

Time Machine はかなり気にせずに使えるのがいいというものですが、バックアップ実行中に環境設定を開いても今何をコピーしているのが全く表示されないので、気になるときはモヤモヤする。

なんかいい方法ないかなと思ったけど、特に思いつかないので、dtrace で open を見たらとりあえずわかりそうな結果はでました

$ sudo dtruss -t open -n backupd

で backupd が open するファイル名がドンドコ表示されるので、起動しっぱなしにしておけば、現在コピー中のファイルは知ることができる。

ただ、なんか1つのファイルをずっとコピーしているなー、という場合には (既に open 済みなので) 使えなくて、そういうときは lsof でいける気がする。けどたった今バックアップが終わってしまったので検証できないのでそのうちやってみます。

何かもっと素晴しい方法があればご教示ください。

2013年 11月 18日

マイコン周りのシリアル通信プロトコルまとめ

なんかいろいろあって??ってなるので特徴を覚え書き。線は信号に関係するものだけ (普通は +VDD が必要)

名前 特徴 速度 備考
1-wire SIGNAL, GND 半二重 1対多 非同期 標準 15.4kbps, オーバードライブ125kbps SIGNAL が VDD を兼ねるので本当に2本だけでOK センサーとかで採用例がある。MAXIM の日本語スライド
I2C SDA, SCL, GND 半二重 多対多 同期 ロースピード 10kbps 標準 100kbps ファーストモード 400kbps 高速モード 3.4Mbps バス中のデバイスのどれでもマスターになれる。マイコンだと400kbpsまでが多い?ここに上げた中では唯一多対多のバスを作れる
SPI SCK, MISO, MOSI, SS, GND 全二重 1対多 同期 クロック依存最大 1Mbps〜2Mbps マスターはスレーブの数だけ SS が必要。1対1 なら SS は必要ない。
RS232 RxD, TxD, GND 全二重 1対1 非同期 9600bps などいろいろ PC でもよく使われていたインターフェイス。今でも USB 変換ケーブルは簡単に手に入る。フロー制御とかしないなら3本で使える
USB1.0 D+, D-, GND 半二重 1対多 非同期 1.5Mbsp, 12Mbps 使うの面倒。USB2.0 は高速化版、USB3.0 はさらに高速化して全二重に

AVR では

  • SPI はほぼどの AVR でも使える
  • I2C は AVR によっては専用ハード (TWI) が用意されてる。専用ハードでなくても USI があれば TWI をハンドリングできる (多少面倒だけどライブラリとして公開している人はいる)。
  • RS232 はロジックレベルをドライバ (MAX232系の) で変換すれば USART で直接扱えるので簡単。
  • USB は一部の AVR で組込み。V-USB を使えばソフトウェアだけでもいける。あるいは USB Serial 変換チップ (FTDIのが有名でクロスプラットフォーム) を使えば USART 経由で使える。変換チップ使うのが確実で汎用性があってよく使われていそう。

略語がいっぱい

  • UART (Universal Asynchronous Receiver Transmitter) は非同期なシリアルを扱う回路の名前。同期なのを統合したものを USART (Universal Synchronous Asynchronous Receiver Transmitter) というらしい
  • TWI (Two Wire Interface) はその名の通り2線式ってことなんだけど、AVR においては普通は I2Cのことを指しているっぽい。I2Cと名乗ってないのはなんか政治的な問題?
2013年 11月 17日

キヤノンのカメラのリモートレリーズ (またはリモコンレリーズ)

そういえばマイコンからカメラのレリーズができたらいいかもなーとなんとなく考えたのでやってみた。タイムラプス的なもの (インターバル撮影) とか、バルブとか自分で制御できたら楽しいかもしれない。

リモートレリーズ端子

リモートレリーズ端子 (有線) にはいくつか種類があるらしく、キヤノンの場合、Kiss とかではステレオミニと同じだけど、5Dとか7Dとかだと、N3型端子とかいう謎の端子になる。N3端子ってのはそこらへんで単体で簡単に手に入らないので、既存のを買って切るしかないっぽい。機能的には同じみたいだけど、なんでこんなことになってるのか謎

手元にあるのはN3型のものなので、別にレリーズ別途買ってまで試すまでのモチベーションはわかなかったので、とりあえずリモートレリーズ端子を使うのは諦めた。(ただのスイッチなので難しいことはなさそう)

赤外線リモコンのレリーズ

他にレリーズを切る方法としては、赤外線リモコンを使うほうほうがあって、これなら赤外線 LED チカらせるだけでよく、端子とか関係ないのでお手軽そうだった。赤外線は昔昔買ったLEDジャンク詰め合せに無駄にいっぱい入っていて腐っている。

ググるとリモコンの解析結果を公開している人がいるので、その通りやったらいけた。

あたり前だけどドライブモードをリモコンのモードにしないとシャッター切れない。解析結果をそのままコードにしただけだけど (PB0 に LED が接続されている前提)

void shutter () {
	int i;

	for (i = 0; i < 23; i++)  {
		set_bit(PORTB, PB0);
		_delay_us(13);
		clear_bit(PORTB, PB0);
		_delay_us(13);
	}
	_delay_us(7200);
	for (i = 0; i < 23; i++)  {
		set_bit(PORTB, PB0);
		_delay_us(13);
		clear_bit(PORTB, PB0);
		_delay_us(13);
	}
}

ただ、赤外線の場合、設定済みの露出でしかシャッターを切れないので、バルブとかはできない。インターバル撮影とか、センサー連動のシャッターとかはこれで十分できそう。花火の撮影とか自動化できそう。

2013年 11月 10日

ATTiny2313 ステップ速度調節のエレキー

最初に作ったやつを少し作りなおした。ケースを加工するのが面倒だったので適当な状態で放置されていたんだけど、おさまりの良さそうな方法を思いついたので、基板から作りなおした。

回路図

殆ど前のと変わってない。ESD 保護ダイオードと、プルアップを変更しただけ

基板図

ファームウェア

ピンの配置の関係でアサインだけ変えてある。

ケース

秋月で売ってる電池ボックス 単3×4本用(フタ付プラスチック・スイッチ付)というのを使ってる。

単3は2本分の領域をエネループ用に使って、残り半分のスペースに回路を入れてる。もとからあるでっぱりとかはニッパーとかカッターで切った。電池の金具は加工する必要はなくて、ハメこまれてる位置を変えてあげるだけでよかった。元からあるスイッチはとってしまっている。

結構狭いので、圧電ブザーを削ったり基板をやすりで削ったりしてギリギリで入れてる。今回は部品配置の検討をするのに EAGLE が大変役に立った。ISP 部分以外はほぼジャンパなしでいけてる。IC ソケットをつけなければもっと高さに余裕があったんだけど、一応つけた。

スイッチがあった部分は少し広げて、タクトスイッチを入れてる。固定する方法で困るけど、グルーガンでタクトスイッチを固めてしまった。グルーガンでも結構固めになるので、力を入れても大丈夫なくらいにはなるっぽい。

ref.

Mac で YAESU FT-450D の PCC (PCからのコントロールソフト) を動かしてみる

wine で PCC-450D を動かしてみる。CAT のリファレンス読んでたら PCC-450D がなんとかって書いてあったのでググった。

YAESU USの Files から PCC-450D Software V1.00 and Reference Manual ( 1.18 MB ) をダウンロード。

wine で実行するとエラる

err:module:import_dll Library MFC42.DLL (which is needed by L"Z:\\Users\\cho45\\Downloads\\PCC-450D_V100\\PCC-450D\\PCC-450D.exe") not found
err:module:LdrInitializeThunk Main exe initialization for L"Z:\\Users\\cho45\\Downloads\\PCC-450D_V100\\PCC-450D\\PCC-450D.exe" failed, status c0000135

MFC が必要なので入れる

$ winetricks mfc42

COM ポートがどれも開けない。wine のこのへん、どういう仕組みなんだろう? と思ったら以下のようにするらしい。

$ ln -s /dev/tty.usbserial-FTB3L9UG  ~/.wine/dosdevices/com1

で起動はするし COM ポートとのやりとりも一応できてるっぽい。

でもいまいちうまく表示が更新されない。のでメニューから AI1; を自分で送ってあげると更新されたりする。でも全部の情報を同期する方法がわからなかった…… あと別にPCからリグをコントロールできても嬉しくない (もっとたくさん情報を表示できるとか、そういう機能はなかった)

結局、何かしら追加の機能が欲しいなら自力で書くしかない

2013年 11月 08日

MOS-FET 2N7000

VGS(th) に結構バラつきがあるみたいで、データシートだと 0.8〜3V となっている。VGS = VDS ID = 1mA の条件が書いてあるから、たぶん温度変化について書いてあるんだと思うけど、よくわからない。

VDS= 5V, ID = 1mA ぐらいで、手元のをいくつか試すと。室温20度で、約2.28〜2.32V付近でスイッチする。指でつまんで温めると0.1Vぐらい下がったりする。おもしろい。

2.1V ぐらいまでスイッチできてほしいんだけど、なんかうまい手はないんだろうか。負荷側の電圧は決まってしまっているし、ほかの素子を探すしかないのかな。すごい困るというほどではないから、そこまではしたくない。

Watch Dog Timer

ワッチドッグタイマー。基本はプログラムが意図しない挙動をしたときにリセットをかけるためのタイマー。

例えば、「常に1秒後にリセットをかけるワッチドッグタイマー」をセットして、ワッチドッグタイマーによってリセットされる前にメインプログラム側からワッチドッグタイマーをリセットする。もしプログラムが暴走してタイマーが初期化されなくなると、ワッチドッグタイマーがリセットをかけてくれる。

用途上、メインのクロックとは別のクロックで動いている。

Brown Out Detection

電源電圧を監視して、一定より下がったらリセットをかけてくれる。

もちろん瞬間的な電源電圧変動では反応しないようにヒステリシスな感じになってる。

ボタン電池で動く小型・低消費電力 AVR エレキー (50円 ワンチップマイコン ATTiny13A)

とりあえず完成なので、今まで書いたやつのまとめで整理。

要求

  • 外に持ちだせるように小型で電池駆動できること
  • 電池交換をあまり気にしなくてもいいこと
  • 実用的であること

仕様

  • 短点・長点それぞれ1点のメモリー
  • スクイーズ
  • インヒビット
  • 無段階スピードコントロール (10wpm〜30wpmまで想定)
インヒビットについて

エレキーは片方のパドルを押したままだと、ずっとその符号が出続けるので、いいタイミングで手を離す必要がある。

このとき、どのタイミングで符号メモリーを効かせるかで使い勝手が大きく異なる。

  • 前の符号が終わった瞬間にパドルが押されていたら即メモリーさせるか
    • 前の符号が鳴っている間にパドルから手を離す必要がある
    • 前のめったキーイングが必要
  • 前の符号の直後のスペースが終わった瞬間にメモリーさせる
    • 前の符号が鳴り終わってからも多少時間がある
    • 落ちついたキーイングが必要

後者のほうが基本的に落ちついて打てる感じだけど、パドルを早く動かしすぎると変な符号が出たりする。一長一短な感じ。

このエレキーでは、これらの中間として、前の符号が終わってから、短点の長さ * 0.3 の間は「インヒビット」として押し続けていてもメモリーされない挙動にした。これは単に好みなので、ソースコードの定数で変えれるようにした。

回路図

前回とピンの使いかたが変わっているけど、あまり変更はない。

パドル入力には静電気サージ (ESD) 用にツェナーダイオードを入れた。AVR の仕様上「All I/O pins have protection diodes to both VCC and Ground」となっていてクランプダイオードが入っているみたいだけど、クランプされたのを消費する部分がどこにもないので前段で入れたほうがよさそう。

FET のゲートについてる 150Ω は電流制限用だけど、一応なくても動く。AVR のポートの絶対定格が 40mA なので 3V/20mA=150Ω。流れるとしても瞬間だけなんだけど、絶対定格を守るなら必要そう。

FET の GS 間の抵抗は入力オープン時に GS を確実に 0V にするためで、普通入れるみたい。AVR の出力ポートってローのときは吸い込み動作するしいらないんじゃ? と思ったけど、電源 OFF->ON からのタイミングとかいろいろなタイミングで入力オープンのとき不意にONになるとそのままになってしまうらしい。一応入れたほうがよさそう。

2.2MΩ の抵抗はパドルのプルアップ抵抗で、省電力のため外部に大きなのをつけてる。ただ、人体アースの電圧降下でもキーイングとみなされる(接点を触れるとキーイングされてしまう)ようになるので、善し悪しがある。

いろいろ突き詰めると部品点数が減らせない。

基板図

ステレオミニジャックでパドルと繋ぐようにしてるけど、別に直結でもいいと思う。その場合ジャック部分はいらない。

ボリュームは半固定として書いてあるけど、普通のやつのほうがいいと思う。基板取り付けの小型ボリュームだとお手軽だけどあまり手に入らないみたい。なんでもいいけど場所をとる。

ファームウェア

これだけしか書いてないけど、ATTiny13A だと 96.7% Full (990 bytes) なので、結構ギリギリです

CrossPack-AVR-20130212 の avr-gcc (GCC) 4.6.2 で開発

AVR ISP Mark II なら、Makefile 変更なしに make install で書きこみが走る。

ISP も回路を切断せずに一応動いて、書きこみもできるけど、キーイング出力にノイズが入るので注意が必要 (ブレークインを切っておくか、リグとは切断して書きこみする必要がある)。

電源と実測消費電流

  • CR2032
  • eneloop lite

あたりを想定

CR2032 (3V) は公称 3V、終止電圧 2〜2.5V 程度。約 225mAh 使い捨てだけど、よく売ってる。使い捨てなので限界まで動いて電池しぼりとって動かなくなるほうが効率的。

eneloop lite 2本だと公称は 2.4V (1.2*2)、終止電圧 2.0V (1.0 * 2) 程度で、単4で550mAh、コイン電池に比べると体積は大きい。lite 版のほうが用途的にはいいだろうと思う。エネループの場合普通のニッケル水素より自然放電が少ないのと、比較的高い電圧が長く続く。ただし過放電すると致命的なので、2.1V程度で動かなくなるのが理想。

最低動作電圧

本体の最低動作電圧は 1.8V 程度なので、スイッチング用の FET の Vth に支配される。

実測すると、最低動作電圧は室温20℃で2.3V 程度 (≒ FET Vth)

CR2032 で動かすなら、もっと低い電圧でも動いてほしいけど、もっとぎりぎりの別のFETにするほかない。

エネループの場合2本で2.3Vを切る (1本で1.15V) になるのは、だいたい70%〜90%ぐらい放電したあたりなようなので、これでも悪くはなさそう。

消費電流

消費はいろいろ工夫してみたので、結構減らせてる。

  • キーイング中: 96μA (約 0.1mA 実測)
  • パワーダウン中: 0.15μA
    • (測定不可なので、ATTiny13A の仕様書から。実測では 0.0μA未満の表示だった)

電源に CR2032 (225mAh) を使った場合、1日に2時間キーイングすると仮定すると、約1152日ほど持つ。1日8時間フルタイムでキーイングしても 292日ほど持つ。1日16時間キーイングし続ける廃人でも146日ほど持つ。

eneloop lite (550mAh) の場合、容量の70%程度使うまででも、1日2時間のキーイングで1971日ほど持つ計算になる。自然容量減を考えてもそこそこ持ちそう。

消費電流減の対策

具体的には以下のような対策をしてる

  • 動作周波数は内蔵 128kHz
  • FET でスイッチング (なのでキーイング端子に高電圧がかっているリグでは使えない。5Vとか12Vとかなら全然大丈夫なはず)
  • スピード調節用のボリュームにできるだけ通電しない
  • キーイング用のプルアップ抵抗を高抵抗に
  • できるだけアイドルモードで動くように
  • 10秒経過ですぐパワーダウンモードに移行
    • キー入力割込みで復帰するので特に違和感はないと思う

まとめ

かなり単純なものをしっかり各所考えながら作ってみたけど、いろいろと発見があった。ソフトウェアの変更がダイレクトに消費電力減に繋がったりするのは新鮮で面白い。

また、この程度の回路だと全素子の動作を考えながら作れるので、基本的なことを理解するきっかけになった。

次はもうすこし複雑なものを作りたい。

ref.