ビデオキャプチャをweb配信

PCA-DAV2をdebianで
装置についたカメラをwebから監視したいと思っていたのだが,linuxからビデオキャプチャできる良いものが無かったので,なかなか実現できなかったが,ようやくできるようにすることができた.使ったのはPCA-DAV2というUSBビデオキャプチャで,入手が困難だったが売っているところを見つけてなんとか買うことができた.それをdebian bullseyeからmotionを使ってwebに流すまでの設定についてメモをしておきたい. まず,そのままだと認識されないので,/etc/modprobe.d/em28xx.confの中にoptions em28xx card=29と記述して,再起動すると認識するようになる.カード番号については,13,40,68という情報もあったが,自分の環境では29が正しいようだ. 次に,そのままだとPALが標準設定になっているので,これをNTSCに変更する必要がある.v4l-utilsをインストールして,v4l2-ctl –set-standard=0とすると,NTSCになる.すると,cheeseなどで画像が見れるようになる. そして,web配信はmotionを使った.これをインストールしたら,/etc/motion/motion.confを変更して必要な設定を行う.daemonをoffにして,NTSCにするためにnormを1にするのが重要で,あとは自分の環境に合わせて設定する.今回はpicture_outputもmovie_outputもoffにして,保存は行わないようにした.root権限でmotionを実行すると,8081ポートから動画が見れるようになる. 最後に,motionが自動で起動するように,まずはchown motion:motion /var/log/motion/motion.logとしてログファイルの権限を変更する.そして,systemctl start motionとすると,自動起動できるようになる. まだ,装置が実際に動いているときの動作を確認していないので,なんとも言えないが,便利になると良いな.

Read more...

rubyの更新

1.8.7から2.7.4へ
10年ぐらい前にセットアップしたPCを更新したら,rubyのversionがかなり違っていて,プログラムを書き換えるのに苦労した.特に,文字コードとしてShift_JISを使っていたので,その部分も面倒だった.正確にはCP932というコードだったので,Shift_JISを指定しても動かなかったが. 主に引っかかった点を,羅列しようと思う.

  • requireのフォルダ指定が必要
  • jcodeが廃止
  • parsedateが廃止されたので,require "date"としてからDate::parse(self).to_timeを使った
  • # coding: cp932を指定した.
  • CGIのformを取り込むために,CGI.accept_charset="cp932"とした
  • ファイルの読み書きで,"w:cp932"などと指定した
大体は以上の変更で動くようになったようだが,今後まだバグが出るかも知れない.

2023/3/30追記 あと,cookieで日本語を使っている場合に,CGI.unescape(ci[0])などとしなければならなかった.

Read more...

dataの抽出

古いKaleidaGraphから かなり古いKaleidaGraphから数値dataを抽出したいという話を聞いたので,そのデータをもらって,構造を解析してみた.それなりに単純な構造をしていたので,データ抽出プログラムをrubyで書いてみた.それがこんな感じ. qda=ARGV[0] dat=qda.sub(/\.qda$/i,"_.dat") d=open(qda,"rb"){|f|f.read} n=d[0,16].unpack("n*") c=n[8] # byte size of the last comment n=n[1] # the number of data sz=d[0x200,2*n].unpack("n*") # size of each data tp=d[0x200+2*n,2*n].unpack("n*") # type names=d[0x200+4*n,40*n].unpack("a40"*n).map(&:strip) r=d[(0x200+4*n+40*n)..-1] sz=sz.zip(tp).map{|s,t| a,b="g","" # big endian float a,b="N","Z21" if t==1 # string a,b="G","" if t==2 # big endian 64bit float *data,r=r.unpack(a*s+"n"*s+b*s+"a*") msk=data[s,s] # mask str=data[2*s,s] # string data=data[0,s] # numeric if t==2 # date or time td=r[0,8].unpack("C*")[3] data=data.map{|l|(Time.gm(l>3e9?1904:2000)+l).getutc.strftime("%d-%m-%Y")} if td==0 #date data=data.
Read more...

グラフソフト

originをwineで

グラフソフトとしては,Rを主に使っている.使い始めた当初は,コマンドや言語の仕様になれずに,多少は戸惑ったが,使い慣れてくると使いやすいと感じるようになってきた.研究用のグラフソフトとしては,Igor ProやOriginなどがあるが,それなりに高価である.多少は安価なKaleidaGraphなども使われているようである.コマンドに慣れる必要はあるが,これらの高価なソフトに勝るとも劣らない機能を,フリーで利用できるのは良いことだと思う.

