Arduino 入門 番外編 20 【shiftOut関数 まとめ】

arduino-extra-edition-20-00 Arduino番外編
記事に広告(アフィリエイト広告)が含まれています。
スポンサーリンク

Arduino 入門
番外編 20
【shiftOut関数 まとめ】

こんにちは管理人のomoroyaです。

arduino 入門 番外編はarduinoの基本的なことを解説している記事です。

 

本記事は、Arduinoで使用するshiftOut関数についてです。

入門編では、8bitシフトレジスタの制御で使用した関数。

 

この関数も入門者には、わかりずらく理解しにくい・・・。

shiftOut関数は1byte分のデータを1bitずつシフトアウトする関数です。

 

関数の動作としては・・・

クロック出力ピンから8クロックが出力され、そのクロックに同期して8ビットのデータがシリアル方式で出力される動作となります。

 

どんなときに使うのか?

SPI接続のスレーブ機器の制御。

Lesson 20Lesson 21 で使用している「SN74HC595N」シリアルパラレル変換用のシフトレジスタの制御。

などに使用します。

 

本LessonではshiftOut関数の動作を理解するためにタイミングチャートを考えてみます。

Lesson 20Lesson 21 を遊ぶ上での一助になれば幸いです。

 

管理人はプログラマーの専門家というわけではありません。

気が向いたときにテキストを開き、ネットを調べ自己学習。

管理人にとってはブログ記事が自己学習のノートです。

書くことによって頭の中が整理できる。

何よりも、忘れたときに見返せるってのが良い。

 

arduino自身のこと、スケッチ(コード、プログラム)を少しづつ理解して行きましょう。

いやいや、arduinoを早速始めたいんだ!というかたは下記の入門編からお読みください。

 

Arduino入門編の解説にて使用しているArduinoは互換品です。

互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

正規品(Arduino UNO R3)の本体単品がほしい方はこちらとなります。

 

Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)

 

 

スポンサーリンク

shiftOut関数 基本解説

まずは基本的なことを復習。

繰り返しになりますが、「1byte分のデータを1bitずつシフトアウト」ための関数です。

1byte = 8bit になります。

(MSB)10000001(LSB) ← 2進数8bit
LSB:0bit目と表現
MSB:7bit目と表現

 

Wikipedia LSB
最下位ビット(さいかいビット、least significant bitLSBと略記)は、コンピュータにおいて二進数で最も小さな値を意味するビット位置のことである。LSBは右端ビットとも言われる。十進数に当てはめれば、「一の位」に相当する。

Wikipedia MSB
最上位ビット(さいじょういビット、most significant bitまたはhigh-order bitMSBと略記)は、コンピュータにおいて二進数で最も大きな値を意味するビット位置のことである。MSBは左端ビットとも言われる。

 

では、さっそく関数から確認。

shifutOut(dataPin, clockPin, bitOrder, value)
引数 説明
dataPin 各bitを出力するピン
clockPin クロックを出力するピン
dataPinに値がセットされた後、clockPinが1回反転
bitOrder LSBFIRST、MSBFIRSTを指定
LSBFIRST:最上位bitから送信
MSBFIRST:最下位bitから送信
value 送信したいデータ

 

shiftOut関数 タイミングチャート

shiftOut関数のタイミングチャートを考えてみます。

上が「LSBFIRST」、下が「MSBFIRST」のタイミングチャートになります。

arduino-extra-edition-20-01

 

タイミングチャートについて説明していきます。

■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で説明)

  1. shiftOut関数呼び出し
  2. dataPin」にshiftOut関数の引数であるvalueのbit0(LSB)が出力
  3. dataPin」にvalueのbit0が出力されている間に、「clockPin」がH→L
  4. dataPin」にvalueのbit1が出力され、その出力中に「clockPin」がH→L
  5. 同じ動作を8回繰り返す
  6. 最後のbit7はvalueの出力を維持したままで、shiftOut関数から戻る

※MSBFIRSTの場合はbit7から始まるだけで動作は同じです。

 

補足
1つのビットをdata信号に出力し続けている間に、clock信号がH→Lとなるため立ち上がりエッジでも立下りエッジでもデータを取得可能。
※接続先相手である電子部品の仕様による
注意
clock信号がHの状態でshiftOut関数が呼び出されると、bit0を出力している間にclock信号の立ち上がりエッジがないことになります。
そのため、データを受信する電子部品がclock信号の立ち上がりでエッジでdataを取り込む仕様の場合、dataを1ビット取りこぼすことに・・・。

 

次に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」は立ち上がりエッジでデータを取り込む仕様。

上記を踏まえたうえで確認ください。

arduino-extra-edition-20-02

 

タイミングチャートにあらわすと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関数 まとめ】です。

Arduino 入門 番外編 21 【pulseIn関数 まとめ】
本記事は、Arduinoで使用するpulseIn関数についてです。pulseIn関数はパルス幅を測定する関数。pinに入力されるパルス幅を測定できます。パルスはHighでもLowでもどちらでも測定可能。HighとLowのパルス幅を測定できる…

 

最後に

疑問点、質問などありましたら気軽にコメントください。

この電子部品の解説をしてほしい!などなどなんでもOKです。

リンク切れ、間違いなどあればコメントいただけると助かります。

 

Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。

 

Arduino入門編Arduino入門編2で使用しているUNOはAmazonにて購入可能です。

Arduino入門編では互換品を使用。

Arduinoはオープンソース。

複製して販売するのもライセンス的に問題なし。

 

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

学習用、遊び用、お試し用には安価な互換品がおすすめです。

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

 

Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)

 

Amazonでお得に買う方法

Amazonでお得に購入するならAmazon MastercardAmazonギフト券がおすすめです。

時期により異なりますが、様々なキャンペーンを実施しています。

\Amazonギフト券/
Amazonギフトカード キャンペーン

Amazon Mastercard お申込み
Amazon Mastercard 申し込み 

 

いずれの場合もプライム会員である方がお得!!

\Amazon Prime 30日間の無料会員を試す/
無料会員登録 

 

 

コメント

  1. 匿名 より:

    msb,lsbが混乱します。なぜ上下なのでしょうか、右左のほうがわかりやすいです。
    また、シフトレジスタ側もどのビットとどのピンと対応しているのかもよくわかりません。データシートなどで調べたり実際動かせばわかることかもしれませんが、悩んでしまい先へ進めません。
    文句ばかりですいません。

    • omoroya omoroya より:

      コメントありがとうございます。
      隣のビットは桁上がりしたときに使わるビットなので上位、下位という表現でしょうか。
      10進数でも同じで、9の次は10になって桁上がりしますよね、と思えば上位、下位もしっくりくるかも。
      シフトレジスタは確かにわかりづらいかもしれません。
      まずは、動かして遊んでみて、結果から理解する方が良いかもしれません。

タイトルとURLをコピーしました