ラベル Ruby の投稿を表示しています。 すべての投稿を表示
ラベル Ruby の投稿を表示しています。 すべての投稿を表示

2016年6月28日火曜日

ポケットガイガーType5 + arduino

久々の活動再開。

ついにというか、ようやくarduino触ってみた。

楽。とても楽。USBシリアルポートが標準装備なのとC言語ライクスケッチとライブラリの豊富さ。

atmegaゴリゴリやってたのが馬鹿みたいだ。


というわけでラズパイ用に買ってたポケットガイガーType5をつないで遊んでみた。



arduinoのスケッチはポケットガイガーのものがそのまま使えた。

ポケットガイガーType5 サポートページ
http://www.radiation-watch.org/2011/05/professional.html#emb

シリアル通信でCPMを取得してxivelyに投げるRubyスクリプトを書いて完了。
https://gist.github.com/izumogeiger/ad07fa739314dd76c504619b2af29cea

xivelyページ
https://personal.xively.com/feeds/1679002984


ポケットガイガーはPINフォトダイオードなのでGM管のGC10とはCPMが随分違う。




2013年9月28日土曜日

Google音声認識APIを利用した音声認識コマンド入力

前記事「Ruby + Google音声認識APIによるRaspberryPIでの音声認識」でGoogle音声認識が使えることがわかったので音声認識コマンド入力のプロトタイプを作ってみた。

動作概要

  • コマンド入力スクリプトはリモコンから起動
  • ピッという発信音の後5秒間録音してGoogle音声認識APIにかける
  • Google音声認識APIの結果からコマンドかどうか判断
ソース

----

----

プロトタイプなので「天気予報」などのコマンドの中身は実装していない。

状態遷移で複雑な入力もできるし、対話型にしてもいいかも知んない。

色々できそうではあるんだがいかんせんヤル気が・・・


2013年9月19日木曜日

Ruby + google音声認識APIによるRaspberryPIでの音声認識

「googleの日本語音声認識を自由に呼び出して使う方法」を参考にRubyからgoogle音声認識APIを叩いてみた。

まず事前準備として

RaspberryPIにUSBマイクで音声入力を参考に、録音
$ arecord -D plughw:1,0 -d 10 -f cd test.wav
ffmpegパッケージでtest.wavをtest.flacに変換
$ ffmpeg -i test.wav -vn -ac 1 -ar 16000 -acodec flac test.flac
あとは以下のスクリプトを実行。

----
----

実行結果
$ ruby gvoicerecog.rb
#<Net::HTTPOK 200 OK readbody=true>
{"status":0,"id":"1b69aa31b6bfac4059d6409566f4950e-1","hypotheses":[{"utterance":"あいうえお","confidence":0.5210862},{"utterance":"あ い う え お"},{"utterance":"アイウエオ"},{"utterance":"あいうえお aa"},{"utterance":"あいうえお うー"}]}

juliusと違ってかなりの認識精度。

それにRaspberryPIの負荷もほとんどない・・・

便利すぎる。

ただ家電コントローラ的にはリモコン操作に慣れてしまったのでもはや使い所がない。
うーむ。ちょっと利用方法を考える。

  • 人口無脳的チャット
  • 自由記述による検索
  • 天気予報とかwikipediaとか(出力が音声だと使いにくくない?)
ぬぬー。求むアイディア。

2013年9月14日土曜日

RaspberryPI + I2C 3軸デジタルコンパスHMC5883L(2) 5分間隔で計測してxively.comにデータ登録

前回はi2cget、i2csetコマンドでHMC5883Lのモード設定、コンパス値の取得が使用できることを確認した。

i2cget、i2csetコマンドをRubyやシェルスクリプトから叩くつもりだったが、1回の測定について1000回ぐらい繰り返し、平均値を使ったほうが良い気がしてきた。

1000回の測定となると毎回i2cgetコマンドを叩くのは非効率なので、C言語でプログラムを書くことにした。

hmc5883l.c
  • HMC5883Lの測定周期、磁界強度設定などの設定はデフォルト、測定モードは連続モード
  • 10ms間隔で1000回測定した平均値を出力
で、そのCのプログラムの実行結果をログファイルに書いてxively.comに転送するRubyスクリプト(hmc5883l.rb)も作成。

そしてそのhmc5883l.rbをcronで5分間隔で実行するようにしてみた。

で、その結果が以下である。


スクリーンショット

当たり前なのだが、センサーを固定しているのでほぼ変動がない。

このグラフに意味があるかないかはよくわからないけどしばらく続けてみる予定である。

最後に作成したプログラムを公開しておく。



2013年9月13日金曜日

RaspberryPI + 赤外線リモコン基盤 + mplayerでラジオサーバ

先日作成したリモコン基盤マウンタとRaspberryPIをPower Mac G4 cubeにつっこむ。