さて,知り合いがOrigin ProをLinux上で動かしたいということだったので,やってみた.IgorProはWineでほとんど苦労せずに動かすことができるので,Wineで普通に動くかも知れないと予想していたが,そうでは無かった.試したのはOrigin Pro 2023で,インストールまでは普通にできて,立ち上がるものの,クリックなどが一切できない. Wine hqのページを調べたところ,別のversionの情報があって,

winetricks vcrun2019

とすると良いようだった.しかし,これを実行すると,ハッシュが合わないと言われてうまくインストールできない.これは,microsoftが最近ファイルを更新したためらしい.そこで,

sudo winetricks --self-update

とすると,winetricksが最新のものに入れ替わって,vcrun2019が無事にインストールできるようになる. その後でOrigin Proを立ち上げると,無事に動くようになった.細かい動作はまだ確認していないが,なんとか使えるようになった.

Read more...

xautomation

マウス操作の自動化
マウスをクリックする作業を,ある程度の時間をあけて繰り返さないといけないことになった.以前は古いwindowsで,何かソフトを入れてそのようなことをやっていたが,その時に使ったソフトが何か分からなくなったので,今回はlinuxで似たようなことをやってみた. まず,aptitudeでxautomationを入れる.次に,マウスのクリックする場所の座標をxmouseposを用いて調べる.そして,シェルスクリプトを作って,永久にループするようにして,それを実行すれば出来上がりである. 実際に作ったスクリプトは以下の通りである.

sleep 3600
while true
do
 xte 'mousemove 385 210'; sleep 1; xte 'mouseclick 1'; echo r on
 date; sleep 10;
 xte 'mousemove 485 210'; sleep 1; xte 'mouseclick 1'; echo x on
 date; sleep 1
 xte 'mousemove 485 235'; sleep 8; xte 'mouseclick 1';echo x off
 date; sleep 100;
 xte 'mousemove 385 235'; sleep 1; xte 'mouseclick 1'; echo r off
 date; sleep 3600
done

これで,後は時間を待つだけのはずだ.

Read more...

webpへの変換

jpegとwebp
インターネット上の画像形式としては、以前はjpegが多かったと思うのだが、最近はwebpが増えてきたように感じられる。最初にwebpを知ったときには、まだ対応しているソフトが少なくて、表示するためにブラウザーを使ったものである。 少し試してみたところ、imagemagickのconvertでjpgからwebpに変換すると、容量が増えてしまう。一方、gimpのデフォルト設定で変換すると、容量がかなり小さくなる。ただし、losslessを指定すると、imagemagickと同程度になった。試行錯誤していたら、imagemagickで変換するときも、-quality 90という指定をすると、容量が減ることを発見した。 webpを扱えるソフトが増えてきたので、今後はlosslessの必要が無く、容量を小さくしたいときにはwebpを使うのも良いかも知れない。

Read more...

picotest G5100AをLANから制御

マニュアルに書いて無い
picotestのファンクションジェネレーターG5100AをLANから制御する必要があって、なんとかできたけど少し苦労したので、メモをしておく。設定をいじってLANにつないで DHCPでIPを取得するところまでは問題なくできるが、そこから先のことがマニュアルにほとんど書いていないので試行錯誤が必要だった。 まず問題なるのが、何番のポートからアクセスするかである。rubyからいくつかのポートをあけようとしてみたら、80番は開いているようだったので、ブラウザからアクセスしてみたら、説明が表示された。それによると、httpの80番とSCPI telnetの5024番とSCPIソケットの5025番が使えるようである。ブラウザからもスイッチを押す感じで使えるのは面白いと感じた。 次に、試しにtelnetで5024を開いてコマンドを入力してみたら、普通に動作したが、プログラムから制御するために5025番にコマンドを送っても、動作しなかった。いろいろといじっていたら、改行コードも送らないとコマンドが実行されないことがわかった。つまり、5025番のポートを開いて、GPIBやUSBTMCで送るコマンドに改行を加えて送ると、制御できる。 マニュアルに少しは説明を書いて欲しかった。

Read more...

Rとjuliaとpythonとrubyで

