RTno (RT-middleware + arduino)

組み込みマイコン用RTC開発キット「RTno(アールティーノ)」を開発しました.

ROBOMEC2011での発表資料:
原稿(PDF)
ポスター(PDF)
SI2011での発表資料:
スライド (SlideShare)

ニュース:
RTno Release 4.0をリリースしました.Ethernetへの対応が遅れていますが,プロトコル仕様を見直し,プロキシRTCを改良して通信の安定性が増しました.mbedではRTnoV4で検索してください.

RTno Release 3.0をリリースしました.EthernetシールドやTimer1の実行コンテキストに対応しています.
ぜひ,対応シールドとArduinoを使って,exampleを試してみてください.

mbedに対応しましたー!!
mbed用RTnoライブラリURL
mbed用RTnoテスト用プログラム

※入門記事を準備中です.しばしお待ち下さい.更新情報などはTwitterの@ysugaで.Follow me!

概要
組み込みマイコンボード「Arduino」を使い,簡単にRTCに対応したデバイスを作るためのライブラリです.

1.RTミドルウエアとは

RTミドルウエアとは,分散オブジェクト技術に基づいたロボット用の共通プラットフォーム規格です.RTミドルウエアはネットワークロボティクスや,その他のRTコンポーネントと呼ばれるロボット要素の統合利用を簡単化します.このRTコンポーネント規格はOMG(Object Management Group)によって議論および定義されています.

2.arduino(あるでぃーの)とは

arduino (アルディーノ,アルドゥイーノ)は,オープンソースの組み込みプロトタイピング用のプラットフォームで,ハードウエアはAtmelのAVRマイコンを使い,その回路図やブートローダなどはオープンソースのライセンスに基づいて公開されています.

3.RTno(あーるてぃーの)とは

RTno (アールティーノ)は,RTコンポーネントとarduino(もしくはarduinoコンパチのデバイス)との間の通信を簡単化します.

下図をご覧ください.RTnoパッケージはarduino用のライブラリ「RTno」と,それと通信する「RTnoProxy」というRTコンポーネントのセットです.もし,arduinoのテンプレートに従ってプログラムをすれば,RTnoはRTnoProxyを通して,他のRTコンポーネントと通信出来ます.

もう少し詳しく説明しましょう.通常の組み込みデバイス開発では,デバイス開発者は組み込みマイコン側の開発と,それをPCに接続して使うためのAPI関数の両方を開発し,他の開発者に提供していました.下図における赤色の部分です.

さらにそれを使うユーザ)黄色部分)は,デバイス開発者のAPI関数を使ってデバイスを使うプログラムを作成します.API関数は組み込みデバイスと,ホスト(通常はPC)との通信をカプセル化しますが,システムインテグレータは,このようなAPI関数のドキュメントをたくさん,しかも注意深く読む必要がありました.

さらに別のデバイスを使うプログラムを作った場合,そのプログラムとの通信部分もユーザが作成する必要があります.

これはRTミドルウエアを使うと,ユーザの苦労は減ります.RTミドルウエアは,システムインテグレータに共通化されたプラットフォームを提供するので,通信部分の実装を簡単にすることが出来,デバイス毎のRTCを使えば良いことになります.下図の黄色部分が減りましたよね.

でも,デバイス開発者は,API関数と同時にRTコンポーネントも開発しなくてはならなくなりました.赤色部分が増えましたよね.

しかしRTnoを使えば,デバイス開発者は,PC側のRTC開発に触れる必要が無くなり,arduinoマイコンボードのプログラミングのみに専念出来ます.RTnoライブラリがRTnoProxyというRTコンポーネントとarduinoとの間の通信をカプセル化するからです(緑色).RTnoProxyはarduinoに書き込まれたプログラムからRTCの情報(ポートの数やタイプ)を受け取り,自動的にRTCのインターフェースを変更します.また,他のRTCとarduinoの間の通信はすべて隠ぺいされるため,floatやdoubleなどの型をそのままarduinoと他のRTCの間で通信している感覚でプログラミングが出来ます.

