1コメント

【Arduino Uno】シフトレジスタを使ってみた【74HC595】

という訳で。今回。電子工作ド素人な自分がシフトレジスタを使ってみたよ。


という記事になります。



まずなんでこれ使おうと思ったのかってのはシンプルで、電子工作何かまた作りてえなあ〜と思って漁ってて


出てきたのがセット内容のこの半導体。



4N31かなんか、フォトカプラって奴も入ってたけどピンと来ずそっちは触れてない



今回触れたのは


74HC595と言う奴だ。


I-14053.jpg



足は片方に八本、合計十六本。



集積回路ICと言っても様々な種類があり、まあ回路を小さく細かく集めた部品であることは名前の通り分かるだろうが



じゃあこいつは何のICなの?




と聞かれれば答えはこうだ。




シフトレジスタ。




私が勉強する上で参考にした2つのサイト。細かく勉強したければこちらを参照して欲しい









データシートはこちら





もくもくもくもくもくじ

  1. シフトレジスタ とは
    1. もう1つのレジスタ
  2. 結局どういう動作するん
  3. 使用例は?今回何作ったの
  4. まとめ

シフトレジスタ とは

じゃあまず、シフトレジスタとは。

自分なりの解釈ですが、シフトってのは「ずらす」って意味合いが大きいです。

レジスタは「記録」。


ずらして記憶…?


レジスタがデータを保持するが、ずらすメリットとは…?

てなところから初めて行きます。


もう1つのレジスタ
74HC595はシフトレジスタという名目ですが。もう1つレジスタがあります。

ストレージレジスタです。こちらはデータを保持するストレージ、なレジスタです。


💭❓

シフトレジスタがレジスタだからデータ保持するんじゃないの?


データは保持するが、シフトさせる動作が終わり次第次のシフトさせる動作をするデータを受け取るため、データは消えます。

忙しいですね😅


自分もここは何となくしか把握してないので色々言えないんですが。


どう説明するかな…何となく想像はつく感じ


というのは、

20210227_050740.jpg

上記リンクから引用。

言ってしまえばこのICは「シリアルデータ(直列)をパラレルデータ(並列)に変換する」回路なんですね〜


って言ってもピンと来ないと思いますが…


ざっと動作説明すると、8bitのデータをSERピンから受け取ります。

それをSRCLKいわゆる「クロックパルス」のタイミングに合わせて右にずらしてQA'レジスタに入れる

それを次のクロックパルスでさらに右ずらしでQB'レジスタに


説明…うーん


QA'は入力データがHIGHからLOWになる時、その前のクロックパルスの時にはHIGHだったことが分かる

なのでHIGHにする、というのを繰り返すことでズレているかのような動作が起きる。


1度のクロックパルスにおいて保持できるデータは1つのレジスタに1bitだけであってもなんか面白い原理になるんですね〜



で。これを繰り返すと。

QA'からQH'にかけて綺麗に入力データが縦並びになる。


そして8bitが縦並びになり今ある分のデータ分処理が終わるタイミングくらいにRCLKがHIGHになるのを合図としQA''からQH''にQA'からQH'のデータそれぞれのHIGHとLOWの情報になる


このQH''からQA''をストレージレジスタという感じ。


こっからは次分野。


結局どういう動作するん

結局は、シフトレジスタからRCLKの合図でストレージレジスタに移すというのは、ストレージレジスタからICの外へ出力する猶予が必要だから行うのであるということだ。


というのは、順序逆にしてしまったが使用例のシリアルをパラレルに変換するという事は、すなわち


パラレル(縦並び)に変換されたデータは全て同時(RCLKタイミング)で出力しなければならない。


まあ、シフトレジスタでずらしてからその都度その都度出力しては結局シリアルと何も変わらないので、一括で出力する必要がある


なのでストレージレジスタに貯めておいてデータが縦並びに揃った時に出力する、という仕組みになってるんだと思います。


ちなみに、RCLKも一種のクロックパルスになっていて、次のRCLKのパルスが来るまでずっと前回シフトレジスタで処理したあとのパラレルデータを各出力ピンから出力し続ける、という動作をします


これは極めて高速で尋常じゃない速度で処理しますがArduinoのDigitalWrite的には毎秒4回とかしか処理してくれない…みたい?


使用例は?今回何作ったの

じゃーーー何に使えるのそれ。という意見


20210226_220033.jpg

こちらを見てもらえれば。


分かりにくいか…


さっき言った通りシフトレジスタの入力は一つだけ。


なのにLEDは8個。

こちらの動画のように入力一つだけでこんなに彩やかに制御するなんてどうなってんだ。


シフトレジスタは直列を並列に変換するIC、そして変換速度はとても早い。



シンプルにまとめましょう。

例えば「1を点灯0を消灯」とします。


データ1100101ってのを直列でシフトレジスタに送ります。


すると縦並び(並列、パラレル)に変換します。

QA'が1,QB'が1,QC'が0、…

と、こんな感じで。


で、それぞれのストレージレジスタから同時に出力する。


そうすることでどれが点灯(1)どれが消灯(0)した状態か、ってのを制御できます。



もっと簡単に例えましょう


「寿司」←データ

2進数にする(プログラムで)(ここではsushiとする)

シフトレジスタにs u s h iを「1文字ずつ」送る


箱箱箱箱箱←ストレージレジスタ

s u s h i ←SERの入力データ


という状態(箱に入れる機構をシフトレジスタ、箱をストレージレジスタという)


でこの5つの箱をそれぞれ同時に入力する(出力が5つあるということ)


※実際は1bitには0か1の情報しか入らず、この記事で出してるレジスタは8bitまで扱えます。



ちなみに点灯消灯が切り替わるのは、時間を開けて別のシリアルデータを送信しているだけです。


まとめ

全工協主催の情報技術検定2級に「シフトレジスタとは」「RS-FFとは」「D-FFとは 」とか、作図問題が出された記憶があるんですね


それも少し興味を引かれた要因でもある。


ちなみに2級までなら資格は持ってます。


ただ、今回6時間ほど作業する羽目になって結構大変だった。


というのも非同期クリアとか、そこらはあまりまだ理解してないですけど基本的にLOW、HIGHにしておくべきピンがあり、それに気づかずずっと(点灯しない!!)と嘆いておったものでw


初心者トラップかなー…



でもまあ、もっと色々電子工作にはチャレンジしていきたいですね


以上!


この記事へのコメント

  • tako

    Arduinoとシフトレジスタをせっかく使うのですから、Arduinoにテンキーつけて周波数のような数字を打ち込んで、Arduinoでシリアルデータにして、中間周波数を加減したものを吐き出させてシフトレジスタに送って、パラレル(BCDコード)を出したらPLL式のFM送信機もしくはFMラジオが作れるんじゃね?知らんけど

    テンキーで例えば8,4,7を打ち込んで、Arduino内で84.7MHz(小数点が厄介なので、847とする)を入れて、中間周波数の10.7MHzを意味する 107を加算すれば、PLLのMC145163(モトローラのPLLのICのN分周)をパラレル入力させるために、シフトレジスタを使えばよくね?

    もっともPLL回路で難問はVCOですので、FMトランスミッタやFMラジオの局発ならなんとかしてVCOを組めたとして。

    素材としては千石電商に八ヶ岳クラブ PLL FMトランスミッタが売られていましたわ(2024/1/4に目にしてます)。あのキットを単に組み立てたら周波数こそ安定はしますが、基準周波数が取説では間違っていて可聴周波数の2.5kHzになるのでわずかな音が発せられます。
    2024年01月12日 23:59