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...

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,%);

これらを使うと,これまで計算できなかった変形ができるようになった.これで,式変形が進むかな.

Read more...

階乗の計算

rubyは少し面倒かな.
rubyで階乗を使おうと思ったら,意外に面倒だった.maximaだと数学と同じように4!と書ける.Rだと,prod(1:4)で計算するか,gamma(5)を使う方法もありだと思う.一方,rubyだと,(1..4).inject(:*)とするしか無いかな.その書き方を使って,階乗を沢山含んだ式を書いたら,長いコードになってしまった.わざわざ定義するほどでは無いし.

Read more...

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]
でも,これで分かってくれる人は,どの位いるのだろうか.
Read more...

ubuntu22.04のくせ

Jammy Jellyfish
少し前にインストールしたubuntu22.04LTSであるが,少しだけ気になることがあったので,記録しておこうと思う.budgieを選んだが,他の環境でも同じだと思う. まず,以前のLTSと変わっていたことに気がついたのが,firefoxがsnap版になっていたことである.apt版を入れるには,少し工夫が必要なようだった.大抵のことはどちらでも変わらないと思うが,OSのインストールなどをしたときの,環境の引き継ぎなどのやり方が変わるのでは無いかと思われるので,気をつける必要がある. あと,いくつかのサイトのipの取得に失敗するようで,新たにgoogleのDNSである8.8.8.8を設定したら,うまく動くようになった.自動設定などでnetplanを使うようになったことによる不具合なのでは無いかと予想している.もうしばらくすると,このバグも取れるかな.

Read more...

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があるので,多分大丈夫なんだと思う.

Read more...

CPUの使用状況

topとhtop
CPUの使用状況を調べるために,これまではtopを使っていました.しかし,マルチコアのCPUに対しては,100%以上が表示されたりして,よく分からなかった.今回,htopというものがあることを知って使ってみた.スレッド毎に使用率が表示されて,わかりやすくなっている.メモリの使用状況も分かるし.

Read more...

RとwebGL

やり方が変わった
約一年ぶりにRからwebGLを作ろうとしたら,以前のやり方ではうまく行かなかった.以前はwriteWebGLというコマンドを使っていたのだが,ファイルはできるものの,ブラウザーで見るとjavascriptが有効で無いというようなコメントが出る.調べてみたらhtmlwidgets::saveWidgetというコマンドを使うべきだという記述を見つけた.結局,下のコマンドを実行すると,htmlと,必要なjsなどが出力された.

htmlwidgets::saveWidget(rglwidget(), "out.html", selfcontained=FALSE, libdir="lib")

一年でやり方が変わるのは,困ったものだ.

Read more...

Rとjuliaとrubyとpython

行列の取り扱い方 4つの言語の比較の第八弾として,そのきっかけとなった行列の使い方について表にまとめてみた. Rjuliarubypython3 初期化 using LinearAlgebra require "numo/linalg" import numpy as np 定義 a<-matrix(c(1,3,2,4),2,2) a=[1 2; 3 4] a=Numo::NArray[[1,2],[3,4]] a=np.array([[1,2],[3,4]]) 単位行列 b<-diag(2) b=I(2) b=Numo::DFloat.eye(2) b=np.eye(2) b=np.identity(2) 対角行列 d<-diag(c(1,2)) d=diagm([1,2]) d=Numo::NArray[1,2].diag d=np.diag([1,2]) 対角要素 diag(a) diag(a) a.diagonal np.diag(a) np.diagonal(a) a.diagonal() 型 dim(a) size(a) a.shape a.shape 要素 a[1,2] a[1,2] a[0,1] a[0,1] 行 a[1,] a[1,:] a[0,true] a[0,:] 列 a[,1] a[:,1] a[true,0] a[:,0] 転置 t(a) transpose(a) a.transpose a.T a.transpose() 随伴行列 Conj(t(a)) a' adjoint(a) a.transpose.conj a.T.conjugate() 跡 sum(diag(a)) tr(a) a.
Read more...

Rとjuliaとrubyとpython

特殊関数 4つの言語の比較の第八弾として特殊関数などの使い方についてまとめてみた.まず,比較的一般的な特殊関数は,以下の表のように使うことができる. Rjuliarubypython3 導入 julia using Pkg Pkg.add("SpecialFunctions") aptitude install ruby-gsl aptitude install python3-scipy 初期化 using SpecialFunctions require "gsl" from scipy import special ガンマ関数 gamma(3) gamma(3) Math.gamma(3) special.gamma(3) ダイガンマ関数 digamma(3) digamma(3) GSL::Sf::psi(3) special.psi(3) ベッセル関数 besselJ(0.1,1) besselj(1,0.1) GSL::Sf::bessel_Jn(1,0.1) special.jv(1,0.1) 次に,多項式で表される特殊関数は,例えば以下のように使うことができる. Rjuliarubypython3 導入 aptitude install r-cran-polynom R install.packages("orthopolynom") julia using Pkg Pkg.add("SpecialPolynomials") aptitude install ruby-gsl aptitude install python3-scipy 初期化 library(polynom);library(orthopolynom) using SpecialPolynomials require "gsl" from scipy import special エルミート多項式 predict(hermite.h.polynomials(3)[[3]],0.8) basis(Hermite,2)(0.8) GSL::Poly.hermite(2).eval(0.8) special.
Read more...