Arduino Tutorial デジタル/アナログ入出力
IDEはインストール済みから
1.Lチカ
中華Arduio NanoをUSBポートに取り付ける。
Windowsキー+Xを押してから、Mを押してデバイスマネジャーを立ち上げる。
ポート(COMとLPT)の”>”をクリックして展開
USB-SERIAL CH340(COM9)
と表示されているか確認する。中華ではない純正のNanoだと表示が異なる。
COM9の数字9の部分は環境に依存する
IDEを開き、
ファイルースケッチ例ー01.Basics-Blinkの順で開く
次に、ツールーボードからNanoを指定する。その下のプロセッサもATmega328Pを選択する。(ここで中華を使っているとブートローダーが古いバージョンが焼き付けられている場合があってその時は、oldを選択する。やってみて動く方)
デバイスマネージャーで確認した番号のポートを選択
その後、
マイコンボードに書き込むボタンを押す。Ctrl+U でも同じでショートカットを覚えておくと今後楽です。いろいろメッセージが流れて、”avrdude done."とメッセージが出たら終了。オンボードのLEDが点灯しはじめるはず。
マイコンは、基本的に電源が入ると、初期設定をした後は、無限に同じ動作をするが基本的な構成になる。Arduinoでも他のマイコンでも基本的には同じ。
Arduinoの場合は、setupという関数の箇所で初期設定をして、loopの関数内で処理を繰り返す。
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
■pinMode
ピンをアウトプット(出力)とするのか?またはインプット(入力とするのか)といったことを設定する
マイコンのピンはデジタル信号を(電圧がHighかLowか)を出力するか、読み取るか?、アナログ値を読み取る(アナログデジタルコンバート)、アナログ出力をするか?の4つの機能にユーザ側で設定ができる。
と言っても多くのマイコンの場合は、アナログ出力はできず、PWMによる疑似的なアナログ出力になる。例えば、1.32Vという電圧をあるピンに入力して、その値をマイコンで読む場合は、アナログインプット。1.32Vという電圧を出力しようとしても、できずパルスで5Vと0V(5Vは3.3Vだったり使うものによりけり)を繰り返して平均的な電力供給が1.32Vになるように出力するだけ。
まず、LED_BUILTINというのは、Arduinoの決まり事でNanoやUnoの13ピンが割り当てられているのでこういう書き方になっている。
pinMode(13, OUTPUT);
本来はこのように記載する。実際にこの部分を置き換えて書き込みをしてみると、何とかわらない。
次にloopの中を見る。13ピンは出力に割り当てられているが、デジタルのHigh状態にしないさいという命令が、
digitalWrite(LED_BUILTIN, HIGH);
となる。Arduinoの場合は5VがHigh状態なのでこれで13ピンが5Vの電圧になる。digitalWrite(13, HIGH); と記述しても同じで、こちらの方が汎用的。
delay(1000);
は待ち(何もせず現状をキープ)の命令で1秒(1が1msecに相当)
digitalWrite(LED_BUILTIN, LOW);
で13ピンをLOW(つまりゼロ)にしてから1秒待つ、それをloopで繰り返す
という事になるから、1秒間隔でLEDが点灯したり消えたりする。
2か所あるdelay(1000);をdelay(500);に変更して書き込みしてみると点滅が早くなるのが確認できる。
Arduinoの場合は、ピンを完全に自由には指定できず用途が決まっている
Nano ピン配置 と検索すると出てくる。
D13(上の図で、右した)がLEDにつながっているので、D13のピンは5Vになったり0Vになってと周期的に切り替わっている事になる。
オンボードのLEDを点滅させたが、外にLEDを設置して同じ事をしてみる。
まず、ブレッドボードに回路を組む
D3のピンからジャンパーピンで抵抗、抵抗は上下の溝をまたぐようにして、LEDの足を同じ列に、その片方をGNDに。マイコンのGNDとブレッドボードのGNDもワイヤーでつなぐ。
抵抗は220Ωぐらいのものを赤色の時は使う。LEDは極性があり、足の長い方がプラス側なので、GNDには短い方を入れる。
先のソースを
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(3, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(3, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(3, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
とピンを13から3に変更して書き込みをする
外に構成してLEDが点灯する。
少しソースコードを改造する
// the loop function runs over and over again forever
void loop() {
digitalWrite(3, HIGH); // turn the LED on (HIGH is the voltage level)
// delay(1000); // wait for a second
// digitalWrite(3, LOW); // turn the LED off by making the voltage LOW
// delay(1000); // wait for a second
}
点滅させていたが、最後の3行をコメントアウトするか消す。
これで書き込みを行うと、LEDがずっと点灯する。
次にdigitalWrite(3, HIGH); // turn the LED on (HIGH is the voltage level)も
コメントアウトして
analogWrite(3, 10);
と変えて書き込みをする。LEDの明るさが暗くなるはず。PWMによって疑似的に電圧を下げた。10の数字が入っているところは、Arduinoの場合は、8ビットなので0から255までの256階調の変調ができる。またPWM出力が可能なピンは限られていて、デジタルピン3、5、6、9、10、11のみが可能。この中でも周期が2種類あって・・・となる割愛
void loop() {
for (int i = 0; i < 255; i++) {
analogWrite(3, i);
delay(5);
}
for (int i = 255; i > 0; i--) {
analogWrite(3, i);
delay(5);
}
}
と編集して書き込みをする。ArduinoIDEは基本C言語ベースなのでfor文なんかも使える。
蛍が光るように徐々にあかるくなり、徐々にくらくなりと点滅するはず。
次に、アナログの入力を組み込む。”電圧を読む”。
回路の手入れ
ポテンシャルメーターを使う。100kΩもポテンシャルメーター。
・3
1・ ・2
ポテンシャルメーターは3つの足からなっていて、1-2の間が指定された抵抗で3の端子に分圧された電圧が出力されて手で回すと、3の端子の電圧が変かする。
ブレッドボードにそのままささらないので、2の足を90度まげて半田で足を足している。
5V(Nanoの5Vの端子とブレッドボードの5Vを繋いである)ー端子1、抵抗を通って端子2、端子2とGNDを接続する。端子3をA0とシルク印刷のたる端子にジャンパで接続する。
違うスケッチを読み込む。スケッチ例、03. AnalogInput- AnalogInputを読み込み、少しコードをいじる。
LEDはD3ピンに接続しているので、13から3に変更する。
int sensorPin = A0; // select the input pin for the potentiometer
int ledPin = 3; // select the pin for the LED
int sensorValue = 0; // variable to store the value coming from the sensor
void setup() {
// declare the ledPin as an OUTPUT:
pinMode(ledPin, OUTPUT);
}
void loop() {
// read the value from the sensor:
sensorValue = analogRead(sensorPin);
// turn the ledPin on
digitalWrite(ledPin, HIGH);
// stop the program for <sensorValue> milliseconds:
delay(sensorValue);
// turn the ledPin off:
digitalWrite(ledPin, LOW);
// stop the program for for <sensorValue> milliseconds:
delay(sensorValue);
}
これをマイコンに書き込みする。ポテンシャルメーターをドライバーを使って回すと点滅間隔がかわる。
sensorValue = analogRead(sensorPin);
sensorPinの所でアナログで読み取りに使うピンを指定する。
A0からA7まで8個使える。sensorValue にはピンから読み取った値が整数で入ってくる。0から5ボルトの入力電圧を0から1023の数値に変換することができます。分解能は1単位あたり4.9mVになる。
delayにこの戻り値が入るので、ポテンシャルメーターの分圧が高い=大きい数字の時には点滅間隔が長くなり、電圧が小さい時は点滅間隔が早くなるコードになっている。
実際に読み取っている数値がどんな数値かをシリアル通信を使ってPCに表示する。
void setup() {
Serial.begin(9600);
// declare the ledPin as an OUTPUT:
pinMode(ledPin, OUTPUT);
}
setupに1行を足す。そして、
void loop() {
// read the value from the sensor:
sensorValue = analogRead(sensorPin);
Serial.println(sensorValue);
Serial.println()関数に戻り値をいれる。これを書き込みして結果をみる。
IDEのツールーシリアルモニタを開くと
今読み取っている値が0-1023(10ビット)で表示される。ポテンシャルメーターを回すとこの値も変わる事が確認できる。delayがこの値でかわるので、数字の大きいな時は更新が遅く、小さい時は更新が速い。
0-1023の整数で示されているが、実際の電圧に換算してみる。setupの上で変数が定義している所に、1行voltという変数をfloatで定義する。
int sensorValue = 0; // variable to store the value coming from the sensor
float volt;
そして、読み取った値sensorValueを電圧に変換する計算式を入れてシリアルに出力されるものをvoltへ変更する。
void loop() {
// read the value from the sensor:
sensorValue = analogRead(sensorPin);
volt = sensorValue * 5.0 / 1023.0;
Serial.println(volt);
これで同じように、シリアルモニタで表示すると分圧されている電圧として表示されるようになる。この電圧は正確な電圧ではない。USBの電源からとっていると若干低くて4.7Vとか4.8VとかでつなぐPCによって本来はばらつくのを5.0Vとして扱っている。より正確にArduinoで電圧を簡単に読みたい時は、https://funasover.blogspot.com/2021/02/arduino.html
を参考にされたい。
次に少し回路を改造する。
スイッチを設ける。押している間はLEDを点滅させずに消灯させるようにしてみる。
D2からスイッチの片方につないで、スイッチの他方はGNDに接続する。
スケッチの編集は以下
pinMode(2, INPUT_PULLUP);
pinMode(2, INPUT);←アウトプットではなくてインプットに設定する事で、返値がHIGHかLOWかになる。ここでINPUT_PULLUPというように宣言しているが、プルアップ。
プルアップはテストしてみるとよいが先人の方の解説に任せる。
https://burariweb.info/electronic-work/arduino-learning/digital-input-pullup-pulldown.html
loopの箇所は、if文でボタンが押されていなかれば・・・押していたら・・・と処理をする。プルアップなのでボタンが押されていない間はHIGH側につながっている。
void loop() {
int status ;
status = digitalRead(2) ;
if(status == HIGH){
// read the value from the sensor:
sensorValue = analogRead(sensorPin);
volt = sensorValue * 5.0 / 1023.0;
Serial.println(volt);
// turn the ledPin on
digitalWrite(ledPin, HIGH);
// stop the program for <sensorValue> milliseconds:
delay(sensorValue);
// turn the ledPin off:
digitalWrite(ledPin, LOW);
// stop the program for for <sensorValue> milliseconds:
delay(sensorValue);
}else{
digitalWrite(ledPin,LOW) ;
}
}
スケッチを書き込むと、ポテンシャルの値に応じて点滅スピードがかわる点はかわらないが、ボタンが押されている間は消灯する。
ここまでで、デジタル、アナログそれぞれの入出力(アナログ出力はPWM)すべての基本を試した事になる。
どんなマイコンでもまず最初に手にしたらGPIO(General Purpose Input Output)のピンでデジタル、アナログの入出力のやり方、プルアップ、プルダウンのやり方というの抑えるというのがはじめの一歩
コメント
コメントを投稿