カウンタ
4 4 0 0 7
まじめなようでまじめでもないブログ

非研究ブログ

2次元しか使ったことがない僕のところに3次元の波がやってきた

2014.01.22追記(追記部分は下のほうにあります)

つい先日、2次元(2D)から3次元(3D)への波がやってきた。
といっても、テレビでもゲーム機でもないよ!

とある機器(真空ポンプ)の支えを設計しようとして、真空ポンプの外形図のCADのデーターをくださいとお願いしたら、3D CADのデーターしかないとのこと。担当の方は、変換するように依頼してくれたらしいけど、すぐにはうまくいかなかったみたい。
どうやら最近はいろんなものが最初から3D CADで設計されているらしく、2D CADのデーターがないということらしい。

自分が普段つかっているCADも3Dには対応しているが、2D CADとして開発されたソフトに3D機能が追加されたものなので、あまり使ったことがなかった。
とうことで、3D CADをがんばってやってみることにしよう。といっても、今回は、ひとまずデーターを見て寸法を測れればいいだけどね。

もらったファイルの拡張子はstep。どうやら、stepというのはSTEP(Standard for the Exchange of Product model data)の略でISOで定められたファイル形式らしい。

おっと、
ここで問題発生。自分が持っているCADがこの形式に対応していない。
IGESという別の形式には対応しているがSTEPはだめ。変換しないと~
ということで検索。いろいろなデーター形式変換ソフトを見ていみが、なかなか良いものがない。じゃあ、フリーウエアのCADとかってあるのかなと、ふと思って検索したら良さそうなものを発見。
オープンソースなフリーウエアとして開発されているFreeCAD。
まだ開発途中らしいが、IGESに変換できてしまえばいつも使ってるCADが使えるので問題ない。

FreeCADのウェブサイトはhttp://www.freecadweb.org/にある。

FreeCADのウェブサイトによると"Import/export to standard formats such as STEP, IGES, OBJ, STL, DXF, SVG, STL, DAE, IFC or OFF, NASTRAN, VRML"とあるので、結構いろんなものに対応していて、STEPにも対応している。

早速インストールしてみよう。意外にいろんなメニューが日本語化されているのでそれなりにわかりやすい。

早速取り込んでみると、問題なく表示されて、あっけなく変換できてしまった。
FreeCADそのものでも寸法を見ることはできたので、結構良いかもしれない。
今回は、今使っているCADで作業をして、次回はFreeCADで設計をやってみることにするか。

2014.01.22追記
上記を書いた後に気がついたこと。
FreeCADが大きなデーターを読み込むと重たく落ちてしまったりするし、現状では寸法を見るのもいまいち使いにくいので、別のものを探していたところ、RS Compornentsが公開していて、登録するだけで使えるDesignPark Mechanicalにたどり着いた。大きなデーターを読みこんでも落ちたりはしないし、これなら使えるかも。
http://www.designspark.com/jpn/page/mechanical
0

Raspberry Piと大気圧センサーをつなぐ その1

購入してからしばらく忙しくて放置していたRaspberry Piですが、i2c通信できる大気圧センサーモジュール(秋月電子通商でFreescale semiconductorのMPL115A2にピンを小さい基盤に乗っけてピンをつけたものを購入しました)をi2cでつないでみました。

i2cっていうのは、組み込み機器用の2線式のシリアル通信の規格らしいです。
http://ja.wikipedia.org/wiki/I%C2%B2C
仕事柄RS232CとかRS485とかは良く使うのですが、i2cはもちろん使うのは初めてです。

ネットで検索するとどうやら、Raspberry Piの標準的なOS Raspbianではi2cは標準では使わない設定になっているようなので、使えるようにするところからスタート。