基盤下に耐震ジェルパッドを敷いてユルーク固定してるつもりだけどあまり意味なし。

USBスピーカーも繋げてバージョン1完成とする。

PIneApple(・・・PI in Apple)と命名する。




ただ肝心のソフトがまだだったので作成。

ざっくりとした仕様は以下。
  • 赤外線リモコンで操作
  • ボタンに応じてmplayerの起動、フロアライトのリモコン操作を行う
  • 赤外線受信のハンドリングはirwコマンドで行う
でできたのが↓のRubyスクリプト(rirc.rb)。
  • IO.popenでirwの標準出力を拾って解析
  • ボタンとリモコン名からスクリプト名を決定し、スクリプトファイルがあれば実行
  • どうもリモコンボタンを普通に押しただけで2回連続で赤外線とぶみたいなので、実行後1秒間の受信は無視
  • cronで定時起動するようにしてロックファイルで重複実行しないように
  • ボタン対応スクリプト内でAquesTalkで軽くしゃべらせる




動作風景


見た目が若干アレなので配線の始末とか前面パネルとか作るかも知れない。

あとはLCDとかマトリックスLEDでなにか表示させるとかやってもよいかも。

2013年8月28日水曜日

RaspberryPI+mplayer+lameでNHKラジオ第2を録音してDropBoxにアップロード(2)

SDカードからやり直したせいかサイマルラジオ録音スクリプトが動作しなくなっていた。 

調べたところmplayerで以下のようなエラーがでていた。


size_confirm mismatch!: 22611 20047
Error while parsing chunk header
Failed, exiting.
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

connect error: Connection refused


コンソールからmplayer単独で動かすとエラーはでない。

詳しい原因はわからないけどRubyスクリプトからmplayerを呼ぶシェルスクリプトを実行するとダメなようだ。

プロセス関係の問題と思われるがよくわからない。

mplayerをシェルスクリプトを使わずに直接実行するよう変更したら動作した。

ソース(radiorec2.rb)
https://gist.github.com/izumogeiger/6366082#file-radiorec2-rb

2013年8月25日日曜日

本日の戦利品(購入品到着)


あとはRaspberryPIとUSBマイクが来れば全部かな。

追記

早速、USB電源スピーカーRaspberryPIにつないでみたが必要にして十分な音量音質。

mplayerでサイマルラジオも流してみたけど旧式ラジオより確実に高音質(ほぼ受信方式の違いだろうけど)。

2013年8月14日水曜日

RaspberryPI+mplayer+lameでNHKラジオ第2を録音してDropBoxにアップロード

NHKラジオ第2の英語講座を録音したい。録音してどうするか。通勤中聞くのだ。
ちなみにリスンしたい番組は以下。

1年間ほぼ毎朝聴き続けた結果、読み書き発音の進歩はないが、聞き取りは若干上達したような気がする。
通勤時間長い人にはおすすめだ。

で、本題。


例によって参考サイト「Ubuntu に関する個人的メモ  > mplayer でらじる★らじるを聴く」を参考にRubyで実装。

と、実装の前にRaspberryPIでlameによるmp3エンコードとか大丈夫なのか。ということで試してみた。

mplayer -playlist http://mfile.akamai.com/129932/live/reflector:46056.asx -vo null -ao  pcm:waveheader:fast:file=>(lame -q 4 - /tmp/hoge.mp3)

数分、録音してみたけどきちんと録音できてエンコードできる。
やはりCPUを使うらしく、CPU温度は上昇。録音停止と共に下降。



で、確認できたところで、実装。

方針は以下

  • 録音対象はNHKラジオ第2のみ
  • スクリプト実行時から録音開始して与えられた秒数で録音終了
  • 録音終了後mp3ファイルをDropBoxにアップロード
  • cronで番組開始時にスクリプト起動
  • mplayerによる録音は終了タイマーとかできないっぽいのでforkして一定時間経過したらkillすることで録音終了させる(とっても乱暴だが)
シェルスクリプトベースのが正解っぽいのだがファイル名の生成とか面倒なのとDropBoxへのアップロードにRubyライブラリを使うのでRubyベースで。

mplayerの実行にシェルスクリプト(mplayer.sh)を使用。

詳細はソース読んでね。

あとDropBoxライブラリの使用方法とか、アクセストークンの取得とか割愛。

あとは聞きたい番組に合わせてcronを設定。

いやあUnixというかLinuxのcron最高。
もっともWindowsにもatコマンドてのがあるらしいけど。

GC-10 twitterボット変更(1時間平均、1時間最大)

1時間に1回平均線量と最大線量をツィートするよう変更。



3時間グラフや1分ログアップデートとほぼ同様でcronキック。

ソース

2013年8月7日水曜日

マントルによるGC-10動作テストとツイッター警告追加