さらに,自分自身がユーザの場合は,他のコンポーネントと通信するポートをarduinoマイコンプログラム上に実装してしまえば,ユーザープログラムを書く必要が無くなります.RTnoを使えば最速のシステム・プロトタイピングが可能です.

もちろん,arduinoは8ビットマイコンのAVRを使っていますから,その限られた性能ではRTnoはリッチ過ぎると思いますが,これからRTミドルウエアに触れるという方や,RTミドルウエアは分かるけど,使えるデバイスが無い,という方には,安価で簡単にI/O制御が出来るデバイスをRTCと簡単に接続できるという点でメリットが大きいと思って作りました.

従って「RTno」はRTミドルウエアのユーザでマイコン等の初心者であれば,arduino初心者のための素晴らしいプログラミングツールとなります.なぜならば,RTコンポーネントのプログラミングにそっくりな方法でプログラミングができ,さらに他のRTコンポーネントとの通信方法を提供することが出来るからです.

また,arduinoユーザにとっては,RTnoはarduinoとPCとの通信を簡単化するツールとなり,より高度で洗練されたRTツールとの接続性を増します.RTCプログラミングへの入門ツールとしても使っていただけるのではないでしょうか?

ダウンロード

最新のv4.0がリリースされました.

RTno (arduino側のライブラリ)

arduino-1.0以降でサポート.
GITHUB: https://github.com/ysuga/RTno

RTnoProxy (PC側の実行ファイル)

GITHUB: https://github.com/ysuga/RTnoProxy
インストーラ (2014/11/30): RTnoProxy
旧バージョン:

インストーラ (Win):
OpenRTM-aist 1.1.0 対応RTnoProxySetup_v016.zip

RTno_Ichi10

インストーラ (Win):

OpenRTM-aist 1.1.0 RC3対応:RTnoProxySetup_OpenRTM1.1RC3
OpenRTM-aist 1.0 Release対応:RTnoProxySetup_OpenRTM1.0

RTnoProxySetup015.zip
RTnoProxySetup014.zip
RTnoProxySetup013.zip
RTnoProxySetup011

インストール

1.OpenRTM-aistの準備

OpenRTM-aistの公式サイトから,OpenRTM-aist C++版をインストールします.サイトのトップからダウンロードできるインストーラで,すべてインストールされます.

2.arduinoの準備

arduinoの公式サイトから,arduino-1.0をダウンロードし,展開して任意のフォルダに配置してください.僕は通常はCドライブの直下に置いて,デスクトップやスタートメニューにarduino.exeに対するショートカットを配置しています.

3.RTnoのダウンロードと展開

GITHUBよりRTnoをダウンロードします.
https://github.com/ysuga/RTno
GITHUBからダウンロードする場合は,以下の図のリンクからダウンロードします.

展開すると,ysuga-RTno-XXXX (XXXXはコミットバージョン)が生成されます.
このフォルダの名前をRTnoに変更してください.

RTnoフォルダの直下には以下のファイルがあります.

  • example ・・・ RTnoの実装例
  • RTno.h ・・・ RTno本体の宣言
  • RTno.cpp ・・・ RTnoのメインルーチン
  • その他のソースコード

ファイルの展開ソフトによっては自動的に中間フォルダが生成されることがありますが,RTnoフォルダの直下にRTno.hなどのファイルがおかれる関係性は大事なので守ってください.

次はこのRTnoフォルダをarduinoで使えるように配置します.

4.RTnoの準備

RTnoはarduinoを配置したディレクトリの,librariesのフォルダに置きます.僕なら,
C:\arduino-1.0\libraries\にRTnoフォルダを置きます.

MacOSの場合は,Arduinoのアプリケーションの中に入り,「Arduino.app/Contents/Resources/Java/libraries/」に配置します.

これでarduinoを起動したときに,「sketch」>「import libraries」から,「RTno」が見られると思います.(RTnoでは,このインポート方法は使いません)

インストールの確認

5.RTnoProxyの準備

GITHUBからソースコードをダウンロードすることが出来ます.
https://github.com/ysuga/RTnoProxy

