GROVEベースシールド紹介!!(Arduino詳解)

詳しく解説!!Arduino-その5です。前回の記事はこちらです。


hirocom777.hatenadiary.org

GROVEベースシールドとスケッチ(Fade)

 今回は、Arduino Uno用GROVEシステムの中核であるGROVEベースシールドを前回のスケッチ(Fade)の解説も交えて説明していきます。

とりあえず動いたよね!!

 とりあえず動きましたね!今回は、外付けの部品を動かしましたよ!!この様に簡単にデバイスを繋げて動かすことができるのは、GROVEシステムの大きな特徴です。でも、具体的にはどう繋がっているのでしょうか?まずは、接続の詳細を見てみましょう。

GROVEベースシールドの接続

 GROVEベースシールドを見てみると、両脇にあるHeaderコネクタと16個の4ピンコネクタ(4ピンケーブルが繋がる白いコネクタ)が目に入ります。Headerコネクタは主にArduino UNOからの信号接続(中継)、4ピンコネクタはArduino UNOとデバイスの接続が主な役目です。ベースシールド上には以下のように表示がされています。

f:id:HiroCom777:20200327203719j:plain
4ピンコネクタには、信号1、信号2、電源、GNDが接続されています。GNDは、Arduino Unoを中心として構成された回路の基準電圧(0V)ですね。"D2"とか"D3"とか表示されているものがありますが、これは接続されているArduino Unoのピン番号を示します。"D2"はコネクタの信号1に2番ピンが接続されているという意味です。信号2には一つ上の番号のピンが接続されます。"D2"コネクタならば3番ピンです。気を付けなければいけないのは、"D2"コネクタの信号2と"D3"コネクタの信号1には、同じ3番ピンが接続されている→つまり、ショートしているということです。繋げるデバイスによって信号1しか使わないものと、信号1、2両方使うものとあります。両方使うデバイスの場合、隣のコネクタは使えなくなります。

今回使用したLEDモジュールは信号1(今回の場合Arduino UNOの3番ピン)だけ使用しています。(LEDモジュールの回路図はこちらです。)

他にも4ピンコネクタがあるのですが、別の機会に説明させていただきます。

スケッチ(Fade)

 それではスケッチの解説です。以下に改めてスケッチを載せますね。

int led = 3;
int brightness = 0;
int fadeAmount = 5;

void setup() {
  pinMode(led, OUTPUT);
}

void loop() {
  analogWrite(led, brightness);

  brightness = brightness + fadeAmount;

  if (brightness <= 0 || brightness >= 255) {
    fadeAmount = -fadeAmount;
  }
  delay(30);
}
setup-その前に

 setupとloop-Arduinoのスケッチはこの二つのブロックで構成されていますって、前回説明しましたよね。でも、今回はその前に何やら記述があります。これは、スケッチで使用する数値を記憶する場所を予め確保しているんです。いわゆる変数ってやつです。intは整数の数値を記憶することを意味しています。

スケッチの動き

 実際のスケッチの動きです。まずsetupですが前回とほとんど同じです。3番品(LEDモジュールが繋がっているピン)を出力に設定しています。次のloopですが、先頭に新しいコマンドがありますね。

・analogWrite
 analogWriteはArduinoのピンの出力状態(0〜255)を設定するコマンドです。以下のように記述します。

 analogWrite(ピン番号、出力状態(0〜255));

 前回紹介したdigitalWriteも出力状態を設定するコマンドでしたが。こちらは出力を0〜255の256段階で設定できます。
 変数brightnessは3番品の主力状態を指定するのに使っています。また、その直後ではbrightnessを変数fadeAmountで指定した分だけ増やしています。

・if文と判定式
 その後にあるのはif文です。指定した条件が満たされた時に処理を実行します。以下のように記述します。

 if (条件) {
  処理内容
 }

 では、ここで指定されている条件を確認します。brightness <= 0は、brightnessが0以下の時を指定します。brightness >= 255は、brightnessが255以上の時を指定します。間にある || はOR(または)です。つまり、brightnessが0以下か255以上の時・・・という条件ですね。この条件が成立したときにfadeAmountの極性を入れ替えています(+5なら-5、-5なら+5)>。最後の delay(30);は30ミリ秒の時間調整。最後まで行くとloopの先頭に戻るんでしたよね!!

整理すると、このスケッチのloopでは3番ピンの出力値を徐々に増やしていく処理をしているのです。そして、出力が255以上になったら増やす値をマイナスに変更しています(出力が0以下になったら増やす値をプライスに変更する)。こうして出力値が徐々に増減していくのでLEDはふぁーっとした感じで点いたり消えたりするんです。面白いでしょ!!

 それにしても analogWrite。0〜255まで変えられるって優れものです。でも本当のこと言うと、このピンもHIGHとLOWしか出力してないんです。

PWM(パルス幅変調)

 それは、PWM(パルス幅変調)って仕組みを使っているんです。PWMってどこかで見ませんでしたっけ・・・

f:id:HiroCom777:20200318215242j:plain
そう、Arduino UNOのこの部分にPWM~って書いてあります。0から13番ピンのうち3, 5, 6, 9, 10, 11番ピンの前には~が表示されていますよね。これらのピンにanalogWriteで出力すると一定の周波数でパルス信号を出力します(3, 9, 10, 11番ピンは490 Hz。5, 6番ピンは980 Hz)。HIGHとLOWを繰り返し出力するんですね。ただ、HIGHを出力する時間とLOWを出力する時間の比が変わるんです。

analogWriteで指定した出力状態によって以下の様に変わります。

出力状態-0  ⇒ HIGH-0 LOW-1
出力状態-127 ⇒ HIGH-0.5 LOW-0.5
出力状態-255 ⇒ HIGH-0 LOW-1

イメージ的にはパルスがこんな具合に変化する感じですね。
LOWの比が多い(出力状態0に近い)
f:id:HiroCom777:20200327221813j:plain
HIGH/LOW半々(出力状態127くらい)
f:id:HiroCom777:20200327221906j:plain
HIGHの比が多い(出力状態255に近い)
f:id:HiroCom777:20200327221745j:plain

analogWriteは接続したデバイスを細かく制御するときによく使いますので、覚えておきましょう!!
LEDの点灯制御が続きましたが、次は入力用デバイスのボタンモジュールを使ってみたいと思います。
hirocom777.hatenadiary.org


Arduino UNO入門の連載記事はコチラからどうぞ!!