GM管が動作しているか不安なのでマントルを購入してテストしてみた。



マントルには微量のトリウムが含まれているためガイガーカウンターが激しく反応するのでよくテストに使われるのです。

早速ラックの上に置いてみたところLEDが激しく明滅!!





マントルとGC-10との距離は5cm程度。5cmも離れてこの反応。

さすがはマントル。


GC-10のデータファイル上では400CPMを超えてた(サイトでは60秒平均で丸められて270CPM)。


20130807211504  431
20130807211505  438
20130807211506  438
20130807211507  439
20130807211508  443
20130807211509  441
20130807211510  442
20130807211511  441
20130807211512  439
20130807211513  438
20130807211514  430
20130807211515  430
20130807211516  427
20130807211517  414



というわけで結論。

GC-10は正しく動いている。

校正してないから絶対値としては怪しいけど。。。

あ、あと60秒平均で50CPMを超えたらツイートするようにしてみた。


2013年8月4日日曜日

SOEKS01-MをWebカメラで撮影

100円ショップで買った合板を加工してWebカメラマウンタを作成。



RaspberryPIに繋げて画像を取得。


fswebcam -d /dev/video0 -D 2 -r 400 --png 0 --set brightness=100% /tmp/soeks.png


若干斜めになってるのはご愛嬌。
WEBカメラが丸型で調整が非常にムズカシイ。

できればライブカメラ化までしたかったのだが、自前のサーバがないとさすがに無理っぽい。

flickrとかに定時アップロードでもいいのだけど、間隔を短くするとサービスの容量すぐなくなるし、
長くするとSOEKSの面白さがないし。

考えた結果、SOEKSの接続はやめることにした。

一応picasaへアップロードするスクリプトをのせとく。
https://gist.github.com/izumogeiger/6150160#file-picasa-rb

2013年8月3日土曜日

xively.comにRaspberryPIのCPU温度を追加

以下のコマンドでRaspberyPIのCPU温度が取得できる。

% vcgencmd measure_temp

エアコンをつけたらどんどん温度下がってく。
追記

西日の指す閉めきった部屋に置いても最大で57度程度の様子。
さすがは低消費電力マシン。

例によってgistでソース公開。



gnuplotでグラフを作成してbloggerへアップロード


  • 3時間分のグラフをgnuplotで作成する(cpmと5分の移動平均)
  • pony + gmailでbloggerにメール投稿する
ソースはgistで。

2013年8月2日金曜日

ログファイルをgoogleドライブにアップロード

「スクリプトまたはコマンドラインでGoogleドライブにファイルをアップロードする」を参考にgoogle-docs-uploadを利用してログファイルをgoogleドライブにアップロードする。
  • cronで1日1回実行
  • 現在時間から前日のログファイル名を決定してgoogleドライブにアップロード
スクリプトは例によってgistで公開。

2013年8月1日木曜日

1分毎にcpmと線量をtwitterとxively.comに送信

というわけでスクリプト作成。

スクリプト中のXMLがBloggerにエスケープされてしまうようなのでgistで提供。
https://gist.github.com/izumogeiger/6131907#file-avcpm-rb

よくわからない解説

  • 現在時間からログファイルを決める
  • ログファイルの最後60行の平均cpmを求める
  • cpmを線量に換算する 換算係数は150らしぃ
  • tweetする
  • xively.comする


cron設置。

ミッション完了。

モニタリングポスト仕様/cpmロガー作成

さて材料が揃ったのでいよいよモニタリングポストを構築しよう。
例によって先人の記録(ガイガーカウンターキット GC10 データをグラフ化)を参考にして以下のようにしよう。

  1. GC10のcpmをログファイルに記録
  2. 1分間隔でcpmと線量をtweet
  3. 1分間隔でxively.comにcpmと線量をアップロード
  4. 1時間隔でgnuplotでグラフ作成してブログにアップロード
  5. 1日間隔でログファイルをgoogleドライブにアップロード
時間間隔での動作はcronで動作させる。
というわけでまずは1.のロガー作成。

バージョン1

# coding:utf-8
 
require 'pp'
require 'fileutils'
#require 'serialport'
 
class GC10Logger
  def initialize
     @sp = SerialPort.new('/dev/ttyUSB0',9600,8,1,0)
  end
 
  def get_cpm
    line = @sp.gets("\n")
    if /^\d+/ =~ line
      return line.to_i
    else
      return nil
    end
  end
 
  def run
    loop do
      cpm = get_cpm
      now = Time.now
      next unless cpm
 
      dir = File.join(ENV["HOME"],"gc10",now.strftime("%Y"),now.strftime("%m"))
      file = File.join(dir,now.strftime("%d")+".txt")
      FileUtils.mkdir_p(dir)
      mode = File.exists?(file) ? "a" : "w"
      File.open(file,mode) do |io|
        out = "#{now.strftime("%Y%m%d%H%M%S")}\t#{cpm}"
        io.puts out
      end
    end
  end