cmakeしてビルドすればRTnoProxyが動作します.

WindowsならばCMakeしてから,buildディレクトリでRTnoProxy.slnを開き,Releaseでビルドしてください.
Linuxならばmakeしてください.build/srcフォルダにあるRTnoProxyCompがRTnoProxyの実行ファイルです.

cd RTnoProxy
mkdir build
cd build
cmake ../
make

さて,完成したRTnoProxyCompを実行してもうまく動作しません.
起動時にrtc.confを使うので,実行フォルダにrtc.confを配置する必要があります.Linuxならばbuild/srcフォルダにRTnoProxyCompがありますので,ここに配置します.
Windowsだと,build/src/Releaseフォルダに実行用のバイナリがあります.また,Visual Studioから実行したい場合は,build/srcフォルダにrtc.confを配置する必要があります.

配置したrtc.confは,RTnoProxyというRTCのデフォルトの設定をRTnoProxy.confというファイルから読み出すように設定されています.

※インストールされたフォルダ(WindowsのバイナリインストールならC:\Program Files\ysuga_net\RTnoProxy内,ソースからコンパイルならコンパイルしたRTnoProxyフォルダ内のbinフォルダ内)には4つのファイルがあります.

  • DataPortTestComp: テスト用コンポーネント
  • RTnoProxy.conf: COMポート番号を設定するためのコンフィグファイル
  • RTnoProxyComp: RTnoProxy本体
  • rtc.conf: rtc.conf.ネームサーバーなどRTCの基本的設定をするためのファイル
使い方

1.arduinoマイコンボードへのプログラムの書き込み

今回はexampleフォルダにあるdigitalInOut.pdeを例にして練習しましょう.

arduinoからexampleフォルダのdigitalInOut.pdeを開きます.

本来はここでソースコードを変更します.
ゼロから開発する場合は,exampleフォルダ内のRTnoTemplate.pdeの名前を変更してから使うとよいでしょう.
このページに少しずつチュートリアルを追加していくので,それをご覧になると,最初の始め方がわかると思います.

ここから書き込みの準備に入ります.

ツール>SerialPortでシリアルポートの番号を確認します.Windowsの場合はデバイスマネージャを使ってCOMポートの番号を確認してください.


またBoardで使用しているarduinoを選択してください.ちなみにこのプログラムはUbuntu9.10とarduino UNOで動作確認しています.

uploadボタンを押すと,自動的にコンパイルが始まり,arduinoにプログラムをアップロードします.

書き込みが終わると自動的にリセットされます.リセットされた状態でRTnoが書き込まれたarduinoマイコンボードは,PC側のRTnoProxyの実行を待っています.

2.RTnoProxyの設定

まず,arduinoがつながっているシリアルポートをRTnoProxyに読み込ませるための設定をします.
RTnoProxyをインストールしたフォルダ(WinならC:\Program Files\ysuga_net\RTnoProxy内,LinuxならコンパイルしたRTnoProxyフォルダ内のbinフォルダ内)の中の”RTnoProxy.conf”を変更します.通常は以下のようになっています.

  #conf.default.comport:\\\\.\\COM4
  conf.baudrate: 19200
  conf.default.comport:/dev/ttyACM2

#はコメント行です.
Windowsで使う場合は,1行目の#をはずし,適切なCOMポート番号を,デバイスマネージャで確認して設定してください.逆に最後の行はコメントにします.
(\\\\.\\というエスケープ文字列は大事です.COM9より大きい値を設定するための文字列です.)
Linuxの場合も同様で,dmesgコマンドなどで確認してください.

新しいバージョンより,ボーレートを変更出来るようになりました.
これはRTno (arduinoデバイス) 側と同じ値にする必要があります.通常は変更しないほうが良いと思いますが,XBeeとArduino FIOを使った無線通信&書き込みの場合は,適宜変更すると便利です.近いうちに無線で使う方法についてチュートリアルをアップします(2011/04/27)

*注意:
Windows 7とVistaのユーザには,設定ファイルがProgram Filesフォルダ内にあるので,UACに保護されてしまい,変更できません(できても仮想化されてしまって読みこめないのです)

