• astah*で図を書いて redmineの wikiに埋め込むプラグインを考える その2


    embed-astah.png
    なんとなくアイデアを書いてからもう4カ月。書いたっきり手つかずで放置してたけど、突然やる気になってみた。

    astah*で図を書いて redmineの wikiに埋め込むプラグインを考える その1

    ソースはgithubに。例によって無保証です。
    tckz's redmine_wiki_astah at master - GitHub

    前のエントリに書いたように、astaファイルから図をエクスポートするのは非常に時間がかかる。だから、wikiマクロでは、エクスポート対象astaファイルをDBに記録するだけにした。そして別途cronなどを使ってエクスポート処理を動かす、という流れ。

    主なfeature

    • wikiマクロ、{{astah_diagram}}を追加。
    • astaファイルは、public配下に置いたものまたは、リポジトリに入れたものを指定できる。
    {{astah_diagram}}マクロ

        {{astah_diagram(public:foo.asta, namespace/diagram)}}
    {{astah_diagram(source:/repo/path/foo.asta, namespace/diagram)}}
    {{astah_diagram(option=value...,public:foo.asta, namespace/diagram)}}

    • astaファイル:
      • public:path/to/.asta
        • RAILS_ROOT/public/配下に置いた.astaを指定する。
        • RAILS_ROOT/public/sample.astaなら、指定する値はpublic:sample.asta
      • source:repo/path/to/.asta
        • リポジトリに格納したastaを指定する。プロジェクトにリポジトリがないと意味がない。
        • wikiのsourceリンク展開と同じように記述。
        • リポジトリの直下にあるsample.astaなら、source:sample.asta
    • 図のpath:
      • Asta*で図をエクスポートした際のpathに準ずる。
      • 図や名前空間に「/」が含まれると、エクスポートの際に「_」に変換される。ので、マクロに指定する値も「_」に変換した値とする。他にもあるかもしれないが不明。
    オプション:
    • align=value
      • 埋め込まれた図のIMG要素に追加するalign属性
      • 例:right, left
    • width=value
      • 埋め込まれた図のIMG要素に追加するwidth属性
      • 例:100px, 100%
    • height=value
      • 埋め込まれた図のIMG要素に追加するheight属性
      • 例:100px, 100%
    • target={_blank|any}
      • 埋め込まれた図のIMG要素に追加するtarget属性
      • 別ウィンドウで開くなら_blank

    インストール

    事前に、astah(のGUI)を実行可能な状態に。↓のエントリで書いたように、図のエクスポートにはGUIが動くように、DISPLAYとライセンスを適切に設定する必要がある。
    astah*で図を書いて redmineの wikiに埋め込むプラグインを考える その1

    1. プラグインをRAILS_ROOT/vendor/plugins/配下に置く。

        #{RAILS_ROOT}/vendor/
          plugins/
            redmine_wiki_astah/
    2. redmine_wiki_astah/run-astah.shを環境に合わせて編集する。
        ASTAH_HOME : Astah*を展開したディレクトリを設定。astah-pro.jarがあるディレクトリ。
        DISPLAY    : 当該環境のディスプレイをポイントする。自分ところでは前のエントリのとおり、vncserverを使っている。
    3. プラグインが使うテーブルを準備。
      rake db:migrate:plugins RAILS_ENV=production
    4. Redmineを再起動
    5. 管理者でredmineにログインする。
    6. プラグインの設定画面で'secret key'に適当な文字列を設定する。
    7. 図のエクスポートを定期的に行うようセットアップする。

    図をエクスポートする

    wikiに埋め込まれたastaをエクスポートして実際の図イメージを作成する。
    Astah.export_diagrams()を定期的に実行する必要がある。

    こんな感じで。
    #{RAILS_ROOT}/script/runner Astah.export_diagrams -e production

    エクスポートしたイメージをredmineを実行しているユーザから参照できるよう、実行ユーザに注意。


    おわり


    astaにたくさん図が含まれるとエクスポートに何分もかかってしまう。
    図のID(astaファイル中の内部的なID。APIで取得できる)があらかじめわかっていれば、特定の図だけをエクスポートすることで短縮もできるが・・・・。
    先のエントリに書いたように、大き目の図が多いせいでwikiに埋め込むと小さい。widthを付けることで収まりはよくなるが、リンクをクリックして図だけを表示しないと読み取るのは難しいかも。

    環境:
      CentOS 5.5 i386
        ruby-1.8.7-p299(from source)
          redmine-1.0.0
          sqlite3-ruby (1.3.1)
        sqlite-3.7.0-1
        astah* pro 6.2




  • arduinoと MP4212でモータを回す

    前回の「ラジコン風」ではモーターの駆動に、TA7219Pを使った。
    ネットをうろつくと、モータの駆動にはパワーMOSFETというのを使うそうで、この辺を参考にうなってみた。

    回すモータは、マブチモーターのRE260。
    SN3E0076.JPG

    タミヤのハイスピードギヤボックス。
    これ、ユニバーサルプレートの穴と、ギヤボックスのネジ穴位置がびみょーに合わない。
    カットするしかないのか、とも思ったが今はモータを固定できればいいので、テストベッド的な感じで。


    SN3E0078.JPG

    MP4212は、NchとPchのMOSFETが2つずつパッケージされていて、なんとなく扱いやすそうだと思ってこれにした。4Vで駆動できるしRE260なら定格に収ま りそうだし。

    FETは燃えるぞ壊れるぞ、という話があちこちで見られる。
    チキンなので、正転方向だけマイコン制御ありに、逆転方向のMOSFETはプルアップ・プルダウンで常にOFFになるようにして、PWMで回転数を制御するところだけ試した。

    TA7291Pのときと違ってドライバでの電圧降下が少ないため、エネループ2本で十分よくまわる。

    冒頭の参考ページにあるLow-side-PWMをなんちゃってでまねっこしてみる。
    右側の7セグメントLEDは、analogWrite()の値を示している。
    写真では、MOSFETをトランジスタ1個でスイッチしているけど、のちにプッシュ・プル構成にして高速スイッチングをめざした。けど、arduinoのPWM周波数が約490Hzということで(日本語リファレンスより)、今のところMOSFETのスイッチング速度を活かせる構成ではない。

    写真では付いていないけど、10kΩの半固定抵抗で分圧した電圧をanalogRead()で読ませて回転数が変化するようにした。半固定抵抗を動かすとスムーズに回転数が変化してちょっと楽しかった。調子にのってぐりぐり動かしていたら、ねじ切ってしまった。あぁ。今度はちゃんとボリュームにしよう・・。


    最終的には、モータ制御はATtinyなど小さめのマイコンを使い、arduinoから独立させようと考えている。
    SN3E0079.JPG

    ちょっと検索するとライタを自分で作っちゃう人ばかりで、道は遠いなーと思わざるを得ない。
    が、4000円投資してAVR ISP mkIIを購入。いいんだこれで。

    AVR Studio本体とSPをダウンロードしてインストール。
    ハナっからCで書くつもりなのでWinAVRもDLしてインストール。

    ここの環境はWindows 7 x64だけどドライバも問題なく認識。

    ATtiny 2313Vを2つ購入した。低電圧版を選んだのは、モータ制御とは別にリモコン的なものを考えていて、単三×2で動くようにしてみたかったから(モータ制御用のは5Vで使う予定)。
    とりあえずLチカするところまで進めたいなー、と、電源とGND(とISPに必要なピン)とLED+抵抗だけ結線して、ISPに繋ぐ。

    ISPのコネクタにジャンプワイヤを突っ込んでブレッドボードに挿す、大雑把さ。ISP側のピン配置はこのページを参考にした。後はデータシートを見てAVR側のピンに接続。
    Lチカ用のLEDは、PB0に繋いだ。

    電源はスイッチングなACアダプタ5Vから給電。クリスタルもパスコンもなんにもない状態。内部発振8MHzの1/8で、システムクロックは1MHz。

    AVR Studioを起動して、こんな感じのだらっとしたhello worldをビルドしてAVRに書きこむ。

    #include <avr/io.h>
    #include <util/delay.h>

    int main(void) {

    DDRB = 0xFF;

    const int pin = 0;

    while(1) {
    PORTB |= 1<<pin;
    _delay_ms(100);
    _delay_ms(100);
    _delay_ms(100);
    PORTB &= ~(1<<pin);
    _delay_ms(100);
    _delay_ms(100);
    _delay_ms(100);
    }
    }
    なんか、ちゃんと点滅してる。
    ブレッドボード上を見てると、ほぼワンチップマイコンだけが載ってる状態でプログラムが動いちゃうんだからおもしろいなー、と感動してしまう。

    次は、arduinoからSPIなりなんなりで、このATtinyに指令を送って何かさせる、ってことをやろう。


    環境:
     Windows 7 x64 Ultimate
      arduino 0018
      AVR Studio 4.18 + SP2
      WinAVR 20100110
    Arduino Duemilanove
    AVR ATtiny 2313V

  • arduinoと xbeeでラジコン的なもの

    先月観に行ったMTM05会場で、スイッチサイエンスの出店で、xbee×2とxbeeシールドを買ってきた。
    ZigBee対応版は在庫がないそうで、シリーズ2を2つ購入。後からファーム更新してZB対応版相当品に。

    xbeeでラジコン的な作例はたくさんあるので、今さら感あふれる感じなんだけど、とにかく自分で実際にやってみたかったのだった。

    機構・構造部品は、少年時代を思い出すTAMIYAの「楽しい工作シリーズ」を使った。
    昔懐かし、ツインモーターギアボックストラック&ホイールセットでクローラ風にしてみる。
    このギアボックス、子供の時は金属フレームかつ完成品だったような気がしたんだけど(はっきり覚えてない)、今はプラスチック製で組み立て式なんだな。

    最初、ユニバーサルプレートという工作界のユニバーサル基板みたいなヤツを一枚しか買ってなくて、ギアボックスとキャタピラを乗せたら、電池も回路も置く場所がなくなってしまった・・・。
    ユニバーサルプレートをもう一枚と、ユニバーサル金具というL字に使える構造材を買い足した。

    で、出来たのがコレ。なんか配線がピンピン飛び出てて危なっかしい・・。
    SN3E0071.JPG

    テーマは、
    • ラジコン的なものなので、当然、電池電源でもって行動できること。
    • Xbeeを使って、PCからリモート操作する。
    • おまけで、測距センサを使って、障害物に近づいたら勝手に停止する。
    ていう感じ。

    モーターは2つで、左右の動輪をそれぞれ駆動している。細かい回転の制御は何もやってなくて、全開かオフかの二択だ。TA7291Pを2つ使っていて正転と逆転のコントロールはかろうじて可能に。

    手持ちの電池ケースが単三×4のしかなくて、勢いが良すぎた。TA7291PのVrefをもっと下げておけばよかった。ギア音うるさいし。

    arduino用の電源は、二階建ての裏面に取り付けた006Pから供給。xbeeシールドを乗せちゃうと、Vinが隠れてしまうが、シールドと本体の隙間から無理やり差し込んだ。

    ユニバーサルプレートはネジ止めだけで構造を乗せていけるので便利なんだけど、穴のピッチが5mm間隔のため、基板と合わなくて難儀する。結局、arduinoの方は2穴だけ使って斜めに配置、モータードライバを載せた基板は、アングルを使って90度立てることに。若干斜めになっているのは、こっちもネジ穴の位置が合わなかったため。

    SN3E0073.JPG
    arduino~xbee(シールド)間の通信は、普通にシリアル通信出来てしまう。便利だ。0ピンと1ピンを使うので、単にSerial.begin(ボーレート)しておいて、読み書きするだけ。

    コード上は、aruduino IDE上のシリアルモニタを使って、コマンドとモータの動作を実装・確認。で、動かす時はXbeeシールドを乗っけるだけ(もちろんxbee間の設定は先に済ませておく必要がある)。

    xbeeの設定は、XbeeエクスプローラUSBとDigi社公式のX-CTUで。

    ここの環境では、2つのXbeeをどっちもFunctionSetを「Zigbee Router/End device AT」にして、お互い相手のシリアルナンバーをDH/DLに指定している。

    1対1の通信では、Xbeeの良さをスポイルしてしまうが、ラジコン風用途で用いる分にはいいだろう、てことで。

    PC側のXbeeは、XbeeエクスプローラUSBによって仮想COMポートとして見えているので、何らかのTerminalからぽちぽちと入力すれば、arduino側のXbee+シールドを通じてシリアル通信で読みだされる。

    SN3E0072.JPG
    シャープ測距モジュール GP2Y0A21YK。秋月電子で購入した。対象、というか壁のようなものとの距離を電圧で得られる。

    距離と電圧の関係はリニアではないけど、近似式を求めた人がいたので、丸パクリしちゃう。ごっちゃんです。arduinoの場合、アナログ入力の分解能が10bitなので、analogRead()で得られた値を、(5/1024)倍して近似式に放り込む。

    室内の蛍光灯下で、「手のひら」を対象に測った感じでは、9cmから50cmぐらいまではそれっぽい値が出ている感じがした。(これ以上遠くは物差しがなかったのでよくわからん)

    本ラジコン風クローラでは、前進中で正面12cm未満に障害物が出てきたときは停止、というコードにしてみた。

    十分加速したところから、検知・制動すると、壁際2~3cmというところで、危なっかしい(^^; が、制御して遊ぶのが目的なのでヨシとする。



    キーボードからの入力で、工作がきーきー動くのはなんとも不思議な感じ。
    やっぱり、モータの制御がON/OFFで大雑把過ぎるな。今度は各種センサからの情報を取り入れて細かく制御することをテーマにしてみたい。

    ひとしきり遊んだ後で、いくらかかったかなーとふと思う。
     ・arduino=3,200円
     ・xbeeシールド=2,200円
     ・XbeeエクスプローラUSB=2,500円
     ・xbeeシリーズ2×2=5,960円
     ・ユニバーサルプレート×2=700円
     ・ツインモーターギアボックス=800円
     ・トラック&ホイールセット=600円
     ・ユニバーサル金具セット×2=800円
     ・測距センサ=400円
     ・TA7291P×2=360円
    あとLEDとかコンデンサとかソケットがあるけど無視して・・・17,520円。
    わぁ。


    環境:
     Windows 7 Ultimate x64
      arduino 0018
     Arduino Duemilanove

  • astah*で図を書いて redmineの wikiに埋め込むプラグインを考える その1

    uc.png

    UMLその他モデルの作図にJudeを愛用している。
    ・・・というかastah*か。

    astah*で書いた図を、emfで(拡大縮小しても綺麗だから)ワードに張り付けるなどしているが、redmineのwikiに埋め込めるといいのにな~と思っていた。
    もちろん画像で出力してからアップロードすることはできるが面倒。
    せっかくリポジトリにastahのファイルを保管しているのだから、最新の図をwikiに自動反映できたら便利そう。

    最近知ったのだけど、PlantUMLというのがあって、一定の記法で書いたUMLを画像にしてくれるOSSがあるそうだ。じゃあ、astah APIでモデルの情報を抜き出してPlantUML記法で吐きだしたらどうか?と一瞬考えたものの、レンダリング結果がastah上の図とはかなり変わってしまうし、APIで取得できない情報が多数あるのでそもそも再現度が低い。

    やはり図の出力はastah*に任せたい。

    jude時代から、コマンドラインで図出力を実行することができるので、これを呼び出したらいいだろう。
    ※細かいことは、インストール先のCommandRunner.htmlに書いてある。

    自分ところで使っているredmineはどれもlinux上で動いているので、できればlinuxサーバで完結させたい。ということでまずは「linux上でコマンドラインで図出力」する手順を検討した。

    ポイントは以下のとおり。
    • コマンドライン図出力を実行するには、DISPLAY(Xサーバ)が必要。
      • APIの場合はXサーバなしでも動くけど、図出力はdisplayが初期化できないと先に進まない。
      • 図出力用のディスプレイという位置づけで、vncserverを使うことにした。
    • astahライセンスをセットアップする必要がある

    1. ディスプレイを用意

    • 図出力を実行するユーザ向けにvncserverのディスプレイを作る。
    • CentOSの場合、yumリポジトリにvnc-serverがあるのでこれをインストール。
    • 実行ユーザで一回vncserverを起動しておく。
      • 各種ファイルのひな型が作成されるのと、vncserverのパスワード設定を一度に出来るから。
        % vncserver

        You will require a password to access your desktops.

        Password:
        Verify:

        New 'somehost:1 (someuser)' desktop is host:1

        Creating default startup script /home/someuser/.vnc/xstartup
        Starting applications specified in /home/someuser/.vnc/xstartup
        Log file is /home/someuser/.vnc/somehost:1.log
    • 上で起動したvncserverはkillしちゃう。
      で、ひな型をちょこっと編集。CentOSの場合、xstartupは以下の内容になっていた。
      twmが動いていると、Xクライアントがウィンドウを作成するときに出現位置をユーザ操作で指定する流れになるので、図出力の自動化においては邪魔になってしまう。ので、twmの行を削除した。xtermも特に必要ないので削除。
      #!/bin/sh

      # Uncomment the following two lines for normal desktop:
      # unset SESSION_MANAGER
      # exec /etc/X11/xinit/xinitrc

      [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
      [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
      xsetroot -solid grey
      vncconfig -iconic &
      #xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
      #twm &
    • システム起動時の自動起動を考慮して/etc/sysconfig/vncserverに設定
      図出力を実行するユーザに合わせて編集。とりあえずディスプレイ番号は2のままにした。ジオメトリはもっと小さくてもいいはず。
      VNCSERVERS="2:someuser"
      VNCSERVERARGS[2]="-geometry 800x600 -nohttpd -localhost"
    • rootでrcスクリプトから起動
      # /etc/init.d/vncserver start
    2. astah*を用意

    • astah*のダウンロードサイトからzipを入手。「JREなし、インストーラなしのアーカイブ」と書かれているもの。
    • 適当な場所にunzipする。
    • 同梱されているastah-command.shは後半がちょいおかしい(pro 6.1.1)ので、ちびっと修正して、とりあえず同じディレクトリに「run.sh」という名前で保存した。実行権限を忘れない。
      #!/bin/sh

      ASTAH_HOME=`cd \`dirname $0\` && pwd`

      INITIAL_HEAP_SIZE=64m
      MAXIMUM_HEAP_SIZE=1024m
      STACK_SIZE=3m

      JAVA_OPTS="-Xms$INITIAL_HEAP_SIZE -Xmx$MAXIMUM_HEAP_SIZE -Xss$STACK_SIZE"

      java $JAVA_OPTS -cp "$ASTAH_HOME/astah-pro.jar" com.change_vision.jude.cmdline.JudeCommandRunner $*

    • ライセンスを配置。
      自分ところはJUDEのユーザライセンスがサポート時効前なのでJUDEのライセンスで。
      $HOME/.astah/professional/JUDE_License_User_Professional.xml
    3. 実行

    • path上にjavaコマンドがあることを確認。なければ適宜pathを通す。
    • 環境変数DISPLAYにvncserverを指定。
      自分はtcshスキーなので以下の通りだが、他のシェルの場合は適宜
      % setenv DISPLAY 127.0.0.1:2
    • 実行
      % /path/to/astah/run.sh -image all -f /path/to/some.asta -o /path/to/dir 

    おわり

    • で、出力されたのが冒頭のpng画像。
    • Windowsで出力したときとフォントが異なるので、見た目の違いはあるけど、元の図がキープされていることに意義はありそう。
    • 元の図が大きくなりがちなので、wikiに張り付けるのに向かないケースも多そう。
    • 図出力にはかなり時間がかかる&出力したい図を指定できない(種類は指定出来る)ので、運用上はcronで出力しておいてどーこーみたいな仕組みも必要っぽい。
    • wikiマクロ的には、.astaファイルと図のpath(名前空間+名前)を指定する感じか。


    環境:
      Windows 7 Ultimate x64
        JRE6 x86
          astah* professional 6.1.1
      CentOS 5.4 x64
        vnc-server-4.1.2-14.el5_3.1
        JRE6 x64
          astah* professional 6.1.1



  • arduinoで lcd

    SN3E0066.jpg
    しばらく前に秋月電子で20文字×4行のキャラクタ表示液晶(SC2004CSLB。SUNLIKE社 SC2004C)を買った。
    当時、PICで制御してみたいなーともくろんでいてたんだけど、あっさり投げ出していたのだった。

    arduinoの場合、(リファレンスいわくHitachi HD44780とその互換チップセットをベースにした)LCDを制御するライブラリが標準装備なので、print感覚で文字表示できる、はず。。。

    とりあえず、同梱の説明書にある、「バックライトの電源を液晶側を共有」するようにちまちまとハンダづけする。J2にハンダを盛ってショートさせ、R8に添付されてた抵抗100Ω×3を並列に接続。

    同梱されてたピンヘッダを何も考えずにモジュール背面にとりつけたのだけど、ネットで見かけた作例だとピンソケットを全面にとりつけている人もいた。そしたらジャンプワイヤで簡単に接続出来てお試ししやすいのか。そういう考え方もあるんだなー。

    すでに取りつけてしまったものはCTRL+Zでとりはずすこともできず。さりとて電子工作初学者の自分は、ハンダを吸い取るのもおっくうで、このまま進むことにするのだった。

    ユニバーサル基板にソケットとコントラスト調整用の半固定抵抗をのっけた。
    説明書によれば、pin3 コントラスト調整用電源は、「=Vssで最も濃くなる」とあったので、何も考えずにGNDに繋いだら、何も表示していない部分や表示した文字の上下に不必要なドットが現れてしまった。
    手元に500Ωの半固定抵抗があったので、えいやっと繋いだけど、180度中、コントラスト調整として意味があるのは30度ぐらいだけになってしまった。残りの150度ぐらいは何も映らない。。。

    スケッチはただのコピペ。
    使ってる液晶が20桁4行なので、初期化パラメータだけちょびっと変更。

    #include <LiquidCrystal.h>

    LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

    void setup()
    {
    lcd.begin(20, 4);
    lcd.clear();
    lcd.cursor();
    lcd.blink();
    lcd.setCursor(0, 0);
    lcd.print("ohayo");
    lcd.setCursor(2, 1);
    lcd.print("oyasumi");
    lcd.setCursor(4, 2);
    lcd.print("ore dayo ore ore");
    lcd.setCursor(6, 3);
    lcd.print("moshi moshi");
    }

    void loop()
    {
    }


    もはや制御らしい制御がコードに現れてこないのがすごい。
    リファレンスによれば、blink()の結果はディスプレイ次第だそう。この液晶モジュールではカーソル位置に、下線→黒塗りつぶし四角のアニメーションが表示された。

    環境:
      Windows 7 Ultimate x64
        Arduino 0018 (IDE)
      Arduino Duemilanove 328