Arduino 入門
番外編 20
【shiftOut関数 まとめ】
こんにちは管理人のomoroyaです。
arduino 入門 番外編はarduinoの基本的なことを解説している記事です。
本記事は、Arduinoで使用するshiftOut関数についてです。
入門編では、8bitシフトレジスタの制御で使用した関数。
この関数も入門者には、わかりずらく理解しにくい・・・。
shiftOut関数は1byte分のデータを1bitずつシフトアウトする関数です。
関数の動作としては・・・
クロック出力ピンから8クロックが出力され、そのクロックに同期して8ビットのデータがシリアル方式で出力される動作となります。
どんなときに使うのか?
SPI接続のスレーブ機器の制御。
Lesson 20、Lesson 21 で使用している「SN74HC595N」シリアルパラレル変換用のシフトレジスタの制御。
などに使用します。
本LessonではshiftOut関数の動作を理解するためにタイミングチャートを考えてみます。
Lesson 20、Lesson 21 を遊ぶ上での一助になれば幸いです。
管理人はプログラマーの専門家というわけではありません。
気が向いたときにテキストを開き、ネットを調べ自己学習。
管理人にとってはブログ記事が自己学習のノートです。
書くことによって頭の中が整理できる。
arduino自身のこと、スケッチ(コード、プログラム)を少しづつ理解して行きましょう。
いやいや、arduinoを早速始めたいんだ!というかたは下記の入門編からお読みください。
Arduino入門編の解説にて使用しているArduinoは互換品です。
互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
正規品(Arduino UNO R3)の本体単品がほしい方はこちらとなります。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
shiftOut関数 基本解説
まずは基本的なことを復習。
繰り返しになりますが、「1byte分のデータを1bitずつシフトアウト」ための関数です。
1byte = 8bit になります。
LSB:0bit目と表現
MSB:7bit目と表現
Wikipedia LSB
最下位ビット(さいかいビット、least significant bit、LSBと略記)は、コンピュータにおいて二進数で最も小さな値を意味するビット位置のことである。LSBは右端ビットとも言われる。十進数に当てはめれば、「一の位」に相当する。Wikipedia MSB
最上位ビット(さいじょういビット、most significant bitまたはhigh-order bit、MSBと略記)は、コンピュータにおいて二進数で最も大きな値を意味するビット位置のことである。MSBは左端ビットとも言われる。
では、さっそく関数から確認。
引数 | 説明 |
---|---|
dataPin | 各bitを出力するピン |
clockPin | クロックを出力するピン dataPinに値がセットされた後、clockPinが1回反転 |
bitOrder | LSBFIRST、MSBFIRSTを指定 LSBFIRST:最上位bitから送信 MSBFIRST:最下位bitから送信 |
value | 送信したいデータ |
shiftOut関数 タイミングチャート
shiftOut関数のタイミングチャートを考えてみます。
上が「LSBFIRST」、下が「MSBFIRST」のタイミングチャートになります。
タイミングチャートについて説明していきます。
■clockについて
図で示したclockは、shiftOut関数の引数である、「clockPin」で指定されたピンから出力される信号です。
Xは不定をあらわし、L、Hがわからない状態。
この部分はshifutOut関数が呼び出される前に「clockPin」で指定したピンをdigitalWrite関数などでLまたは、Hのどちらに指定したかによって決まります。
■dataについて
図で示したdataは、shiftOut関数の引数である「dataPin」で指定したピンから出力される信号です。
Xは不定をあらわし、L、Hがわからない状態。
この部分はshifutOut関数が呼び出される前に「dataPin」で指定したピンをdigitalWrite関数などでLまたは、Hのどちらに指定したかによって決まります。
■動作(LSBFIRSTで説明)
- shiftOut関数呼び出し
- 「dataPin」にshiftOut関数の引数であるvalueのbit0(LSB)が出力
- 「dataPin」にvalueのbit0が出力されている間に、「clockPin」がH→L
- 「dataPin」にvalueのbit1が出力され、その出力中に「clockPin」がH→L
- 同じ動作を8回繰り返す
- 最後のbit7はvalueの出力を維持したままで、shiftOut関数から戻る
※MSBFIRSTの場合はbit7から始まるだけで動作は同じです。
次にLessonで使用している8bitシフトレジスタについて考えていきます。
「74HC595」のタイミングチャートを作ってみましょう!
「74HC595」タイミングチャート
Arduino 入門編のスケッチをもとにタイミングチャートを考えます。
スケッチでいうと下記部分のタイミングチャートになります。
digitalWrite(rclkPin, LOW); //送信中のRCLKをLowにする shiftOut(dsPin, srclkPin, LSBFIRST, leds); //シフト演算を使って点灯するLEDを選択 digitalWrite(rclkPin, HIGH); //送信終了後RCLKをHighにする
shiftOut関数は「LSBFIRST」を指定。
そのた、タイミングチャートはLSBFIRST。
「74HC595」は立ち上がりエッジでデータを取り込む仕様。
上記を踏まえたうえで確認ください。
タイミングチャートにあらわすと「shiftOut関数」前後の動作理由がわかるはず・・・。
digitalWrite関数で「rclkPin」をL→Hとしている必要性が一目瞭然です。
digitalWrite(rclkPin, LOW); //送信中のRCLKをLowにする shiftOut(dsPin, srclkPin, LSBFIRST, leds); //シフト演算を使って点灯するLEDを選択 digitalWrite(rclkPin, HIGH); //送信終了後RCLKをHighにする
まとめ
「Arduino 入門 番外編 20 【shiftOut関数 まとめ】」
はここまで。
なんとなく、使っていたというかたもタイミングチャートで考えてみると理解しやすくなります。
Arduinoの良いところは、分かっていなくても動かせてしまうところ。
しかし、一つ一つの動作をより深くす理解すると遊びの幅が広がります。
応用編に進むためには理解したいところです。
次回の「番外編 21」は【pulseIn関数 まとめ】です。
最後に
疑問点、質問などありましたら気軽にコメントください。
この電子部品の解説をしてほしい!などなどなんでもOKです。
リンク切れ、間違いなどあればコメントいただけると助かります。
Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。
Arduino入門編、Arduino入門編2で使用しているUNOはAmazonにて購入可能です。
Arduino入門編では互換品を使用。
Arduinoはオープンソース。
複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
学習用、遊び用、お試し用には安価な互換品がおすすめです。
ELEGOO UNO キット レベルアップ チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用
上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
Amazonでお得に買う方法
Amazonでお得に購入するならAmazon Mastercard、Amazonギフト券がおすすめです。
時期により異なりますが、様々なキャンペーンを実施しています。
\Amazonギフト券/
Amazonギフトカード キャンペーン
\Amazon Mastercard お申込み/
Amazon Mastercard 申し込み
いずれの場合もプライム会員である方がお得!!
\Amazon Prime 30日間の無料会員を試す/
無料会員登録
コメント
msb,lsbが混乱します。なぜ上下なのでしょうか、右左のほうがわかりやすいです。
また、シフトレジスタ側もどのビットとどのピンと対応しているのかもよくわかりません。データシートなどで調べたり実際動かせばわかることかもしれませんが、悩んでしまい先へ進めません。
文句ばかりですいません。
コメントありがとうございます。
隣のビットは桁上がりしたときに使わるビットなので上位、下位という表現でしょうか。
10進数でも同じで、9の次は10になって桁上がりしますよね、と思えば上位、下位もしっくりくるかも。
シフトレジスタは確かにわかりづらいかもしれません。
まずは、動かして遊んでみて、結果から理解する方が良いかもしれません。