April 06, 2013

Super Sylphide 進捗状況(61) -- mruby on TinyFeather

オートパイロットシステムTinyFeatherですが、開発環境を見直そうと考えています。その一環として、JTAGエミュレータなどのハードやコンパイラといったソフトウェアを揃えなくとも、ちょっとしたスクリプトを書くだけで制御系を構築できるようにしようと考えています。その一環として、スクリプト言語を搭載することにしました。いくつか候補があったのですが、僕はmrubyを選びました。Rubyが好きだからです(笑)。

取り急ぎ、mrubyが動作している様子を掲載してみようと思います。

mruby_on_TinyFeather.jpg

配列やハッシュ、算術演算、evalを試してみました。TinyFeatherとPCを擬似シリアル(USBのCDC)で繋げ、PCからシリアルボートにアクセスしている画面です。送受信が両方表示されており、見難くてすいません。TinyFeatherの中ではDSP(Texas Instruments TMS320C6745)上でmirbに近いものが走っています。なおmrubyのビルドに使ったスクリプトはbuild_config.rbです。

最終的には、これまでC/C++で記述をしていた『TinyFeatherの誘導制御スケルトン』の部分が、Micro SD上に配置したRubyスクリプトだけで全て済む、ビルドレス環境にしようとしています。制御系を設計するにあたってはゲインの調整などの試行錯誤、すなわち、設計から実行、検証、改善のいわゆるPDCAサイクルを素早くまわすことがとても重要ですので、ビルドレス環境はとても適しているのではないかと思います。

世界で唯一のRubyで動く(であろう)オートパイロットシステム TinyFeatherの今後にご期待ください(笑)。

※次の進捗ではTinyFeatherのi2cまわりを改修しました。

23:11 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/879

April 14, 2013

Super Sylphide 進捗状況(62) -- CPLD で i2c Multiplex その2

オートパイロット装置Tiny Featherを改修しています。地磁気センサをHoneywell HMC5883Lから半田付けが容易なFreescale MAG3110へ変更し、また新規に絶対圧センサとしてMS5611-01BA01を搭載することにしました。いずれもすごいロガー(NinjaScan) Rev.Cで採用した部品です。

実装はこんな感じになりました。

TinyFeather_MAG3110_MS5611.jpg
IC1がMAG3110、U5がMS5611。

この変更はいずれもi2cバス上のデバイスが置き換わったことになるのですが、少々問題が生じました。TinyFeatherでは以前の記事『Super Sylphide 進捗状況(62) -- CPLD で i2c MUX』にあるとおり、CPLDを介した特異な方法で本体のDSPとi2cデバイスを接続しています。今回導入したi2cデバイスのうちMAG3110は、介在しているCPLDがあらかじめ想定していた挙動とは異なる挙動をすることがわかり、CPLDのコードを変更する必要に迫られました。その挙動というのがクロックストレッチという機構です。

クロックストレッチというのは、スレーブデバイスがクロックをLOWレベルで固定することにより、マスタデバイスを待たせることが可能な機構です。MAG3110を例に出すと、下図のような挙動をします。

まずは、クロックストレッチが行われていない際のオシロスコープ画像です。クロック(黄色)が一定間隔で動いていることが見て取れると思います。

MAG3110_normal.png


次にクロックストレッチが行われている際のオシロスコープ画像です。クロック(同じく黄色)がLOWで固定している時間帯があることが見て取れます。

MAG3110_stretched.png


クロックストレッチはスレーブデバイスからクロックラインに発生するもので、従前のCPLD内のi2c muxではクロックはマスタからスレーブへの一方通行にしてありました。クロックストレッチを正しく機能させるためには、スレーブからマスタへクロックラインの状態を伝える必要があります。現在のVHDLコード i2c_mux.vhdは次のような方法でこれに対応することにしました。

  1. マスタ側のクロックラインがLOWになる
  2. スレーブ側のクロックラインをLOWにすると同時にタイマー開始
  3. タイマー開始後、CPLDからマスタ側、スレーブ側双方のクロックラインがLOWになるようCPLDが率先してLOWを出力する
  4. 一定時間経過後、まずはスレーブ側のクロックラインについてCPLDがLOW出力するのをやめ、Hi-Zにする
  5. マスタ側のクロックラインにはスレーブ側の状態を逐一伝え、スレーブ側がHIGHになるまでマスタ側にはLOWを出力する

詳しくはコードを見てみてください。マスタ、スレーブとも確実にLOWを出力する一定時間はgenericパラメータで調整できるようにしてあります。僕が実際にこのコードを使う際は、今回はi2cのfast modeに対応する400KHzのLOW時間1.25 usを指定するようにしました。

※次の進捗として、OLED表示をつけてみました。こちらで紹介のi2c MUXも使った成果です。

23:59 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | コメント (2) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/880