解1) お使いのテキストエディタを管理者権限で実行し,それから設定ファイルを開いて変更します.
解2) UACを止めて編集します.
解3) 設定ファイルをデスクトップなどにコピーし,元のファイルを削除します.デスクトップ上で変更した上で,再度,プログラムフォルダにコピーします.

UACをとめちゃうのがシンプルですが,頻繁に変更しなければ解3が以外とオススメです.

3.RTnoProxyの起動

RTnoProxyはRTコンポーネントです.まずは,インストールしたネームサービスを起動します.Windowsならば,スタートメニューから,「OpenRTM-aist」>「C++」>「tools」>「Start Naming Service」で起動します.
Linuxならばrtm-namingコマンドで起動します.引数としてポート番号を指定するのですが,デフォルトの2809はomniORBがデフォルトで使っているので使いにくいです.9999などを指定しましょう.異なるポート番号を使う場合は,RTnoProxyのrtc.confを適宜変更する必要があります(後述).

ネームサーバーが実行されると,プロンプトに下図のような表示があります.

次に,RTnoProxyCompの設定を行います.先ほどのRTnoProxy.confと同じフォルダにrtc.confというRTコンポーネント用の設定ファイルがありますので,これを編集します.

corba.nameservers:127.0.0.1:2809
exec_cxt.periodic.rate:100.0
Test.RTnoProxy.config_file: RTnoProxy.conf
logger.enable:NO

大事なのは”corba.nameservers”と,”exec_cxt.periodic.rate”の値で,それぞれ,ネームサーバーのIPアドレス:ポート番号と,実行周期(単位Hz)を表しています.Linuxユーザの方は,先ほど変更したポート番号に変更するのが良いでしょう.IPアドレスと「:(コンマ)」で区切って入力してください.
*やはり上記のRTnoProxy.confと同様にWin7やVistaを使っている方々にはUACの問題で変更が面倒です.すみません.

これで準備OKなので,RTnoProxyCompを実行します.実行に成功するとOpening SerialPort(COM*)…OK.と表示され,3秒停止後に,onInitializeが呼ばれます.この中でarduinoと通信しながら初期化処理が行われます.DigitalInOutでは,L型(TimedLongSeq)のin0というInPortとout0というOutPortが追加されたのが分かります.

もしRTnoProxyを再起動した場合,Windowsの場合は,COMオープン時にarduinoにリセットがかかりませんので,手動でResetボタンを押すか,抜き差しを行って下さい.

4.RTnoProxyのテスト

RT System Editorを起動します.Windows版ならばOpenRTM-aistと同時にインストールされていますので,toolsの中から選択すると良いでしょう. Linuxをお使いの場合はオフィシャルサイトよりダウンロードしてください.

RT System Editorの画面です.

まず,ネームサーバーに接続します(多くの場合はデフォルトの2809番ポートでネームサービスが動いていれば,起動時に自動的に接続されます).下の図のボタンを押します.

先ほど指定したIPアドレスとポート番号を設定してください.

すると下図のようにネームサーバーが追加されます.

RTnoProxyが実行されていると,下図のようになります.

さらに同時にインストールされているDataPortTestCompを実行してください.Linuxユーザの方は同じbinフォルダにあります.

さて,これで準備が整いました.Fileから「Open New System Editor」を選択するか,「ON」の表示のボタンをクリックして,新しいSystem Editorを開きます.

左のメニューのDataPortTest0とRTnoProxy0をSystem Editorにドラッグ&ドロップしてください.RTnoProxyの構造を確認し,所望のポートが追加されていることがわかります.

次にポートを接続します.DigitalInOutを使ったRTnoは,TimedLongSeq型の入力,出力ポートを一つずつ持っていますので,DataPortTest側も同じタイプのポートを接続してやります.

ドロップすると表示されるダイアログは,DataFlowがpushになっていることを確認してOKでいいです.

同様にRTnoProxyの出力ポートも接続します.

