環境構築(3)

今回は、RTAI-Lab上でI/Oボードを動かしてみます。「RTAI-Labってフリーでしょ?本当にリアルタイム処理が出来るの?」とお疑いの方は、画像を見ていただくだけでもおおよその性能が分かって頂けるかと思います。

たまたま、インターフェース社のPCI-2727というボードが遊んでいました。このボードはDIOボードです。そこで、Scicosモデルからこの子をコントロールして、矩形波を出力してみることにします。どれくらいのジッタが出るのか、見ものです。

freehils05_00

コネクタの準備

PCI-2727が遊んでいたのは良いのですが、この子につながるコネクタが見当たりません。もともと持っていなかったのか、どこかで無くしてしまったのか。。。

仕方がありませんので、ちょいと大須までいってコネクタを買ってくる事にしました。

インターフェース社のWebページにて、PCI-2727は「ハーフピッチ 68ピン オス」である事がわかりました。つまり、「ハーフピッチ 68ピン メス」を買えばいいのです。

ひさびさの大須を満喫しつつ、パーツ屋をめぐります。大須って、あんまりオタクっぽい人って居ないんですね。ちょっとやんちゃ系(?)の若者を多くみかけました。色黒で、ピアスなんかしてて、露出が高くって・・・若いっていいなぁ!

さて、肝心のコネクタはなかなか見つかりませんでしたが、1件だけ、取り扱っている店を見つけました。早速購入!

家に持ち帰ってPCI-2727とつなげようとすると・・・はまらない!? なんで!? ピン数もあってます。オスメスも間違えていません。

よーく見てみると、買ってきたコネクタは、微妙に、ほんとうに微妙に、大きい。そのせいで、うまくハマらなかったのです。

これがお客様に納品するシステムであれば、きちんと適合するコネクタを取り寄せるところです。しかし、今回は自腹で買って、たぶん使い捨てるだけのコネクタ。ただ捨てるのももったいない!というわけで、こんな感じにしてみました。

freehils05_01

まずは、ペンチでもって、まんべんなく押しつぶしてやりました。そのうえで、コネクタの左右の部分を、大きめのニッパーで切り取ってやりました。どうだ参ったか!コネクタめ!

さすがにここまでしてやると、PCI-2727にも接続できます。念のためテスターで導通チェックをすると・・・OK!これで準備は完了です。

今回得た教訓:コネクタは、ピッチやピン数が一緒だからといって、ハマるとは限らない。でも、その気になればなんとでもなる。

下調べ

今回は、とにもかくにもI/Oを動かそうという話です。そこで、必要な作業は最小限にしましょう。

今回使用するボードはPCIボードです。PCIは、そのボードへのアクセスに、どのアドレスを使うかが固定されていません。システムによって全然違ってくるわけです。

そこで、ちょいと手で確認してみます。rootユーザーになって、

lspci -v | less

としてみます。すると・・・

freehils05_02

ありました。Interface Corp Deviceとあるので、間違いないでしょう。

どうやら、I/O空間の df30 に割り当てられているようです。今回は、決め打ちでこの値を使うとしましょう。

将来的にきちんとドライバーを書くときは、自動検出するようにします。

モデル作成

今回作成したモデルは、こんなかんじです。

freehils05_03

真ん中のブロックには、PCI-2727を操作するコードが埋め込んであります。

・ブロック入力ポートの値を、PCI-2727のOUT1~8ピンに出力
・PCI-2727のIN1~8ピンの入力値を、ブロック出力ポートから出力

そうすると、P-2727の出力をオシロスコープで測定する事が出来るはずです。

なお、今回はハードリアルタイムの性能を試すものです。したがって、モデル実行とGUI表示を1つのノードで行う、なんていうのは論外です。そこで、

・モデル実行:実マシン
・GUI表示:VMWare上の仮想マシン

と、役割分担させることにしました。これらの間の通信は、UDP/IPで行われます。

ハードウェアセットアップ

PCI-2727は、入力ピン、出力ピンそれぞれに、電源、グランドがあります。マニュアルによると、電源は12~24Vで使いなさい、とあるので、

・入力用電源、出力用電源に、ともに12Vを与える
・入力用グランド、出力用グランドは、共通とする
・IN1ピン、OUT1ピンを配線で取り出す