まずは、モジュールが自動的に読み込まれないようになっているので、そのあたりを設定しました。(
この辺とかこの辺とかを参考にしました

/etc/modprobe.d/raspi-blacklist.conf に「blacklist i2c-bcm2708」という行があるので、それをコメントアウト。そして、/etc/modulesに「i2c-dev」を追加。

これで、再起動したらi2cが使えるようになりました。

配線は、この辺とかこの辺とかを参考につないでいきます。
MPL115A2の説明書を日本語訳してくれた方(http://www.ne.jp/asahi/shared/o-family/ElecRoom/AVRMCOM/MPL115A2cnt/MPL115A2cnt.html)がいるので、それとRaspberry Piの資料を見ながら配線していきます。

途中で、ハマったのは、
MPL115A2の5番ピン(RST:リセット)と4番ピン(SHDN:スリープ)にもRaspberry Piからの3.3Vの電圧供給のラインをつないでおかなくてはいけないこと。説明書の表記をよく読んだら書いてあるのですが、5番ピンの方は最後まで気が付きませんでした。
5番ピンを開放してあっても、たまに動くので。。。。)

さてさて、うまくつながって
いるかどうかの確認ですが、「i2c-tools」というパッケージをインストールすると使えるようになるi2cdetectというコマンドが便利なので、aptをつかってインストールしました。
sudo apt-get install i2c-tools

i2cdetect -y 1」を実行すると、下のような応答が返ってきますが、MPL115A2のアドレスが60ですので、60のところに60と表示されているのがつながっている証拠です。
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: 60 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

さてさて、お次は、Rubyで通信ですが、Ruby I2C library(https://github.com/andec/i2c)を入れて、遊んでいるところですので、また今度。
0

IODATA GV-VCP3R/PCIをlinuxで使う

Rubyの話じゃないけど。。。ビデオキャプチャボードをlinux (Video for linux 2, V4L2)で使おうとしたときに、ちょっと手間取った時の情報を、参考のために&自分が忘れないように、どうすればよいかを書いておきます。
まあ、最近のUSBのカメラとかは、USB Video Class(UVC)に対応しているから繋げるだけで動くはずだけどね。どうしてもアナログ入力が必要な人には参考になるかと。

アナログカメラからの画像を解析するために、現状で入手できるPCIカードということで、IODATA GV-VCP3R/PCIを購入してUbuntu12.10を入れているPCにインストールしてみた。
手持ちのカード(IODATA GV-VCP3/PCI)が動いていたので安心していたら、IODATA GV-VCP3R/PCI(そうなんです、ちょっとアップデートされたらしく品番に"R"がついていたのです)は、そのままでは認識れれなくて焦った。

何もせずにそのまま、PCIにボードを差してPCを起動すると、cx2388x v4l2 driverがIODATA GV-VCP3R/PCIを自動では識別できなくて、以下のような、エラーメッセージを出します。

cx88[0]: Your board isn't known (yet) to the driver.  You can
cx88[0]: try to pick one of the existing card configs via
cx88[0]: card=<n> insmod option.  Updating to the latest
cx88[0]: version might help as well.
cx88[0]: Here is a list of valid choices for the card=<n> insmod option:
cx88[0]:    card=0 -> UNKNOWN/GENERIC
cx88[0]:    card=1 -> Hauppauge WinTV 34xxx models
cx88[0]:    card=2 -> GDI Black Gold
cx88[0]:    card=3 -> PixelView
cx88[0]:    card=4 -> ATI TV Wonder Pro
cx88[0]:    card=5 -> Leadtek Winfast 2000XP Expert
cx88[0]:    card=6 -> AverTV Studio 303 (M126)
cx88[0]:    card=7 -> MSI TV-@nywhere Master
cx88[0]:    card=8 -> Leadtek Winfast DV2000
cx88[0]:    card=9 -> Leadtek PVR 2000
cx88[0]:    card=10 -> IODATA GV-VCP3/PCI
cx88[0]:    card=11 -> Prolink PlayTV PVR
cx88[0]:    card=12 -> ASUS PVR-416
cx88[0]:    card=13 -> MSI TV-@nywhere
cx88[0]:    card=14 -> KWorld/VStream XPert DVB-T
cx88[0]:    card=15 -> DViCO FusionHDTV DVB-T1
cx88[0]:    card=16 -> KWorld LTV883RF
cx88[0]:    card=17 -> DViCO FusionHDTV 3 Gold-Q
cx88[0]:    card=18 -> Hauppauge Nova-T DVB-T
cx88[0]:    card=19 -> Conexant DVB-T reference design
cx88[0]:    card=20 -> Provideo PV259
cx88[0]:    card=21 -> DViCO FusionHDTV DVB-T Plus
cx88[0]:    card=22 -> pcHDTV HD3000 HDTV
cx88[0]:    card=23 -> digitalnow DNTV Live! DVB-T
cx88[0]:    card=24 -> Hauppauge WinTV 28xxx (Roslyn) models
cx88[0]:    card=25 -> Digital-Logic MICROSPACE Entertainment Center (MEC)
cx88[0]:    card=26 -> IODATA GV/BCTV7E
cx88[0]:    card=27 -> PixelView PlayTV Ultra Pro (Stereo)
cx88[0]:    card=28 -> DViCO FusionHDTV 3 Gold-T
cx88[0]:    card=29 -> ADS Tech Instant TV DVB-T PCI
cx88[0]:    card=30 -> TerraTec Cinergy 1400 DVB-T
cx88[0]:    card=31 -> DViCO FusionHDTV 5 Gold
cx88[0]:    card=32 -> AverMedia UltraTV Media Center PCI 550
cx88[0]:    card=33 -> Kworld V-Stream Xpert DVD
cx88[0]:    card=34 -> ATI HDTV Wonder
cx88[0]:    card=35 -> WinFast DTV1000-T
cx88[0]:    card=36 -> AVerTV 303 (M126)
cx88[0]:    card=37 -> Hauppauge Nova-S-Plus DVB-S
cx88[0]:    card=38 -> Hauppauge Nova-SE2 DVB-S
cx88[0]:    card=39 -> KWorld DVB-S 100
cx88[0]:    card=40 -> Hauppauge WinTV-HVR1100 DVB-T/Hybrid
cx88[0]:    card=41 -> Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile)
cx88[0]:    card=42 -> digitalnow DNTV Live! DVB-T Pro
cx88[0]:    card=43 -> KWorld/VStream XPert DVB-T with cx22702
cx88[0]:    card=44 -> DViCO FusionHDTV DVB-T Dual Digital
cx88[0]:    card=45 -> KWorld HardwareMpegTV XPert
cx88[0]:    card=46 -> DViCO FusionHDTV DVB-T Hybrid
cx88[0]:    card=47 -> pcHDTV HD5500 HDTV
cx88[0]:    card=48 -> Kworld MCE 200 Deluxe
cx88[0]:    card=49 -> PixelView PlayTV P7000
cx88[0]:    card=50 -> NPG Tech Real TV FM Top 10
cx88[0]:    card=51 -> WinFast DTV2000 H
cx88[0]:    card=52 -> Geniatech DVB-S

エラーメッセージに書いてあるようにdriverに"card="を渡して、どのカードか教えてあげなきゃいけないわけです。Ubuntu12.10の場合は、/etc/modprobe.d/options.confに以下の行を追加すると「IODATA GV-VCP3/PCI」として認識されるようになります。

options cx88xx card=10

そういえば、カードが2枚以上あるときは、オプションをカンマ区切りで渡せばOKです。(実は、2系統の画像を入力して処理しようと思っているので、2枚ボードを差したのです。)

options cx88xx card=10,10
のような感じで。

これで、めでたく画像を入力できるようになりました。
0

忘れたころにやってきたRaspberry Pi

ずいぶん昔に注文していた、Raspberry Piが、先週末、忘れたころにやってきた。
忙しくてしばらく放置していたのだが、ひとまず、SDカードにOSを入れて日本語を表示できるようにしたのでメモを書いておく。

OSはRaspberry Piの公式サイトからイメージファイルをダウンロードして、公式サイトに書いてあるとおりにMS-Windowsが入っているPCをつかってWin32DiskImagerでSDカードに書き込んだ。Raspbian(Raspberry Pi用に最適化されたDebian)を入れてみた。

このSDカードをRaspberry Piに突っ込んで、電源を入れたら問題なく起動できました。(当たり前ですが。。。)最初の起動時には初期設定用のメニュー が出てきます。ここでは、ひとまず、SDカード全体が使われるようにするために、「expand_rootfs」を選んでおきます。ほかの設定はひとまずそのままでも問題ないです。
この設定メニューは最初の起動時にしか出ないのですが、もう一度やりたいときは、「sudo raspi-config」で呼び出すことができます。

さてさて、このままではすべて英語表示なのですが、一応、自分の子供用に購入したので、ネットの情報を元に日本語が使えるように言語の設定をしました。Debianなので「sudo dpkg-reconfigure locales」でlocaleの設定を変更できます。
EUC-JPとUTF-8が使えるように設定しておいたほうが良いとのことなので、その二つを追加で選択して、デフォルトをUTF-8にしておきました。
これだけだと、フォントが入っていなくてメニュー等が見えなくなってしまうので、aptでフォントを
インストールしておきました。

sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname

これでめでたく日本語が表示されるようになりました。
わーい。
さて、後はどうしよう。。。。
1

Ruby失敗日記: hornetseyeでビデオキャプチャ

分光器のスリット上での像を確認するために、RubyでビデオキャプチャができるHornetseyeというRuby用のライブラリをつかってみました。(このソフトの作者が書いたD論がHornetseyeのサイトにあるので、そこにも詳しいことが書いてあったりする。
インストールはgemで簡単にできます。

gem install 'hornetseye_xorg'
gem install 'hornetseye_v4l2'

hornetseye_xorgは、x-windowに表示するときに、'hornetseye_v4l2'はVideo for Linux Version 2 (V4L2)を使ってビデオキャプチャするときに使います。Horneteyeのウェブサイトで紹介されているキャプチャして表示する簡単な例は以下のような感じ。

require 'rubygems'
require 'hornetseye_v4l2'
require 'hornetseye_xorg'
include Hornetseyecamera = V4L2Input.new
X11Display.show { camera.read }

これで、windowが画面上に表示されて、キャプチャされた動画がそのまま表示されるはずです。キャプチャーボードに複数のチャンネルがある場合は、「V4L2Input.new」のところに、指定を書きます。

V4L2Input.new(device = '/dev/video0', channel = 1) {[UBYTE, 320, 240]}

たとえば、上記の例はヤプチャするデバイスを「/dev/video0」のチャンネル1に指定して、取り込む画像は白黒 320*240に指定しています。ひとまず、これで表示はできますが、今回は、スリット上での光の軸の位置を数字として出したいので、いろいろやらなくてはいけなくて苦労したのですが、それについてはまた今度書きます。
0

Ruby失敗日記: ファイルに"すぐに"書き込みたい flushの使い方

測定機器(電流計とか)をシリアル通信(RS232C)でPCとつないで、測定値の長時間の傾向を見たりしているのですが、Rubyのプログラム中ではその都度ファイルに書き込んでいるのですが、ファイルに書き込んだのにcloseするまで反映されないということに気が付きました。(テスト環境はLinuxです。Windowsではどうなんでしょうかね。)

Rubyのファイルアクセスは、実際のファイルに即時には 書き込まれないみたいです (内部バッファーがすごく良く効いているのか?) 。もちろん、ファイルをcloseすれば書き込まれるのでふつうは困らないのですが、今回のように測定機器の値を読み込んだときに書き込んでいるような場合、ファイルは開けっぱなしで書き込みたいので、せっかく書き込んだログファイルがなかなか更新されなくて困ってしまいます。
特に、今回の場合は、そのファイルをほかのプログラムが読み込むようになっているので、すぐに書き込んでくれないと値が更新されなくて困っちゃうわけです。

そこで、flushコマンドの登場です。
flushはIO ポートの内部バッファをフラッシュ(ト●レみたいにじゃーっと流す)します。
たとえばこんな感じで、書き込んだ直後にflushすればその時点で書き込みの処理が行われるようです。
例えば測定のためのループの中にこんな感じでflushをかいておけばOKです。

output_file1 = File.open($script_path + "#{date_for_filename}.dat","a")
output_file1.write("#{data}\n")
output_file1.flush
0

Ruby失敗日記: Ruby-serialportでシリアル通信

エレクトロメーター(電流計)などの計測機器にはRS232Cでシリアル通信ができるものがあって、それを使ってデーターをPCに取り込むわけですが、Rubyでは、Ruby-serialportというライブラリを使ってシリアル通信が簡単にできます。

インストールはgemを使って簡単にできます。~
$ gem install serialport

実際に、どんな感じに使うかというと

reuire 'rubygems'
require 'serialport'

 #シリアルポート通信設定
$serial_port = '/dev/ttyS0'
$serial_baudrate = 38400
$serial_databit = 8
$serial_stopbit = 1
$serial_paritycheck = 0
$serial_delimiter = "\n"

#シリアルポートを開く
sp = SerialPort.new($serial_port, $serial_baudrate, $serial_databit, $serial_stopbit, $serial_paritycheck)
sp.read_timeout=1000 #受信時のタイムアウト(ミリ秒単位)

#送信(例えばこんな感じ)
sp.puts "ARM:COUNt 1#{$serial_delimiter}"
sp.write "INIT#{$serial_delimiter}"

#受信(例えばこんな感じ)
#デリミターを引数として渡しておくとgetsはデリミターが受信されるまで
#あるいは設定されたタイムアウトになるまで待ちます
line = sp.gets("#{$serial_delimiter}")
#あとは受信された内容を解釈するだけ

#シリアルポートを閉じる
sp.close

ポートを開けて、書き込みをして読み込むだけ、ほら簡単です。
(もちろんシリアル通信ってそんなものですけどね。)

参考文献
Ruby-serialport: http://ruby-serialport.rubyforge.org/
0

Ruby失敗日記をはじめました

最近、真空とか光強度とかいろんな実験条件のログをとるために、測定機器を制御するプログラムをRubyを使って書いているのですが、失敗したケース(それだけでは、あまりにもなので成功したケースも?)をブログに載せておこうと思っていますう。
意外に、普段は気付かないような微妙な動作の違いが、思わぬトラブルを引き起こすわけで面白いのではありますが、大変なわけです。
そんなわけで、単に、ブログのネタがないだけという説もありますが、Ruby失敗日記をはじめることにしました。
まあ、奇特なかたが、見つけて再利用してくれるかもしれないしね。
0

第24回液体の化学夏の学校

去年参加させていただいた、液体の化学夏の学校、今年は京都だそうです。
前回は、初日は別の学会に行っていて、途中から参加したのですが、飲みながら楽しく液体の構造について話し合いました。今年は、自分は参加するかどうか未定ですが、興味のある方は、下記のリンクからたどれる「第24回 液体の化学 夏の学校」のウェブサイトをご覧ください。
https://sites.google.com/site/ekitai2012ayabe/
0

Proxmox VEをつかってみた

サーバーにしていたPCが古くなって(PentiumIIIのPCもあった)いろいろと問題が出てきたので、Proxmox VE ( http://www.proxmox.com/ )を使って仮想化してみた。予想外に簡単だった。

Proxmox VEのインストールはそのままCDからインストールするだけだし、実機からの移行は、Clonezilla( http://clonezilla.org/ )のLive CD を使って起動して、そのまま仮想PCに中身をコピーするだけ。
(ちょっとHDDが壊れかけていたPCがあってそれに関しては、コピーする前にいろいろいじったけど)

ライセンスサーバーになっているPCは、実機を止めずに中身をコピーして動作を確認したら実機の方を落として途切れずに入れ替えできた。
調子に乗ってPC3台を1台にまとめた。

なんて簡単なんだ。気持ちがよいくらい簡単なので、次回からこれでいこう。
0