んで,Activateします.個別に右クリックしてactivateを選択するか,みどり三角形の再生ボタンをクリックします.Activateに成功すると,下図のようにRTCが緑色になります.

さて,この時点で,arduinoを見ると,RXとTXに対応したLEDが点滅しており,PCとの間で激しく通信している事がわかります.RTnoProxyの実行に合わせてarduino側とデータを同期しているからです

DataPortTestCompの画面を見ると,LongSeqの列に6つのデータが来ていますが,これはarduinoの2番ピンから7番ピンまでの入力です.ここにスイッチなどをつなぐと,値が変化するのが確認出来るはずです.

もしお使いのarduinoボードが「arduino UNO」ならば13番ピンにLEDが付いているので,これを点灯させてみましょう.

まず,キーボードから「L」を打ちます(Shiftを押しながら「Lキー」).ちょっと効きづらいときがありますが,何度かやってみてください.

ここでDataPortTestの出力データの要素数を選択します.入力欄を6にしてください.

んで,「Enter」をおし,6個の数字を入力&Enterします.ここでは,1[Enter]1[Enter]1[Enter]1[Enter]1[Enter]1[Enter]と入れます.

最後の数値を入力すると,直ちにarduinoにデータが送信され,LEDが点くはずです.「ゼロ」を6個送信するとLEDは消えます.

この値は8番ピンから13番ピンの出力に対応しています.他のピンにもLEDを取り付けてみてください.

digitalInOutのソースコード解説

Digital Input/Output

DigtalInOutの例を解説します.

まずはソースコード全文をお見せします.

/**
 * digitalInOut.pde
 * RTno is RT-middleware and arduino.
 *
 * Using RTno, arduino device can communicate any RT-components
 *  through the RTno-proxy component which is launched in PC.
 * Connect arduino with USB, and program with RTno library.
 * You do not have to define any protocols to establish communication
 *  between arduino and PC.
 *
 * Using RTno, you must not define the function "setup" and "loop".
 * Those functions are automatically defined in the RTno libarary.
 * You, developers, must define following functions:
 *  int onInitialize(void);
 *  int onActivated(void);
 *  int onDeactivated(void);
 *  int onExecute(void);
 *  int onError(void);
 *  int onReset(void);
 * These functions are spontaneously called by the RTno-proxy
 *  RT-component which is launched in the PC.
 */
 
#include 
 
/**
 * This function is called at first.
 * conf._default.baudrate: baudrate of serial communication
 * exec_cxt.periodic.type: reserved but not used.
 */
void rtcconf(void) {
  conf._default.baudrate = 19200;
  exec_cxt.periodic.type = ProxySynchronousExecutionContext;
}
 
/**
 * Declaration Division:
 *
 * DataPort and Data Buffer should be placed here.
 *
 * Currently, following 6 types are available.
 * TimedLong:
 * TimedDouble:
 * TimedFloat:
 * TimedLongSeq:
 * TimedDoubleSeq:
 * TimedFloatSeq:
 *
 * Please refer following comments. If you need to use some ports,
 * uncomment the line you want to declare.
 **/
TimedLongSeq in0;
InPort in0In("in0", in0);
 
TimedLongSeq out0;
OutPort out0Out("out0", out0);
 
//////////////////////////////////////////
// on_initialize
//
// This function is called in the initialization
// sequence. The sequence is triggered by the
// PC. When the RTnoRTC is launched in the PC,
// then, this function is remotely called
// through the USB cable.
// In on_initialize, usually DataPorts are added.
//
//////////////////////////////////////////
int RTno::onInitialize() {
  /* Data Ports are added in this section.
  */
  addInPort(in0In);
  addOutPort(out0Out);
 
  // Some initialization (like port direction setting)
  for(int i = 0;i < 6;i++) {
    pinMode(2+i, INPUT);
  }
  for(int i = 0;i < 6;i++) {
    pinMode(8+i, OUTPUT);
  }
 
  return RTC_OK;
}
 
