Arduinoと戯れる!

Arduino 入門 番外編 22 【IOピン ポート・レジスタ まとめ】

arduino-extra-edition-22-00Arduino番外編
スポンサーリンク

Arduino 入門
番外編 22
【IOピン ポート・レジスタ まとめ】

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

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

 

本記事は、IOピンを高速かつ簡単に設定できるポート・レジスタについてです。

Arduinoのピン状態を設定するコマンドは「pinMode()」「digitalWrite()」「digitalRead()」。

管理人はスケッチ(コード)を描くのに慣れるまでは、上記で描くのが良いと考えています。

なぜなら、ポート・レジスタを使用することで

  • デバック、メンテナンスが難しくなる
  • 移植が難しくなる

などの問題があるからです。

入門者、初級者は使わない方が良いかもしれません。

 

しかし、ある程度スケッチ(コード)を描くのに慣れてきた場合、「pinMode()」「digitalWrite()」で一つ一つのPINを設定するのも煩雑に思えてくるもの。

また、色々遊んでいくうちに下記のような問題にぶつかるかもしれません。

  • 一つ一つ設定するため、同時にPINの状態を設定することがでない
  • コマンド処理に時間がかかる
補足(処理時間について)
普通に遊んでいる分には気にする必要ありません。
処理時間に関してはasm() を使うという手もありますが上級者向けです。

上記を解決するために、ポート・レジスタの使い方を覚えておくと便利です。

 

スケッチを簡略化、IOピンの処理を高速化一石二鳥のコマンドでとても便利です。

下記Lessonのスケッチで参考として使ってみました。

 

ポート・レジスタを通じて、ArduinoボードのIOピンを制御することで、高速かつ簡単に状態設定をすることができます。

 

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

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

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

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

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

 

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

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

 

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

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

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

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

 

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

 

スポンサーリンク

ポート・レジスタ 基本解説

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

Arduinoボードで使われているマイコンのポートは以下の3つ。

  • ポートB (デジタルピン8から13)
  • ポートC (アナログピン)
  • ポートD (デジタルピン0から7)

 

Arduino言語で定義されているポート制御レジスタは以下の3つ。

ポート制御レジスタ内容
方向レジスタ
DDRx
ピンのINPUT、OUTPを設定
x:B/C/D
データレジスタ
PORTx
ピンのHIGH、LOWを設定
x:B/C/D
入力レジスタ
PINx
INPUTピンの状態読み取り
x:B/C/D

※1 DDR、PORTレジスタ 読み書き両方が可能
※2 PINレジスタ     読み取り専用

■PIN番号(参考)

arduino-extra-edition-02

■補足
PORTB:デジタルピン 8~13(6、7は水晶発振器が接続されているので使用不可)
PORTC:アナログピン 0~5

 

PINのマッピングは公式で確認することができます。

 

ポート・レジスタ 設定方法

実際の使い方を解説していきます。

 

方向レジスタ DRDx

方向レジスタ(DRDx)の設定。

方向レジスタは、Arduino言語の「pinMode()」の代わりに使用できます。

 

■ポートD (デジタルピン0から7)の設定方法

Arduino言語のpinMode()と比較してみましょう。

/* ponMpde()使用にてピン方向を設定 */
pinMode(0, INPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
/* DDRDレジスタにてピン方向を設定 */
//BXXXXXXXX(MSB <--> LSB)
//0:INPUT 1:OUTPUT
DDRD = B11001110;

1行で描けちゃいます。

 

データレジスタ PORTx

データレジスタ(PORTx)の設定。

データレジスタは、Arduino言語の「digitalWrite()」の代わりに使用できます。

 

■ポートD (デジタルピン0から7)の設定方法

DDRxかpinMode()によってピンが出力を設定している前提で使います。

Output指定されたピンだけに5Vが発生します。

Arduino言語のdigitalWrite()と比較してみましょう。

/* digitalWrite()使用にてHIGH/LOWを設定 */
digitalWrite(0, LOW);
digitalWrite(1, LOW);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
/* PORTDレジスタにてHIGH/LOWを設定 */
//BXXXXXXXX(MSB <--> LSB)
//0:LOW 1:HIGH
PORTD = B11001100;

1行で描けちゃいます。

 

入力レジスタ PINx

入力レジスタ(PINx)の設定。

入力レジスタは、Arduino言語の「digitalRead()」の代わりに使用できます。

デジタル入力のピンを同時に読み取ることができます。

 

PINx」は使い方がわかりづらい。

高速化したいなどがなければ、通常は「digitalRead()」で良いと考えます。

補足
digitalRead()やdigitalWrite()は10行以上のコードで作られています。
直接ポートにアクセスすることによって時間短縮が可能。

 

■ポートD (デジタルピン0から7)の設定方法

Arduino言語のdigitalRead()と比較してみましょう。

/* digitalRead()使用にてピンの値を読み取り */
//デジタル入力ピン0~7の読み取り
val0 = digitalRead(0);
val1 = digitalRead(1);
val2 = digitalRead(2);
val3 = digitalRead(3);
val4 = digitalRead(4);
val5 = digitalRead(5);
val6 = digitalRead(6);
val7 = digitalRead(7);
/* PORTDレジスタにてピン方向を設定 */
//デジタル入力ピン0~7の読み取り
//BXXXXXXXX(MSB <--> LSB)
//1:読み取り
val0 = PIND & B00000001;
val1 = PIND & B00000010;
val2 = PIND & B00000100;
val3 = PIND & B00001000;
val4 = PIND & B00010000;
val5 = PIND & B00100000;
val6 = PIND & B01000000;
val7 = PIND & B10000000;

 

ちなみに、下記のように描くこともできます。

/* PORTDレジスタにてピン方向を設定 */
//デジタル入力ピン0~7の読み取り
//B00000001(MSB <--> LSB)
//1:読み取り
val0 = PIND & _BV(0);
val1 = PIND & _BV(1);
val2 = PIND & _BV(2);
val3 = PIND & _BV(3);
val4 = PIND & _BV(4);
val5 = PIND & _BV(5);
val6 = PIND & _BV(6);
val7 = PIND & _BV(7);

_BV():指定したビット数だけ1を左シフト

 

まとめ

Arduino 入門 番外編 22 【IOピン ポート・レジスタ まとめ】

 

pinMode()」「digitalWrite()」「digitalRead()」の基本関数をしっかりと理解したうえで「DRDx」「PORTx」「PINx」を使ってみるのも一つです。

特に高速化する必要ない場合は基本関数で十分です。

もし、ピンのON/OFFの高速化などが必要になった場合お試しください。

 

次回の「番外編 23」もArduinoの基本的なこと、スケッチのことを記事にしていきます。

 

最後に

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

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

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

 

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

 

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

互換品とは言え、Arduinoはオープンソース。

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

 

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

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

 

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

 

 

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

 

Amazonでお得に買う方法

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

現金でチャージするたびに、チャージ額に応じたポイントが付与されます。

最大2.5%!!!(Amazonプライム会員ならさらにお得)

チャージ額(一回分)一般プライム会員
5,000円~19,999円0.5%1.0%
2,0000円~39,999円1.0%1.5%
40,000円~89,999円1.5%2.0%
90,000円~2.0%2.5%

さらに、初回チャージで2000ポイントもらえるキャンペーンも実施中!
※いつもは1000ポイント、今なら2000ポイントです!

\Amazonギフト券 2000ポイントキャンペーン/
Amazonチャージ 初回購入で2000ポイントキャンペーン

 

補足情報
コンビニ・ATM・ネットバンクが対象
購入は1円単位で可能

コメント

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