end
 
gc10 = GC10Logger.new
gc10.run

これで$HOME/gc10/2013/08/01.txtのようなファイルが延々とできる。
内容は

20130801212453 25
20130801212454 24
20130801212455 24
20130801212456 24
20130801212457 23
20130801212458 23
20130801212459 23
20130801212500 22

みたいな感じ。

さらに自動起動するようにしたいのでロックファイルを確認して既に実行中だったら終了するよう改造してcronで定時起動する作戦。

で、バージョン2

# coding:utf-8
 
require 'pp'
require 'fileutils'
require 'serialport'

class Locked < StandardError
end

def lock(lock_file_path='/tmp/gc10lock')
  File.open(lock_file_path, 'w') do |lock_file|
    if lock_file.flock(File::LOCK_EX|File::LOCK_NB)
      yield
    else
      raise Locked
    end
  end
end

class GC10Logger
  def initialize
     @sp = SerialPort.new('/dev/ttyUSB0',9600,8,1,0)
  end
 
  def get_cpm
    line = @sp.gets("\n")
    if /^\d+/ =~ line
      return line.to_i
    else
      return nil
    end
  end

  def run
    loop do
      cpm = get_cpm
      now = Time.now
      next unless cpm
 
      dir = File.join(ENV["HOME"],"gc10",now.strftime("%Y"),now.strftime("%m"))
      file = File.join(dir,now.strftime("%d")+".txt")
      FileUtils.mkdir_p(dir)
      mode = File.exists?(file) ? "a" : "w"
      File.open(file,mode) do |io|
        out = "#{now.strftime("%Y%m%d%H%M%S")}\t#{cpm}"
        io.puts out
      end
    end
  end
end

begin 
  lock do
    gc10 = GC10Logger.new
    gc10.run
  end
rescue Locked
  puts "already running..."
  exit 0
end

あとはcronの設定。

cronからrvmのrubyを実行するのに若干手間取ったができた。
/etc/cron.d/gc10loggerを以下の内容で作成。


* * * * * pi /home/pi/.rvm/bin/ruby /home/pi/scripts/gc10logger.rb

みっしょんこんぷりーと

2013年7月31日水曜日

RaspberryPIからtweetする

例によってこのあたりから情報を得る。

twitterのatokenの取得やなんかはブログの内容が参考になるが、

twitter gemについては最新版とはAPIが全然違うらしく結局公式サイトを参考に。
# encoding:utf-8

require 'twitter'

Twitter.configure do |config|
  config.consumer_key = 'XXXXXXXXXXXXXXXXXXXXX'
  config.consumer_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXX'
  config.oauth_token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
  config.oauth_token_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
end

Twitter.update("tweet from RaspberryPI")




でけた。



RaspberryPIセットアップ

リモートで使えるようになったので早速セットアップ。

apt-get updateとかやった感じだとやっぱり遅い。

定番のlv,w3m,wget,vimあたりを入れて。

それからrvmでrubyのセットアップ

% curl -L https://get.rvm.io | bash -s stable --ruby=1.9.3
略
ruby-1.9.3-p448 - #extracted to /home/pi/.rvm/src/ruby-1.9.3-p448
ruby-1.9.3-p448 - #configuring.............................................................................................................................................................................................................................................................................................................................................................................................................................................................
ruby-1.9.3-p448 - #compiling............................................................................................................................................................................................

。。。コンパイルが凄まじく遅い。

普通のデスクトップとのCPUパワーの差を感じる。

 つうか終わらん。。。 結局、1時間近くかかった。 

そういや高速なSDカード使わないと遅いとどこかで見たような。。。
そのせいなのか。

% gem install twitter serialport
して終了。

2013年7月29日月曜日

RubyでGC10のcpmを取得

Ruby失敗日記: Ruby-serialportでシリアル通信というそのものずばりなサイトを参考にしてRubyでGC10のcpmを取得しよう。

まずはRVMでRubyをインストール。

% curl -L https://get.rvm.io | bash -s stable --ruby=1.9.3

そしたら

% gem install serialport

それで参考サイトのソースをちょびっと変更。

# encoding:utf-8
require 'serialport'

 #シリアルポート通信設定
$serial_port = '/dev/ttyUSB0' 
$serial_baudrate = 9600
$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はデリミターが受信されるまで
#あるいは設定されたタイムアウトになるまで待ちます
puts line = sp.gets("#{$serial_delimiter}") 
#あとは受信された内容を解釈するだけ

#シリアルポートを閉じる
sp.close
おもむろに実行
% ruby gc10.rb
17

とれた。
次はtwitterボット作成。
RaspberryPIはまだ届いてない。