////////////////////////////////////////////
// on_activated
// This function is called when the RTnoRTC
// is activated. When the activation, the RTnoRTC
// sends message to call this function remotely.
// If this function is failed (return value
// is RTC_ERROR), RTno will enter ERROR condition.
////////////////////////////////////////////
int RTno::onActivated() {
  // Write here initialization code.
 
  return RTC_OK;
}
 
/////////////////////////////////////////////
// on_deactivated
// This function is called when the RTnoRTC
// is deactivated.
/////////////////////////////////////////////
int RTno::onDeactivated()
{
  // Write here finalization code.
 
  return RTC_OK;
}
 
//////////////////////////////////////////////
// This function is repeatedly called when the
// RTno is in the ACTIVE condition.
// If this function is failed (return value is
// RTC_ERROR), RTno immediately enter into the
// ERROR condition.r
//////////////////////////////////////////////
int RTno::onExecute() {
 
  /*
   * Input digital data
   */
  if(in0In.isNew()) {
    in0In.read();
    for(int i = 0;i < in0.data.length() && i < 6;i++) {
      digitalWrite(8+i, in0.data[i]);
    }
  }
 
  /*
   * Output digital data in Voltage unit.
   */
  out0.data.length(6);
  for(int i = 0;i < 6;i++) {
    out0.data[i] = digitalRead(2+i);
  }
  out0Out.write();
 
  return RTC_OK;
}
 
//////////////////////////////////////
// on_error
// This function is repeatedly called when
// the RTno is in the ERROR condition.
// The ERROR condition can be recovered,
// when the RTno is reset.
///////////////////////////////////////
int RTno::onError()
{
  return RTC_OK;
}
 
////////////////////////////////////////
// This function is called when
// the RTno is reset. If on_reset is
// succeeded, the RTno will enter into
// the INACTIVE condition. If failed
// (return value is RTC_ERROR), RTno
// will stay in ERROR condition.ec
///////////////////////////////////////
int RTno::onReset()
{
  return RTC_OK;
}

まず冒頭でrtcconf関数を定義しています.この関数はRTnoデバイスの基本的な設定を行う部分で,現状は通信のボーレート設定に使います.

/**
 * This function is called at first.
 * conf._default.baudrate: baudrate of serial communication
 * exec_cxt.periodic.type: reserved but not used.
 */
void rtcconf(void) {
  conf._default.baudrate = 19200;
  exec_cxt.periodic.type = ProxySynchronousExecutionContext;
}

デフォルトではボーレートは19200になっています.exec_cxt.periodic.typeは周期実行のタイプの設定ですが,現状では使っていません.いずれ対応予定です (2011/04/27)

次にグローバルスコープでInPortとOutPort,およびデータを受けるバッファを宣言しています.

TimedLongSeq in0;
InPort in0In("in0", in0);
 
TimedLongSeq out0;
OutPort out0Out("out0", out0);

次にonInitializeでは,このポートを追加しています.さらに,ピンの入出力設定を行っています.2番ピンから7番ピンまでの6本がINPUTで,8番から13番まではOUTPUTです.

  addInPort(in0In);
  addOutPort(out0Out);
 
  // Some initialization (like port direction setting)
  for(int i = 0;i < 6;i++) {
    pinMode(2+i, INPUT);
  }
  for(int i = 0;i < 6;i++) {
    pinMode(8+i, OUTPUT);
  }

onActivatedとonDeactivatedでは何もしていませんが,ここにも初期化処理などを記述することが出来ます.

そしてonExecuteにメインの周期的な処理を記述します.

int RTno::onExecute() {
 
  /*
   * Input digital data
   */
  if(in0In.isNew()) {
    in0In.read();
    for(int i = 0;i < in0.data.length() && i < 6;i++) {
      digitalWrite(8+i, in0.data[i]);
    }
  }
 
  /*
   * Output digital data in Voltage unit.
   */
  out0.data.length(6);
  for(int i = 0;i < 6;i++) {
    out0.data[i] = digitalRead(2+i);
  }
  out0Out.write();
 
  return RTC_OK;
}

ここではin0Inのポートに入力してきたデータを,そのままdigitalWriteしています.さらにdigitalReadしたデータ(1か0)を,out0Outポートから出力しています.


