blog.migiue.jp

OpenGeigerのGM-01AからUSB経由で値を得る

Open Geiger ProjectのガイガーカウンターGM-01AはUSBでコンピューターに繋がります。

ファームウェアがver1.2以降ならば、プログラム側からUSBでデータを取得できます。

GM-01Aをベースにした以下の機種(ファームウェアはver1.2以上)でも使えると思います(未確認)

Rubyから値を得ることが出来るようになったので、手順を残しておきます。

1. libusbruby-usbをインストールする

Macの場合は、ruby-usbにちょっとしたパッチを当てないと入らないと思う。
参考 : http://www.jedi.be/blog/2009/11/11/ruby-usb-libusb/

2. rubyからlibusb経由でGM-01AのCPM値を得る

基本的には以下のようなRubyプログラムになります。USB_CONTROL_MSGで「0x01」を送るとCPM値を、「0x03」を送ると生のインターバルカウント値が得られます。
(GM-01A以外の互換機は idVendor == 0x20A0 とか idProduct == 0x4176 の部分が違うかも)

どのような値を送れば、どんなデータが返ってくるかは、OpenGeigerのファームウェアコード
の opengeigerfirmware1.20/common/usbprotocol/usbrequest.h のあたりに書いてあります。

3. 「0x01」を送ってGM-01A側で移動平均処理をしたCPM値を得る

require "usb"

# USBデバイスをオープンする
@device ||= USB.devices.select {|d| d.idVendor == 0x20A0 && d.idProduct == 0x4176 }.first
@handle ||= @device.usb_open

# GM01-A側で移動平均処理をしたCPM値を得るメソッド
def readcpm
  data = "\0" * 2
  ret = @handle.usb_control_msg(
    USB::USB_TYPE_VENDOR | USB::USB_RECIP_DEVICE | USB::USB_ENDPOINT_IN,
    0x01,
    0,
    0,
    data,
    5000
  )
  puts data.unpack('c')
end

# 10秒ごとに実行する
loop do
  readcpm
  sleep 10
end

4.「0x03」を送って生インターバルカウント値を得る。

require "usb"

# USBデバイスをオープンする
@device ||= USB.devices.select {|d| d.idVendor == 0x20A0 && d.idProduct == 0x4176 }.first
@handle ||= @device.usb_open

# GM01-A側で移動平均処理をしないインターバルカウント値を得るメソッド
def readcps
  data = "\0" * 2
  ret = @handle.usb_control_msg(
    USB::USB_TYPE_VENDOR | USB::USB_RECIP_DEVICE | USB::USB_ENDPOINT_IN,
    0x03,
    0,
    0,
    data,
    5000
  )
  puts data.unpack('c')
end

# 1秒インターバルで値を得る
# 60秒で実行すれば移動平均処理をしない生のCPM値が得られる
loop do
  readcps
  sleep 1
end

仙台Ruby会議(Ruby親方会議)

仙台Ruby会議02に参加してきました。

牛タン利休の極

仙台Ruby会議01に続いて今回もスタッフとしての参加、Ust中継を担当しました。
会場は仙台駅の近く、アエルの28F。高層階だからなのか、イーモバが不調でうまく映像と音声が流れていなかったかも。 次回は音声を綺麗に撮るためのマイクが必要そうですが、今回のように会場の音がたくさん入るのも楽しいかも。

テーマは「Rubyとビジネス」

私はRubyでプロダクツを作って大々的にリリースしたりはしてないですが、Webサイトに埋め込むCGIも、クライアントに使ってもらう便利グッズも、ほとんどRubyで作ります。私がやっているビジネスにはRubyの扱いやすさが丁度良いです。

後半のRuby親方会議のパネリストにも声をかけていただいていたのですが、今回はUstに専念。
すずりょってビジネス何してるの?謎の人と言われることも多いですが、私の組成としては半分が親方、半分が先生の成分で出来ています。

スタッフとして動くと、じっくり話を聞けなかったりするのですが、多くのRubyistの話を聞いて、さらにRubyが好きになりました。

Tenjinテンプレートエンジンで快適Web制作3

IWDD41で発表したTenjinテンプレートエンジンで快適Web制作2の続きエントリーです。

Webサイトの原稿をもらうときに、ワードだったり、エクセルだったりすることがあるかと思いますが(><)、今回はエクセルファイルから直接ページを作ってみます。

まず、エクセルでこんなシートを作ります。シート名は「page1」、ファイル名は「data.xls」にしておきます。これがページの原稿になります。

エクセルで原稿を作る data.xls

RubyのSpreadSheetライブラリを使って、エクセルのデータを直接読み込んでテンプレートの中に展開します。

Tenjinテンプレートエンジンで快適Web制作

IWDD41で「Tenjinテンプレートエンジンで快適Web制作」として発表してきました。

VGAアダプタを忘れてプロジェクタに映せなかったので(><)、blogにコードを貼ってみます。

素のHTMLを何ページも手書きしたくない、CMSを入れる程でもない、DreamWeaverテンプレートでは物足りない。 デザイナーでもテンプレートエンジンを使いこなしたい。Rubyを使いたい。そんな人にお勧めです。

今年はもっとRubyを勉強しようと思っているので、Ruby用のrbTenjinを使ってデモを書きました。

IWDDで発表した内容は

  • 基本的なTenjinの使い方
  • ヘッダ、本文、フッタの3ファイルに分ける方法
  • エクセルファイルからデータを読み込んでHTMLページ生成
  • YAMLファイルからデータを読み込んでHTMLページ生成
  • CGIのパラメータを受け取ってページの内容を変える

基本的なTenjinの使い方

テンプレートファイルの中で

  • ${...}と書けばrubyの式を評価した結果が入る(HTMLエスケープ有り)
  • #{...}と書けばrubyの式を評価した結果が入る(HTMLエスケープ無し)
  • <?rb ... ?>でrubyの文を埋め込める

仙台Ruby会議01

仙台Ruby会議に参加してきました!私も一応実行委員としてUstreamでの生中継の担当をしていました。

当日の様子はUstreamで生中継され、録画映像は公開されています。ピークで最大同時接続数40人くらいがUstを見ていただいていたようです。

また、Ustとは別にバックアップ用に撮影しておいたHDVの編集が終わりましたので、こちらもUPしておきます。.mp4形式のファイルでサイズが大きいです。ローカルにダウンロードしてお楽しみ下さい。

GAINERと加速度センサとFunnelでKeynoteのスライドをめくる

1000speakers:7@仙台#1ではコミュニティー枠で東北のコミュニティーの紹介を話したんですが、それだけでは技術的な話がないので、GAINER加速度センサFunnelとRubyで、Keynote.appのスライドをめくるというのをデモしました。

GAINERのボタンを押すときに、加速度センサが載っているブレッドボードを

  • 向こうに傾けると:スライドがスタート
  • 手前に傾けると :スライドがストップ
  • 右に傾けると  :スライドが次へ
  • 左に傾けると  :スライドが戻る

という仕組みです。