ゼロから作るOS

Interface誌の特集がRaspberry Pi Picoで動くOSを作るとのことで、買ってみた。Picoについてはこれまでに公式のSDKのexamplesなどをいじってみたものの、C言語に抵抗がありわかった感じがしなかったので、もう少し詳しくなりたいと思っていたところだ。そこに渡りに舟の特集だったのだが、御多分に漏れず環境構築から手こずった。


プログラム対象のPicoともう一台別のPicoを用意してOpenOCDでのデバッグが可能なのだけど、このOpenOCDをどうやってインストールするかという所からして、大いにてこずった。Picoの公式ドキュメントにはGitHubからダウンロードしてmakeせよと書いてあったがなぜか動かず、結局brew installした。またEclipse IDEを使用せよという話だけど、組み込みシステム用のアドオンをインストールできておらず設定画面で困ったり。IDEに頼らずまずコマンドラインからコンパイラを叩いてみたのは、どういうオプションが必要かとか、Makefileのご利益とか、ちょっと勉強になった。
なんとか環境構築が完了したのだけど当然ここからも難儀している。著者の書いたコードは動くのだけど、中身がかなーりわからない。C言語にも不慣れだし、リンカスクリプトに至っては何を読んだら理解できるのかすらわからない。というわけでバシバシChatGPTに聞きながらコードを解読している。ChatGPTというのはコード読みに関しては本当に頼りになる存在で、かなり心強い。下は関数ポインタの配列宣言について細かく説明をお願いしてみたところ。

無尽蔵の忍耐力を持った知識豊富な先生が専属でついてくれているようなもので、非常に助かる。(もちろん100 %信用できないところはあるが。)

実力不足を感じながらやっているが、なかなか面白くやっております。

技術の時間

これからマイコンを勉強するとしたらAVRとPICのどっちがいいだろうと調べてみら、MicrochipがAVRを吸収したいまとなっては両者は結構融合が進んでいるらしい。トランジスタ技術 2021年4月号の特集「AVRでサクッとマイコン開発」を読んだら、「どちらも同じツール、同じIDE、同じコンパイラを使って開発ができます」とのこと。安心してとりあえずPICkit4を買った。


早速作りたいものがあるので慣れない頭で数日間考えていたが、マイコン部分以外にも回路作製が必要になりそうだ。電子回路については学生時代の実験で数時間触れただけで、知識はほぼない。というわけでとりあえず基礎から勉強できそうな良さげな教科書を買った。

これは流石に結構簡単そうなので早めに読み切ってしまいたい。新分野に取り組むときには考える前にとにかく知識量を増やすことが不可欠だ。


今回の工作は前途が長い。プリント基板作製も初めて取り組むし、ハードウェアとソフトウェアを両方開発しながらデバッグするのも初めてだ。一通り流れを経験して入門者から初心者へ!を目指していきたいですな。

技術力が欲しい

 もっと技術力を身につけたいと思う。というのも研究をしていると最適な装置(計測器とか)を自作できたらいいのにと思うことが少なからずあるからだ。自分の技術力の低さゆえに及び腰になってしまい、研究の進展が遅くなるケースもある(たとえばアナログ回路などを億劫がったり)。研究をして得られる知識をいざそれを実用的な問題に適用したいという時にも実装のイメージが湧いてこないこともある。これは結局、自分の技術力というか、ものづくり力が低すぎるせいだと思う。物理系の研究というのは案外枯れた技術で成り立っている部分が大きいので、これでもやれてないことはない。しかし技術力がないから技術が十分と思えているだけということもありうる。
 技術力が研究を大きく進展させた例としてPCの活用がイメージと近いかもしれない。私の上司の世代はアナログ装置を使った実験で、定期的にメーターを目視してデータを得ていた時代を経験したそうだが、今日からはなかなか想像できない。PCが研究に普及して大量のデータを取得できるようになったし、解析も高度になって…いろんな面で研究の質が大きく向上した。もう一つ別の理想として、20年ほど前に電子顕微鏡マイコン工作でチョチョチョイと改造し、電子線リソグラフィ装置を自作したなんていう話があるらしい。今の自分にはそんな技術力がないが、もしそんなことができたらカッコいい。というわけで自分も技術力を身につけて、研究の幅を広げてみたい。業務上の不便を解決して研究の生産性を上げたいし、実装力を上げて基礎研究と実社会を近づけられたら満点。
 妄想を語りすぎたが、そういう感じでゆるく頑張っていきたい。一朝一夕には以下がないでしょうがとりあえず所信表明。

揺動散逸定理の導出について