リンク

Arduino公式サイト http://www.arduino.cc/

OpenRTM-aist公式サイト openrtm.org

【入門】digitalInOutの自作

まず回路を作ります

御用意するのは

  • Arduino UNO
  • ブレッドボード
  • LED
  • 抵抗470Ω
  • タクトスイッチ
  • ジャンパー線

Arduino入門みたいなセットに入ってたりしますね.→の「Arduinoをはじめようキット」だと全部そろうと思いますよ.

LEDは足が長い方が+になると光ります.抵抗は足を曲げておきます.

下図のように抵抗とLEDをさします.抵抗をさし,抵抗の横の穴にLEDの長い方の足をさします.

抵抗の他方を5V端子に繋ぎます.

LEDの反対側の足と,Arduinoの8番ピンを繋ぎました

スイッチをブレッドボードに付けます

スイッチの片側はGND,反対側は2番ピンに入れました

図で表すとこんな感じ.

プログラム

Arduinoを起動します.

RTnoがインストールされているとします.

まずはOpenボタンで

RTnoTemplateのファイルを開きます

別の名前で保存します.ここはmyDigitalInOutと名前を付けました.

んで,ファイルを編集.コメントとかは省略してあります.

#include 
 
void rtcconf(void) {
  conf._default.baudrate = 57600;
  exec_cxt.periodic.type = ProxySynchronousExecutionContext;
}
 
TimedLongSeq in0; // 入力データの入る変数
InPort in0In("in0", in0); // 入力ポートの宣言.onInitializeで追加しないとだめ
 
TimedLongSeq out0; // 出力データを入れるための変数
OutPort out0Out("out0", out0); // 出力ポート.これも追加処理が必要
 
int RTno::onInitialize() {
  /* Data Ports are added in this section.  */
  addInPort(in0In); // 入力ポートの追加
  addOutPort(out0Out); // 出力ポートの追加
 
  // Some initialization (like port direction setting)
  for(int i = 0;i < 6;i++) {
    pinMode(2+i, INPUT);   // 2~7ピンを入力ピンに設定
    digitalWrite(2+i, HIGH); // ここで内部プルアップをONに
  }
  for(int i = 0;i < 6;i++) {
    pinMode(8+i, OUTPUT); // 8~13番ピンを出力に設定
  }
 
  return RTC_OK; 
}
 
int RTno::onExecute() {
 
  /* Input digital data  */
  if(in0In.isNew()) { // データが来ていたらIf文に入る
    in0In.read(); // ここでようやく読み込む
    for(int i = 0;i < in0.data.length() && i < 6;i++) { // length関数でシーケンス配列の長さが分かるので
      digitalWrite(8+i, in0.data[i]);  // 配列形式でアクセスできます
    }
  }
 
  /* Output digital data in Voltage unit. */
  out0.data.length(6); // length関数に引数を与えるとシーケンス配列の長さを設定できる
  for(int i = 0;i < 6;i++) {
    out0.data[i] = digitalRead(2+i); // 配列にデータを代入して
  }
  out0Out.write(); // ここでデータを出力ポートから排出
 
  return RTC_OK; 
}

さてうごくでしょうか?試してみます.

書き込み

Arduinoのボードを選択します.「Tools」>「Board」>「Arduino UNO」を選びます.

Arduinoボードが接続されているCOMポートを選びます.デバイスマネージャで確認してみて下さい

アップロードします.アップロードボタンを押してください

Done Uploadingと出ればOKです.

テスト

1. NameServerを起動します.
2. RTnoProxy.confを変更して,Arduino UNOが接続されているCOMポートを選択します.

############# RTnoProxy.conf ###########
conf.default.comport:\\\\.\\COM10
conf.default.baudrate:57600
#conf.default.comport:/dev/ttyACM0
####################################

3. RTnoProxyComp.exeを実行します.
4. File > New Online System Editorを選択して,エディタを開きます.下図のボタンでもOK.

あとは,TimedLongSeqデータを排出できるRTCと接続して試します.