ハードウェアとソフトウェアツール、Arduino APIを紹介します。
AUTHOR: Karl Söderby、LAST REVISION: 2022/12/07 23:23
Arduinoプラットフォームの開発は2005年に始まり、エレクトロニクスと組み込みデザインの分野においてもっとも認知されているブランドの一つになりました。
しかし、Arduinoの根幹は何でしょうか?ボードとは何で、コードをどうやって書き、自分のプロジェクトを作るために必要なツールは何でしょうか?このガイドの目的は、Arduinoプロジェクトの概要を伝えることです。
概要
このガイドは、ハードウェアとソフトウェアツール、Arduino API、クイックリファレンスの4つのパートに別れています。以下のリンクから直接飛ぶこともできます。
このセクションでは、エレクトロニクスとArduinoボードの操作の基礎を学ぶことに時間を割きます。
- Arduinoボードの構造
- 基本操作
- 回路の基本
- 電子信号
- アナログ信号
- デジタル信号
- センサーとアクチュエーター
- シリアル通信プロトコル
- メモリ
- 内蔵センサー
- モノのインターネット(Internet of Things: IoT)
このセクションでは、Arduino APIと、Arduinoボードで動作するコードの書き方を学びます。
このセクションでは、開発環境の設定方法と、どういうオプションがあるのかを学びます。
クイックリファレンスは、Arduino API全体から選んだもので、よく使う関数や構造、メソッドを紹介します。
Arduinoハードウェア
何年にもわたり、Arduinoは多くの形態のハードウェアデザインをリリースしてきました。
Arduinoボードの構造
全てのArduinoボードは異なりますが、全てのArduinoに共通する要素がいくつかあります。以下の図を見てください。
- マイクロコントローラ(Microcontroller) - Arduinoの頭脳で、プログラムをロードする構成要素です。いくつかのことが実行できるように設計された小さいコンピュータです。
- USBポート(USB port) - ArduinoボードをPCに接続するために使われます。
- USB-シリアル変換チップ(USB to Serial chip) - USB-シリアル変換チップは、例えばPCからボード上のマイクロコントローラに送信されるデータを変換する為の重要な構成要素 です。
- デジタルピン(Digital pins) - デジタルロジック(0/1、LOW/HIGH)を扱うピン。スイッチやLEDをオン・オフするためによく利用されます。
- アナログピン(Analog pins) - 10ビット(0-1023)の精度でアナログ値を読むためのピン。
- 5V/3Vピン(5V/3V pins) - 外部の回路に電力を供給するためのピン。
- GND - グラウンドや陰極、単に - とも呼ばれ、0ボルトの電気レベルで、回路を終端させるために利用されます。
- VIN - 外部電源を接続します。
Arduinoボードによっては、もっと多くの構成要素があります。上記のリストはどんなArduinoボードにもある一般的なものです。
基本操作
ほとんどのArduinoボードは、マイクロコントローラ上で一つのプログラムが動作するように設計されています。このプログラムは、LEDを点滅させるなど、ひとつのアクションを行うように設計されています。一サイクルで、何百ものアクションを実行するよう設計することもできます。プログラムによりそのスコープは異なります。
マイクロコントローラにロードされたプログラムは、電源投入後すぐに実行が開始されます。全てのプログラムには"loop"と呼ばれるプログラムがあります。loop関数では、以下のようなことを行うことができます。
- センサーの値を読む
- 電気をつける
- 条件が成立したか調べる
- 上記全て
ゆっくり動作するよう明示しない限り、プログラムはとても早く動作します。プログラムのサイズやマイクロコントローラの実行時間に依存しますが、通常はマイクロ秒単位(1秒間に百万回)です。
回路の基本
回路は少なくとも一つの電子部品と、電流を通すための電線などの導電材料で構成されます。Arduinoを使うとき、プロジェクト用に回路を作る場合がほとんどです。
簡単な回路の例はLED回路です。Arduinoのピンから抵抗(高電流からLEDを守る役割があります)を通して電線でつなぎ、最後にグランドピン(GND)に接続します。ピンをHIGH状態にすると、Arduinoボード上のマイクロコントローラは電子回路に電流を流し、LEDを光らせます。ピンをLOW状態にすると、電流が回路に流れなくなり、LEDが消えます。
回路は通常回路図として表され、回路の設計図になります。下の図は、上の図で示した回路と同じ回路を、回路図として表したものです。
電子信号
電子機器間の全てのやりとりは、電子信号を通じて行われます。電子信号には、アナログとデジタルの2種類があります。
アナログ信号
アナログ信号は通常、範囲が決まっています。Arduinoでの典型的な範囲は、0-5Vと0-3.3Vです。
例えば、可変抵抗(回路で抵抗を変化させるためのアナログ機器)を使うと、この範囲(0-5V)を調整することができます。プログラムでは、これは0-1023の数値で表され、10ビットの精度です。
パルス幅変調(Pulse-Width Modulation: PWM)を使ってアナログ信号を出力するときは、0-255の範囲を使います。これは、8ビットの精度です。
デジタル信号
デジタル信号は、少し異なる働きをします。2つの状態(0か1)だけで表され、プログラムではHIGHかLOWで表されます。これは現代の技術での典型的な信号の形式です。
Arduinoでは簡単にデジタル信号を読み書きすることができます。例えば、ボタンの状態を読んだり、何かをオン・オフしたりするのに有用です。
デジタル信号は0か1なので簡単に見えますが、実際にはもう少し高度です。例えば、HIGHとLOWを迅速に何回も送ることで、連続したビット列を作ることができます。これは、バイナリシーケンスやビットストリームとして知られています。
二つのバイナリシーケンスを見ていきましょう。
|
|
これらは10進表現では、以下のようになります。
45
23667
これは、HIGHとLOWの信号を速く送ることで、ある地点から他の地点に多くのデータを送信するための賢明な方法です。信号からデータを解釈するためには、シリアル通信プロトコルを使います。
センサーとアクチュエーター
Arduinoを使うには、センサーとアクチュエーター、そして、それらの違いを理解することが重要です。
センサーとは何か?
簡単に言うと、センサーは環境を認識します。つまり、温度のような物理パラメータを取得し、電子信号に変換します。
センサーはボタンのような簡単な形態をとることもあります。状態が変わる(ボタンを押す)と、電子信号がLOWからHIGH(0から1)に変わります。
センサーには多くの種類があり、データの取得方法も多岐にわたります。おそらく簡単に使えるのはアナログセンサーでしょう。Arduinoのアナログピンに入力される電圧の値(通常は0-5V)の範囲によって通信します。これにより0-1023の値(10ビットの精度)が得られます。
デジタルセンサーは、形態によってはもう少し進歩的です。データの送信はシリアル通信プロトコルに依存し、データを変換するには少し複雑な操作が必要です。電子信号で述べたように、データはバイナリシーケンス(例: 101101もしくは45)を使って送信され、ソフトウェアレベルで理解する必要があります。ありがたいことに、多くのセンサーにはソフトウェアライブラリがあり、簡単に値を読むことができます。
ライブラリを使う多くの場合、1行で済みます。
|
|
アクチュエーターとは何か
簡単に言うと、アクチュエーターは物理状態を動作させる、もしくは、変更します。いくつかの例を挙げます。
- LEDのようなライト
- モーター
- スイッチ
どのようなコンポーネントを使うかにより、アクチュエーターの制御方法が変わります。もっとも簡単な方法は何かをオン・オフすることです。もう少し複雑な例は、モーターのスピードのように、コンポーネントが受け取る電圧を制御することです。
アクチュエーターの制御には、dgitalWrite()
やanalogWrite()
を使うのが一般的です。
|
|
入力と出力
センサーとアクチュエーターは、よく、入力と出力とも呼ばれます。プログラムを書くとき、センサーの状態を確認し、何かを動作させるかを決定することが一般的です。
簡単な例はボタンとLEDです。ボタンが押されていればLEDを点灯し、押されていなければLEDを消灯するようなプログラムを書くことができます。Arduinoのプログラムでは、以下のようになります。
|
|
シリアル通信プロトコル
データの送信に先ほどのデジタル信号を利用するシリアル通信がたくさんあります。最も一般的なのは、UARTとSPI、I2Cです。UARTは、PCとArduinoの間で新しいプログラムをアップロードしたり、Arduinoから直接データを読み取ったりするのに使われます。
SPIとI2Cプロトコルは、内部および外部のコンポーネントとの通信に利用されます。通信は、Arduinoの特定のピンと結びついたシリアルバスと呼ばれるもので扱われます。
I2Cプロトコルを使うと、ひとつのピンに複数のセンサーを接続し、正確にデータを取得することができます。各デバイスには、データを取得するためのアドレスがあり、プログラムで指定する必要があります。
メモリ
「標準的な」Arduinoは通常SRAMとフラッシュメモリの2種類のメモリを持っています。
SRAM(Static Random-Access Memory: ランダムアクセスメモリ)は、例えば、ブール値の状態のような変数の値を格納しています。電源を切るとこのメモリはリセットされます。
フラッシュメモリは、主にメインプログラム、すなわち、マイクロコントローラに対する命令を格納します。電源を切ってもこのメモリは消えません。このため、これらのマイクロコントローラに対する命令は、電源を入れるとすぐに実行されます。
Arduinoで利用できるメモリ量は、ボードによって異なります。例えば、Arduino UNOは、32kBのフラッシュメモリと2kBのSRAMを搭載しています。Nano 33 IoTは、256kBのフラッシュメモリと32kBのSRAMを搭載しています。これらの情報は、Arduinoのハードウェアドキュメントの、それぞれの製品のドキュメントに記載されています。
内蔵センサー
多くの新しいArduinoボードにはセンサーが内蔵されています。例えば、Nano 33 BLE Senseは、わずか45x18mmの大きさで、7つのセンサーを内蔵しています。これらはすべて上述のI2Cプロトコル経由で接続され、異なるアドレスが割り当てられています。
モノのインターネット(Internet of Things: IoT)
最近のほとんどのArduinoボードは無線通信を行うための無線モジュールが搭載されています。無線モジュールには、いくつかの種類があります。Wi-Fi、Bluetooth®、LoRa®、GSM、NB-IoTなどです。市場で利用可能なさまざまな技術を使って通信するよう設計されています。
最も普及していて安価なモジュールは、Wi-FiとBluetooth®モジュールです。Wi-Fiモジュールはボードをルーターに接続し、インターネット経由でデータを送受信します。インターネット上で様々なデータを要求するPCと同じように動作しますが、その規模が小さいということです。
Bluetooth®は、近傍のデバイスと通信を行うために使われ、高速・高信頼の接続を維持するのに有用です。例えば、実環境のアプリケーションで、Bluetooth®技術は、ワイヤレスヘッドフォンやスピーカーで利用されています。
シリアルプロトコル同様に、無線モジュールは通信のために、HTTPやMQTT、UPDといった独自のプロトコルを利用します。
Arduino API
Arduino APIもしくはArduinoプログラミング言語は、C/C++言語を基にした、関数と変数、構造から構成されます。
主要構成要素
Arduino APIは、関数と変数、構造の3つの分けることができます。
- 関数: Arduinoボードの制御や計算を行います。例えば、デジタルピンの状態を読み書きする、値を割り当てる、シリアル通信を利用する、などです。
- 変数: Arduinoの定数やデータ型、変換などです。例えば、
int
やboolean
、array
があります。 - 構造: Arduino(C++)コードの要素です。以下のようなものがあります。
- スケッチ(
loop()
、setup()
) - 制御構造(
if
、else
、while
、for
) - 算術演算(かけ算、足し算、引き算)
- 比較演算子(
==
(等しい)、!=
(等しくない)、>
(大きい))
- スケッチ(
Arduino APIは、C++プログラミング言語を単純化したもので、Arduinoハードウェアを制御するための多くの機能が付加されています。
プログラム構造
Arduinoプログラムが必要とする最低限の関数は、void setup()
とvoid loop
の2つです。“void"は、実行結果を返さないことを意味します。
void setup()
この関数は、Arduinoに電源が入れられたときに一度だけ実行されます。ここでは、ピンのモード(入力か出力)やシリアル通信のボーレート、ライブラリの初期化などを行います。void loop()
この関数には、継続して実行するコードを記述します。例えば、入力によってランプをオン・オフしたり、X秒ごとにセンサーの値を読み取るなどです。
Arduinoスケッチでは、上記の関数は必須です。長いプログラムを書くときには、さらに関数を追加することも、もちろんできます。
スケッチ
Arduinoプロジェクトでは、プログラムは「スケッチ」と呼びます。プログラムが書かれたファイルがスケッチです。スケッチは、.ino
という拡張子を持ち、常に同名のフォルダ内に配置されます。
フォルダには、スケッチに含めるヘッダファイルなどの他のファイルを置くこともできます。
スケッチ例
以下は、いくつかのよく使われるArduinoのプログラム要素を持つ、標準的なArduinoスケッチの例です。
|
|
ライブラリ
Arduinoライブラリは、標準的なArduino APIの拡張です。公式およびコミュニティによって寄贈された何千ものライブラリがあります。
ライブラリは複雑なコードの利用を簡潔にします。センサーやモーターの制御、インターネットへの接続などに使われます。全てのコードを自分で書くのではなく、ライブラリをインストールし、コードの最初でインクルードすれば、ライブラリの全ての機能を利用することができます。全てのArduinoライブラリはオープンソースで、無料で利用することができます。
ライブラリを使うには、下記のように、コードの最初でインクルードします。
|
|
ほとんどのライブラリには、ライブラリの利用に役立つスケッチ例が付属しています。
コアAPI
全てのArduinoボードは、「コア」あるいは「パッケージ」が必要で、これらはプログラミングのためにインストールする必要があります。全てのパッケージには標準Arduino APIが含まれ、さらに、特定のボードで利用できる特定のAPIも含まれます。
例えば、昔からあるArduinoCore-avrパッケージには、EEPROMやSoftwareSerialライブラリが含まれ、追加のインストールを行うことなく自由に利用することができます。このパッケージには、Arduino UNOやNano、Mega2560などが含まれます。
他の例は、ArduinoCore-mbedパッケージで、40以上のライブラリを含み、以下のような特定のボード向けの機能が設計されています。
- PDM Nano 33 BLE SenseとNano RP2040 Connectに搭載されているマイクからオーディを信号のサンプリングに使われます。
- Ethernet Portenta Visionシールド用のEthernet機能が利用できます。
- GSM Portenta Cat. M1/NB IoT GNSSシールド上のGSM機能が利用できます。
これらの機能は各製品のランディングページに記載されています。全てのハードウェアのリストは、docs.arduino.ccに記載されています。
Arduinoソフトウェアツール
Arduinoエコシステムのもう一つの構成要素は、ソフトウェアツールです。
通常Arduino IDEと呼ばれるのは、統合開発環境です。では、正確にはどういう意味でしょうか?
ボードでプログラムを作成するには、プログラムを書き、機械語にコンパイルし、最後に、新しいプログラムをボードに転送する必要があります。
Arduino IDEは、1行目のコードを書くことから、Arduinoボード上のマイクロコントローラで実行させるところまでの全ての機能を持っています。Arduino IDEは、ダウンロードできる(オンラインバージョンもあります)プログラムもしくはアプリケーションで、コード開発の全てを行うことができます。以前は、エレクトロニクスとコンピュータサイエンスの知識が多く要求される複雑なプロセスでした。今は、Arduino IDEのおかげで、誰でもこれらのことを学ぶことができます。
現在、Arduino IDEには、以下の3種類があります。
- Arduino IDE 1.8.x(クラシック)
- Arduino IDE 2.x(新しい)
- Arduino Web Editor(オンライン)
典型的な作業の流れ
IDEを使ってコードをArduinoにアップロードするには、通常以下のことを行います。
- ボードをインストールする ボード用の正しいパッケージをインストールすることを意味します。パッケージがないとボードを利用できません。IDE内で、簡単な操作ですぐに、ボードをインストールできます。
- 新しいスケッチを書く スケッチはプログラムファイルです。マイクロコントローラ上で実行したい命令セットを書きます。
- スケッチをコンパイルする 書いたプログラムは、Arduinoにアップロードする際には異なった形式になっています。コードをコンパイルするということは、エラーがないことを確認し、0と1で構成されるバイナリファイルに変換することを意味します。何かに失敗すると、エラーコンソールにその旨が表示されます。
- スケッチをアップロードする コンパイルに成功すると、コードをボードにアップロードできるようになります。このとき、ボードとPCを物理的に接続し、正しいシリアルポートを選択します。
- シリアルモニタ―(オプション) ほとんどのArduinoプロジェクトでは、ボード上で何が起こっているのかを知ることが重要です。シリアルモニターはすべてのIDEで利用可能で、ボードからPCにデータを送信できます。
Arduino IDE 1.8.x
現在はレガシーなエディタと考えられている、Arduino IDE 1.8.xあるいはJava IDEは、Arduinoができたときにリリースされたエディタです。
Arduino IDE 2.0.x
2021年に、Arduino IDE 2.0がリリースされました。新しいIDEはクラシックIDEの機能に加え、自動補完やでバッギングといった機能をサポートします。
Webエディタ
Arduino Web EditorはオンラインIDEで、Arduino Cloud suiteの一部です。機能は似ていますが、このエディタは完全にWebベースで、他の機能やオンラインストレージも備えています。Webエディタを使うには、Arduinoアカウントを登録する必要があります。
Arduino IoTクラウド
Arduino IoTクラウドでは、設定からプログラム、デバイスの制御・監視をWebベースのアプリケーションで行うことができます。モノあるいはデジタルツインを使い、ダッシュボードから変数を直接制御することができます。このサービスでは、WebフックやAmazon Alexaのような他のサービスとの統合がサポートされています。
クラウドはだれでも使うことができ、開始するのに事前の経験をあまり必要としません。
ライブラリマネージャー
すべてのバージョンのIDEには、Arduinoソフトウェアライブラリをインストールするための、ライブラリマネージャがあります。何千もの公式ライブラリや寄贈されたライブラリを直接ダウンロードすることができます。ダウンロードすると、各ライブラリのスケッチ例も利用できます。
Arduino CLI
Arduino CLIは、コードをコンパイルやボードにアップロードするために利用されるコマンドラインツールです。GUIはありませんが、自動化には有用です。熟練したユーザ向けに設計されています。
CLIを適切に利用すると、通常のIDEよりもはるかに速く実行するので、開発期間を短縮することができます。
クイックリファレンス
このセクションでは、標準のArduino APIの共通要素のいくつかを説明します。これによりいくつかの共通要素を視ることができます。
すべてのArduino APIを知るには、Arduinoとコミュニティにより維持されているArduinoリファレンスを参照してください。数百の項目があり、コード例や詳細な説明が記載されています。
一般機能
setup()
setup()
関数は、プログラムの設定を行うための関数です。
void setup() {
//program configurations here
}
loop()
loop
関数は、メインプログラムを格納する場所です。ボードに電源が入っている間、実行され続けます。
void loop() {
//main program here
}
delay()
delay()
関数は指定したミリ秒だけプログラムを停止させます。
blinkのコードを以下に示します。
|
|
delay()
関数はとても有用な関数で、ほとんどすべてのスケッチ例で利用されています。しかし、delay()の間Arduino花にもできなくなるので、コードの効率性という意味では、最適な選択肢というわけではありません。
このため、millis()
関数を使うことができます。
millis()
millis()
関数は少し先進的ですが、非常に有用な関数です。プログラムを止めることなく、複数のイベントを同時に扱うことができます。プログラムが開始されてからの時間(ミリ秒)を計測することで、実現します。
処理の実行間隔と、最後のイベントの発生時刻の記録を用いて、プログラムを止めることなく、特定の時刻にイベントが発生させる単純なアルゴリズムを作成できます。
以下の例を見てください。
|
|
millis()
関数はdelay()
関数よりも先進的な概念ですが、早い段階から慣れておいたほうがいいでしょう。
関数
実行してリターンするだけの関数や、結果を返す関数を自作することができます。
何も返さないvoid
関数の例です。
|
|
整数値を返すint
関数の例です。
|
|
変数定義
変数は、局所的(ローカル)にも大域的(グローバル)にも作成できます。loop()
の中で定義される変数は局所的で、スケッチの先頭で定義される変数は大域的です。
|
|
データ型
いくつかのデータ型が利用できます。よく使うものを以下に示します。
|
|
int
(整数)型のデータを格納する例です。
|
|
float
(実数)型のデータを格納する例です。
|
|
文字列を格納するには、String
を使うことができます。
|
|
単純なスイッチやtrue/falseでは、ブーリアンを使います。
|
|
シリアル通信
ボードで何が起こっているのかを知るための最も簡単な方法として、シリアル通信はArduinoプログラムに不可欠なものです。
このために、Serial
クラスを利用することができます。
Serial.begin()
ボードとPC間のシリアル通信を初期化します。これは、void setup()
関数で定義します。このとき、ボーレート(通信速度)も指定します。
|
|
Serial.print()
シリアルポートにデータを書き出します。書き出したデータは、Arduino IDEのシリアルモニターで見ることができます。
|
|
Serial.read()
入力されるシリアルデータを読みます。
|
|
GPIO/ピン管理
Arduinoのデジタルピン・アナログピンの状態の管理や読み込みを行います。
pinMode()
デジタルピンを入力もしくは出力として動作するよう設定します。void setup()
関数の中で設定します。
|
|
digitalRead()
デジタルピンの状態を読みます。例えば、ボタンのクリックを検出するのに使います。
|
|
digitalWrite()
HIGHもしくはLOWの状態を書き出します。コンポーネントをオン・オフするのに使います。
|
|
analogRead()
アナログピンの電圧を読み、0-1023(10ビットの分解能)の数値を返します。アナログコンポーネントの値を読みます。
|
|
analogWrite()
0-255(8ビットの分解能)の値を書きます。ライトの明るさを調整したりモーターのスピードを設定するのに使います。PWMやパルス幅変調とも呼ばれます。
|
|
PWMは、"~“の印がついている特定のピンで利用できます。
構造
Arduino APIの構造はC++に基づいていて、プログラムの構成要素となります。
条件分岐
条件分岐はどのようなプログラムでも利用される要素です。Arduinoでの、典型的な条件分岐は、if
とelse
です。
|
|
コード内で、複数のif/else文を使うことができます。
ループ/繰り返し
指定した回数や条件が成立している間、コードブロックを実行するには、for
とwhile
ループがよく使われます。
while
を使ってvariable
がtrueの間コードブロックを実行する基本的な方法を以下に示します。
|
|
for
を使って指定した回数(この場合は10回)だけコードブロックを実行する基本的な方法を以下に示します。
|
|
ループを抜けるには、break
を使います。以下の例では、条件が成立する(variableがtrueになる)と、ループを抜けます。
|
|
算術演算
算術演算は、足し算・引き算・かけ算・割り算や、他の数学計算に使います。
|
|
比較演算子
比較演算子はある値と他の値を比べるのに使います。条件文で鍵となる要素です。
|
|
条件分で使う例を以下に示します。
|
|
論理演算子
論理演算子(論理否定 !、論理積 &&、論理和 &&)はより高度な比較で使うことができます。
論理積 && を使う例です。
|
|
論理和 || を使う例です。
|
|
論理否定 ! を使う例です。
|
|
複合演算子
複合演算子は2つのオペレータからなり、ひとつの文で2つの演算を同時に実行します。例えば、足し算(+)と代入(=)を同時に行います。
いくつかの例を示します。
|
|
おわりに
このガイドでは、いくつかのArduinoの基本を説明しました。ハードウェアとソフトウェアツール、Arduino APIとは何か、それらの導入です。このガイドは主にArduinoの紹介で、基本概念の理解を目的としています。
さらに学ぶには、ArduinoドキュメントやArduinoリファレンスを見てください。詳細なチュートリアルやスケッチ例、APIや他の情報が記載されています。
Arduinoボードの購入は、Arduinoストアを見てください。
Arduino IDEをダウンロードするには、Arduinoソフトウェアのページを見てください。
オリジナルのページ
https://docs.arduino.cc/learn/starting-guide/getting-started-arduino
最終更新日
December 11, 2022