レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

ATtiny13Aでシフトレジスタを使ってみる

2019年12月05日 | 電子工作

ATtiny13Aは安くてつい購入してしまうのですが、使用できるピン数が5本(ヒューズで設定すれば6本も可能だけどICSPが使えなくなる)しかないので、色々なデバイスをつなげたくてもピンの不足に悩まされることが結構あります。

ピンが足りない時の対処法は色々あると思いますが、ATtiny13Aの少ないメモリをできるだけ消費しないで対応するにはシフトレジスタを使うのがいいのではないでしょうか。シフトレジスタはシリアルで入力されたデータをパラレルの出力に(またはその逆に)変換してくれる便利なICです。前にファミコンジョイスティックの中にパラレル→シリアル変換のシフトレジスタがあるのを見て、一度使ってみたいと思っていました。
我らが秋月電子にはシリアル→パラレル変換の8ビットシフトレジスタ74HC595(U74HC595AG-D16-T)がありましたので、ATtiny13Aで利用するのに購入しました。



残念ながらパラレル→シリアル変換でよく使われる74HC165とかはありませんでしたので、こちらはあきらめました。(TSSOPタイプのHD74LV166ATというシフトレジスタはありましたがDIP化が必要なのでまた別の機会に)

さて、このシフトレジスタを使って何をするかというと、昔使ったこの7セグメントLEDのドライバにしてみます。7セグメントLEDには専用のドライバーICもありますが、ここは学習の為にシフトレジスタを使ってみます。

手持ちの7セグメントLEDは、GNDがひつとにまとまっているカソードタイプのものです。数字とドット合わせて8個のLEDがあり8ビットシフトレジスタ74HC595で扱うのにちょうどいいですね。このLED2個にそれぞれシフトレジスタを1つずつ割り当てます。
以前は2個の7セグLEDを点灯するのにArduinoの8本のピンをそれぞれのLEDのセグメントに重複させてつなぎ、7セグLEDのオンオフを高速に切り替えて両方のLEDが点灯しているようにみせるダイナミック点灯という方法を使っていたのですが、今回は両方のLEDが常に点灯しているという贅沢な方式にしたいと思います。

ところで、74HC595をコントロールするのには最低でもシリアルデータの入力、シリアルデータ入力タイミングのクロック、入力した8ビットを出力するクロックの3つの出力が必要になります。でも、ATtiny13Aには使えるピンが5つしかないので、2つのシフトレジスタをコントロールすることは出来ません。
そこでカスケード接続という方法で2つの8ビットシフトレジスタをつなげて、16ビットシフトレジスタとして使います。1つめのシフトレジスタの最上位ビットを2つめのシフトレジスタの入力にするのです。これによりATtiny13Aの3ピンを使うだけで2つの7セグLEDを点灯できます。便利ですね。
この辺の詳しいことはネットで多くの方が説明してくださっているのでそちらを参考にしてみてください。

これで、7セグメントLEDの表示については問題なさそうです。せっかくなのでこのLEDで何か実用的なものを作ってみようと思ったのですが、7セグLED2桁で出来ることはあまり思いつかなかったので、ありきたりですが秒表示のない分表示のみのキッチンタイマーを作ってみることにしました。

でも、ATtiny13Aはメモリが1Kバイトしかないので、7セグLED表示以外に色々させるのは難しそうです。
しかたがないのでもう1つATtiny13Aを使うことにしました。もともとの単価が50円と安いので気楽に使用できます。

1つは7セグLEDの表示に、もう1つはタイマーとスイッチ、ブザーのコントロールに使用します。ATtiny13A同士の通信に最低でも2つのピンは必要です。LED表示用はシフトレジスタに3ピン使うので残り2ピンが通信に使えます。もう1つは通信以外の3ピンでスイッチとブザーを使わなければならないので、スイッチには2ピンしか割り当てられません。2個のスイッチでもタイマーは作れますが、操作性を考えるとスタート・ストップに1つと時間の設定に2つのスイッチを割り当てたいところです。

