2015年
3月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2015-03-04 rubyでグラフ

_ BLTを使ってグラフを書いてみた

rubyを使ってグラフを書く方法には、いくつかある。Rやgnuplotをrubyから呼び出す方法や、tkを使って書く方法などがある。tkを使う方法を調べていたら、plotcharやBLTというものを使うと、比較的簡単にグラフを作れるようだ。こんなのは、いつできたんだろう。 plotchartよりもBLTの方がいろいろとできそうなので、それをインストール。aptでlibtk-rubyとbltを入れたら、動くようになった。まず、書いてみたのが、こんなプログラムである。
require 'thread'
require 'tk'
require 'tkextlib/blt'
graph = Tk::BLT::Graph.new.pack
graph.title="title"
graph.axis_configure('x',:title=>'x-axis')
#graph.axis_configure('x',:min=>'0',:max=>'4')
#graph.axis_configure('y',:min=>'0',:max=>'4')
graph.axis_configure('x',:ticklength=>5)
graph.axis_configure('x',:showticks=>true)
graph.gridline_on()
graph.legend_configure( :hide=>'yes')
graph.crosshairs_configure( :hide=>'no')
graph.xaxis_bind('1', proc{|x,y| puts "x(%d,%d)"%[x,y]},"%x %y")
graph.yaxis_bind('1', proc{|x,y| puts "y(%d,%d)"%[x,y]},"%x %y")
xx=Tk::BLT::Vector.new()
yy=Tk::BLT::Vector.new()
zz=Tk::BLT::Vector.new()
plot = Tk::BLT::PlotComponent::Element.new(graph, 'plot1', :label=>'foo')
plot.configure( :xdata=>xx, :ydata=>yy)
plot.configure( :linewidth=>1)
plot.configure( :symbol=>'plus',:pixels=>5)
#"none","circle", "square", "diamond", "plus", "cross", 
#"splus", "scross", "triangle", "arrow"
plot2 = Tk::BLT::PlotComponent::Element.new(graph, 'plot2', :label=>'foo')
plot2.configure( :xdata=>xx, :ydata=>zz)
plot2.configure( :color=>"red")
plot2.configure( :symbol=>'cross',:pixels=>5)
Thread.start{
i=0
loop{
  xx.append(i)
  yy.append(Math.sin(i*0.01) )
  zz.append(Math.cos(i*0.01) )
  sleep 0.2
  i+=1
}}
Tk.mainloop
いろいろなオプションを指定すると、綺麗なグラフをオンタイムで書ける気がする。もう少しいじってみよう。

2015-03-13 raspberry piでmathematica

_ Mathematicaが使えるらしい

raspberry piの設定をしていて、いろいろと調べていたら、raspberry piではMathematicaを非商用では無償で使えるらしい。インストールは、sudo apt-get install wolfram-engineで終わり。no GUIだと/opt/Wolfram/WolframEngine/10.0/Executables/mathで実行らしい。とりあえず、N[Pi,100]などとして、遊んでみた。10万桁まではすぐに表示できたが、100万桁は少し時間がかかった。Quitで終了。
sudo ln -s /opt/Wolfram/WolframEngine/10.0/Executables/math /usr/local/bin/math
とでもして、シンボリックリンクをはっておいた。

2015-03-15 cabも扱える

_ Linuxでcabの展開

linuxでcabを展開する必要があったので、やってみた。apt-get install cabextractでインストールしてcabextract a.cabで展開できる。すぐにできてしまったが、メモしておこう。


2015-03-21 raspberry piでmotion

_ motionのdefaultの設定は不完全

raspberry piでweb cameraの画像を配信しようと思い、motionをインストールしてみたが、デーモンとして立ち上げるのに苦労した。まず、aptでmotionをインストールして、/etc/motion/motion.confを編集する。daemonをonにしたり、image widthやheightとframerateを設定し、ファイルを保存しないようにoutput_normal offとして、外部からアクセスできるようにwebcam_localhostをoffとする。

ここまでは、普通にするべきことなのだが、それに加えて以下のことをしたら、デーモンが立ち上がった。まず、/etc/default/motionを編集し、start_motion_daemon=yesとする。次に、/etc/init.d/motionの中の"--chuid motion"というオプションを削除する。

これで、電源を入れたら、motinoがデーモンとして立ち上がるようになった。

motionは比較的メジャーなパッケージだと思うのだが、何でdefaultの設定がこんなに面倒なんだろう。


2015-03-22 GPIBアダプタのアイディア

_ FTDIかRaspberry piか

測定装置のインターフェースの状況が、近年変わりつつある。昔からあったRS232CとGPIBは徐々にすたれて、USBTMCやEthernetが増えつつある。後の二つはLinuxから使いやすいので、重宝している。前の二つの内でRS232Cは、USB-RS232C変換ケーブルが容易に入手できるので、簡単に使うことができる。問題はGPIBであるが、LinuxからGPIBを扱うには、いくつかの方法がある。

まずは、PCにGPIBボードをのせて、linux-gpibを使って制御する方法である。これはシンプルなのだが、最近のdebianではカーネルのコンパイルが必要なようで、少し面倒である。以前はこのようにして使っていた時期もあるが、ボードも高いし、インストールが面倒なので、あまり使わなくなってしまった。

