「Arduinoの基礎」の版間の差分
(2人の利用者による、間の16版が非表示) | |||
4行目: | 4行目: | ||
変数の初期化や、ピンモードの設定、ライブラリの初期化などを行うのに適している。<br> | 変数の初期化や、ピンモードの設定、ライブラリの初期化などを行うのに適している。<br> | ||
loop()関数は、setup()関数が呼ばれた後に繰り返し呼び出される。<br> | loop()関数は、setup()関数が呼ばれた後に繰り返し呼び出される。<br> | ||
<br><br> | |||
== 仕様一覧 == | |||
==== Arduino UNO R3 ==== | |||
下表に、Arduino UNO R3の仕様を示す。<br> | |||
<center> | |||
{| class="wikitable" style="background-color:#fefefe;" | |||
|+ Arduino UNO R3の仕様 | |||
|- | |||
! style="background-color:#66CCFF;" | 項目 | |||
! style="background-color:#66CCFF;" | 仕様 | |||
|- | |||
| マイコン || ATmega 328P | |||
|- | |||
| 動作電圧 || 5[V] | |||
|- | |||
| 入力電圧<br>DCジャック または Vin端子 || 推奨値 : 7~12[V]<br>限界値 : 6~20[V] | |||
|- | |||
| アナログ入力ピン || 6本 | |||
|- | |||
| デジタルI/Oピン || 14本 | |||
|- | |||
| DC出力電流 I/O || 20[mA] / IOピン(1つのI/Oピン当たり)<br>合計 Max : 100[mA]<br>※注意 : 1ピンあたり40[mA]以上で損傷 | |||
|- | |||
| DC出力電流 3.3[V]出力ピン || 50[mA] | |||
|- | |||
| ADC || 10bit | |||
|- | |||
| DAC || 無し | |||
|- | |||
| Flashメモリ || 32[KB] | |||
|- | |||
| SRAM || 2[KB] | |||
|- | |||
| EEPROM || 1[KB] | |||
|- | |||
| クロック || 16[MHz] | |||
|} | |||
</center> | |||
<br> | |||
==== Arduino UNO R4 ==== | |||
Arduino UNO R3との主な違いはマイコン、メモリ容量、クロック周波数等である。<br> | |||
また、Arduino UNO R4では、ペリフェラルにDAC機能、Wi-Fi機能、Bluetooth機能が追加されている。<br> | |||
<br> | |||
<center> | |||
{| class="wikitable" | style="background-color:#fefefe;" | |||
! style="background-color:#66CCFF;" | 項目 | |||
! style="background-color:#66CCFF;" | 仕様 | |||
|- | |||
| マイコン || RA4M1 (Renesas) | |||
|- | |||
| 動作電圧 || 5[V] | |||
|- | |||
| 入力電圧<br>DCジャック または Vin端子 || 推奨値:7~12[V]<br>限界値:6~24[V] | |||
|- | |||
| アナログ入力ピン || 6本 | |||
|- | |||
| デジタルI/Oピン || 14本 | |||
|- | |||
| DC出力電流 I/O || 8[mA] / IOピン(1つのI/Oピン当たり)<br>合計 Max:100[mA]<br><br><u>※注意</u><br><u>仕様を超える電流で損傷の可能性あり</u> | |||
|- | |||
| DC出力電流 3.3[V]出力ピン || 50[mA] | |||
|- | |||
| ADC || 14bit | |||
|- | |||
| DAC || 12bit | |||
|- | |||
| Wi-Fi || Arduino UNO R4 WiFiのみ | |||
|- | |||
| Bluetooth || Arduino UNO R4 WiFiのみ | |||
|- | |||
| Flashメモリ || 256[KB] | |||
|- | |||
| SRAM || 32[KB] | |||
|- | |||
| データメモリ || 8[KB] | |||
|- | |||
| クロック || 48[MHz] | |||
|} | |||
</center> | |||
<br><br> | |||
== Arduinoの電源供給 == | |||
Arduinoの電源供給は、USB端子と外部電源の2通りの給電方式がある。<br> | |||
USB端子と外部電源は以下に示す供給能力が推奨される。<br> | |||
<br> | |||
<center> | |||
{| class="wikitable" style="background-color:#fefefe;" | |||
|+ Arduino UNO R3の電源仕様 | |||
|- | |||
! style="background-color:#66CCFF;" | | |||
! style="background-color:#66CCFF;" | 電圧[V] | |||
! style="background-color:#66CCFF;" | 電流[A] | |||
|- | |||
| USB電源 || 5[V] || 約0.5〜0.9[A] | |||
|- | |||
| 外部電源(DCジャック) || 7〜12[V]<br>※注意 || 約1[A] | |||
|- | |||
| 外部電源(V<sub>IN</sub>) || 7〜12[V]<br>※注意 || 約1[A] | |||
|} | |||
</center> | |||
<br> | |||
Arduino UNO R4の基本的な電源仕様はR3と同様である。<br> | |||
USB電源は5V、最大900[mA]、外部電源 (DCジャック、VIN) は推奨7〜12[V]、約1[A]までとなる。<br> | |||
<br> | |||
外部電源の電圧は、推奨値7~12[V]、絶対最大定格は6~24[V]を守る必要がある。<br> | |||
<br> | |||
<center> | |||
{| class="wikitable" | style="background-color:#fefefe;" | |||
|+ Arduino UNO R4の電源仕様 | |||
! style="background-color:#66CCFF;" | 項目 | |||
! style="background-color:#66CCFF;" | 電圧[V] | |||
! style="background-color:#66CCFF;" | 電流[A] | |||
|- | |||
| USB電源 || 5[V] || 約0.5~0.9[A] | |||
|- | |||
| 外部電源(DCジャック) || 7~12[V]<br>※注意 || 約1[A] | |||
|- | |||
| 外部電源(VIN) || 7~12[V]<br>※注意 || 約1[A] | |||
|} | |||
</center> | |||
<br> | |||
<u>※注意</u><br> | |||
<u>Arduinoの開発元では、入力電圧の限界値を6〜20[V] (R4では、6〜24[V]) と表示している。</u><br> | |||
<u>ただし、実装部品が耐圧20[V]以下の部品が実装されている場合があるため、7〜12[V]の推奨値の範囲で使用することを推奨する。</u><br> | |||
<br><br> | <br><br> | ||
15行目: | 141行目: | ||
== LEDの点滅(ArduinoのHello World)のサンプルコード == | == LEDの点滅(ArduinoのHello World)のサンプルコード == | ||
次に示すのは、LEDを点滅させるサンプルコードである。<br> | 次に示すのは、LEDを点滅させるサンプルコードである。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
const int LED_PIN = 13; | const int LED_PIN = 13; | ||
30行目: | 156行目: | ||
delay( 1000 ); | delay( 1000 ); | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
37行目: | 163行目: | ||
Arduino Uno等の動作電圧が5[V]のボードでは、0[V] - 5[V]までの電圧は、0 - 1023までの整数に対応付けられる。<br> | Arduino Uno等の動作電圧が5[V]のボードでは、0[V] - 5[V]までの電圧は、0 - 1023までの整数に対応付けられる。<br> | ||
<br> | <br> | ||
Arduino | Arduino IDEでは、<code>analogRead</code>関数を用いることで、指定したアナログピンから値を読むことができる。<br> | ||
analogRead() | <code>analogRead</code>関数は読み取った値を、0 - 1023までの整数値で返す。<br> | ||
<br> | |||
<math>\mbox{analogRead 関 数 の 戻 り 値 } = \frac{\mbox{ セ ン サ 電 圧 [V]}}{\mbox{ 参 照 電 圧 [V]}} \times (2^{N} - 1) \qquad \therefore \mbox{ N は 、 N ビ ッ ト の AD コ ン バ ー タ }</math><br> | |||
<br> | |||
したがって、<code>analogRead</code>関数の戻り値をセンサ電圧に対応する場合は、以下の計算式を使用することにより、センサ電圧が分かる。<br> | |||
<br> | |||
<math>\mbox{ セ ン サ 電 圧 [V]} = \frac{\mbox{analogRead 関 数 の 戻 り 値 }}{(2^{N} - 1)} \times \mbox{ 参 照 電 圧 [V]} \qquad \therefore \mbox{ N は 、 N ビ ッ ト の AD コ ン バ ー タ }</math><br> | |||
<br> | <br> | ||
なお、標準では、<code>analogRead</code>関数の戻り値である0 - 1023が、0[V] - 5[V] (Arduino Gemmaのような3.3[V]の動作電圧の場合は0[V] - 3.3[V]) に対応付けられているが、<br> | |||
<code>analogReference</code>関数を使用してこの範囲を変更することは可能である。<br> | |||
ただし、設定可能な値は、各ボードに依存するため注意が必要である。<br> | |||
<br> | <br> | ||
<center>'''図.1 電圧を測定する回路図'''</center><br> | <center>'''図.1 電圧を測定する回路図'''</center><br> | ||
53行目: | 185行目: | ||
[[ファイル:Arduino AnalogRead 02.png|フレームなし|中央]] | [[ファイル:Arduino AnalogRead 02.png|フレームなし|中央]] | ||
<br> | <br> | ||
< | <syntaxhighlight lang="c++"> | ||
const int PIN_ANALOG_INPUT = 5; | const int PIN_ANALOG_INPUT = 5; | ||
68行目: | 200行目: | ||
delay(1000); | delay(1000); | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
81行目: | 213行目: | ||
また、attachInterruptの引数にはピンの番号ではなく、割込み番号を指定することに注意すること。<br> | また、attachInterruptの引数にはピンの番号ではなく、割込み番号を指定することに注意すること。<br> | ||
ピン番号から割込み番号の解決には、digitalPinToInterruptを使用する。<br> | ピン番号から割込み番号の解決には、digitalPinToInterruptを使用する。<br> | ||
attachInterruptで指定した関数には幾つかの制約があるので、次の点に注意する。<br> | |||
* delay関数は機能しない。 | |||
* millis関数の戻り値が増加しない。 | |||
* シリアル通信により受信したデータは、失われる可能性がある。 | |||
* 割り当てた関数のなかで値が変化する変数にはvolatileをつけて宣言する必要がある。 | |||
<br> | <br> | ||
次のサンプルコードでは、toggle_ledという名前のISRを、D2ピンでの割込み処理に指定している。<br> | 次のサンプルコードでは、toggle_ledという名前のISRを、D2ピンでの割込み処理に指定している。<br> | ||
86行目: | 223行目: | ||
ISRでLEDが接続されたピンの状態を表す変数をLOWまたはHIGHに変化させている。<br> | ISRでLEDが接続されたピンの状態を表す変数をLOWまたはHIGHに変化させている。<br> | ||
そして、loop()関数でその変数をdigitalWrite()関数に渡している。<br> | そして、loop()関数でその変数をdigitalWrite()関数に渡している。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
const byte PIN_LED = 10; | const byte PIN_LED = 10; | ||
const byte PIN_INTERRUPT = 2; | const byte PIN_INTERRUPT = 2; | ||
108行目: | 245行目: | ||
state != state; | state != state; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
152行目: | 289行目: | ||
Arduinoの3番ピンにて2[V]を出力している。<br> | Arduinoの3番ピンにて2[V]を出力している。<br> | ||
<br> | <br> | ||
< | <syntaxhighlight lang="c++"> | ||
const int PIN_PWM = 3; | const int PIN_PWM = 3; | ||
const float V_OUT = 2; | const float V_OUT = 2; | ||
166行目: | 303行目: | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
== ファームウェアの復元 == | |||
==== Arudino UNO R4 WiFi ==== | |||
Arduino UNO R4 WiFiにはUSB-シリアル通信を処理するESP32-S3チップが搭載されている。<br> | |||
このチップのファームウェアは、Arduino IDEまたはArduino Cloudを使用してアップグレードできるが、アップグレード後のファームウェアが正常に動作しない場合がある。<br> | |||
<br> | |||
この時、espflashツールを使用してファームウェアを復元することができる。<br> | |||
<br> | |||
これは、以下に示すような症状が起きている場合に有効である。<br> | |||
* Arudino UNO R4 WiFiが、Arduino IDEまたはArduino Cloudの[ボード情報の取得]を選択すると、汎用のESP32ボード (例: ESP32-S3-Box) として検出される。 | |||
*: [[ファイル:Arduino UNO R4 ESP32 Error.png|フレームなし]] | |||
* Arudino UNO R4 WiFiが、Arduino IDEまたはArduino Cloudの[ボード情報の取得]を選択すると、データUSBケーブルでコンピュータに接続されているにもかかわらず、どのボードとしても検出されない。 | |||
<br> | |||
# まず、下図のように、Arduino UNO R4 WiFiにある6ピンヘッダのGNDピンとDownloadピンを短絡 (ショート) させる必要がある。<br> | |||
#: [[ファイル:Arduino UNO R4 ESP32 Data Pins.png|フレームなし|中央]] | |||
# Arduino UNO R4 WiFiと不要なUSBデバイスをPCから外す。 | |||
# Arduino UNO R4 WiFi上で、USB type Cコネクタの隣にある6ピンヘッダのGNDピンとDownloadピンを探す。 | |||
#: <br> | |||
# GNDピンとDownloadピンを短絡させる。<br>これは、2つのピンの間にメス-メス ジャンパワイヤを使用して接続することを推奨する。 | |||
# メス-メス ジャンパワイヤが持っていない場合は、先の尖った導電性の物体 (オス-オス ジャンパワイヤの一端等) を使用して、両方のピンに接触するように配置することもできる。 | |||
# 短絡させた状態で、Arduino UNO R4 WiFiをPCに接続する。 | |||
# 新しいデバイスが接続されたというメッセージが表示される場合は、接続を許可する。 | |||
<br> | |||
次に、[https://github.com/arduino/uno-r4-wifi-usb-bridge/releases espflashツールのGithub]にアクセスして、espflashツールをダウンロードする。<br> | |||
ダウンロードしたファイルを解凍する。<br> | |||
unzip unor4wifi-update-linux.zip | |||
cd unor4wifi-update-linux | |||
<br> | |||
espflashツールを実行してファームウェアを復元する。<br> | |||
./bin/espflash write-bin -b 115200 0x0 firmware/UNOR4-WIFI-S3-*.bin | |||
<br> | |||
復元前において、以下に示すようなプロンプトが表示される。<br> | |||
この時、キーボードの[N]キーを押下する。<br> | |||
? Remember this serial port for future use? (y/n) > | |||
訳: 今後の使用のために、このシリアルポートを記憶しておきますか? (y/n) | |||
<br> | |||
ファームウェアの復元に成功した後、Arudino UNO R4 WiFiをPCから外す。<br> | |||
次に、GNDピンとDownloadピンのジャンパワイヤ (短絡用) を外す。<br> | |||
<br> | |||
Arudino UNO R4 WiFiをPCに再度接続する。<br> | |||
Arduino IDE等から[ボード情報の取得]を選択して、"Arudino UNO R4 WiFi"と表示されているかどうかを確認する。<br> | |||
<br> | |||
<u>※注意</u><br> | |||
<u>Linux上でespflashツールを実行する時、以下に示すようなエラーが出力される場合がある。</u><br> | |||
<u>これは、システムにインストールされているGLIBCのバージョンが古いためである。</u><br> | |||
./bin/espflash: /lib64/libc.so.6: version `GLIBC_2.33' not found (required by ./bin/espflash) | |||
./bin/espflash: /lib64/libc.so.6: version `GLIBC_2.32' not found (required by ./bin/espflash) | |||
./bin/espflash: /lib64/libc.so.6: version `GLIBC_2.34' not found (required by ./bin/espflash) | |||
<br> | |||
この時、[[インストール - GLIBC]]のページを参照して、エラーで出力されているバージョン以降のGLIBCを別途インストールする。<br> | |||
インストールしたGLIBCをラッピングして、espflashツールを実行する。<br> | |||
# 別途インストールしたGLIBCをラッピングして、espflashツールを実行する場合 | |||
export GLIBC_DIR="<GLIBCのインストールディレクトリ>" | |||
$GLIBC_DIR/lib/ld-linux-x86-64.so.2 \ | |||
--library-path $GLIBC_DIR/lib64:$GLIBC_DIR/lib:/usr/lib64:/usr/lib:/lib64:/lib \ | |||
./bin/espflash write-bin -b 115200 0x0 firmware/UNOR4-WIFI-S3-*.bin | |||
<br><br> | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:Arduino]] | [[カテゴリ:Arduino]] |
2024年12月20日 (金) 04:32時点における最新版
概要
Arduinoのスケッチには、setup()関数とloop()関数が存在する。
setup()関数はスケッチの実行開始時(電源を投入した直後)、またはボードのリセット後に1度だけ呼ばれる。
変数の初期化や、ピンモードの設定、ライブラリの初期化などを行うのに適している。
loop()関数は、setup()関数が呼ばれた後に繰り返し呼び出される。
仕様一覧
Arduino UNO R3
下表に、Arduino UNO R3の仕様を示す。
項目 | 仕様 |
---|---|
マイコン | ATmega 328P |
動作電圧 | 5[V] |
入力電圧 DCジャック または Vin端子 |
推奨値 : 7~12[V] 限界値 : 6~20[V] |
アナログ入力ピン | 6本 |
デジタルI/Oピン | 14本 |
DC出力電流 I/O | 20[mA] / IOピン(1つのI/Oピン当たり) 合計 Max : 100[mA] ※注意 : 1ピンあたり40[mA]以上で損傷 |
DC出力電流 3.3[V]出力ピン | 50[mA] |
ADC | 10bit |
DAC | 無し |
Flashメモリ | 32[KB] |
SRAM | 2[KB] |
EEPROM | 1[KB] |
クロック | 16[MHz] |
Arduino UNO R4
Arduino UNO R3との主な違いはマイコン、メモリ容量、クロック周波数等である。
また、Arduino UNO R4では、ペリフェラルにDAC機能、Wi-Fi機能、Bluetooth機能が追加されている。
項目 | 仕様 |
---|---|
マイコン | RA4M1 (Renesas) |
動作電圧 | 5[V] |
入力電圧 DCジャック または Vin端子 |
推奨値:7~12[V] 限界値:6~24[V] |
アナログ入力ピン | 6本 |
デジタルI/Oピン | 14本 |
DC出力電流 I/O | 8[mA] / IOピン(1つのI/Oピン当たり) 合計 Max:100[mA] ※注意 仕様を超える電流で損傷の可能性あり |
DC出力電流 3.3[V]出力ピン | 50[mA] |
ADC | 14bit |
DAC | 12bit |
Wi-Fi | Arduino UNO R4 WiFiのみ |
Bluetooth | Arduino UNO R4 WiFiのみ |
Flashメモリ | 256[KB] |
SRAM | 32[KB] |
データメモリ | 8[KB] |
クロック | 48[MHz] |
Arduinoの電源供給
Arduinoの電源供給は、USB端子と外部電源の2通りの給電方式がある。
USB端子と外部電源は以下に示す供給能力が推奨される。
電圧[V] | 電流[A] | |
---|---|---|
USB電源 | 5[V] | 約0.5〜0.9[A] |
外部電源(DCジャック) | 7〜12[V] ※注意 |
約1[A] |
外部電源(VIN) | 7〜12[V] ※注意 |
約1[A] |
Arduino UNO R4の基本的な電源仕様はR3と同様である。
USB電源は5V、最大900[mA]、外部電源 (DCジャック、VIN) は推奨7〜12[V]、約1[A]までとなる。
外部電源の電圧は、推奨値7~12[V]、絶対最大定格は6~24[V]を守る必要がある。
項目 | 電圧[V] | 電流[A] |
---|---|---|
USB電源 | 5[V] | 約0.5~0.9[A] |
外部電源(DCジャック) | 7~12[V] ※注意 |
約1[A] |
外部電源(VIN) | 7~12[V] ※注意 |
約1[A] |
※注意
Arduinoの開発元では、入力電圧の限界値を6〜20[V] (R4では、6〜24[V]) と表示している。
ただし、実装部品が耐圧20[V]以下の部品が実装されている場合があるため、7〜12[V]の推奨値の範囲で使用することを推奨する。
スケッチのダウンロード
まず、スケッチをコンパイルする。
次に、Arduino IDEの[ツール]メニューバー - [ボード]メニューでArduinoボードを選択する。
更に、Arduino IDEの[ツール]メニューバー - [ポート]メニューでCOMポートを選択する。
最後に、[マイコンボードに書き込む]ボタンを押下して、コンパイルしたスケッチをダウンロードする。
LEDの点滅(ArduinoのHello World)のサンプルコード
次に示すのは、LEDを点滅させるサンプルコードである。
const int LED_PIN = 13;
void setup()
{
pinMode(LED_PIN, OUTPUT);
}
void loop()
{
digitalWrite(LED_PIN, HIGH);
delay(1000);
digitalWrite(LED_PIN, LOW);
delay( 1000 );
}
Arduinoで電圧を測定する(アナログ入力を読み取る)
Arduinoボードは、A0 - A5までの6チャネルの10ビットのADCを持っている。
Arduino Uno等の動作電圧が5[V]のボードでは、0[V] - 5[V]までの電圧は、0 - 1023までの整数に対応付けられる。
Arduino IDEでは、analogRead
関数を用いることで、指定したアナログピンから値を読むことができる。
analogRead
関数は読み取った値を、0 - 1023までの整数値で返す。
したがって、analogRead
関数の戻り値をセンサ電圧に対応する場合は、以下の計算式を使用することにより、センサ電圧が分かる。
なお、標準では、analogRead
関数の戻り値である0 - 1023が、0[V] - 5[V] (Arduino Gemmaのような3.3[V]の動作電圧の場合は0[V] - 3.3[V]) に対応付けられているが、
analogReference
関数を使用してこの範囲を変更することは可能である。
ただし、設定可能な値は、各ボードに依存するため注意が必要である。
次に記述するのは、電圧を読み取った結果をシリアルモニタに出力するサンプルコードである。
これによって 1秒毎にシリアルモニタに電圧が表示される。
const int PIN_ANALOG_INPUT = 5;
void setup()
{
Serial.begin(9600);
}
void loop()
{
int iVoltage = analogRead(PIN_ANALOG_INPUT);
float fVoltage = iVoltage * 5.0 / 1023.0;
Serial.println(fVoltage);
delay(1000);
}
割り込みとISR
Arduinoのスケッチでのハードウェア割込み(hardware interrupt)の利用方法について記載する。
Arduino Unoでは、2個のピン(D2, D3)が割込みに利用できる。D2は割込み番号が0、D3は割り込み番号が1である。
Arduino Mega2560では、6個(D2, D3, D18, D19, D20, D21)が使用できる。割込み番号は順に0, 1, 5, 4, 3, 2が設定されている。
割込みサービスルーチン(ISR, interrupt service routine)は、引数および戻り値が無いvoidの関数が割り当てられる。
attachInterrupt(割込み番号, 関数名, モード)でISRをセットする。
また、attachInterruptの引数にはピンの番号ではなく、割込み番号を指定することに注意すること。
ピン番号から割込み番号の解決には、digitalPinToInterruptを使用する。
attachInterruptで指定した関数には幾つかの制約があるので、次の点に注意する。
- delay関数は機能しない。
- millis関数の戻り値が増加しない。
- シリアル通信により受信したデータは、失われる可能性がある。
- 割り当てた関数のなかで値が変化する変数にはvolatileをつけて宣言する必要がある。
次のサンプルコードでは、toggle_ledという名前のISRを、D2ピンでの割込み処理に指定している。
モードのFALLINGはHIGHからLOWの状態へ遷移したことで割込みを発生させることを意味する。
ISRでLEDが接続されたピンの状態を表す変数をLOWまたはHIGHに変化させている。
そして、loop()関数でその変数をdigitalWrite()関数に渡している。
const byte PIN_LED = 10;
const byte PIN_INTERRUPT = 2;
volatile byte state = LOW;
void setup()
{
pinMode(PIN_LED, OUTPUT);
digitalWrite(PIN_LED, state);
attachInterrupt(digitalPinToInterrupt(PIN_INTERRUPT), toggle_led, FALLING);
}
void loop()
{
digitalWrite(PIN_LED, state);
}
void toggle_led()
{
state != state;
}
ArduinoでPWM制御
Arduinoでは、PWMによるアナログ出力(任意の出力値)をサポートしている。
デジタル信号としてHIGH(3.3[V]または5[V])とLOW(0[V])だけでなく、2[V]等の中間の値も出力できる。
これにより、LEDの調光制御を行うことができる。
PWMとは
PWM(Pulse Width Modulation)とは、電圧を制御する方法の1つである。
出力のオンとオフを行うことで、 パルス幅に比例した電圧を得ることができる。
例えば、下図のように信号の基本周期の間で、25[%]の時間だけ出力をオンにすることにより、
平均で電圧の25[%]の電圧(5[V] * 25[%] = 1.25[V])を得ることができる。
尚、この場合はオン時間をデューティーサイクル (Duty Cycle) といい、最大電圧に対する出力電圧の割合になる。
ArduinoのPWM出力
Arduino Unoでは、デジタル出力ピンの3, 5, 6, 9, 10, 11番の6個のピンがPWM制御に利用できる。
ピン番号の前に ~記号が付記されており、PWM制御が利用可能であることがわかる。
基本的に、ArduinoのPWMの周波数は約490[Hz]だが、Arduino Unoでは5番と6番ピンは980[Hz]である。
周波数が2倍ということは、波長が半分ということである。しかしながら、デューティーサイクルが同じであれば出力電圧は同じである。
analogWrite関数の使い方
Arduinoでは、PWM出力にはanalogWrite関数を使用する。
analogWrite関数の引数は、第1引数にピン番号、第2引数にデューティーサイクルを渡す。
デューティーサイクルは、パーセント表示ではなく、0(0%)から255(100%)の値をとる。
したがって、5[V]の動作電圧の時には、255 / 5 = 51より電圧 * 51として、更に整数に丸めた値をanalogWrite関数の第2引数に渡す。
analogWrite関数を1度呼ぶと、同じピンに対してanalogWrite関数、digitalWrite関数、digitalRead関数を呼ぶまで、一定のPWM波を出力する。
analogWrite関数を呼ぶためにpinModeを事前に呼ぶ必要は無い。
PWM出力のサンプルコード
次に、analogWrite関数によるPWM出力のサンプルコードを記述する。
Arduinoの3番ピンにて2[V]を出力している。
const int PIN_PWM = 3;
const float V_OUT = 2;
void setup()
{
int i = (int)V_OUT * 51;
analogWrite(PIN_PWM, i);
}
void loop()
{
}
ファームウェアの復元
Arudino UNO R4 WiFi
Arduino UNO R4 WiFiにはUSB-シリアル通信を処理するESP32-S3チップが搭載されている。
このチップのファームウェアは、Arduino IDEまたはArduino Cloudを使用してアップグレードできるが、アップグレード後のファームウェアが正常に動作しない場合がある。
この時、espflashツールを使用してファームウェアを復元することができる。
これは、以下に示すような症状が起きている場合に有効である。
- Arudino UNO R4 WiFiが、Arduino IDEまたはArduino Cloudの[ボード情報の取得]を選択すると、汎用のESP32ボード (例: ESP32-S3-Box) として検出される。
- Arudino UNO R4 WiFiが、Arduino IDEまたはArduino Cloudの[ボード情報の取得]を選択すると、データUSBケーブルでコンピュータに接続されているにもかかわらず、どのボードとしても検出されない。
- まず、下図のように、Arduino UNO R4 WiFiにある6ピンヘッダのGNDピンとDownloadピンを短絡 (ショート) させる必要がある。
- Arduino UNO R4 WiFiと不要なUSBデバイスをPCから外す。
- Arduino UNO R4 WiFi上で、USB type Cコネクタの隣にある6ピンヘッダのGNDピンとDownloadピンを探す。
- GNDピンとDownloadピンを短絡させる。
これは、2つのピンの間にメス-メス ジャンパワイヤを使用して接続することを推奨する。 - メス-メス ジャンパワイヤが持っていない場合は、先の尖った導電性の物体 (オス-オス ジャンパワイヤの一端等) を使用して、両方のピンに接触するように配置することもできる。
- 短絡させた状態で、Arduino UNO R4 WiFiをPCに接続する。
- 新しいデバイスが接続されたというメッセージが表示される場合は、接続を許可する。
次に、espflashツールのGithubにアクセスして、espflashツールをダウンロードする。
ダウンロードしたファイルを解凍する。
unzip unor4wifi-update-linux.zip cd unor4wifi-update-linux
espflashツールを実行してファームウェアを復元する。
./bin/espflash write-bin -b 115200 0x0 firmware/UNOR4-WIFI-S3-*.bin
復元前において、以下に示すようなプロンプトが表示される。
この時、キーボードの[N]キーを押下する。
? Remember this serial port for future use? (y/n) > 訳: 今後の使用のために、このシリアルポートを記憶しておきますか? (y/n)
ファームウェアの復元に成功した後、Arudino UNO R4 WiFiをPCから外す。
次に、GNDピンとDownloadピンのジャンパワイヤ (短絡用) を外す。
Arudino UNO R4 WiFiをPCに再度接続する。
Arduino IDE等から[ボード情報の取得]を選択して、"Arudino UNO R4 WiFi"と表示されているかどうかを確認する。
※注意
Linux上でespflashツールを実行する時、以下に示すようなエラーが出力される場合がある。
これは、システムにインストールされているGLIBCのバージョンが古いためである。
./bin/espflash: /lib64/libc.so.6: version `GLIBC_2.33' not found (required by ./bin/espflash) ./bin/espflash: /lib64/libc.so.6: version `GLIBC_2.32' not found (required by ./bin/espflash) ./bin/espflash: /lib64/libc.so.6: version `GLIBC_2.34' not found (required by ./bin/espflash)
この時、インストール - GLIBCのページを参照して、エラーで出力されているバージョン以降のGLIBCを別途インストールする。
インストールしたGLIBCをラッピングして、espflashツールを実行する。
# 別途インストールしたGLIBCをラッピングして、espflashツールを実行する場合 export GLIBC_DIR="<GLIBCのインストールディレクトリ>" $GLIBC_DIR/lib/ld-linux-x86-64.so.2 \ --library-path $GLIBC_DIR/lib64:$GLIBC_DIR/lib:/usr/lib64:/usr/lib:/lib64:/lib \ ./bin/espflash write-bin -b 115200 0x0 firmware/UNOR4-WIFI-S3-*.bin