メインコンテンツへスキップ
見出し画像

Arduino Opta®(マイクロPLC)の始め方/環境構築

    1.概要

     前回シングルボードコンピュータ(SBC)のArduinoを紹介しました。

    今回はArduinoのArduino Pro シリーズで提供されるArduino Opta®マイクロPLC(プログラマブルロジックコントローラ)を紹介します。

    画像
    https://www.arduino.cc/pro/hardware-arduino-opta/

    1-1.技術用語

     一般知識としての技術用語を紹介します。

     1-1-1.PLCとは

     PLC(Programmable Logic Controlle)とは、大量のリレーから構成させる機器であり要求に応じて電気信号のON/OFFや演算、アナログ・デジタル信号の出力などが出来ます。そのため装置制御のための演算器として用いられます。
    ※製造現場ではPLCだけでなくIPC(Industrial PC:産業用PC)も使用されることがあります。今回はPLCのみの説明となります。

    【コラム:IPCとは】
     IPC(産業用PC)とはプラントや工場などで使用され、耐環境性能や安定稼働に優れた製品であり、I/Oの拡張なども容易に可能です。

    【コラム:DI/DO, AI/AOとは】
     プラント業界において制御や監視システムで"DI/DO、AI/AO"という用語が使用されます。

    画像

    DI/DO, AI/AOの意味は下記の通りであり、信号のやり取りを意味します。

    • DI(Digital Input):デジタル信号(正確には接点)の入力

    • DO(Digital Output):デジタル信号(正確には接点)を入力

    • AI(Analog Input):アナログ信号を入力

    • AO(Analog Output):アナログ信号を出力

    画像

     デジタル信号(DI/DO)というと”Ethernetやシリアル通信のような通信によるデータ”をイメージする人もいると思いますが、このDI/DOはシンプルな0/1の信号(計器用なら0Vと24Vの切り替え)を出力するものであり、つまりは”接点(電気の通り道)の開/閉”を制御しているものとなります。
     接点は大きく分けて無電圧接点と有電圧接点があり、下記の通りです。

    • 無電圧接点:接点がONの状態になっても接点には電圧がかかっていない

      • 例としてスイッチやリレーがある

      • 電源は相手側の機器で用意するため、相手側の回路をオン・オフさせるだけの働きとなる

      • 別名:ドライ接点、DRY接点、乾接点とも呼ばれる

    • 有電圧接点:接点がONの状態になった時、接点にも電圧が印加される

      • 別名:ウェット接点、WET接点、電圧接点ともとも呼ばれる

     アナログ信号(AI/AO)とは最小値と最大値を持つ情報を電圧や電流の大小でやり取りする信号であり、仕様としては下記があります。

    1. 電流信号:電流(mA)を用いたアナログ信号

      • DC4-20mA:データのMIN:4mA, MAX:20mAとして信号を電流で送付する方式。

        • ノイズの影響が小さい、伝送線抵抗の影響がない、1-5V信号に変換が用意(抵抗250Ωを設置), 2線伝送方式センサが可能等の特徴がある

        • 最小値が0mAでなく4mAのため、故障時(0mA)の判断が容易

    2. 電圧信号:電圧(V)を用いたアナログ信号

      • mAと比較して(電圧のため)複数機器に並列接続が可能

      • テスターによる測定が簡単

      • 電圧信号は電圧降下が生じるため長距離伝送には不向き

      • 種類としては「DC1-5V」、「DC0-5V」、「DC0-10V」などがある。

     1-1-2.IEC 61131-3

    IEC 61131-3とは、国際電気標準会議(IEC)が発行したPLC用標準規格 IEC 61131シリーズの第3部です。

     背景としてPLC用のソフトや言語はメーカーごとに開発が行われており互換性がありませんでした。そこで標準化(互換性あり)するために1993年にPLCのプログラミング言語の国際規格「IEC 61131-3」が発行されました。

    画像
    https://www.fa.omron.co.jp/product/special/sysmac/plcopen/iec-61131-3.html

     IEC 61131-3ではPLCのプログラミング言語として、日本で普及しているラダー図を含む、3種類のグラフィック言語(LD/FBD/SFC)と2種類のテキスト言語(IL/ST)が規定されています。

    画像
    プログラミング言語の得意・不得意(出典:JEMA「PLCアプリケーションの開発効率化指針」)

     コラム:DCS/SCADAとは

     PLCのような制御管理システムとして下記があります。プラントや製造業の管理システムに携わる方は用語だけでも覚えておくと便利と思います。

    1. PLC(Programmable Logic Controller):機械を自動的に制御する装置

    2. SCADA(Supervisory Control and Data Acquisition):装置・設備から得られる情報を、ネットワークを利用して一箇所に集めて監視すると共に、必要に応じて制御するシステム

      • 参考ソフトとして「FA-Panel6」がある

    3. DCS(Distributed Control System):分散制御システムの略称で、システムを構成する各機器ごとに制御装置を設けるシステム

    1-2.Arduino PLCとは

     Arduino PLCは「Arduino Pro シリーズ」の中で提供されるPLCであり、設計はFinderと技術提携しています。

    画像
    https://docs.arduino.cc/tutorials/opta/user-manual/

     2024年現在の型式はLite, RS485, Wifiの3種類があり、大きな違いは信号接続の部分です。

    • Opta Lite:EthernetとUSB-C™プログラミングポートを装備

    • Opta RS485:RS485ハーフデュプレックス接続インターフェイスも追加

    • Opta Wi-Fi:最も多目的。Wi-Fi/ BLUETOOTH Low Energy接続機能も搭載

    画像
    https://docs.arduino.cc/resources/datasheets/AFX00001-AFX00002-AFX00003-datasheet.pdf
    画像

    1-3.Opta拡張モジュール

     一般的なPLCはCPU(本体)とは別で、様々なデータの入出力(I/O)追加ができる拡張ユニットを提供しています(参考例:三菱電機のMELSEC)。

     Arduino PLCも同様に入出力やセンサー追加など機能を拡張するモジュールを提供しており、AUX portから簡易に接続可能です。OPTAには最大5module接続でき、それぞれDI=80, AI=30, DO=40, AO=30まで拡張できます。

    1. EMR digital expansion

      • 16 inputs (Digital / Analog 0-10V)

      • 8 outputs EMR 6 A

    2. SSR digital expansion

      • 16 inputs (Digital / Analog 0-10V)

      • 8 outputs SSR 3 A

    3. Analog expansion

      • 6 inputs (4 x 0-10V / 4-20mA + 2 x PT100/1000)

      • 6 outputs (2 x 0-10V/4-20mA + 4 PMW)

    画像
    https://www.arduino.cc/pro/hardware-arduino-opta-expansions/
    画像

     他にパワーサプライ(Finder 78.12.1.230.2400 power supply)も供給されています。こちらは代替ができるので説明は省略します。

    1-4.OPTAの技適

     技術基準適合証明(技適)とは、総務大臣の登録を受けた者等が、特定無線設備について、電波法に定める技術基準に適合しているか否かについての判定を無線設備1台ごとに行う制度です(制度の概要(登録証明機関一覧))。
     「Arduino S.r.l.」で確認できる機種は下表の通り。
    2024年8月現在でArduino OPTA WIFIモデルが見当たらないので、おそらく国内で使えないと思います。

    画像

    2.Arduino OPTA仕様

     各モデルで基本的な仕様は同じであり、大きな違いは通信規格の有無となります。詳細は公式Docsをご確認ください。

     内部構造は下記記事参照のこと。

    2-1.概要

     特徴は下記の通り。

    画像
    Opta™ WiFi main components
    画像

    2-2.Pinout

     参考としてRS485記載

    画像
    https://docs.arduino.cc/resources/pinouts/opta-full-pinout.pdf

    2-3.データシート

     一部抜粋

    画像
    https://docs.arduino.cc/resources/datasheets/AFX00001-AFX00002-AFX00003-datasheet.pdf

    2-4.回路図

    画像
    画像

    3.製品の購入

    3-1.購入先に関して

     基本的にはRaspberry PiやArduinoの購入先と同じ(例:秋月電子やSwitch Scienceなど)で購入すれば問題ないです。

    3-2.購入品

     最低限の動作確認のため、本体購入+周辺機器の準備をしました。本体はWifiモデルまではまだ使わないのでRS485モデルを選定しました。

    1. Opta™ RS485:私は秋月電子で「Arduino Opta RS485」購入

    2. USB-C® cable: ※手持ちの適当なやつがそれでもOK

    3. +12-24 VDC/0.5 A power supply:手持ちのOMRON S8FS

      • 詳細は「<学習シリーズ>電子工作編:直流(DC)電源の作り方」参照

    画像

    3-3.Option

     おそらくOPTAの前にRaspberry PiかArduinoを通過しているはずなので、細かい部品はすべて揃っているものとします。
     やりたいことに応じて別途準備していけばよいと思います。

    4.Arduino PLCの環境構築

     Arduinoの環境構築方法について説明します。今回は取り急ぎ下記で使用したArduino IDEをベースに開発してみます。

    4-1.IDE (統合開発環境)の設定

    公式推奨(互換性保証)のソフトウェアは下記の通りです。

    画像
    https://docs.arduino.cc/hardware/opta/#compatibility

     他のPLCツールも含めて箇条書きにしました。好きなソフトウェアを選択したらよいですが、本記事では主にArduino IDEを使用していきます。

    1. Arduino IDE:「Arduinoの始め方/環境構築」参照

    2. Arduino CLI:「Arduinoの始め方/環境構築」参照

    3. IoT Cloud:ー

    4. Cloud Editor:”Getting Started with Arduino Cloud”参照

    5. Arduino PLC IDE:IEC 61131-3準拠のArduino公式ツール

    6. CODESYS(IEC61131-3準拠):1994年にドイツのCODESYS社から発表されたPLCソフトウェア。日本の代理店はLINX社。

    7. Open PLC Editor:IEC 61131-3に準拠したオープンソースのPLC開発を目指した「OpenPLC Project」で提供されるPLCソフトウェア

    画像
    https://primemotion.com/software-plc/

     4-1-1.Arduino IDE

     環境構築は下記記事4-2節の通りです。追加対応が必要な箇所(※印)は補足しました。

    1. Arduino IDEインストール

    2. 日本語の設定

    3. Board Package追加※

    4. Port/Boardの選択※

      • Port選択※:適切なCOM番号を選択(事前にPCとOptaはUSB接続済)

      • Board選択※:Optaを選択

    5. 確認:ウィンドウ右下に選択したボード(Opta)表示を確認

    画像
    画像

     4-1-2.Arduino PLC IDE

     公式Docs「Arduino® PLC IDE Setup & Device License Activation」に従って環境構築を実施します。
    ※私の環境だと最後のConnectがエラーが出ました。公式Docsに従って実装しましたが他の方も同様のエラーがあるみたいですので実装は途中で中止しました。参考用として途中結果まで記載しておきます。
    ※実装はWindowsのみであり、OSは10以上が必要です。
    ※”Portenta Machine Control”を使用する方はプロダクトキーによるライセンス有効化が必要です。Optaは不要のため本項では除外しました。

    【要領1:Arduino PLC IDE Setup(初回のみ)】
     まずは「公式Software」ページに移動し、Arduino PLC IDE Installerをダウンロードします。本インストーラーはドライバー、ライブラリ、コアなどを含んでいます。
     インストール時の途中ページは全て「JUST DOWNLOAD」でよいです。

    画像

     ”Arduino-PLC-IDE-Installer_x.x.x_Windows_64bit.exe”を実行し、すべてデフォルトで実行します。この処理で「PLC IDE Tools」と「PLC IDE software」がSetupされます。

    画像

     スタートページにあるArduino PLC IDEを実行しWelcome Screen(下図)が確認できれば完了です。

    画像

    【要領2:プロジェクト作成】
     これ以降はArduino PLC IDEの使い方になります。
     まず「File > New Project」を選択するとNew projectウィンドウが開きます。必要な情報を入力("Case sensitive"はON)し、OKボタンを押します。

    画像

     画面が変わったら、左パネルの"Resource"タブを押し、Configuration内の機器名(Opta)をクリックします。右側に”Boards configuration page”が出たらOKです。
    ※私の場合は最初からConfigurationのページは開かれてました。

    画像

    【要領3:Runtimeのダウンロード】
    BoardはPLC IDEと通信するために”run a specific program (runtime)”が必要になります。RuntimeはPLC IDEをアップデートしたら毎回ダウンロードが必要になります。

     Configurationページ下のOtherに移動し、USBで接続したOptaのシリアルポートを選択してDownloadボタンを押します。
    ※次のウィンドウで出るようにDownloadは数分以上かかります。

    画像

     RuntimeのDownloadが完了すると、初期に存在したポートに加えてModbus通信用の別ポート(virtual port)が出現します。virtual portのポート番号は基本的に一番大きな番号の物になります。
     このvirtual portは次のステップで使用します。

    画像

    【要領4:機器との通信】
    Runtime完了後に、「On-line > Set up communication」を選択すると、DeviceLinkManager Configウィンドウが開きます。
     そこでModbus protocolのプロパティを選択し、Port番号が適切であることを確認してからOKを押します。

     この時、基本的にデフォルトポートの選択でよいはずですがうまくいかない場合は別ポート(virtual port)にするとうまくいくことがあるみたいです。

    画像
    画像

     最後に「On-line > Connect.」を押し、機器との通信をします。

    画像

     ここでウィンドウ右下にエラーが出なければ成功です。
    ※現在エラーが取れないため、確認中です。

    【コラム:エラー対応|Runtime/機器との通信】
     Runtimeと機器との通信でそれぞれエラーが発生したのでご参考までに。

    画像
    左:RuntimeのDownload時エラー、右:Connect時のエラー

     Runtimeのエラーは公式や下記記事にある通りOpta本体のRESETボタンを2回クリックして再実行するとうまくいくことがあります。私は2回くらい試したらうまくいきました。

    画像

     機器との通信エラーは記事にいくつか記載がありました。とりあえずどれかを試してみるとうまくいくかもしれません。

    1. 最新版のArduino PLC IDEを入れる(出典:If you're having trouble connecting a device to PLC IDE)

    2. Baud rateを9600に変更(出典:PLC IDE cannot connect to OPTA)

    3. Device Addressが247であることを確認(出典:Program the Arduino OPTA as a ModbusTCP PID Controller)

    4. Virtual Port(2個目のポート)を選択していなかった(出典:PLC IDE and Arduino OPTA - cannot connect)

    5. とにかく待つ(出典:Qiita Arduino Opta 備忘録)

    【要領5:Pre-Licensed Products (Opta™)のライセンスアクティベート】
     追って

     4-1-3.OpenPLC Editor

     OpenPLCのDownloadページに移動し、自分のPCにあったインストーラーを選択し、ダウンロードしたexeファイルを実行します。exeファイルはinstallボタンを押すだけとなります。

    画像
    https://autonomylogic.com/download
    画像

     使い方は公式Docsの「Docs/1. Get Started/1.1 OpenPLC Overview」参照

    4-2.電源の供給

     OPTAに電源供給します。公式Docsより複数の方法があります。基本的にUSBケーブルだけで動作可能ですが、OUTPUTリレー使用時は別途外部電源が必要になります。

    • USB-C® cable:

      • 基本的にはプログラミング用のみで使用

      • USBケーブルのみだとOptaの出力ポート(relay outputs)からは出力されない

    • 12~24 VDC power supply:

      • ユーザーマニュアルのpinout sectionを確認し、設置ミスが無きこと

    画像

     外部電源の供給方法は下図の通りです。

    画像
    画像

    5.マニュアル・チュートリアル

    5-1.Arduino Opta

     公式Docsのチュートリアルページは下記の通りです。

    画像
    https://docs.arduino.cc/hardware/opta/#tutorials

    5-2.Arduino言語

     下記参照のこと

    6.QuickStart(Arduino IDE)

     公式Docs+記事を参考にしながらArduino IDEで動作検証してみました。

    6-1.Lチカ初級編:RESET LED

     OptaのHello World(一番簡単な動作確認)としてLED点灯を実装します。設計思想は下記の通り。

    1. LED_BUILTIN(RESETボタン上のLED)を出力に設定

      • 公式Docsのpinoutに”LED_BUILTIN”の記載が無いため出典不明

      • pinout記載の”LED_RESET”や”LEDR”でも動作確認済み

    2. loop()で0.5s毎に指定LEDの電圧をON/OFFする

    [sample.ino]
    void setup() {
      //LED_BUILTINはRESETボタン上の緑のLED
      pinMode(LED_BUILTIN, OUTPUT);
    }
    
    void loop() {
      digitalWrite(LED_BUILTIN, HIGH);
      delay(500);
      digitalWrite(LED_BUILTIN, LOW);
      delay(500);
    }
    

     上記と同類のコードは「ファイル/スケッチ例/01.Basics/Blink」からでも選択可能です。

    画像

     検証(Verify)/書き込み(Upload)を実行するとプログラムがOPTAに書き込まれ、Lチカが確認できました。

    画像

     LED_BUILTINをLEDRに変更するとLEDは赤く点灯しました。

    画像

    6-2.Lチカ中級編:User LEDs

     Optaには4つの”user-programmable LEDs”があります(※WifiモデルのみLED_USERが追加)。このLEDを使用して状態を表すことも可能です。

    画像

     サンプルコードの設計思想は下記の通り。参考までにfor文を使って行数を少なくしたコードも記載しました。

    1. 各LEDを左から順に0.5sec毎に点灯

    2. 全LEDが点灯したらすべてを消灯し、それを繰り返す。

    [Sample.ino]
    void setup() {
      // 初期設定
      pinMode(LED_D0, OUTPUT); //STATUS1 LED
      pinMode(LED_D1, OUTPUT); //STATUS2 LED
      pinMode(LED_D2, OUTPUT); //STATUS3 LED
      pinMode(LED_D3, OUTPUT); //STATUS4 LED
    }
    
    void loop() {
      //LEDを順番に点灯
      digitalWrite(LED_D0, HIGH);
      delay(500);
      digitalWrite(LED_D1, HIGH);
      delay(500);
      digitalWrite(LED_D2, HIGH);
      delay(500);
      digitalWrite(LED_D3, HIGH);
      delay(500);
      // 全LEDを消灯
      digitalWrite(LED_D0, LOW);
      digitalWrite(LED_D1, LOW);
      digitalWrite(LED_D2, LOW);
      digitalWrite(LED_D3, LOW);
      delay(500);
    }
    [Sample.ino(for文使用)]
    //グローバル変数定義
    int ledPins[] = {LED_D0, LED_D1, LED_D2, LED_D3}; //配列型:LEDピン
    int numLeds = sizeof(ledPins) / sizeof(ledPins[0]); //LED数
    
    void setup() {
      //全pinをOUTPUTに出力
      for (int i=0; i < numLeds; i++){
        pinMode(ledPins[i], OUTPUT);
      }
    }
    
    void loop() {
      //LEDを順次点灯
      for (int i=0; i < numLeds; i++){
        digitalWrite(ledPins[i], HIGH);
        delay(500);
      }
      //LEDを全消灯
      for (int i=0; i < numLeds; i++){
        digitalWrite(ledPins[i], LOW);
      }
    }
    画像

    【参考:ランダムにLEDを点灯させるスクリプト】
     LEDをランダムに点灯させるスクリプトを(思いついたので)作成してみました。設計思想は下記の通り。

    1. randamSeedで乱数固定:analogRead(0)で未接続ピンのノイズを利用

    2. 各LEDに乱数で取得した0/1(LOW/HIGH)を割り当て

      • 各LEDに乱数値を与えるため点灯するLEDもランダム

    3. 点灯終了したらリセットとして全LEDを消灯

    [Sample.ino]
    // グローバル変数定義
    int ledPins[] = {LED_D0, LED_D1, LED_D2, LED_D3}; // 配列型:LEDピン
    int numLeds = sizeof(ledPins) / sizeof(ledPins[0]); // LED数
    
    void setup() {
      // 全pinをOUTPUTに設定
      for (int i = 0; i < numLeds; i++) {
        pinMode(ledPins[i], OUTPUT);
      }
      
      randomSeed(analogRead(0)); // ランダムシードを設定(アナログピン0のノイズを利用)
    }
    
    void loop() {
      // 各LEDの状態を無作為でHIGH/LOW選択
      for (int i = 0; i < numLeds; i++) {
        int randomState = random(0, 2); // 0か1のランダムな値を生成
        digitalWrite(ledPins[i], randomState); // ランダムにHIGH or LOWを設定
      }
      
      delay(500); // 500ミリ秒間ランダムな状態を維持
      
      // 全部消灯(リセット)
      for (int i = 0; i < numLeds; i++) {
        digitalWrite(ledPins[i], LOW); // すべてのLEDを消灯
      } 
    }
    画像

    6-3.プログラマブルボタン(User Button)

     Optaはオンボードのプログラム可能なボタン(Pin名:BTN_USER)が搭載されています。ボタンは内部プルアップ抵抗を持ち、デフォルトではHIGHとなります(つまりボタンはB接点)。

    画像
    https://opta.findernet.com/en/tutorial/getting-started

     今回は下記記事を参照し、ボタンの押した回数に応じてSTATUS LEDの状態を変更するスクリプトを作成しました。設計思想は下記の通り。

    1. 特定の状態を確認・保持できる変数を用意

      1. ButtonState:Programmable buttonのON/OFF状態を確認

      2. counter:ボタンが押された回数を保持

    2. ボタンが押された回数に応じて異なる動作を実行する変数を作成

      • void changeLights():デフォルトは全消灯、1回押すと左から点灯し5回目でデフォルトに戻る

    3. デバウンス(ボタンを押したときに発生するノイズによる誤動作を防ぐための処理)として、100ミリ秒の遅延を挿入

    [Sample.ino]
    //グローバル変数 
    int buttonState = 0;  // ボタンの状態を保持する変数
    int counter = 0;      // LEDのカウンター変数
     
    void setup() {
      // OPTAのLEDを初期化
      pinMode(LED_D0, OUTPUT);
      pinMode(LED_D1, OUTPUT);
      pinMode(LED_D2, OUTPUT);
      pinMode(LED_D3, OUTPUT);
      pinMode(BTN_USER, INPUT); // ボタンを入力モードに設定
    }
     
    void loop() {
      buttonState = digitalRead(BTN_USER);  // ボタンの状態を読み取る
      
      // ボタンが押されたら(状態=LOW)counterの値を+1
      if(buttonState == LOW){
        if(counter < 4){ 
          counter++;
        }
        else{
          counter = 0; // カウンターが4に達したらリセット
        }
        delay(100); // デバウンス対策のための遅延
      }
      
      changeLights();  // LEDの状態を変更
    }
     
    //カウンターに基づいてSTATUS LEDを制御する関数
    void changeLights() {
      switch(counter){
        case 0:
          digitalWrite(LED_D0, LOW); // LED D0消灯
          digitalWrite(LED_D1, LOW); // LED D1消灯
          digitalWrite(LED_D2, LOW); // LED D2消灯
          digitalWrite(LED_D3, LOW); // LED D3消灯
          break;
        case 1:
          digitalWrite(LED_D0, HIGH); // LED D0点灯
          break;
        case 2:
          digitalWrite(LED_D1, HIGH); // LED D1点灯
          break;
        case 3:
          digitalWrite(LED_D2, HIGH); // LED D2点灯
          break;
        case 4:
          digitalWrite(LED_D3, HIGH); // LED D3点灯
          break;
      }
      delay(100); // LED状態の変更後に少し待機
    }

     結果は下記の通り。昔の扇風機みたいに、ボタンの押す回数で動作を変えたりデフォルトに戻したり制御っぽいことができることが確認できました。

    • ボタンを押すとSTATUS LED1▶2▶3▶4と点灯し、5回目で全消灯

    • デバウンス対策+changeLights関数で0.2秒ほどdelayを設定しているため、それ以上の高速でボタンを押しても反応しない

    画像

    6-4.入力信号(DI, AI)

     Optaは8つの”analog/digital programmable inputs”を持っており、ピンマップは下図の通りです。InputはDIとAIで異なります。

    • Digital Input:DC0~24Vで取得

    • Analog Input:DC0-10Vで取得

      • Datasheetより”Analog Input resolution=12...16 bits - User configurable”

      • analogReadResolution()で設定可※本記事では16bitで使用

    画像
    Analog/digital input terminals map

     確認用の「直流電源」は、①パワーサプライ(DV24V)、②ACアダプター+”2.1mm標準DCジャック⇔スクリュー端子台”を付けジャンパー線とつないだものを使用しました。

     6-4-1.Digital Input

     Arduino OptaのDI仕様はDatasheetより下記の通り。
    ※VIL(Input Low Voltage):この値以下をLOWと認識する電圧
    ※VHL(Voltage at High Line)???

    画像
    https://docs.arduino.cc/resources/datasheets/AFX00001-AFX00002-AFX00003-datasheet.pdf

     設計思想は下記の通り。

    • 取得したDI値をシリアルモニターで確認するためにSerial.print()を使用

    • デジタル(※0/1)値はdigitalRead(pin)で取得

    [Sample.ino]
    void setup() {
      Serial.begin(9600);
      pinMode(A0, INPUT);
    }
    
    void loop() {
      int DI_0 = digitalRead(A0);
      Serial.print("I1=");
      Serial.println(DI_0);
      delay(500);
    }

     実験は1.DC24V(左図)と2.DC5V(右図)で実施しました。

    画像

     DC24Vの結果は下記の通り、電源供給したタイミングで出力が0->1に変化することを確認できました。
     なおDC5Vでは出力が0から変化しませんでした。理由としてはDIの閾値が5Vより大きいため今回の電源(5V)ではHIGHと認識しなかったためと思います。
    ※Digital Input Voltage logic levelのVIL=4.46VDCなのでギリギリ反応すると思ったのですが、VHLの方を見ないといけないかもしれません。

    画像

     6-4-2.Analog Input

     Arduino OptaのAI仕様はDatasheetより下記の通り。

    画像
    https://docs.arduino.cc/resources/datasheets/AFX00001-AFX00002-AFX00003-datasheet.pdf

     下記参考にし、アナログ入力(AI)を実装しました。設計思想は下記の通り。

    • 取得したAI値をシリアルモニターで確認するためにSerial.print()を使用

    • アナログ値はanalogRead(pin)で取得

    • 得られたデジタル値を電圧に換算

      • デジタル値は12ビット(4095)~16ビット(65535)で設定可能

      • 得られるデジタル値を0-10Vにスケーリング

      • デジタル値は0から開始されるため-1を引く

      • 基準の電圧が3Vなのが分からないので追って修正(公式Docsだと3.3Vを使用しているがスケーリングすると10Vにならないためこちらも不明)

    電圧[V]=取得値(デジタル)×基準電圧最大bit数−1× スケーリング=16bit値×3.0216−1×103=16bit値×3.065535×0.3=16bit値×10.065535\begin{aligned} 電圧[V] &=取得値(デジタル) \times \frac{基準電圧}{最大bit数-1} \times  スケーリング\\ &=16bit値\times \frac{3.0}{2^{16}-1}\times \frac{10}{3} \\ &=16bit値\times \frac{3.0}{65535}\times 0.3 \\ &=16bit値\times \frac{10.0}{65535} \end{aligned}

    【実験風景】
     実験時は直流電源の-はOptaのGNDに差しっぱなしにして、+はA0の方に抜き差ししました。

    画像
    画像

    【コード&OUTPUT】
     公称値5Vの直流電源に対して4.9Vで検出できているため十分な結果だと判断できます。

    [Sample.ino]
    void setup() {
      // シリアル通信を設定
      Serial.begin(9600);
    
      // アナログ入力の分解能を16bitに設定
      analogReadResolution(16);
    }
    
    void loop() {
      // 1chの電圧取得
      int ValueA0 = analogRead(A0);
      float volA0 = ValueA0 * (3.0 / 65535.0)/ 0.3; //10V=65535
      Serial.print("I1 value: ");
      Serial.println(ValueA0);
      Serial.print("I1 Vol: ");
      Serial.print(volA0, 5); 
      Serial.println("V");
    
      delay(1000);
    }
    画像

    6-5.Output Relays

     まず基本的なリレーの仕組みは下記記事参照のこと。

    【概要】
     Optaの出力の特徴は下記の通り。

    • リレーはNormally Open (NO)の電気機械式

    • 容量は250V AC, 10Aであり、最大電圧は400V

    • Opta™出力コンタクトは「クリーン」コンタクトで、「非接続」シナリオではこれらは生きていないこと※直訳してますが、意味が理解できていないため追って修正

    画像
    https://opta.findernet.com/en/tutorial/getting-started
    画像
    https://docs.arduino.cc/resources/datasheets/AFX00001-AFX00002-AFX00003-datasheet.pdf

    【事前準備:電源供給】
     4-2節で説明の通り、Outputリレーを使用するにはUSBとは別で12~24Vの外部電源が必要です。今回はパワーサプライを使用して下記の通り外部電源を供給しました。

    画像

     出力確認用として出口側にはLED点灯ラインを作成しました。LEDの詳細は下記記事ご確認ください。

    画像

    【使用方法】
     Outputリレーを使用するには①pinMode(relayOutput, OUTPUT)でピン設定、②digitalWrite(relayOutput, LOW/HIGH)で接点切り替え を実施します。

    [Sample.ino]
    void setup() {
      pinMode(D0, OUTPUT); //D0リレーの出力設定 
      pinMode(LED_D0, OUTPUT); //STATUS-LED(Users LED)の設定
    }
    
    void loop() {
      //OUTPUT RelayとLEDをON
      digitalWrite(D0, HIGH);
      digitalWrite(LED_D0, HIGH);
      delay(1000);
      //OUTPUT RelayとLEDをOFF
      digitalWrite(D0, LOW);
      digitalWrite(LED_D0, LOW);
      delay(1000);
    }

     実行すると2秒ごとにリレーの切り替え音(カチカチ)が聞こえます。リレーは無電圧接点(ドライ接点)※のためテスターで確認しても電圧はありません。
    ※自身に電源を保有していない接点

     参考としてOUTPUTリレーにDC5VでLEDのラインを作成しました。結果として1秒ごとに点灯/点滅を繰り返します。これはOPTAのリレー(接点)が1秒ごとにOPEN/CLOSEを繰り返しているためです。

    画像

    6-6.通信

     Arduino Optaではモデルにより下記通信が可能です。通信により各機器や計器(センサ)、インターネットなど様々な箇所と接続や情報交換が可能になります。

    • Ethernet

    • RS-485

    • Modbus(RTU/TCP)

    • Wi-Fi®

    • Bluetooth Low Energy®

     6-6-1.Ethernet

    Ethernetとはデバイスを接続してローカルエリアネットワーク (LAN) を構築する際によく使用されるネットワークプロトコルの1つです。
     事前準備として、RJ45型コネクタ部分にLANを差し込みます。

    画像
    Onboard RJ45 connector in Opta™ devices

    【Arduino_JSON Library for Arduinoライブラリ追加】
     HTTPクライアントで得られたJSONからkey IP詳細(IP address, city, region, and country)を抽出するために”Arduino_JSON library”を追加します。

    画像
    画像

    【参考用スクリプト作成】
     ”Arduino Mbed OS Opta Boards”はEthernetを使うためのbuilt-in library:Ethernet libraryを持っています。今回は「ip-api.com」にHTTPクライアント※HTTPクライアント^{※}のGETリクエストを送信します。
    ※HTTPクライアントは「Pythonライブラリ(HTTP):Requests」参照のこと

     戻ってきたJSONオブジェクトを”Arduino_JSON library”を使用して重要な情報だけ抽出しました。

    [Sample.ino]
    // built-in libraryのインクルード
    #include <Ethernet.h>
    #include <Arduino_JSON.h>
    
    // サーバーアドレス (ip-api.com)
    const char* server = "ip-api.com";
    
    // IP詳細を取得するためのAPIエンドポイントパス
    String path = "/json/";
    
    // Optaデバイスの静的IP設定
    IPAddress ip(10, 130, 22, 84);
    
    // 通信用のEthernetクライアントインスタンス
    EthernetClient client;
    
    // 取得したデータを保存および処理するためのJSON変数
    JSONVar doc;
    
    // データを一度だけ取得するための変数
    bool dataFetched = false;
    
    void setup() {
      // シリアル通信を115200ボーで開始
      Serial.begin(115200);
    
      // シリアルポートが接続されるのを待機
      // (ネイティブUSBを持つボードで必要)
      while (!Serial);
    
      // DHCPを介してEthernet接続を試行
      // DHCPが失敗した場合は、診断メッセージを表示
      if (Ethernet.begin() == 0) {
        Serial.println("- DHCPを使用してEthernetの構成に失敗しました!");
    
        // 静的IPアドレスを使用してEthernetを構成
        Ethernet.begin(ip);
      }
      delay(2000); // 2秒間の遅延
    }
    
    void loop() {
      // データが既に取得されていないことを確認し、
      // Ethernetリンクがアクティブであることを確認し、
      // サーバーへの接続を確立し、
      // HTTP GETリクエストを送信する
      if (!dataFetched) {
        if (Ethernet.linkStatus() == LinkON) {
          if (client.connect(server, 80)) {
            client.print("GET ");
            client.print(path);
            client.println(" HTTP/1.1");
            client.print("Host: ");
            client.println(server);
            client.println("Connection: close");
            client.println();
    
            // HTTPヘッダーをスキップしてJSONデータまで待機
            char endOfHeaders[] = "\r\n\r\n";
            client.find(endOfHeaders);
    
            // JSONレスポンスを読み取り、解析
            String payload = client.readString();
            doc = JSON.parse(payload);
    
            // 解析が成功したかを確認
            if (JSON.typeof(doc) == "undefined") {
              Serial.println("- 解析に失敗しました!");
              return;
            }
    
            // IP詳細を抽出して表示
            Serial.println("*** IP詳細:");
            Serial.print("- IPアドレス: ");
            Serial.println((const char*)doc["query"]);
            Serial.print("- 市: ");
            Serial.println((const char*)doc["city"]);
            Serial.print("- 地域: ");
            Serial.println((const char*)doc["regionName"]);
            Serial.print("- 国: ");
            Serial.println((const char*)doc["country"]);
            Serial.println("");
    
            // データが取得されたことをマーク
            dataFetched = true;
          }
          // 処理が終わったらクライアント接続を停止
          client.stop();
        } else {
          Serial.println("- Ethernetリンクが切断されています!");
        }
      }
    }
    

     コードの詳細までは理解できませんが、LANケーブルをつないだ状態で実行するとip-api.comからの情報を抽出したことを確認できました。

    [Output(LANケーブル接続前)]
    - Ethernetリンクが切断されています!
    
    [Output(LANケーブル接続後)]
    *** IP詳細:
    - IPアドレス: 126.219.196.151
    - 市: Minato-ku
    - 地域: Tokyo
    - 国: Japan
    画像

     6-6-2.RS-485

     RS-485は2つのOptaや別機器の接続などに使えそうです。詳細は下記リンク参照のこと

    画像
    https://docs.arduino.cc/tutorials/opta/getting-started-with-rs485/
    [Sample.ino]
    -

    7.QuickStart(Open PLC Editor)

     「QuickStart(Arduino IDE)」と同じ内容をOpen PLC Editorでも実装してみます。※追って追記予定



    別添

    別添1:Arduino PLC(Opta)

    別添2:環境構築関係

    別添3:参考記事

    別添4:回路記号



    あとがき

     Raspberry PiとかArduinoでもできるんだろうけど、下記機能のおかげで電子工作を超えて本格的な制御機器っぽくなってきた!!
    ※その分電気事故のリスクもあがるけど

    1. デフォルトでDI/DO, AI/AOがある

    2. 制御用のボタン付き

    3. LEDが複数実装(状態表示)

    4. 拡張モジュール追設可能

    5. DC24Vが扱える

     そろそろ家電製品や機器などに繋いで制御させてみたいけど、仕事忙しすぎて時間がない・・・・・

    更新履歴

    • 2024年8月3日:作成開始

    • 2024年8月11日:初版発行

      • 追記予定:DI,AI、リレーの結果確認

      • OpenPLC Editor

    • 2024年8月12日:Arduino PLC IDEのSetup更新

      • Connectエラーが取れないので途中で一旦中止

    • 2024年8月13日:OpenPLC Editor追加

      • OpenPLC Runtimeは追って

    • 2024年8月18日:6章のDI/DO, AI/AO部分を追加

      • Digital Input追加

      • Analog Input追加

      • Output Relays追加


     
     

    KIYO

     
     
    普段は製造業で企画/開発/設計しております。記事はプログラミング・機械学習、IoT関係の記事をメインで作成し、なるべく1つの記事で知りたいことを網羅していきます。内容は学術的より実装・アウトプット(ほしくなるもの)を重視して作成しています。 面白そうな仕事があればやりたいです!

    あなたへのおすすめ