様々な言語で角運動量演算子 角運動量演算子の行列を求めるプログラムを4つの言語で書いてみたので,メモがてら公開しておこうと思う.言語名と角運動量演算子で検索してもあまりヒットしないので,誰かの役に立つかもしれないし. Rについては,以前もブログに書いたことがあるが,j=0の場合にも対応できるように一部を書き直した. mjz<-function(j) diag(j:-j,2*j+1) mjp<-function(j) matrix(diag(sqrt(diffinv(j:-j)*2))[-1,-2*j-2],2*j+1) mjm<-function(j) t(mjp(j)) mjx<-function(j) (mjp(j)+mjm(j))/2 mjy<-function(j) (mjp(j)-mjm(j))/2i me<-function(j) diag(2*j+1) juliaは,比較的新しい言語だが,数値計算には便利かも知れないので,書いてみた.いつかこのルーチンを使ってみたい. using LinearAlgebra mjz(j)=diagm(j:-1:-j) mjp(j)=diagm(1=>2j:-2:2-2j|>cumsum.|>sqrt) mjm(j)=mjp(j)' mjx(j)=(mjp(j)+mjm(j))/2 mjy(j)=(mjp(j)-mjm(j))/2im me(j)=I(2j+1) pythonはなぜか人気が衰えない言語で,書きにくいけど需要があるかも知れないので,書いてみた. import numpy as np def mjz(j):return np.diag(j-np.arange(2*j+1)) def mjp(j):return np.diag(np.sqrt(np.cumsum((j-np.arange(2*j))*2)),1) def mjm(j):return mjp(j).T def mjx(j):return (mjp(j)+mjm(j))/2 def mjy(j):return (mjp(j)-mjm(j))/2j def me(j):return np.identity(int(2*j+1)) rubyは数値計算にはあまり向かない言語だと思っていたが,numoを使えば数値計算もできそうなので,書いてみた. require "numo/linalg" def mjz(j) (j-Numo::DFloat[0..2*j]).diag end def mjp(j) Numo::NMath.sqrt((j-Numo::DFloat[0...2*j]).cumsum*2).diag(1) end def mjm(j) mjp(j).transpose end def mjx(j) (mjp(j)+mjm(j))/2 end def mjy(j) (mjp(j)-mjm(j))/2i end def me(j) Numo::DFloat.
Read more...

inkscapeでeps

bounding boxが難しい
texに貼り付けるためのepsファイルを少し手直ししたくて,inkscapeを使ったのだが,texに貼り付けるとずれてしまうという症状に行き当たった.どうやらboundingboxが問題らしく,これを解決する手段を見つけたので,メモしておく. inkscapeでepsをsaveすると,その時に表示されている画像が入るギリギリの枠がboundingboxとして作られるが,その原点は枠では無く紙の左下に取られる.texの場合には,枠の左下の座標が原点である方が良いらしく,それが問題になっているようである. そこで,epsでsaveする直前に,Edit-Resize Page to Selectionとして,紙のサイズを画像ギリギリにして,それからSave asでepsにすると,枠の左下が原点となり,texに貼り付けた時にズレたりしなくなるようである. 以後,inkscapeが必要な時には,この手法を使おうと思う.

Read more...

24bitのADC

ブリッジ回路
ブリッジ回路の微小な電位差を読んでマイコンに取り込みたいと思い,いろいろといじっていたが,なかなかうまく行かなかった.voltageフォロワーとしてオペアンプを使って,それをattiny261で直接読んでみたが,微小な電圧が揺らいでしまってうまく読めない.261では32倍に増幅しても,読んでいるのだが.オペアンプの種類を変えたら,若干改善したものの,必要な桁は得られないと判断して,別の方法を考えてみた. オペアンプを介して,桁の大きなADCで読んだらどうかと思って,手持ちのICを漁っていたら,TM7711というADCを見つけた.これは24bitなのだが,datasheetが中国語のものしか無くて,細かい仕様が分からなかったが,うまく使うことができたので,その概略を書いておこうと思う. 電源電圧を参照電圧として与えたのだが,このICは差動の電圧を128倍に増幅して,それぞ基準電圧の2^24分の一を単位として読み取る.読み取り方も比較的単純で,クロックを25回から27回High/Lowを繰り返したときの,dataから読み取るというものである.このとき,最初の24回にはdataがあり,25または27回にすると,それぞれ10Hz,40Hzで,26回にすると温度を読み取るモードとなるようである.arduinoで読み出すプログラムを書いてみたので,以下に示す.

void setup() {
  // put your setup code here, to run once:
  digitalWrite(A0,LOW);
  pinMode(A0,OUTPUT);
  pinMode(A1,INPUT);
  Serial.begin(9600);
}
void loop() {
  // put your main code here, to run repeatedly:
  signed long v=0;
  while(digitalRead(A1)>0);
  for(char i=0;i<24;i++){
    digitalWrite(A0,HIGH);
    delayMicroseconds(5);
    v<<=1;
    if(digitalRead(A1)>0)v++;
    digitalWrite(A0,LOW);
    delayMicroseconds(5);
    }
    digitalWrite(A0,HIGH);
    delayMicroseconds(5);
    digitalWrite(A0,LOW);
    delayMicroseconds(5);
  if(v>=1<<24)v|=0xff000000;
  Serial.println(v);
  delay(1000);
}
Read more...