という感じで配線しました。こんな感じです。

freehils05_04

ハードウェア屋さんからみたら大爆笑モノなんでしょうね。まぁ、私はソフトウェア専門のエンジニア。しょせんこんなものです。

そして、先ほど作成したモデルを1msステップで実行します。まずはOUT1ピンをオープンにしておいて、電圧を測定してみます。すると・・・

freehils05_05

やりました!1msごとに出力が反転しています!まずは、I/Oボードの制御には成功したようです。第一関門クリア!

ただし、よーく見てみると、電源電圧12Vなのに、OUTの電圧が500mVしかありません。何が原因なのでしょうか?

原因を究明するべく、まずはPCI-2727のマニュアルを読んでみます。問題は、入出力部分の回路がどうなっているか、です。さすがインターフェース社、きちんと記述がありました。

そこを見ると、バイポーラトランジスタが2つ並んでいます。トランジスタか。そういえば、TTL出力だったなぁ・・・そうか!そうです。TTLの入出力時には、微弱な電流が流れるのでした。だから、オープンにしちゃうと、その微弱な電流が流れません。それがいけないんですね。

というわけで、PCI-2727のINとOUTを接続してみました。両方ともTTLだから大丈夫なはず・・・オシロでみてみると・・・

freehils05_06

こんどこそ12Vです。完璧です。これで第二関門もクリア!デジタル出力に関しては正常動作したと考えてよいでしょう。

じゃあ、デジタル入力はどうなんでしょうか?

デジタル入力の結果は、Scicosモデルにとりこんで、RTAI-LabのGUIに表示するようにしています。だから、GUIに1ms刻みの波形が見られれば完璧なはずです。

さっそくRTAI-Labの画面を見てみると、こんなかんじ。INとOUTを接続し、電源12Vを与えた場合はこうです。

freehils05_07

一方、電源12Vをオフした場合はこうです。電源12Vがないため、デジタル入力値は常に0をさしています。

freehils05_08

ちゃんと、違いが出ていますね。ということは、デジタル入力がきちんとうまくいっている、という事です。

ジッタ測定

では次に、どれくらいジッタが出るのかみてみましょう。オシロでもって、じーっと見てみます。すると、だいたいプラスマイナス10μ秒以内におさまっているようです。優秀ですね。タイマーボードも使わないでこれだけ出れば十分でしょう。オシロの周波数測定機能でも、きっかり500Hzになっています。問題無しです。

ところが・・・ジッタを測定しようとじーーーっと画面を眺めていると、ときおりチラッ、チラッとノイズっぽいものが入ります。こりゃなんなんだ?と思い、詳しく調べてみる事にします。

私の持っているデジタルオシロには、パルス幅によるトリガーをかける機能があります。そこで、パルス幅が1.005ms以上になったときにのみトリガーが掛る様にしてみました。すると・・・こんなのや、

freehils05_09

こんなのが出てきます。

freehils05_10

HILSでオーバーランが起きると、たいがいこんな波形になります。これが、だいたい5秒に1回くらいのペースで現れます。ちょっと酷いですねこれは。原因はなんなんでしょう?

ひょっとすると、GUIとの通信が重荷になっているのでしょうか?そう考えて、GUIを停止して、モデルだけリアルタイム実行させてみました。すると、10秒に1回くらいまで頻度が落ちました。しかし、相変わらず発生しています。GUIとの通信による負荷は、原因の一部ではあるようですが、それがすべてでは無いようです。

これだと、お勉強用にちょっとHILSを試してみる分には使えますが、実際の製品検査にはとてもじゃありませんが使えません。この問題に関しては、ちょっとした対策案があるので、のちのち試してみたいと思います。

まとめ

ScicosLab / RTAI-Lab によるモデリング&リアルタイム実行は、だいたい問題無く動作します。

たぶん Simulink / RTAI-Lab でもきちんと動くでしょうが、現時点では試しません。MATLAB / Simuilnkについてはよーく知っているので、どうとでも出来るからです。

ただし、数秒に1回、モデルのステップ時間が乱れる、という極めて重大な問題があるため、きちんと対策する必要があります。

次回

今回までで、とりあえず試してみよう!という作業工程は終了です。これまで得られた知識から、具体的に何をどうやっていくのか、作戦を立てる事にします。