第4回:Arduinoと通信する
設備・情報技術室 AI・メカトロニクス班
木庭 洋介
皆様はMATLABというソフトウェアをご存知でしょうか。MATLABはアルゴリズム開発、データ解析、可視化、数値計算のための統合開発環境です。様々な分野に対応したToolbox(アドオン製品)があり、これらを利用することで、複雑な処理を簡潔なコードで実現できます。
九州大学情報統括本部は、「MATLAB Campus-Wide License(包括ライセンス契約)」の運用を2023年1月4日から開始しました。これにより、MATLAB/Simulinkおよび100以上のToolbox(アドオン製品)の他オンラインツールやサービスを、教職員は有償ですが、学生は無償(!!)で利用できるようになりました。ここでは、「MATLABでこういう事ができます」ということをご紹介していきたいと思います。
※ 残念ながら「MATLAB Campus-Wide License(包括ライセンス契約)」は、2025年12月末をもって終了することになりました。
今回は以下のアドオン製品を使用します。
MATLAB Support Package for Arduino Hardware
はじめに
今回は、MATLABを介してArduinoと通信し、Arduinoに接続したサーボモータを動かします。
Arduinoはワンボードマイコンの一種で、さまざまなセンサーやアクチュエータと接続することができ、ロボットやIoTの分野でよく使われています。
開発環境としてArduino IDEが公開されており、C/C++をベースとしたArduino言語で作ったプログラムをArduinoに書き込むことで動作させることができるのですが、MATLABを使って動作させることもできます。MATLABを使うことのメリットは、例えば、ホストPCに接続したカメラ映像をMATLABで画像解析し、その結果をもとにArduinoに接続したアクチュエータを動かしたり、Arduinoに接続したセンサの値をMATLABに取り込み、解析した結果を可視化したりなど、様々なシステムを容易に開発できることだと言えます。
Arduinoとの通信は、MATLABおよびSimulinkの両方でできますが、Arduino上でスタンドアロンで動作するプログラムはSimulinkでしか作れないといった違いがあります。両者の違いについては、以下のリンクを参考にしてください。
> Arduino Support from MATLAB and Simulink
本記事ではMATLABを使ってArduinoと通信します。アドオンエクスプローラから「MATLAB Support Package for Arduino Hardware」をインストールしてください。途中、ハードウェアのセットアップを行うか聞かれるのですが、セットアップはスクリプトからもできますので「後でセットアップを」を選択し、インストールを完了して頂いて結構です。
ハードウェア構成
使用するボードは「Arduino UNO R3」です。ホストPCとUSBで接続しています。サーボモータは「Parallax Standard Servo」を使います。Parallax Standard Servoは印加電圧範囲4~6VDC、無負荷時の電流は100mA at 6VDCで、0°~180°まで制御できます。今回は動作確認するだけですので、ボードの5V出力からサーボモータに給電していますが、何かを動かす用途で使用する際は別途サーボモータ用の電源を用意するほうが良いです。
以下に配線図を示します。サーボモータの電源線、グランド線、信号線をそれぞれボードの5V出力ピン、グランドピン、デジタル3番ピンに接続しています。
スクリプト作成
それでは、MATLABスクリプトを書いてArduinoと通信し、サーボモータを動作させましょう。今回はライブスクリプトを使って進めます。MATLABを起動し、ホームタブの「新規ライブスクリプト」を選ぶと、untitled.mlxが開きますので、それにスクリプトを書いていきます。
ボードと接続
arduino関数を使って、ボードと通信するためのオブジェクトを作成します。引数にボードと接続するホストPCのポート名”COM5″(ホストPCのデバイスマネージャーで確認してください)、ボードの種類”Uno”、サーボモータを使用するためにボードにアップロードするライブラリ”Servo”を与えます。
arduinoObj = arduino("COM5", "Uno", Libraries = ["Servo"])
下図の赤枠で囲んだ「セクションの実行」ボタンを押して、セクションを実行します。
ライブラリのアップロードに暫く時間がかかりますが、接続が成功すると以下のように出力されます。
arduinoObj = arduino のプロパティ: Port: 'COM5' Board: 'Uno' AvailablePins: {'D2-D13', 'A0-A5'} AvailableDigitalPins: {'D2-D13', 'A0-A5'} AvailablePWMPins: {'D3', 'D5-D6', 'D9-D11'} AvailableAnalogPins: {'A0-A5'} AvailableI2CBusIDs: [0] Libraries: {'Servo'} Show all properties
サーボモータと接続
先ほど書いたスクリプトの末尾にカーソルを持っていき、右クリックします。出てきたメニューから「セクション区切り」を選択し、新しいセクションにします。そこに、以下のスクリプトを書きます。これはservo関数を使って、サーボモータと通信するためのオブジェクトを作成するものです。引数に先ほど作成した通信用オブジェクトarduinoObjと、サーボモータの信号線を接続したボードのピン名’D3’を与えます。
servoObj = servo(arduinoObj,'D3')
セクションを実行すると、以下のように出力されます。
servoObj = Servo のプロパティ: Pin: 'D3' MinPulseDuration: 5.44e-04 (seconds) MaxPulseDuration: 2.40e-03 (seconds)
サーボモータの制御
「セクション区切り」で新しいセクションにし、サーボモータを制御するスクリプトを書きます。今回はライブエディターの対話型コントロール機能を使ってみましょう。「ライブエディター」タブの「コントロール」ボタンを押すと、配置できるコントローラのメニューが出てきますので、そこから「スライダー」を選択します(下図赤枠部分)。
すると、コントロールの構成画面が表示されます(スライダーを右クリックして「コントロールの構成」を選んでも表示されます)ので、「値」の最小値を0、最大値を180、ステップを1にします。このスライダーを使って、0°~180°を1°刻みで制御させようというわけです。
次に、スライダーの左側をクリックするとカーソルがセクションの先頭に移動しますので、そこに”position = “と書いて、スライダーの値を変数positionで参照できるようにします。
改行して、”writePosition(servoObj, position/180.0)”と書きます。writePosition関数はサーボモータを制御するための関数で、第1引数に先ほど作成したサーボモータとの通信用オブジェクト、第2引数に角度を与えます。この角度は0~1の数値で指定します。スライダーの値は0~180なので、その範囲が0~1に収まるように180.0で割っています。
ここまでの作業で、セクションは以下のようになっていると思います。
それではスライダーの位置を変えてみてください。スライダーの位置が変化すると、それに伴いサーボモータが回転したでしょうか?
終了処理
MATLABワークスペースにオブジェクトが残っていると、新たにオブジェクトを作成するときに競合エラーになります。ワークスペース上の必要のないオブジェクトは、clear関数を使ってこまめに消しておきましょう。
clear servoObj clear arduinoObj
おわりに
本記事ではMATLABを使ってArduinoと通信し、サーボモータを動作させる方法をご紹介しました。MATLABヘルプセンターには、様々なセンサーからデータをホストPCに取得し、分析、可視化する例が掲載させていますので、是非ご活用ください。
最後までお読みいただきありがとうございました。本記事ではご理解できない点が多々あるかと思いますので、ご遠慮なく技術部までご相談いただきますようよろしくお願い申し上げます。また、内容に誤りがございましたらお教えいただけますと幸いです。