マニュアルに書いて無い
picotestのファンクションジェネレーターG5100AをLANから制御する必要があって、なんとかできたけど少し苦労したので、メモをしておく。設定をいじってLANにつないで DHCPでIPを取得するところまでは問題なくできるが、そこから先のことがマニュアルにほとんど書いていないので試行錯誤が必要だった。
まず問題なるのが、何番のポートからアクセスするかである。rubyからいくつかのポートをあけようとしてみたら、80番は開いているようだったので、ブラウザからアクセスしてみたら、説明が表示された。それによると、httpの80番とSCPI telnetの5024番とSCPIソケットの5025番が使えるようである。ブラウザからもスイッチを押す感じで使えるのは面白いと感じた。
次に、試しにtelnetで5024を開いてコマンドを入力してみたら、普通に動作したが、プログラムから制御するために5025番にコマンドを送っても、動作しなかった。いろいろといじっていたら、改行コードも送らないとコマンドが実行されないことがわかった。つまり、5025番のポートを開いて、GPIBやUSBTMCで送るコマンドに改行を加えて送ると、制御できる。
マニュアルに少しは説明を書いて欲しかった。
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.eye(2*j+1) end
Rはそのままで実行可能だが,それ以外の3つの言語では,何らかのライブラリを組み込まないといけないのが,少し面倒だ.Rやjuliaは半整数をあまり意識しなくても動くが,pythonとrubyは,rangeが半整数だと動かないので,2*jが整数であることを生かして少し工夫しないといけなかった.R以外の3つの言語では,対角要素の一つ上に成分を並んだ行列を簡単に作れるので,上昇演算子を簡単に書けるが,Rだとそこに工夫が必要で,もう少し良い手法もあるかも知れない.
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が必要な時には,この手法を使おうと思う.
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); }
maximaでベクトル解析
変形の手助け
式変形で,手計算が大変なときには,maximaを使うことが多い.しかし,ベクトル解析などの場合は,その取り扱い方がよく分からなかったので,これまでは使えなかったが,一応できるようだ.例えば,こんな感じで.
load("vect"); depends([f,p],[x,y,z]); div(grad(f*p)); express(%); ev(%,diff);
fとpが座標に依存することを明示して,式を定義する.ちなみに,rotはcurlを使う.その後で,それを展開したり,微分の公式を適用したりする.と,変形ができる.これをdivなどを使った表記に戻す方法が分からないが.あと,変数の間の関係式を代入するためには,ratsubstを使うと良いようだ.
(x+1)^2+(y+1)^2; ratsubst(1,x^2+y^2,%);
これらを使うと,これまで計算できなかった変形ができるようになった.これで,式変形が進むかな.
階乗の計算
rubyは少し面倒かな.
rubyで階乗を使おうと思ったら,意外に面倒だった.maximaだと数学と同じように4!と書ける.Rだと,prod(1:4)で計算するか,gamma(5)を使う方法もありだと思う.一方,rubyだと,(1..4).inject(:*)とするしか無いかな.その書き方を使って,階乗を沢山含んだ式を書いたら,長いコードになってしまった.わざわざ定義するほどでは無いし.
owonのオシロスコープ
SDS7202の制御
電気的なシグナルを見るためにオシロスコープを使うことがあるが,その波形をPCに取り込む必要性が出てきた.しかし,手持ちのオシロの多くはPCとのinterfaceがついていない.幸いなことに,手元にあったowonのSDS7202には,USBとLANのポートがあって,通信もできそうだと思って調べてみたら,測定のパラメータはSCPIコマンドで変えられるらしいことが分かった.しかし,波形の取り込みについては,やり方がすぐには分からなかった.
専用のソフトを使うとできるようなので,原理的には可能なはずだと思っていろいろと調べてみると,参考になる情報がいくつか見つかったので,それをもとに試行錯誤して,なんとか通信できるようになったので,その概要を書いておく.その時に作ったプログラムも,いずれは公開するかも知れない.
まず,PCとの接続には,LANを用いた.固定IPを指定したら,問題無く通信をすることができた.最初に苦労したのが,SCPIコマンドで,大文字と小文字の区別をすることである.通常の装置は,その区別が無いので,そう信じて通信していた,うまく行かずに原因の究明に時間を取られてしまった. 波形のdataは,STARTMEMDEPTHを送ると,直前の測定のbinary dataが返ってくる.このformatが少し独特で,web上で見つかった情報にもいくつかの誤りがあったので苦労したが,いくつかの不明な点を除くと,だいたい理解することができた.この詳細を書くと長くなるのでrubyで書くと,以下のような感じである.ここで,dが返ってきたdataから,先頭の通信用のフラグの12byteを除いたものである.
model,unknown1,serial, trig,channel,zero1,zero2,hPos,type, remain = d.unpack("A6VA30C4s<aa*") trigger={"s"=>[1],"a"=>[1,2]}[type].map{ trgSrc,trgMod,remain=remain.unpack("Caa*") unpck = trgMod=~/[ep]/ ? "l<aa*" : "aa*" # edge or pulse remain,sep,level = remain.unpack(unpck).reverse [trgSrc,trgMod,level,sep] } ch1,ch2=[1,2].map{ ch=remain.unpack("A3l<V9e4") #ch,block,memory,from,screensize,size,movesize,tbase,voffset,vbase,attenuation,tdiv_us,freq,cycle,vdiv_mV next unless ch[1] block=3+ch[1].abs ch=remain[0,block] ch=ch.unpack("A3l<10e4a*") remain=remain[block..-1] unpck=ch[2][0]>0 ? "c*" : "s<*" ch[-1]=ch.last.unpack(unpck) [ch[11]*1e-6,ch[-1].map{|l|(l-ch[8])*ch[14]*1e-3}] } [ch1,ch2,trigger]でも,これで分かってくれる人は,どの位いるのだろうか.
ubuntu22.04のくせ
Jammy Jellyfish
少し前にインストールしたubuntu22.04LTSであるが,少しだけ気になることがあったので,記録しておこうと思う.budgieを選んだが,他の環境でも同じだと思う.
まず,以前のLTSと変わっていたことに気がついたのが,firefoxがsnap版になっていたことである.apt版を入れるには,少し工夫が必要なようだった.大抵のことはどちらでも変わらないと思うが,OSのインストールなどをしたときの,環境の引き継ぎなどのやり方が変わるのでは無いかと思われるので,気をつける必要がある.
あと,いくつかのサイトのipの取得に失敗するようで,新たにgoogleのDNSである8.8.8.8を設定したら,うまく動くようになった.自動設定などでnetplanを使うようになったことによる不具合なのでは無いかと予想している.もうしばらくすると,このバグも取れるかな.
vestaのインストールの仕方
bullseyeとJammy Jellyfishにvesta
もう数ヶ月前になるが,ubuntu22.04LTSがリリースされたので,vestaが入れられるかどうかを調べてみた.また,source.listを使ったインストールの仕方がweb上にあまり書いていないようなので,ここに載せておく.まず,debian11かubuntu22.04に応じて,下のようにしてどちらかのファイルを取ってくる.
wget https://sourceforge.net/projects/materiappslive/files/Debian/sources/materiapps-bullseye.list wget https://sourceforge.net/projects/materiappslive/files/Debian/sources/materiapps-jammy.list
ここでは,debianの例を書くが,listをaptのフォルダに入れて,updateしてkeyringを有効にすると,このsource.listが有効になる.
sudo cp materiapps-bullseye.list /etc/apt/sources.list.d/ sudo apt-get -o Acquire::AllowInsecureRepositories=true update sudo apt-get -y --allow-unauthenticated install materiapps-keyring sudo apt-get update
そしたら,vestaなどはaptやaptitudeで入れられるようになる.ubuntuは試していないが,non-freeの中にvestaがあるので,多分大丈夫なんだと思う.
CPUの使用状況
topとhtop
CPUの使用状況を調べるために,これまではtopを使っていました.しかし,マルチコアのCPUに対しては,100%以上が表示されたりして,よく分からなかった.今回,htopというものがあることを知って使ってみた.スレッド毎に使用率が表示されて,わかりやすくなっている.メモリの使用状況も分かるし.