最近ザゴスキンを読んでいて揺動散逸定理について少し理解が深まったのでメモ。 時間相関と応答関数とを関係づける、揺動散逸定理は実用上重要なので、触ったことがある人は多いと思う。けれども敷居が高いのか、導出についてはあまり知られていないように思う。でも実は線形応答理論さえ認めてしまえば実は簡単に導出できる。 大胆に簡略化してしまえばこんな感じになる。感受率 \chiは久保公式から \langle AB-BA\rangleとなり、時間相関関数 C \langle AB+BA\rangleとなる。実は、 \langle BA\rangle = e^{\beta \hbar\omega}\langle AB\rangleなので(KMS恒等式)、 \chi = (1-e^{\beta\hbar\omega})/(1+e^{\beta\hbar\omega})Cになる。これでほぼ証明は完了。本当はcausalityについてきちんと考える必要があるけど、その辺はとりあえず無視している。こうして形式的に整理してみると揺動散逸定理を覚えておくのに役立つ。 ただこれは厳密な意味での揺動散逸定理の「証明」とはならないので注意が必要。中嶋貞雄先生が「現状の線形応答理論は,揺動・散逸定理が成立するように構築されている」と言っているように、線形応答理論には多くの仮定が含まれている。(https://www.jps.or.jp/books/50thkinen/50th_10/001.html

二酸化炭素センサ1

週末は二酸化炭素モニター用のセンサでちょっくら遊んでいました。
www.winsen-sensor.com

サンプルプログラムをここからコピーしてきた。

#include <SoftwareSerial.h>
SoftwareSerial SerialCom (A1,A0);
int myDelay = 2000;
 
byte addArray[] = { 0XFF, 0x86, 0x02, 0x60, 0x47, 0x00, 0x00, 0x00, 0xD1 };
 
char dataValue[9];
String dataString = "";
 
void setup(){
  Serial.begin(9600);
  SerialCom.begin(9600);
  Serial.println("MH-Z14 C02 Sensor Test Code");
  Serial.println("------------------------------------");
}
 
void loop() {
  SerialCom.write(addArray, 9);
  SerialCom.readBytes(dataValue, 9);
  int resHigh = (int) dataValue[2];
  int resLow  = (int) dataValue[3];
  int pulse = (256*resHigh)+resLow;
  dataString = String(pulse);
  Serial.print("PPM: ");
  Serial.println(pulse);
  delay(myDelay);
}

途中読み出した値をintにキャストするところは、unsigned signにしないとまずい。(僕もはじめ少しハマった)
あとは、送信するコマンドはMH-Z14Aのマニュアルを見て修正する必要がある。

byte addArray[] = { 0XFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };

これらを組み合わせると、なんとか二酸化炭素濃度が測れるようになりました。ちなみにマニュアルではサラッと書いてあるけど、センサのキャリブレーションは基本的には実行してはいけない。自宅で二酸化炭素濃度を定量的に制御して再校正することがほぼ不可能だからだ。


それから、ネットワークについての入門書を買った勢いで、Linuxマシン1台あればTCP/IPの実験ができるというこちらの本を買ってみた。

ip netnsを使って仮想的なネットワークを構成し、ルータを介したipネットワークを構築することができた。また上位プロトコルについても解説されていて、思いがけずカバレッジが良い良書だった。

買い物初め

論文がアクセプトになったこともあり、自分へのご褒美として2021年の買い物初めをした。

実はUR22Cは納期がかかるので2000円くらい高いひとつ上位のモデルを買った。
スタインバーグ Steinberg USB3.0 オーディオインターフェイス UR24C

先日Julia言語でwavファイルを扱ってみたところ、急激に音声処理に興味が湧いてきた。wavファイルは、規格上8 bitまたは16 bitの信号ということだが、上にあげたUSBオーディオインターフェース(AIF)は32 bit Integerの音声データの入出力が可能。音声データの形式として、これと別に32 bitのfloatデータというのもあるが、これは上位1 bitが符号、次の7 bitが指数部を表すため有効数字に与するのは24 bitであり「普通のハイレゾ」と差がない。上のような32 bit整数を扱える高性能なADCが2万円そこそこで買えるのは素晴らしい、ということでほとんど考える前にポチった。
Steinberg オーディオインターフェース「UR-Cシリーズ」発売記念!直撃インタビュー - YouTube
32 bitというと、ダイナミックレンジにして192 dB。これだけ広範囲となると、特性が良いマイクを探すことにも苦労しそうだが、研究用途にも使えるんじゃないかと思う。音響測定まわりでホビー研究でもしてみたいなあ。


買い物その2は、CO2センサ。こちらは、動作原理を知ったところ、ぜひ触ってみたいと思った。

IR吸収を固定されたスペクトルについて測定するNDIRと呼ばれる原理で動作するもので、こういう光学測定を自宅で行うのは想像しただけで面白い。Arduinoから、環境測定で使う予定。


本も買った。現代の教養書です。

ネットワークがよくわかる教科書

ネットワークがよくわかる教科書