Arduinoとは
Arduinoが何か大まかに知るには、まずはWikipediaを見るのが良いでしょう。私は、電気電子製品が世の中に溢れている割にはそれらは全てブラックボックス化されており、人々は中身を見ることさえ避けるようになってしまった。そんな状況はおかしいのではないか、という疑問から出発したプロジェクトだと理解しています。また、Arduinoは、正規品のメーカーの名称でもあり、サードパーティーが製作販売している互換機でもあり、オープンソースのプロジェクトを進める団体でもあり、正式にはArduino IDEと呼ばれるソフトウェアでもある、という、少しややこしい状況です。
Arduino UNO R3の使用例を写真1に示します。電線を刺す穴がたくさんありますが、これらはピン(Pin)と呼ばれます。5Vまたは3.3Vで電流を供給するピン、GND(アース)として働くピン、デジタル入力やデジタル出力をするピン、電圧を読み取るピン、周辺機器と通信するピンなどがあります。スイッチを入れたり切ったり、あるいはセンサーから出力された電圧を読み取ったり、あるいは得られたデータを送信したり、命令を受信したり、といったことができます。
Arduinoを入手しよう
入門機としてしては、2023年6月に発売されたArduino UNO R4もおすすめですが、Arduino UNO R3およびその互換機でも十分です。Arduino UNO R3は2012年10月に発売されたモデルですが、水処理の計測制御のような処理速度を要求されない用途には十分な性能を持っていると思います。少なくとも相当なエキスパートにならない限りは、UNO R3レベルで十分でしょう。秋葉原などの電気街に行くのもいいですが、Amazonでも売っています。私はだいたいAmazonで買っています。安価な互換品は1000円ぐらいで手に入ることもあります。Ali Expressだともっと安価かもしれませんが、よくわからないボードと抱き合わせで販売されている場合もあるので注意しましょう。
配線のノウハウ
私の工作のノウハウをこちらに記しました。
私のプロジェクトで使っているArduino
- Arduino UNO R3: やや電力消費が大きいけれども使いやすいボードです。特段の事情がなければこれを使うことが多いです。ただし、本家のArduino UNO R3ではなく、互換品を使っています。
- Arduino Mega: ピンの数が多く、その分たくさんのことができます。また、シリアル通信のためのUARTポートとして使えるピンが3対あります。滅多に使いませんが、大きなプロジェクトで使うことがあります。
- Arduino Pro Mini (3.3V): Arduino Pro Miniは消費する電流が非常に小さいのが魅力です。3.3V版と5V版が市販されていますが、3.3V版は3.7V出力のリチウムイオン電池と相性が良く、ソーラーパネルと組み合わせて遠隔自立のセンサーを組むのに便利です。また、小さいのも魅力です。
- Arduino Due: 他のArduinoが概ね10bitでAD変換するのに対して12bitでAD変換できる。また、動作電圧3.3V。
- Arduino UNO R4: 最新のArduino UNOで、性能も概して高く値段もそこそこで、これから始めようという人には魅力的な製品かもしれません。WiFiモデルだとWiFiに接続できるのも魅力です。ちょっと残念なのは、デジタルピンから出力できる電流がR3だと20mA程度までOKなのに、R4は8mAが上限だそうです。外部機器への給電をArduinoでON/OFFしたい時に、R3ではOKだけどR4では無理というケースがあります。実際のところ大抵の用途ではR3で十分だし、かつ、R3の互換機がたくさん出回っているので、なかなかR4に手が伸びません。
-
- ESP32:ESP32はArduinoとほぼ同様の使い勝手であり、Blue ToothやWiFiも備え、なおかつ安価であるといういいとこずくめのようなボードです。しかし、さまざまなボードが市販されており、また、ピンの配置が少しずつ違っていたりしてわかりにくく、ある程度習熟した人向けです。私は、Arduinoから集めたデータをインターネット上のデータサーバーにアップするところだけ、ESP32を使っています。あと、起動時に結構電力を消費するので、そのせいで思わぬつまづき方をすることがあります。
-
Arduinoだけでは...
- Arduino入門用のいろいろなキットが市販されています。まずはそれらのうち比較的安価なものを買ってみるのが良いかと思います。
- 少し使いこなせるようになると、いろいろ欲しくなるものがあります。それについてはおいおい書いていきます。
Arduino UNOで遊んでみよう
早速Arduino UNOを試してみましょう。
準備編:Arduino IDEのインストール
まずは、Arduinoで走らせるスケッチ(プログラム)を編集しArduinoにアップロードするソフトウェアであるArduino IDEをパソコンにインストールします。その手順の説明はここでは省略しますが、インターネット上に解説記事がたくさんあるので、そちらをご覧ください。Arduino IDE 2.3.6などのver 2のものをインストールすると良いでしょう。ダウンロードページは英語です。途中で寄付をするよう促されるウィンドウも出てきたりしますが、寄付をしないでダウンロードすることもできます。
ダウンロードした後はパソコンにインストールします。起動に成功すると、最初はメニューが英語になっているのでちょっと面倒に思うかもしれません。しかし、環境設定(Preferences)でメニューの言語を日本語にできるので、心配は入りません。ただし、コマンドは英語で書かざるを得ませんし、また、通信や表示に使う文字も、日本語を使えないことはないのですがアルファベットや数字を使う方が扱いやすいでしょう。
入門その1:Blink、あるいは"エルチカ"
Blinkは瞬きのことです。Arduino Unoのボードに装着されているLEDランプを点滅させてみよう、というスケッチです。Arduinoを学ぶほとんどの人は、ここを出発点にしていると思います。
まずはやってみよう
-
まずは、配線する。
ArduinoとパソコンをUSBケーブルでつなぎます。写真は、私の持っているArduino UNO R3互換機とパソコン(MacBook Pro)をつなげた様子です。しっかりつながっていますね。
<--- 写真用意 ---> -
パソコン側の準備
Arduino IDEを立ち上げて、メニューバーの"ファイル > スケッチ例 > 01.Basics > Blink"を選び、Blinkのスケッチを開きます。Arduinoでは、プログラムのことをスケッチと言っています。少しでも入門の敷居を下げたいということなのだと思います。
Blinkのファイルが開くはずです。
-
Arduino IDEでArduinoが接続されているポートを指定する
Arduinoから送られてくる信号は、貨物のようなものです。パソコン側でUSBケーブルで送られてくる貨物=信号が届く場所は、ポート(Port、港)と呼ばれます。パソコンはさまざまな周辺機器と情報をやり取りすることができるので、複数のPortを持っています。Arduino IDEに、Arduinoからの信号がどのポートに届くのか、指定してやる必要があります。ツールバーから"ツール > ポート"と選びそこにリストされている選択肢の中から先ほど繋げたArduinoのポートを選びます。
ここで問題があります。Arduinoは一つしかつなげていないのに、複数の選択肢がリストされている場合があります。特に、Macの場合は通常そうなっています。迷った時は、一度ArduinoをUSBケーブルから外し、(またはUSBケーブルをパソコンから外し)、そして、再び"ツール > ポート"と進み、選択肢を確認します。選択肢から消えたものが、今外したArduinoです。もう一度ArduinoとパソコンをUSBケーブルでつなぎ、そして、Arduinoに該当するポートを選択しましょう。
なお、時々Arduinoと思われるポートがリストされないことがあるかもしれません。そういう時は、何回かUSBケーブルを挿したり抜いたりし、それでもダメならArduino IDEを再起動し、それでもダメならパソコンを再起動し、対応します。それでもダメならもう一つ確認すべきこととして、ArduinoのUSBシリアル変換器に対応するドライバがパソコンにインストールされていないという可能性があります。Arduino UNO R3互換機の安価なものは、CH340という系統のUSBシリアル変換器を使っており、それに対応するドライバーをインストールすることで解決を試みます。ただし、最近のMacOSやWindowsはその対応ドライバーがデフォルトでついているはずです...。 -
Arduino IDEで接続されているボードの種類を指定する
Arduinoにはいろいろな種類があります。また、Arduino IDEで扱うことができるボードはArduinoだけに限りません。先ほど少し出てきたESP32のスケッチを編集したり書き込むこともできます。ということで、先ほど繋げたボードの種類を指定する必要があります。
メニューバーから"ツール > ボード"と進み、Arduino Unoを選びます。
なお、ポートとボードを指定するには、もう一つ方法があります。下図のようにスケッチの表示されているウィンドウの左上にある四角い枠をクリックすると、ボードとポートを指定するウィンドウが表示されます。
また、パソコンに複数台のArduinoをつなげて作業することも可能です。その場合、それぞれのスケッチ(の開かれているウィンドウ)に対して、ポートとボードを指定します。
- スケッチをArduinoに書き込む
スケッチの表示されているウィンドウの左上に✓マークのボタンと→ボタンがあります。→ボタンをクリックすると、スケッチがArduinoに書き込まれます。正常に書き込まれれば、次の瞬間にはArduino上でスケッチの実行が始まります。
Arduino UNOのボード上のLEDの一つが、およそ1秒ごとぐらいに点滅を始めたはずです。
スケッチの内容
スケッチBlinkの内容はお手元のArduino IDEでご確認ください。いくつか大事なところがあります。
- コメント(注釈)
プログラムには大抵注釈が記載されています。自分で書き込む場合もあります。なにしろ、何かメモを残しておかないと、プログラムを書いた人にしかわからなくなったり、その当人さえも時間が経つっと忘れてしまったりします。コメントを書いておくことは大事です。
コメントの書き方にはふた通りあります。
一つ目は、"/"ではじめて"/"で終わる方法です。Blinkの1行目から23行目がそうなっています。"/"と"/"で挟まれた部分は全て、コメントとして扱われます。
もう一つの方法は、"//"で始めることです。この場合は"//"から行末まで(改行するまで)がコメントにになります。Blinkのスケッチはとても良くできていて、1行まるまるコメントとした例と、コマンドの後ろにコメントを付した例が使われています。 - setup(){...}およびloop(){...}
スケッチの書き方の基本構造です。setupに書かれている内容は、電源が入ってから(あるいはスケッチの実行が始まってから)、一度だけ実行されます。その後、loopの内容が延々繰り返されることになります。 - コマンドは、";"(セミコロン)で終わる
コマンドはセミコロンで終わらせます。セミコロンを書き忘れると、コンパイルした時に、あるいはスケッチを書き込もうとした時に、エラーが出ます。
コメントを削除すると、スケッチは以下のようになります。これがBlinkのエッセンスです。
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
スケッチの解説
おそらくChatGPTやGeminiなどの生成系AIに、「このArduinoのスケッチについて教えてください。その内容は(ここにスケッチの内容をペースト)です。」というような感じでお願いすると、かなり丁寧に教えてくれるでしょう。なお、LED_BUILTINは、13番目のデジタルピンに接続されているLEDのことです。スケッチのLED_BUILTINを13に書き換えても、全く同じように動きます。LEDは13番目のピンがHIGH(この場合5V)の時、点灯し、LOWの時に消灯します。ということで、スケッチの内容についての解説はここでは省略します。
さて、このスケッチが開く可能性について少し説明を加えたいと思います。
LEDをつけたり消したりするだけのスケッチですが、この原理だけで次のようなことができます。
- 13番ピンの出力をリレー(継電器)とよばれる装置につなぐことで、外部機器の電源を自動でON/OFFできる。例えばポンプを動作させたり停止させたりできます。
- 2番〜12番のピン、およびA0〜A5のピンも、同じように使うことができる。つまり、一つだけではなく複数の機器のON/OFFを制御することができる。なお、0番と1番のピンも使えなくはないのですが、0と1はパソコンとの通信につかっているUSBケーブル(シリアル通信線)につなげて使用することがおおいので、あまり使わない方が良いです。
おまけ;Arduinoのピンについて
ピンの紹介
Arduino Uno R3にはたくさんのピンがついています。
- 2〜13はデジタルピンとも呼ばれます。実際、デジタル信号の入出力をします。なお、一部のピン(番号の前に"~"が付されているピン)は、HIGHとLOWの切り替えを極めて迅速に行うことで擬似的に中間の電位を生成するPulse Width Modulation(PWM)という機能を備えています。PWMはモーターの回転速度を調節するのに便利です。
- 0番ピンと1番ピンも2〜13ピンと同じように使うことができそうに見えますが、これらはパソコンとの通信で使うシリアル通信の線と直結されており、シリアル通信以外の機能で用いることはあまり推奨されません。
- A0〜A3のピンは、アナログ信号をデジタル化して取り込むことができます。アナログピンともよばれます。Arduino UNO R3の場合は取り込むことができるのは0〜5Vです。また、AD変換(アナログ値をデジタル化すること)の解像度は2^10 = 1024段階です。つまり10bitでのAD変換です。0〜5Vが1024段階に分割されデジタル化されます。AD変換の能力は機種によって、また、設定によって、少し変えることができます。AD変換については武蔵野電子さんのページが便利でしょう。あるいは、Arduinoのコマンド解説ページのAnalog I/Oもよいでしょう。英語のページも、自動翻訳すればまあまあ読めるでしょう。なお、デジタル入出力のピンとして設定して使うことも可能らしいです。
- A4、A5のピンもA0〜A3ピンと同様に利用できるのではありますが、しかし、次に述べるI2C通信のピン(A4はSDAピン、A5はSCLピン)と直結されています。つまり、I2C通信を使う周辺機器を使う時にはA4、A5ピンを使うことはできないということです。
- デジタルピンの配されている側の一番端の方に、SDA、SCLと記されたピンがあります。これらはI2C通信をするために用いるピンです。I2C通信を使う周辺機器は非常に多く、LCDやOLEDといった外部表示器、EEPROMのような外付けメモリー、一部のセンサー類がI2C通信を使います。
- 5V、3.3Vのピンはそれぞれ5V、3.3Vの電源として周辺機器を動作させるのに使うことができます。また、GNDピンは0Vのピン(電池でいうところのマイナス)として使うことができます。
- 他のピンは、あまり使ったことがありません。RSTピンはArduinoを外部からリセットするために使うことがあります。それぐらいかな...。
各ピンの出力に注意
Arduinoは計測も制御もできて、なおかつ5Vや3.3Vの電源としても使うことができるようです。が、出力することができる電流はそんなにたくさんではありません。Arduinoに過大な負荷をかけないよう、特にモーターや大きな表示器、ヒーターなどを使う計画のある人は意識しておきましょう。
-Arduino UNO R3ではデジタルピンのそれぞれは5Vで20mAまで電流を出力することができます。その電力を利用して、LEDを点灯させたりリレーを動作させることは可能です。また、小型のモーターなら動かせると思いますが、モーターの負荷を高めると、20mA以上の電流が流れて装置が故障あるいは壊れることにつながります。モーターを動かすような時は、モーター駆動用の電源を別途用意する必要があります。Arduino UNO R4ではデジタルピンの出力は4mA程度までになっているので、注意が必要です。
-5Vピンは確か400mAくらいまで(使い方によっては900mAまで)出力できるようです。一方3.3Vピンは50mAくらいが限界のようです。情報源によって多少数字が違います。いずれにしても、電流をたくさん使う機器を動かす場合は、それ専用の電源を別途用意した方が良いということです。
おまけその2:Arduinoの電源
-Arduino UNO R3に給電するには、以下の四つの方法があります。1) USBから、2) ACアダプターをジャックにつなぐ、3) 電池等からの電線を、マイナスをGND、プラスをVinに入れる。4) 電池等からの電線をマイナスをGNDに、プラスを5Vに入れる。1)は特段説明する必要がないかと思います。2)、3)の場合は7V〜12Vくらいの範囲の電源がよいようです。4)の場合は電池等の電圧が5Vである必要があります。
練習
簡単な応用問題を用意してみました。よろしければどうぞ。
練習1
delayのパラメータをいろいろいじって、点滅のパターンを変えてみたり、あるいは、点滅を非常に高速で行わせることで、光の強さを擬似的に強くしたり弱くしたりして、遊んでみましょう。
- スケッチを編集して実行しようとすると、スケッチを保存するかどうか聞いてくるかと思います。保存してもいいし、しなくてもいいです。保存する場合には、デフォルトですと自分のホームフォルダーの下にある書類フォルダーの中にArduinoというフォルダーが作られており、そこに保存されます。
練習2
- 複数のLEDを異なる時間間隔でON/OFFするプログラムを作ってみたくなるでしょう。とりあえずここはそういう状況を想像するだけでいいです。Pin11につながっているLEDは30秒ごと、Pin12につながっているLEDは15秒ごとにON/OFFします。さて、どんなスケッチを提案しますか?(実際のところ、複数のピンを制御するにはdelayを使うのはあまりお勧めできませんが、ここではdelayを使って作成してみましょう。)
- Arduino UNOのデジタルピンの中にはピン番号の前に"~"という記号が記されているものがあります。これらのピンはpulse width modulationという方法で擬似的に0Vと5Vの中間の電圧を出力できます。出力は、0〜5Vを256段階に分けた8bitでの出力となります。例えば9番ピンにアナログ電圧を出力する場合、以下のようになります。
- analogWrite(5, 51);// 5番ピンに1Vが出力される。
- analogWrite(5, 255); //5番ピンに5Vが出力される。
- analogWrite(5, 0); // 5番ピンに0Vが出力される。
- 作成したスケッチが正しく動くかどうかは、もしArduinoが手元にあり、LEDや適当な大きさの抵抗があれば、実際に試してみるといいでしょう。また、LEDがなくてもマルチメーターがあれば、ピンから出力されている電圧を確認できます。
- LEDを使うにあたっては、必ず200〜500Ωぐらいの抵抗を直列に入れること、また、LEDには極性があり、2本の足のうち長い方が高電圧側、短い方がGND側に来るようする必要があります。(ただし、最近は極性のないLEDも市販されています。先日秋葉原の秋月電子で一本10円ほどで買いました。)
- あるいは、スケッチをGeminiなどに示し、正しく動きそうかどうか、聞いてみるのもいいでしょう。このくらい簡単なスケッチであれば、結構しっかりみてくれます。
-
Blinkまとめ
- Arduino IDE
- ポートとボードを指定する方法
- スケッチを書き込む方法
- スケッチの基本構造
- その他、各ピンの紹介、ピンから出力できる電流の上限について
- digitalWrite(ピン番号, HIGH or LOW);
- analogWrite(ピン番号, 0-255の間の数字);
- delay(待ち時間 ミリ秒);
入門その2:AnalogReadSerial:Arduinoで電圧を測定しパソコンに表示
次の練習は、Arduinoで電池などの電圧を測定し、その結果をパソコンに表示させようというものです。Blinkの説明の中でAD変換のことを少し説明しました。ここではそれを実際に実行します。また、得られた値はArduino上にあります。Arduinoがそれをパソコンに送ってくれないことには、測定した結果がわかりません。ですので、Arduinoとパソコンの間の通信についても学びます。
手順
- 必要なものとして、Arduino Uno R3、パソコン、USBケーブルに加えて、少し長めのジャンプワイヤがあるとよいです。ジャンプワイヤは、Arduino入門キットを購入すると付いてくると思いますし、ジャンプワイヤだけのキットも市販されています。私は0.65mmの直径の単芯線の両端のビニール被覆を5〜7mmくらいむいて、ジャンプワイヤとして使っています。
以下、手順です。
-
ArduinoとパソコンをUSBケーブルでつなげる。(まだジャンプワイヤーは使いません)
-
Arduino IDEを立ち上げ、メニューバーの"ファイル > スケッチ例 > 01.Basics > AnalogReadSerial"を開く。
-
Arduino IDEで開いたスケッチで、ポートとボードを指定する。(時々Arduinoと思われるポートがリストされないことがあるかもしれません。そういう時は、何回かUSBケーブルを挿したり抜いたりし、Arduinoに対応するシリアルポートが表示されないか試みましょう。)
-
Blinkの時にやったように、Arduinoにスケッチを書き込みます。
さて、ここまでやっても、特段何も変わらないはずです。あえていうと、さっきまでBlinkを動かしていたのなら、ArduinoのLEDが点滅しなくなってしまったということぐらいでしょうか。Arduinoは取得したデータをパソコンに送っているのですが、パソコン側で(Arduino IDE側で)シリアルポートに届いた信号を表示する設定をまだしていませんよね。
-
Arduino IDEのシリアルモニターを開く
メニューバーの"ツール > シリアルモニタ"で、シリアルモニターのウィンドウが開きます。そうすると、Arduinoが再起動し、そして少し待つとシリアルモニターに受信した信号が表示されるはずです。また、シリアルモニタの下にあるシリアルプロッタを選択すると、時間と共に変化する計測値を表示してくれます。
なお、ポートが正しく選択されているにもかかわらずシリアルモニターに何も表示されないとか、あるいは文字化けしてしまうという場合は、シリアルモニターの通信速度(ボーレート)の設定が正しくない可能性を疑います。AnalogReadSerialではスケッチのSetup中に"Serial.begin(9600);"という業があります。これは、Arduinoがシリアルポートに出力する設定をしているコマンドで、この場合、その速度は9600bps(bit毎秒)です。Arduino IDEのシリアルモニターも9600bpsで信号を受け取るように設定しなければなりません。
また、シリアルモニターのウィンドウの右上の三つのボタンですが、一番左の下向き矢印のようなマークは自動スクロールのオン・オフの切り替え、真ん中の時計マークは受け取ったデータの左側に日時の情報を付します。また、一番右はシリアルモニタの内容を消去します。
スケッチの説明
スケッチからコメントを削除すると、以下のようになります。詳しい説明は、やはり生成系AIに放り込んで教えてもらうと良いと思います。
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0);
Serial.println(sensorValue);
delay(1);
}
以下、スケッチの説明に進みたいと思いますが、その前に一つ。シリアルモニター上では数字がものすごいスピードで出力されていると思います。先に、それをもっとゆっくり出力するようにしましょう。出力が速い原因は、loopの中のdelayのパラメータが1(ミリ秒)となっているためです。1秒で千回計測し千回出力する、という設定なのですから、速いのは道理です。1を100とか1000に書き換えて、そしてArduinoに書き込みましょう。それだけでだいぶ落ち着きますよね。
スケッチの説明です。
-setupの中で宣言されているSerial.begin(9600)については上で説明しました。
-Blinkではsetupの中でピンを出力ピンとして使うことを宣言していました。一方、入力ピンとして使う場合には、特にアナログピンについてはpinModeの宣言を省略できます。
-loopの中の最初の文は変数の名前と型の宣言の方法、および、A0ピンが検出している値の取得方法を知ることができます。
- int型は整数型ともいいます。普通のC言語ですとint型は32bitなのですが、Arduino IDEではint型は16bitです。その分メモリーを節約できるのですが、2^16 = 65,356ですから–32,768〜+32,767の間の数字しか扱うことができません。その範囲を超えると、突然値が変な値になります。例えば32,767+1=-32,768となります。なお、int型の他、long型(32bit整数)、unsigned int(符号なしの正の整数、0〜65,355)、unsigned long(符号なしの正の整数、0〜4,294,967,295)、float(浮動小数点)、boolean(論理値、つまり0か1)、char(1文字の1バイト文字)、String(文字列)などの型があります。また、配列を作ることもできます。
- analogRead(A0)はA0ピンにかかっている電圧を10bitの解像度で読みます。Arduino UNO R3の場合、通常では5V = 10^10-1 = 1023として読みます。0Vは0、2.5Vは512か513ぐらいです。例えば次の計算をするとボルトの値に変換できます。1023に小数点をわざわざつけているのは、この割り算を整数型ではなく浮動小数点型で実行させるためです。
- float voltage = analogRead(A0)/1023. * 5.0; - Serial.println(sensorValue);はA0ピンの読み値(sensorValue)をシリアルポートに出力し、その最後で改行するというコマンドです。Serial.printlnのSerialは出力先の名前、そして、printあるいはprintlnは指定された出力先に文字列や数字を出力するというコマンドです。printだと改行なしなのに対し、printlnだと最後に改行します。
練習
練習1(計測その1)
- ジャンプワイヤーを使ってみましょう。一方の端をA0に、また、もう一方をGND、3.3Vまたは5Vの端子につないでみましょう。結果はどうなりましたか?また、測定値を1023で割って5をかけると3.3Vぐらいの値になりますか?
練習2(計測その2 断線していたらどうなる?)
- ジャンプワイヤーの一方の端をA0に入れたまま、もう一方の端を手で持ったり何にも触らせないで宙に浮かせたままにしておきましょう。それでも何か数字が表示されるし、なおかつ、その値は不安定で上がったり下がったりしていますよね。その様子は、delay()の時間を短くして、そして、シリアルモニターではなくシリアルプロッターを使ってみると、よくわかると思います。
- これは、意味不明な測定値です。実際のところ、空中の電位(電波など)やArduinoそのものの持っている静電気の電位が測定されているのではないかと思います。でも、例えばちゃんと測定しているつもりがセンサーとA0の間でどこかで断線していると、こういう結果が得られてしまうわけです。電線をしっかり接続することも大事ですし、計測値が納得いかない場合は電線の接続を疑うことも大事だということです。
練習3(読み値の電圧への変換)
- スケッチを編集して、少し高度なことができるようにしてみましょう。
- ArguinoがanalogReadの読み値そのものではなく電圧に変換した値を出力するようにスケッチを書き換えてみましょう。
- 電圧の後ろに単位(VやmV)が表示されるようにしましょう。技術者たるもの単位をおろそかにしてはいけませんからね。
- 答えはAIに教えてもらっても良いですが、できるだけその前にどうしたらよさそうか自分で考えて書き換えてみて、うまく実行できなければAIにスケッチをみてもらうとよいでしょう。
- 電圧はデフォルトだと小数点以下下二桁まで出力されるはずです。小数点以下の出力の桁数を変えるにはどうするとよいでしょうか?
練習4(複数のアナログ入力を読み出力する)
これはある意味簡単で、analogRead(A0)に加えてanalogRead(A1), analogRead(A2)を使えば良いだけです。が、その測定値を変数に入れてシリアル通信に出力するのは、どうしたらいいのでしょうか?
Geminiに聞いたところ、以下の二つのスケッチを提案してくれました。
// その1
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValueA0 = analogRead(A0); // A0ピンの値を読み取る
Serial.println(sensorValueA0); // A0の値をシリアルモニターに出力
int sensorValueA1 = analogRead(A1); // A1ピンの値を読み取る
Serial.println(sensorValueA1); // A1の値をシリアルモニターに出力
int sensorValueA2 = analogRead(A2); // A2ピンの値を読み取る
Serial.println(sensorValueA2); // A2の値をシリアルモニターに出力
delay(10);
}
//その2
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValueA0 = analogRead(A0); // A0ピンの値を読み取る
int sensorValueA1 = analogRead(A1); // A1ピンの値を読み取る
int sensorValueA2 = analogRead(A2); // A2ピンの値を読み取る
// 各値をカンマとスペースで区切り、最後に改行する
Serial.print(sensorValueA0);
Serial.print(", ");
Serial.print(sensorValueA1);
Serial.print(", ");
Serial.println(sensorValueA2); // 最後の値の後に改行
delay(10); // 各行の出力の間に少し間隔を空ける
}
その1ですと、Geminiによると出力は次のようになるというのですが、
512 (A0の値)
230 (A1の値)
780 (A2の値)
513 (A0の値)
231 (A1の値)
781 (A2の値)
...
"(A0の値)"、"(A1の値)"、"(A2の値)"を出力するようなコマンドはスケッチには見当たりません。ですから、どの値がどのアナログピンの測定値なのか知ることはできないでしょう。Serial.print("(A0の値)");というようなコマンドを追加する必要があります。
一方、その2はA0の読み値、A1の読み値、A2の夜道の間に", "を入れ、A2の読み値を出力するところでSerial.printlnとして出力の後に改行を入れているので、直感的にわかりやすい出力になります。
512, 230, 780
513, 231, 781
514, 232, 782
...
なお、シリアルモニターに表示された結果をExcelやGoogle Spread Sheetに持っていくことを考えると、カンマ区切りよりもタブ区切りにした方が便利です。タブ区切りにするには、", "の代わりに"\t"を使います。
練習5(整形およびエラー対策)
次のスケッチを見てみましょう。
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0);
Serial.println(sensorValue);
delay(1);
}
先ほどのスケッチとほぼ同じなのですが、loopの中の二つ目のコマンドの先頭が他の行と揃っていません。ただそれだけなのですが、こうしたちょっとしたことでプログラムの構造がわかりにくくなり、バグの原因となったりすることもあります。元に戻すのはおそらく簡単だと思います。一つだけ注意していただきたいのは、空白を入れる時に全角スペースを入れないことです。タブキーか、半角スペースを使ってください。また、Arduino IDEには自動で整形する機能があります。メニューバーで、"ツール > 自動整形"でもいいですし、また、"編集 > 自動整形"でもいいです。便利です。また、MacですとCommand + T、WindowsではCtrl + Tで自動整形できます。
これぐらい短いスケッチですと整形なんかしなくても見通しは十分いいのですが、実用になるようなスケッチだと結構複雑になります。自動整形を活用しましょう。
練習6(エラーが出た時には)
もう一つ、以下のスケッチを見てみましょう。Arduinoに書き込もうとすると、エラーが出るはずです。
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0);
Serial.println(sensorValue)
delay(1);
}
エラーの内容ですが、下の図のようにスケッチの下の出力欄に赤字で説明されています。最初の数行もエラーの原因を探るのに役立つこともあるのですが、まず注目すべきは一番下の行、"Compilation error: expected ';' before 'delay'"です。
delayの前に";"(セミコロン)があるはずなんだけど、ないですよね、というようなエラーメッセージです。実際、"Serial.println(sensorValue)"の後ろの";"が消えてしまっているのですから、その通りです。さらに、スケッチをよくみると、エラーが発生している場所付近の背景色が少しハイライトされています。
うまく動かない時はこうしたエラーメッセージから解決策を探りましょう。エラーメッセージをコピーしてサーチエンジンで検索すると、結構解決の糸口が見えてきます。また、生成系AIに質問するのもいいです。整形まで含めてAIにやってもらうのは、この先の時代はアリなのかもしれません。
AnalogReadSerialまとめ
- アナログピン
- シリアル通信
- シリアル通信の速度
- シリアルへの文字列や数字の出力
- Serial.begin(通信速度);
- Serial.print("数字を含め文字列");
- Serial.println("数字を含め文字列"); //改行される
補足
Arduinoの使い方(給電方法)
ここまでの説明ですと、Arduinoを使うためには別途パソコンが必要だと思われるかも知れません。でも、パソコンは不要です。もちろんスケッチを書き込むためにはパソコンが必要なのですが、一旦スケッチを書き込んでしまえば、Arduinoはパソコンなしでも動作します。Arduino UNOに電力を供給するには、USB出力のあるACアダプタや、普通のACアダプタ(外径5.5mm、内径2.1mmのもので、6V〜12Vくらいの電圧出力のもの)、あるいは電池(これも6V程度〜12V程度)から電力を供給できます。Arduino UNOにはACアダプタを接続するDCジャックがついているので、これが一番便利でしょう。また、電池から給電する場合は、電池のマイナスをArduinoのGNDに、また電池のプラスの方をArduinoのVinに接続します・
電力が供給されるとArduinoは自動的に起動し、setupを実行し、ついでloopを実行します。
データを保存したい...
AnalogSerialReadの例では、いかにもArduino IDEのシリアルモニターにデータを保存する機能がありそうに見えたかもしれません。しかし、ありません。生成系AIのGeminiに聞くと、そのような機能があるらしいのですが、私の手元のArduino IDEにはありません。できることは、シリアルモニターに表示されているデータをマウスを使って選択し、コピーして、ExcelやWord、あるいはテキストエディタにペーストすることです。用途によってはこれで十分なこともあるでしょうが、多くの場合、それでは不便でしょう。
Arduinoを使い始めて最初のハードルとなるのは、多分データの保存です。それから、シリアル通信でやり取りするテキストデータの扱い方。詳しい説明はいずれ別の機会にするとして、データの保存方法のさわりだけ、紹介します。
Arduinoからシリアル通信で送られてくるデータを保存する方法として比較的簡単なのは、シリアル通信のソフトウェアを使うことです。Arduino IDEもシリアル通信の機能を持ってはいますが、シリアル通信に特化したソフトウェアがあります。私は、Roger Meier氏によるCoolTermを使っています。日本語に対応していないのではありますが、使い方はそれほど難しくありません。
あと、ProcessingやPythonなどで書いたプログラムでシリアル通信のデータを受け取り、保存を含めて様々な処理をすることもできます。プログラムを書かなければいけないとなると尻込みする人も多いでしょうが、生成系AIがそこそこ使い物になるプログラムを書いてくれるようになってきているので、案外ハードルは高くないかもしれません。パソコンに保存するだけでなく、GoogleSpreadSheetにデータを自動的に書き込んでくれたりもします。(私は、Googleの生成系AIのGeminiにその方法を教わり、また、プログラムも書いてもらいました。)
また、SDカードにデータを保存することもできます。ただし、長期間運用しているとデータがうまく書き込めていないこともあったりするので、私は個人的にはSDカードの使用を避けています。