どうしたものかと思っていたところ、アナログ入力を利用して1つのピンに複数のスイッチをつなげるという方法を見つけました。詳しくはこちらのサイトで解説してくださっています。素晴らしいですね。これでピン1つにスイッチを2つ付けて合計3つのスイッチを使うことが出来ます。

ところが、まだまだ問題がありました。ATtiny13Aにはタイマーが1つしか無いのですが、このタイマーはATtiny13AをArduinoとして使うときにシステムで利用するので、このタイマーを使ってしまうとATtiny13A同士の通信に使用するdelay()などの関数が機能しなくなるようです。
かなり困った問題ですが、これについても解決策がありました。それはウォッチドッグタイマーを使う方法です。ウォッチドッグタイマーはAVRの動作を監視するためのものなのですが、タイマー割り込みにも利用できるとのことです。詳しくはこちらとかこちらのサイトで解説してくださっています。この機能は便利なので今後も利用していきましょう。

これでキッチンタイマー製作の目処が立ちました。あとはひたすら回路を構築していくだけですが、今回は配線も多いのでArduinoのシミュレーター機能もあるAUTODESKのTINKERCADで回路図を作ってみました。


ちょっとごちゃついていて見にくい図ですが、ご容赦下さい。

図の左端にあるのはオーディオ機器みたいですが電源です。5Vを想定しています。シフトレジスタとATtiny13Aの電源ラインは省略しています。コンデンサーにつながっている+−の線から電源に配線します。コンデンサーは積層セラミックコンデンサ0.1μFです。
中央にあるのは圧電ブザーの絵ですが、実際は電子ブザーを使います。秋月電子のUDB-05LFPNを使いました。電子ブザーは電圧をかけるだけで音がなるので、ATtiny13Aのようにメモリを節約したいAVRで使う場合に便利です。
7セグメントLEDにつながっている抵抗は1kΩです。タクトスイッチにつながっている抵抗は10kΩになっています。

実際に配線したものはこちらです。



キッチンタイマーとしてはかなり大げさな感じになってしまいました。見にくいですが右側のシフトレジスタの下にある3PのソケットはATtiny13Aを取り外して、他のAVRなどからシフトレジスタをコントロールしてLED表示を行うためのものです。



キッチンタイマーのスケッチはこちらになります。

7セグメント表示用

ATtiny13_7SegmentDisplay.ino

タイマー制御用

ATtiny13_7SegmentTimer.ino

このスケッチで使用しているArduino IDE用のモジュールはbitDuino13です。動作クロックは1.2MHzにしました。

デジタル入力側のタクトスイッチはタイマーのスタートとストップを行うものです。アナログ入力側のタクトスイッチは左右のスイッチを押すたびに、それぞれ左右のLEDの数字が0→9→0‥と変化します。
タイマーをスタートして時間が来ると、ブザーが5回なります。このブザーは結構大きな音がします。音を小さくしたいときは抵抗をはさむといいでしょう。
7セグメントLEDのドットは特に必要ないのですが、LED表示の更新を行うたびに左右交互にドットが点滅するようにしました。このスケッチでは1秒ごとに表示を更新して、タイマーが動作していることを分かるようにしています。

タイマーとして使う時に手軽に持ち運びできないと不便なので、前回改造したダイソーモバイルバッテリーに乗せてみました。



なんだか爆弾の起爆装置みたいな怪しい感じになってしまいました。
この基板のスペーサーはグルーガンでバッテリーに固定してありますが、簡単に基板の取り外しができる物なので他のデバイスと取り替えることが出来ます。

 

これでキッチンタイマーの完成です。ただし、まったく防水していないのでシンクまわりで使うのは避けたほうがいいですね。

今回はAVRを使う上で様々なテクニックを知ることが出来て本当に勉強になりました。まだまだ使ったことのないICやデバイスがあるので、今後も活用していきたいと思います。



最新の画像もっと見る

コメントを投稿