特殊な方法としては、古いPCについていたパラレルポートを改造して、GPIBを使えるようにしたこともある。コストは非常に安いし、当時のWindowとLinuxから使えるようにして、それなりに便利に使っていた。説明はここに残っているが、パラレルポートはほとんど見かけなくなったので、今は使えない方法である。

現在、よく用いられているのは、USB-GPIB変換ケーブルを使う方法である。アダプタはいろいろな種類があるが、linux-gpibを使うものや、内部でシリアルに変換するものなどがあるようである。自分でもUSB-RS232CとMAX232とAVR tiny2313を使った変換ボックスを作ったことがある。ソースなどは汚いので、公開していないが。

最近は、使える道具も増えてきたし、新しいGPIBを作れないか考えてみた。まず考えたのが、FTDIのBitbangモードを使って、USBから直接GPIBを制御できないかというものである。もう一つの考えは、Raspberry piのGPIOを使うものである。

FTDIのbitbangは、USBからbit操作を簡単にできる、魅力的な方法である。しかし、FT232Rのbitbangでは8bit、cbusは4bitしか使えないし、FT2232は16bit使えるようだが外付けの部品がいろいろと必要なようで、どちらもGPIB用としては不十分な気がする。FT232Rを使ってシリアルにしてマイコンでGPIBに変換するようなアダプタは、他にも作っている人がいるし、特殊なコマンドを定義しないといけないので、美しくない気がする。cbusはシリアルと同時に使えるので、ATN, IFC, REN, EOIなどをcbusから出して、dataはシリアルで通信するようにするようにすれば、特殊なコマンドを定義しなくても良いので、面白いかもしれない。

一方、Raspberry piのGPIOを使えば、余分なICを使わずに、GPIBが制御できるかもしれない。model BだとGPIOが17本、pi2Bだと26本あるようなので、数は十分である。CPUは忙しくなるが、バスに抵抗はダイオードなどをつけてGPIBにつなげば、GPIBが制御できそうである。

今度、時間ができたら、どちらかのアイディアでやってみよう。


2015-03-25 raspberry piとGPIBの比較

_ GPIBのバスライン

GPIBの規格によると、GPIBのそれぞれのバスは3kohmを介して5Vにプルアップして、6.2kohmを介してGNDにプルダウンしてある。何もつながない状態では、約3.3Vになる計算である。ドライバとしては、SRQ, NRFD, NDACはオープンコレクタ、その他の信号線はオープンコレクタまたはトライステートにするらしい。前者の3つは、wired orを実現するために、オープンコレクタの必要があるのだろう。

一方、raspberry piのGPIOは、3.3Vなので、GPIBのバスの電圧とは相性は良いかも知れない。問題は、電流の吸い込み能力がどの程度あるかである。

少し抵抗をつないで直結しても大丈夫なのかなと不安になるが、どうなのだろう。


2015-03-26 RS-232Cの制御

_ ruby-serialportを使って

RS-232Cの信号線としては、TxD,RxD以外に、出力としてRTS,DTRが、入力としてCTS,DSR,DCD,RIがある。これらをLinuxから制御する方法として、ioctlを使うこともできるが、rubyのserialportを使うと簡単であることが分かった。 まず、インストールをする。
aptitude install ruby-serialport
使い方は、以下のような感じである。
require 'serialport'
sp=SerialPort.new('/dev/ttyUSB0',9600,8,1,SerialPort::NONE)
sp.flow_control = SerialPort::NONE
sp.close
ソースを見ると、methodとしては、以下のものがある。
get_modem_params
set_modem_params
modem_params
modem_params=
baud
baud=
data_bits
data_bits=
stop_bits
stop_bits=
parity
parity=
flow_control=
flow_control
read_timeout
read_timeout=
write_timeout
write_timeout=
break
signals
get_signals
rts
rts=
dtr
dtr=
cts
dsr
dcd
ri
flush_input
flush_output
rtsとdtrは0または1を入れると、出力ができる。入力は、それぞれの信号線の名前と同じ名前のmethodで読むことができる。 出力の数は少ないが、簡単なICの制御などには使えそうである。汎用性も高いし。

2015-03-28 ubuntu14.04にavrdude6.1をインストール

_ avrdudeでarduino-ft232r

久々にavrを使おうと思って、書き込みをしようと思ったら、うまくいかなかった。ft232rを使ったarduino-ft232rまたはdiecimilaというタイプの書き込み機を指定したのだが、flushの消去に失敗する。どうやら、バグがあったようで、去年の9月末ぐらいには対策されている。しかし、ubuntu14.04のマシンのavrdude6.01では、動かないようだ。6.1ももう出ており、ubuntu14.10ではこれが標準になっている。しかし、ubuntu14.04はLTSなので、このままでなんとかしたい。 調べてみたら、以下のようにすると、avrdude6.1をインストールできるらしい。
sudo aptitude remove avrdude
sudo add-apt-repository ppa:pmjdebruijn/avrdude-release
sudo apt-get update
sudo apt-get install avrdude
これで書き込んでみたら、うまくいった。