MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Arduinoの基礎のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Arduinoの基礎
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == Arduinoのスケッチには、setup()関数とloop()関数が存在する。<br> setup()関数はスケッチの実行開始時(電源を投入した直後)、またはボードのリセット後に1度だけ呼ばれる。<br> 変数の初期化や、ピンモードの設定、ライブラリの初期化などを行うのに適している。<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] |- | Flashメモリ || 32[KB] |- | SRAM || 2[KB] |- | EEPROM || 1[KB] |- | クロック || 16[MHz] |} </center> <br><br> == Arduinoの電源供給 == Arduinoの電源供給は、USB端子と外部電源の2通りの給電方式がある。<br> USB端子と外部電源は以下に示す供給能力が推奨される。<br> <br> <center> {| class="wikitable" style="background-color:#fefefe;" |- ! 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> <u>※注意</u><br> <u>Arduinoの開発元では、入力電圧の限界値を6〜20[V]と表示している。</u><br> <u>ただし、実装部品が耐圧20[V]以下の部品が実装されている場合がある。</u><br> <u>そのため、7〜12[V]の推奨値の範囲で使用することを推奨する。</u><br> <br><br> == スケッチのダウンロード == まず、スケッチをコンパイルする。<br> 次に、Arduino IDEの[ツール]メニューバー - [ボード]メニューでArduinoボードを選択する。<br> 更に、Arduino IDEの[ツール]メニューバー - [ポート]メニューでCOMポートを選択する。<br> 最後に、[マイコンボードに書き込む]ボタンを押下して、コンパイルしたスケッチをダウンロードする。<br> <br><br> == LEDの点滅(ArduinoのHello World)のサンプルコード == 次に示すのは、LEDを点滅させるサンプルコードである。<br> <syntaxhighlight lang="c++"> 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 ); } </syntaxhighlight> <br><br> == Arduinoで電圧を測定する(アナログ入力を読み取る) == Arduinoボードは、A0 - A5までの6チャネルの10ビットのADCを持っている。<br> Arduino Uno等の動作電圧が5[V]のボードでは、0[V] - 5[V]までの電圧は、0 - 1023までの整数に対応付けられる。<br> <br> Arduino IDEでは、<code>analogRead</code>関数を用いることで、指定したアナログピンから値を読むことができる。<br> <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> なお、標準では、<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> <center>'''図.1 電圧を測定する回路図'''</center><br> [[ファイル:Arduino AnalogRead 01.png|フレームなし|中央]] <br> 次に記述するのは、電圧を読み取った結果をシリアルモニタに出力するサンプルコードである。<br> これによって 1秒毎にシリアルモニタに電圧が表示される。<br> <br> <center>'''図.2 電圧を測定してシリアルモニタに表示'''</center><br> [[ファイル:Arduino AnalogRead 02.png|フレームなし|中央]] <br> <syntaxhighlight lang="c++"> 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); } </syntaxhighlight> <br><br> == 割り込みとISR == Arduinoのスケッチでのハードウェア割込み(hardware interrupt)の利用方法について記載する。<br> <br> Arduino Unoでは、2個のピン(D2, D3)が割込みに利用できる。D2は割込み番号が0、D3は割り込み番号が1である。<br> Arduino Mega2560では、6個(D2, D3, D18, D19, D20, D21)が使用できる。割込み番号は順に0, 1, 5, 4, 3, 2が設定されている。<br> <br> 割込みサービスルーチン(ISR, interrupt service routine)は、引数および戻り値が無いvoidの関数が割り当てられる。<br> attachInterrupt(割込み番号, 関数名, モード)でISRをセットする。<br> また、attachInterruptの引数にはピンの番号ではなく、割込み番号を指定することに注意すること。<br> ピン番号から割込み番号の解決には、digitalPinToInterruptを使用する。<br> attachInterruptで指定した関数には幾つかの制約があるので、次の点に注意する。<br> * delay関数は機能しない。 * millis関数の戻り値が増加しない。 * シリアル通信により受信したデータは、失われる可能性がある。 * 割り当てた関数のなかで値が変化する変数にはvolatileをつけて宣言する必要がある。 <br> 次のサンプルコードでは、toggle_ledという名前のISRを、D2ピンでの割込み処理に指定している。<br> モードのFALLINGはHIGHからLOWの状態へ遷移したことで割込みを発生させることを意味する。<br> ISRでLEDが接続されたピンの状態を表す変数をLOWまたはHIGHに変化させている。<br> そして、loop()関数でその変数をdigitalWrite()関数に渡している。<br> <syntaxhighlight lang="c++"> 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; } </syntaxhighlight> <br><br> == ArduinoでPWM制御 == Arduinoでは、PWMによるアナログ出力(任意の出力値)をサポートしている。<br> デジタル信号としてHIGH(3.3[V]または5[V])とLOW(0[V])だけでなく、2[V]等の中間の値も出力できる。<br> これにより、LEDの調光制御を行うことができる。<br> <br><br> ==== PWMとは ==== PWM(Pulse Width Modulation)とは、電圧を制御する方法の1つである。<br> 出力のオンとオフを行うことで、 パルス幅に比例した電圧を得ることができる。<br> <br> 例えば、下図のように信号の基本周期の間で、25[%]の時間だけ出力をオンにすることにより、<br> 平均で電圧の25[%]の電圧(5[V] * 25[%] = 1.25[V])を得ることができる。<br> 尚、この場合はオン時間をデューティーサイクル (Duty Cycle) といい、最大電圧に対する出力電圧の割合になる。<br> <br> [[ファイル:Arduino PWM 01.png|フレームなし|中央]] <br><br> ==== ArduinoのPWM出力 ==== Arduino Unoでは、デジタル出力ピンの3, 5, 6, 9, 10, 11番の6個のピンがPWM制御に利用できる。<br> ピン番号の前に ~記号が付記されており、PWM制御が利用可能であることがわかる。<br> [[ファイル:Arduino PWM 02.jpg|フレームなし|中央]] <br> 基本的に、ArduinoのPWMの周波数は約490[Hz]だが、Arduino Unoでは5番と6番ピンは980[Hz]である。<br> 周波数が2倍ということは、波長が半分ということである。しかしながら、デューティーサイクルが同じであれば出力電圧は同じである。<br> <br><br> ==== analogWrite関数の使い方 ==== Arduinoでは、PWM出力にはanalogWrite関数を使用する。<br> analogWrite関数の引数は、第1引数にピン番号、第2引数にデューティーサイクルを渡す。<br> <br> デューティーサイクルは、パーセント表示ではなく、0(0%)から255(100%)の値をとる。<br> したがって、5[V]の動作電圧の時には、255 / 5 = 51より電圧 * 51として、更に整数に丸めた値をanalogWrite関数の第2引数に渡す。<br> <br> analogWrite関数を1度呼ぶと、同じピンに対してanalogWrite関数、digitalWrite関数、digitalRead関数を呼ぶまで、一定のPWM波を出力する。<br> analogWrite関数を呼ぶためにpinModeを事前に呼ぶ必要は無い。<br> <br><br> ==== PWM出力のサンプルコード ==== 次に、analogWrite関数によるPWM出力のサンプルコードを記述する。<br> Arduinoの3番ピンにて2[V]を出力している。<br> <br> <syntaxhighlight lang="c++"> const int PIN_PWM = 3; const float V_OUT = 2; void setup() { int i = (int)V_OUT * 51; analogWrite(PIN_PWM, i); } void loop() { } </syntaxhighlight> <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) として検出される。 * 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__ [[カテゴリ:Arduino]]
Arduinoの基礎
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse