制御工学ブログ

制御工学の研究者を20年やっている国立大学教員が制御工学の基礎から専門まで広く説明します。記事内では、動画やMATLABコードを交えながらわかりやすく解説する方針です。制御工学チャンネル(YouTube,動画ポータル)を運営しています。

Arduinoを用いた制御実験入門

この記事ではArduinoを用いた制御実験を進めるにあたって必要な事項について説明します。Arduinoは、安価なIoTデバイスであり、広く利用されています。制御工学教育でもArduinoは有用です。ここでは、実際にArduinoを利用するにあたっての基礎事項を一通り説明します。制御実験について説明した動画や関連記事リンクは最下部に置いています。

Arduinoとは

Arduinoは、オープンソースの電子工作プラットフォームで、ハードウェアとソフトウェアの両方から構成されています。主にマイクロコントローラーを用いて、様々な電子機器やプロジェクトを開発するためのツールとして利用されています。Arduinoは教育現場やプロトタイピング、IoT(モノのインターネット)など、幅広い分野で活用されています。

Arduinoのハードウェアは以下のような構成となっています。

ハードウェア:Arduinoのボードは、一般的にAVRマイクロコントローラー(Atmel社製)を搭載しており、入力・出力ピンが豊富に用意されています。これにより、センサーやモーター、LEDなどの外部デバイスを接続して制御することが可能です。各ボードは独自の特性を持ち、プロジェクトの要件に応じて適切なモデルを選ぶことができます。本記事では、主に以下のArduino Unoを使った説明を進めます。様々なボードがありますので、それについては記事最後に触れます。

次に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を交互に点滅させるプログラムの例です。

LEDとスイッチ(4,5,10,12ピンに配置)
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==0break;
 }
  digitalWrite( 4 , HIGH );        /* LED1消灯           */
  digitalWrite( 5 , LOW );         /* LED2点灯           */
  for(i=0x4ffff;;){       /* 時間待ち(ソフトウエイト)  */
    i--;
    if(i==0break;
 }
}

ここで、プログラムを実行すると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制御を用いて、そのゲインの設定値と応答の関係を調べます。波形はオシロスコープを用いて計測します。

モーターの回転角度制御

ライントレース制御

定められたコースをライントレース制御します。左右のクローラのモータ速度指令により旋回や直進を行います。黒線の認識はフォトインタラプタを用います。

Zumoロボットのライントレース制御

倒立振子の制御

2つのエンコーダで台と振子の回転角度を計測し、疑似微分値を含む4つの状態量を用いて状態フィードバック制御を施します。倒立状態を保つために台のモータを制御します。

倒立振子

blog.control-theory.com

制御の動画・関連記事

以下はArduinoを用いた制御実験に関する動画になります。

まずは、LEDの点滅に関する動画です。

youtu.be

youtu.be

モータ制御の動画です。

youtu.be

youtu.be

ライントレースの動画です。

youtu.be

倒立振子の動画です。

youtu.be

関連記事はこちらです。一番上の記事は川田先生のです。お世話になっています。

『LEGO 部品と Arduino を利用した「倒立振子」の開発レシピ ― やっぱりモノを動かしてみたいでしょ!』のサポートページ #MATLAB - Qiita

【Arduino入門】はじめてのモータ制御!モータドライバの使い方を解説!ちゃーのYouTube大学工学部

Arduinoを制御デバイスにしてさまざまなモノを動かそう!第3回:自作電磁アクチュエータの制作 | Device Plus - デバプラ

制御実験の前段階としてシミュレーションをする場合はMATLABなどを用います。以下はその関連記事になります。

Arduinoを用いた制御キット

Arduinoを用いたキットをいくつか紹介として並べておきます。スターターキットや移動ビークルは多く販売されています。特に、Arduinoを用いた小型ビークルは、他の組み込み型システムと比較して安価なものが多いです。

Zumoロボットのシャーシ等は、polulu社やスイッチサイエンスのページから購入できます。

スイッチサイエンス (switch-science.com)

Arduinoの関連書籍

Kindle

自己紹介

岡島 寛 (熊本大学工学部情報電気工学科准教授)

制御工学の研究をしています。モデル誤差抑制補償器,状態推定,量子化制御など

研究室HP

岡島寛 (システム制御 control-theory.com)

English Web Page

Hiroshi Okajima (Control Engineering control-theory.com)

制御動画ポータルサイト

制御工学チャンネル(伝達関数・状態方程式・MATLABなど)

電気動画ポータルサイト

電気電子チャンネル (半導体・電気・電子工作など)

YouTube 

制御工学チャンネル (制御YouTubeチャンネル)

人工知能・AIランキング
人工知能・AIランキング

本記事をお読みいただきありがとうございます。役に立った、と思われましたら、ブックマーク・シェア等のアクションをしていただければ嬉しいです。

 

以上がArduinoを用いた制御に関する関連記事になります。本記事は以上です。