ATtiny13Aをシステムクロック16kHzで利用する
まずは、ATtiny13Aをシステムクロック16kHzで利用する目的のお話しです。
プロペラをつかったホータブルゲーム機LameStationのジョイスティック部が次のような感じで
コンパレータLM339を使ってアナログ2入力をUP、DOWN、LEFT、RIGHTのON/OFF出力に変換
する形式となっています。

部品的には抵抗10本、IC(LM339)1個の利用とその配線となります。
この部分をADコンバーター機能を持つ「手持ちのATtiny13Aで置き換えれば簡略化出来るのでは?」
と思いつきやってみました。
動作確認と実装
まずは次ような感じの動作チェック回路を実装し確認しました。
ジョイスティックからのアナログ値を取得しその方向をON/OFFで出力します。
2入力4出力のため6ピン必要となり、リセットピンも利用しました。

プログラムソースは下記のようになります。
Arduino IDE 1.06環境にてsmeezekittyさんが公開している
「Arduino core for Attiny13(core13_022_arduino_1_6.zip)」を導入して利用しています。
// アナログジョイスティック デジタル出力変換 for Lame Station // // ATMEL ATTINY13 / ARDUINO // // +-\/-+ // ADC0 (D 5) PB5 1| |8 Vcc // ADC3 (D 3) PB3 2| |7 PB2 (D 2) ADC1 // ADC2 (D 4) PB4 3| |6 PB1 (D 1) PWM1 // GND 4| |5 PB0 (D 0) PWM0 // +----+ // ピンの割り付け #define J_UP PB1 // UP 出力 #define J_DOWN PB0 // DOWN 出力 #define J_RIGHT PB5 // RIGHT 出力 #define J_LEFT PB2 // LEFT 出力 // アナログ入力ピンの割り付け(要ピン番号で指定) #define IN1 2 // ジョイスティック UP/DOWN #define IN2 3 // ジョイスティック LEFT/RIGHT void setup() { pinMode(J_UP,OUTPUT); pinMode(J_DOWN,OUTPUT); pinMode(J_RIGHT,OUTPUT); pinMode(J_LEFT,OUTPUT); } void loop() { int v1,v2; int s1 = analogRead(IN1); int s2 = analogRead(IN2); if (s1 < 50) { digitalWrite(J_DOWN, LOW); digitalWrite(J_UP, HIGH); } else if (s1 > 973) { digitalWrite(J_UP, LOW); digitalWrite(J_DOWN, HIGH); } else { digitalWrite(J_UP, LOW); digitalWrite(J_DOWN, LOW); } if (s2 < 50) { digitalWrite(J_RIGHT, LOW); digitalWrite(J_LEFT, HIGH); } else if (s2 > 973) { digitalWrite(J_LEFT, LOW); digitalWrite(J_RIGHT, HIGH); } else { digitalWrite(J_RIGHT, LOW); digitalWrite(J_LEFT, LOW); } }
Arduino IDE環境ではシステムクロック 128kHzまでしか対応していないので、
プログラム書き込み後、リセットピンを出力に使うためのリセット禁止とシステムクロックを
16kHzに設定するためにヒューズビットを設定を行います。
作業はコマンドプロンプトにてavrdueコマンドを使って行います。

実行コマンド
avrdude -carduino -Pcom6 -pt13 -U lfuse:w:0x6b:m -U hfuse:w:0xfe:m -v -F -b2400
(書き込み機器はarduinoを利用した"Arduino as ISP"です)
ヒューズビットの設定値を簡単に調べるには次のサイトが便利です。
Engbedded Atmel AVR® Fuse Calculator
注意:RESET禁止またはシステムクロックを低速にすると、プログラム書き込みとヒューズビットの
設定が通常環境では出来なくなります。高電圧書き込みにてヒューズビットのリセット
が必要となります。
書き込み後、実装して動作確認をいたします。

問題無く動作しているようですが、RSETピンの出力が弱いです。

微妙にしか点灯しません。
この現象がなぜなのか、悩んだのですがSNS上のアドバイスにより理由が判明しました。

上記の"The reset pin can also be used as a (weak) I/O pin."のweak(弱い)がこの現象の理由のようです。
信号には使えるが、LEDの駆動には使えないくらい弱いようです。
信号として利用するには問題無いでしょう。
LEDが点灯していない状態で電池からブレットボードに流れる電流を測定すると、
1.27mAでした。予想よりも消費電力が大きいと思ったのですが、
アナログジョイスティックに流れる電流を測定したところ、0.70mAほどでしたので、
ATtiny13A単体では0.57mA程度と思われます。
ATtiny13A を 9.6MHzで動かすと、2.66mAなのでクロックを落とすことで消費電力化
が図れるのは確かなようです。

実際、プロペラ lumestationに組み込んで利用してみるとリセットピンからの
ON/OFFの信号も問題なく読み取れました。

これでジョイスティック入力が出来ました。SDKに付属のゲームで遊べました。

結論と感想
ATtiny13Aをシステム16kHzで利用しても問題なく利用出来ました。
むしろ、こういう使い方こそ50円マイコンにふさわしいと言えますね。
« ATtiny13Aのヒューズビットのリセット | トップページ | Arduino IDE 1.06にATtiny13A開発を構築 »
「ATtiny13A」カテゴリの記事
- ATtiny13AでI2C接続キャラクタLCDを利用する(4)(2018.04.16)
- ATtiny13Aで赤外線リモコン受信センサーを使う(2)(2018.04.15)
- ATtiny13AでHC-SR04を使った距離計測(2018.04.14)
- Arduino 1.8.5環境でATtiny13Aを利用する(2018.04.14)
- Arduino IDEを使ったATtiny13用スケッチの開発について(2016.08.30)
« ATtiny13Aのヒューズビットのリセット | トップページ | Arduino IDE 1.06にATtiny13A開発を構築 »

コメント