この記事ではArduinoを用いた制御実験を進めるにあたって必要な事項について説明します。Arduinoは、安価なIoTデバイスであり、広く利用されています。制御工学教育でもArduinoは有用です。ここでは、実際にArduinoを利用するにあたっての基礎事項を一通り説明します。制御実験について説明した動画や関連記事リンクは最下部に置いています。
Arduinoとは
Arduinoは、オープンソースの電子工作プラットフォームで、ハードウェアとソフトウェアの両方から構成されています。主にマイクロコントローラーを用いて、様々な電子機器やプロジェクトを開発するためのツールとして利用されています。Arduinoは教育現場やプロトタイピング、IoT(モノのインターネット)など、幅広い分野で活用されています。
Arduinoのハードウェアは以下のような構成となっています。
ハードウェア: Arduinoのボードは、一般的にAVRマイクロコントローラー(Atmel社製)を搭載しており、入力・出力ピンが豊富に用意されています。これにより、センサーやモーター、LEDなどの外部デバイスを接続して制御することが可能です。各ボードは独自の特性を持ち、プロジェクトの要件に応じて適切なモデルを選ぶことができます。本記事では、主に以下のArduino Unoを使った説明を進めます。様々なボードがありますので、それについては記事最後に触れます。
Arduino Uno Rev3 ATmega328 マイコンボード A000066(Arduino (アルドゥイーノ))
次にArduinoのソフトウェアは以下のような構成となっています。
ソフトウェア:Arduino IDE(統合開発環境) は、プログラミングを容易にするためのツールで、C/C++言語をベースとしたシンプルなコードを用いて開発が行われます。ライブラリが充実しており、複雑な操作も比較的容易に実現できます。
Arduinoでは、スケッチと呼ばれるArduinoにアップロードをするためのコードを用います。スケッチの保存形式は".ino"という拡張子を使ったものであり、Arduino IDEでスケッチを開くと自動的にプロジェクトとして認識されます。Arduino IDE上で編集やコンパイル、ボードへの書き込みが可能になります。
スケッチの基本構造
ここでは、Arduinoボードに書き込むスケッチの基本構造について説明します。Arduino IDEのインストールや、PCとの接続などについては本記事では省略しています。関連記事をご覧ください。また、各種関数の詳細が知りたい場合はArduinoのリファレンス記事を確認下さい。
英語リファレンス:Arduino Reference - Arduino Reference
日本語リファレンス:Arduinoリファレンス (fc2.com)
スケッチでは次の2つを主に使います。
setup()関数
スケッチの最初に実行される部分です。Arduinoボードが電源を入れられると、最初に一度だけ呼び出されます。主に初期設定(ピンモードの設定、シリアル通信の開始など)を行います。
loop()関数
setup()関数の実行後に続けて実行され、Arduinoが電源を供給されている限り繰り返し実行されます。プログラムの主な動作(センサーの読み取り、LEDの点滅など)はここに記述されます。
スケッチの主な用語
スケッチにおける主な用語は以下の通りです。
ライブラリ
スケッチで使う機能やデバイスを簡単に扱えるようにするためのコードの集まりです。Arduino IDEには標準ライブラリが多数用意(例えばI2C通信用のライブラリ)されており、外部から追加することもできます。
ピンモード
デジタルピンの動作モードを指定する設定です。INPUT(入力)、OUTPUT(出力)、またはINPUT_PULLUP(内部プルアップ抵抗を使った入力)として設定できます。
デジタル書き込み(digitalWrite)
デジタルピンにHIGH(5V)またはLOW(0V)の信号を出力する関数です。LEDを点灯させるなどの用途に使われます。(記載例: digitalWrite(13, HIGH); )
アナログ書き込み(analogWrite)
PWM(パルス幅変調)を利用して、ピンに0から255までの範囲で疑似的なアナログ電圧を出力します。モーターの速度制御やLEDの明るさ調整に使用されます。(記載例: analogWrite(pinNumber, 128); )
デジタル読み取り(digitalRead)
指定したデジタルピンの状態(HIGHまたはLOW)を読み取る関数です。スイッチやボタンの入力を処理するのに使われます。
アナログ読み取り(analogRead)
アナログピンから0から1023までの範囲で入力値を読み取る関数です。センサーからのアナログ信号を処理する際に使用されます。
制御工学の実験を行うにあたって、外部信号を読み取る動作と、外部に信号を印加する動作のどちらも重要になりますので、上述の設定が重要になります。
プログラム例(スケッチ)
ここでは、スケッチによりモノを動かす例をいくつか紹介します。以下は、LEDを交互に点滅させるプログラムの例です。
void setup() {
//4番ピン,5番ピン出力方向
pinMode( 4, OUTPUT); //LED1
pinMode( 5, OUTPUT); //LED2
//4番ピン,5番ピン出力H(LED消灯)
digitalWrite( 4 , HIGH );
digitalWrite( 5 , HIGH );
}
void loop() {
volatile unsigned long i; //volatileが無いと、コンパイル時の最適化で空ループが削除
digitalWrite( 4 , LOW ); /* LED1点灯 */
digitalWrite( 5 , HIGH ); /* LED2消灯 */
for(i=0x4ffff;;){ /* 時間待ち(ソフトウエイト) */
i--;
if(i==0) break;
}
digitalWrite( 4 , HIGH ); /* LED1消灯 */
digitalWrite( 5 , LOW ); /* LED2点灯 */
for(i=0x4ffff;;){ /* 時間待ち(ソフトウエイト) */
i--;
if(i==0) break;
}
}
ここで、プログラムを実行すると4番ピンと5番ピンに接続されたLEDが交互に点滅します。待ち時間を変えると、点滅の挙動が変わります。次に、スイッチの状態をLEDに反映させるプログラムです。
void setup() {
//4番ピン,5番ピン出力方向
pinMode( 4, OUTPUT); //LED1
pinMode( 5, OUTPUT); //LED2
//10番ピン,12番ピン入力&プルアップ抵抗利用
pinMode( 10, INPUT_PULLUP); //SW1
pinMode( 12, INPUT_PULLUP); //SW2
}
void loop() {
unsigned char status_sw1 , status_sw2;
volatile unsigned long i; //volatileが無いと、コンパイル時の最適化で空ループが削除
status_sw1= digitalRead(10); // スイッチの状態を読みこむ
status_sw2= digitalRead(12); // スイッチの状態を読みこむ
digitalWrite( 4 , status_sw1 ); // LED1に出力
digitalWrite( 5 , status_sw2 ); // LED2に出力
}
スイッチの状態をdigitalRead関数で読み込み、その値に基づいてLEDの点灯・消灯を制御します。
Arduinoを制御器として使う
Arduinoを用いて制御系を組む場合について概要を説明します。以下の図が制御の例となります。
制御入力
モーターの回転角度制御を行う場合、制御入力 $$u$$ は、アナログ書き込みもしくはデジタル書き込みを利用して生成します。Arduinoの出力電圧が制御対象への指令となります。ただし、Arduinoで出力できる電力には制限がありますので、実際に制御器から制御対象の間にはアンプを介する必要があります。
制御出力
他方、モーターの回転角度など、制御出力を観測し、制御器でその値を読み取るためには、デジタル読み取りもしくはアナログ読み取りを使います。なお、目標値 $$r$$ については、Arduinoのプログラム内で値として保持し、使用することになります。
離散時間系と制御周期
制御器は、離散時間の制御器を使うことになります。例えば、PID制御器を用いる場合、比例要素、微分要素、積分要素を構成しますが、これは差分近似、和分を利用して構成します。その際には、連続時間と離散時間の関係を考える必要があります。
離散時間系では、サンプリング間隔(サンプリング時間)を一定にし、一定間隔ごとに制御入力を定めて制御対象に指令することになります。上述のloop()関数を利用して1周期が決まりますが、その間の時間は演算時間に依存します。間にif文などがある場合には、分岐内容によって演算時間が微妙に変わってきます。
実験においては、そのような時間を吸収し、一定のサンプリング時間となるようにdelay関数やmicros関数などを使います。
制御周期は短い方が良い制御ができる(可能性がある)といえますが、機器の特性によって実現できる周期が決まります。また、対象の特性によってどの程度の制御周期を必要とするかは変わってきます。制御実験では10ms程度を基準として進めます。基本的には、対象の時定数に比べて十分に短い時間に設定できればよいでしょう。
Arduino UNOのスペック
Arduino UNOは、広く使用されているArduinoプラットフォームの1つであり、初心者から上級者まで幅広いプロジェクトに適しています。以下に、Arduino UNOの主なスペックを説明します。
- マイクロコントローラー: ATmega328P
- 動作電圧:5V
- 入力電圧(推奨):7V~12V
- 入力電圧(制限):6V~20V
- デジタルI/Oピン:14ピン(うち6ピンはPWM出力が可能)
- PWMデジタルI/Oピン:6ピン(3, 5, 6, 9, 10, 11)
- アナログ入力ピン:6ピン(A0~A5)
- DC電流(I/Oピン): 20mA
- フラッシュメモリ:32KB(ブートローダーで0.5KB使用)
- SRAM:2KB
- EEPROM:1KB
- クロック速度:16MHz
- USB接続:USB Type-BコネクタでPCと接続
- 電源ジャック:2.1mmセンタープラス電源ジャック
- リセットボタン:ボード上に配置されており、簡単にリセット可能
- 重量:約25g
その他の特徴
- 内蔵LED:13番ピンに接続されたLEDが搭載されており、簡単なテストやデバッグに利用できます。
- ICSPヘッダ:プログラミング用のICSP(In-Circuit Serial Programming)ヘッダを装備。
- シリアル通信:シリアルモニターを使用して、PCとのデータの送受信が可能。
Arduino UNOは、豊富な入出力ピンやシリアル通信機能を活用して、さまざまな電子工作やプロジェクトを簡単に実現できるよう設計されています。コミュニティやリソースも豊富で、初心者が電子工作やプログラミングを学ぶのに最適なプラットフォームです。
制御実験の実験機
熊大情報電気3年実験では以下の3種類の対象についてArduinoを用いて制御を行っています。モーターの回転を制御するためにはPWMを使います。
モーターの回転角度制御
ステップ目標値への追従制御を行います。PID制御を用いて、そのゲインの設定値と応答の関係を調べます。波形はオシロスコープを用いて計測します。
ライントレース制御
定められたコースをライントレース制御します。左右のクローラのモータ速度指令により旋回や直進を行います。黒線の認識はフォトインタラプタを用います。
倒立振子の制御
2つのエンコーダで台と振子の回転角度を計測し、疑似微分値を含む4つの状態量を用いて状態フィードバック制御を施します。倒立状態を保つために台のモータを制御します。
関連記事:倒立振子のシステム構成と状態フィードバック制御 - 制御工学ブログ
制御の動画・関連記事
以下はArduinoを用いた制御実験に関する動画になります。
まずは、LEDの点滅に関する動画です。
モータ制御の動画です。
ライントレースの動画です。
倒立振子の動画です。
関連記事はこちらです。一番上の記事は川田先生のです。お世話になっています。
-
『LEGO 部品と Arduino を利用した「倒立振子」の開発レシピ ― やっぱりモノを動かしてみたいでしょ!』のサポートページ #MATLAB - Qiita
-
Arduinoを制御デバイスにしてさまざまなモノを動かそう!第3回:自作電磁アクチュエータの制作 | Device Plus - デバプラ
制御実験の前段階としてシミュレーションをする場合はMATLABなどを用います。以下はその関連記事になります。
Arduinoを用いた制御キット
Arduinoを用いたキットをいくつか紹介として並べておきます。スターターキットや移動ビークルは多く販売されています。特に、Arduinoを用いた小型ビークルは、他の組み込み型システムと比較して安価なものが多いです。
関連製品:
- ELEGOO UNO R3基本部品 初心者スターター 互換キット チュートリアル Arduino用(ELEGOO)
- SunFounder 3 in 1 IoT/スマートカー/ラーニング スターター キット究極版 Arduino IDEとScratchに対応、日本語のオンラインチュートリアル、192アイテム、87プロジェクト、ESP8266とArduino UNOに対応可能なコントローラボード付き(SUNFOUNDER)
- ELEGOO UNO R3スマートロボットカー V4.0 電子工作教育的おもちゃ、全年齢対象ロボット(ELEGOO)
- 制御実験用カスタムZumo Robotセット(組立済み) [TSI-ZUMO-002-A-L](Physical Computing Lab)
Zumoロボットのシャーシ等は、polulu社やスイッチサイエンスのページから購入できます。
スイッチサイエンス (switch-science.com)
Arduinoの関連書籍
書籍:
- ArduinoとMATLABで制御系設計をはじめよう! 【第2版】 (Physical Computing Lab) 単行本(ソフトカバー) - 平田光男(TechShare)
- 電子部品ごとの制御を学べる! Arduino電子工作実践講座 改訂第3版 - 福田和宏(ソーテック社)
- ゼロからよくわかる! Arduinoで電子工作入門ガイド 改訂2版 - 登尾 徳誠(技術評論社)
Kindle
電子書籍:
- ArduinoとMATLABで制御系設計をはじめよう! Physical Computing Lab - 平田光男(TechShare)
- 電子部品ごとの制御を学べる!Arduino 電子工作 実践講座 改訂第3版 - 福田 和宏(ソーテック社)
以上がArduinoを用いた制御に関する関連記事になります。本記事は以上です。
関連記事(blog.control-theory.com)
- PID制御の基本理論と設計法(日本語) — Arduinoでよく使われるPID制御の総合記事
- State Feedback Control and State-Space Design(英語) — 状態フィードバック制御の全体像
- State Observer and State Estimation(英語) — 状態推定の総合記事
- System Identification: From Data to Dynamical Models(英語) — 実験データからのモデル取得
関連Qiita記事
- 倒立振子のシステム構成と状態フィードバック制御 — Arduino+倒立振子
- PID制御の基本理論と設計法 — PID制御のPythonシミュレーション
- MATLAB LiveScript を用いた状態フィードバック制御シミュレーション





