RasPiにI/Oを増設しよう! 2020.7.14

いままで、RasPiを動かそうとしたら、色々と大変でした。
まずはHDMIでモニターに接続して、キーボードを新たに用意して、さらにUSBマウスも用意する必要があります。
机の上には2台のキーボードとマウスが混在することになり、とてもややこしかったのです。RasPiがいくら小さくても、付帯装置が多ければ
あまりRasPiの小型のメリットが受けられません。そのため、動かすのは結構気合がいる作業でした。
 そういった状況から、最近ようやくVNCをつかったリモート接続や、WinSCPをつかったPC間とのファイル転送
の環境や整いました。そのため、キーボードやマウスを持ち出さずに、お気楽にRasPiがつかえるようになってきました。
 さらにいいことに、RasPiはWiFIでつながっているので、机の上においておく必要もなく、色々な場所に置くことができます。
そうなると、色々なI/Oをぶら下げて、実験などにつかってみたくなります。

 そういうこともありRasPi用にI/Oを接続すべく、拡張ボードを接続しました。拡張ボードといっても、まだ無垢のユニバーサルボードです。
これから、色々なI/Oをのせていきましょう。
 あたらしいことに目を向けないないと、またCPM80が増殖してしまいそうです(笑。


RasPi用のI/O拡張用基板をとりつけました。これから、PIO、ADC,DACなどを搭載したいと思います。

必要なのは、DAC、ADCそしてGPIO

まず基本的に必要なものはDACとADCとGPIOでしょう。そこで、何を搭載したらいいかを検討していきましょう。

まずはDAC

候補1)MCP4922

いちばん簡単そうなのはMCP4922です。秋月で250円程度で購入できます。手元にも何個かあります。
性能は12ビットとまずまずかな。


もうすこし詳しくみると、主なスペックは下表のようになっています。

機種 MCP4922
分解能 12ビット(2ch)
INL ±3LSB (最悪値 12LSB) 積分非直線性誤差
DNL ±0.3LSB (最悪値 0.75LSB) 微分非直線性誤差
I/F SPI

DACで重要なのは、もちろん分解能もありますがその分解能が実質的な性能になっているかについては非直線性を示すINL、DNLの値が重要です。
INLとDNLの詳しい説明は色々とあるので、そちらを参考にしてもらえばいいかと思いますが、
ここはわかりやすいかもです。 → https://ednjapan.com/edn/articles/1309/09/news009.html

MCP4922については、INLがすこし大きいのが気がかりです。でも、値段をみるとこんなものかもしれません。
しかし、RasPiにつなぐならもうちょっと分解能があってもいいかな〜。14ビットはほしいかも。

候補2)AD1860

いきなりAUDIO用のDACの登場です。AD1860は18ビット分解能がありますし、それにマルチビット型ですから出力も安定しているでしょう。
で、カタログをみて性能に関する部分をピックアップです。

機種 AD1860
分解能 18ビット(1ch)
INL 記載なし MONOTONICITY
15Bits
DNL l記載なし
I/F SPI

大体AUDIO用のDACって、分解能は強調するけど、それ以外の項目ってほとんど書いてありません。
AD1860で、それらしいのはMONOTONICITY(単調増加性)の項目です。これからみれば有効ビットは15Bitです。
すなわち下位3ビットについては、値が増えても、出力電圧は減る可能性があるということですね。
ということで、性能的には15Bit相当でしょうか。非直線性はわからないけど・・・・。
あと、オフセットとかは多そうですが、これは補正でなんとでもなるでしょう。

そのほか、候補としてはマルチビットのPCM1704もありますがちょっともったいない(手持ちで宝物の1個しかありません)。
PCM63(20Bit)もあるけど、パッケージが大きい(DIPの28Pin)です。

ここは候補1)のAD1860を使ってみましょう!
 ※実は、この選択があとあと面倒を引き起こす原因になってしまいました・・・・。

AD1860を使うには正負±5Vの電源が必要です。そこで、5Vの元電源からDCDCで±15Vに変換したのち、
一旦LC回路で高周波数ノイズを抑えて、そして5Vレギュレータを用いて正負±5Vの電源をつくります。
正負±15Vがあれば、あとあとOPアンプも搭載することも可能になるでしょう。

まずは電源部分を搭載して、電圧をチェックしておきます。


電源部が完了したので、AD1860も搭載です。2ch用に2個搭載しました。ついでに、ADC(MCP3208)も乗っけています。
ちょっと面倒なのが、AD1860は5Vロジック(ただしTTLレベルのようなので3.3Vでも動くかもです)なのに対して、RasPiが3.3V
ロジックなので、電圧変換のためのロジックを入れています。3.3Vを5Vに変換するのに74AHC574をつかい、5Vを3.3Vに変換するのに
74LVC125をつかっています。ちなみに、74LVC125はADCをつかうまで出番はありません。


必要な部品が搭載できました。

まずは下調べ
 プログラムを組む前に、RasPiでのGPIOの動作速度を確認です。使っているRasPiは3B+です。それでWiringPiというライブラリーをつかって
GPIOを制御しますが、単純にGPIOをON/OFFさせた場合のパルス幅を確認です。
これが、短いようだとAD1860等を動作させるときに適当なWAITを入れる必要があります。
で、実際に測定してみると40nSです。

GPIOのパルス幅の最小は40nSです(WiringPiライブラリ)。

40nSということであるので、AD1860のタイミングチャートをみると、とくにWAITを挿入する必要はなさそうです。


タイミングチャートを眺めて、パルス幅が40nSあれば、とくにWAITを入れる必要はないでしょう。

さっそく動かしてみる???・・・・動かない・・・・

DACを動かすプログラムなんて、たいしたことありません。そのはずですが、なぜか動きません。
うんともすんとも言わない。もっともスピーカにつながっているわけではないので音はでませんが・・・・。
で、オシロをつなげてデータ線を確認してみますが想定される信号は供給されています。
そして、電源電圧も正常です。なにがおかしいのだろう????

あああああ!
じつは配線している最中にちょっと気になっていたことがありました。
AD1860は+5Vも−5Vもそれぞれ2本のピンに供給する必要があると認識していたのですが、
データシートをみると、+5Vは2本、−5Vは1本だけです。思い違いかな〜と思って配線していたのですが、再度データシートを検索して探して
確認してみると、やはりー5Vも2本配線が必要です。
 どうやら、配線するときに間違えてAD1861のデータシートをみていたようです。
WEB検索で「AD1860 PDF」で検索するのですが、なぜかAD1851/AD1861のデータシートも検索結果にでてきて、あまり確認もせずに
それをみていたようです。あああ、ちゃんと確認しなくっちゃ!。

左がAD1861、右がAD1860.同じように見えて、Pin8の機能が違うのに気づきませんでした。

動いた???でも、ノイズだらけ!

抜けていた−5Vの配線を追加して、再度プログラムをRUNです。今度は、波形がでてきましたが、
なぜかノイズも一杯でてきます。LINUXなので、割り込みが一杯はいるので時間軸が動くことは理解できますが、
ノイズがでるのはおかしいです。タイミング的には問題ないはずだけどな????。
 このノイズですが、マウスとかを動かすとさらにひどくなります。


波形は出ましたが、ノイズも出ます。なぜだろう?

プログラムを見直しますが、とくに問題はなさそうです。
で、仕方なくいたるところにWAITを入れてみました。もう、ものすごく長いWAITです。
すると波形が綺麗になってきました。でも、スペックで40nSのパルス幅でいいのに、その何10倍ものパルス幅に設定して
やっとノイズが消えます。なにかおかしい・・・・

ためしにダンピング抵抗を入れてみる

オーディオDACのときでもそうでしたが、ノイズがでるときにダンピング抵抗が有効なので、
今回も51Ωの抵抗を挿入してみました。
 すると症状がかなり改善しました。やはり、信号が暴れていたのでしょう。
でも、相変わらずパルス幅は既定値より長くしないとノイズがでます。
色々とためして、200nSまで短くすることができました(本来は40nSでもいいはず)。

51Ωの抵抗を入れたところ、症状が改善しました。


一応、綺麗な波形がでましたが・・・・・

遅い!
 いろいろなところにWAITを入れているためか、DACの出力が遅いです。
1つのデータを送り出すのに7uSかかります。まあ、周波数にすれば140kHzくらいなので
我慢するかな〜。RasPiのWAITがとれないと、これ以上早くならないな〜。

1データの送出に7uSかかります。ちょっと遅いな〜。

げげげ・・・・

さて、AD1860の出力がでるようになってきたので、どこまで細かい信号がだせるか楽しみです。
なんせ、15BitDAC(仕様上は18Bit)ですからね。
AD1860の出力は内部のOPアンプをIV変換につかって正負3Vあります。15Bit分解能とすれば、
1ビットあたり0.18mV程度になるはずです。下位3ビットで動かして信号が確認できるようなら、
12BitDACに勝ることになります。
 で、オシロに出力させると妙にノイズバンドが大きい。小さい信号を観測するどころではありません。
信号をよく観察すると、1MHz周期に大きなパルス状のノイズが入っています。どうやら、DCDC電源
のノイズが電源ラインに乗っているようです。LCフィルターでとりきれなかったのでしょう。
この値が100mV以上もあります。こりゃ、小さい信号を観測するどころではありません。


DCDC電源のノイズが飛びついてきているようです。こりゃ、どうしよう?


AD1860をつかったのは失敗だったかなあ〜。

 電源電圧にノイズがあるのは仕方ないとして、出力にそのレベルがそのままでてきているようです。
 こりゃ、AD1860をつかったのは失敗だったかな〜。それに、思ったより早く動かないし・・・・。
 ひょっとして、-5Vの接続をし忘れて動かしたことで内部に損傷が生じたかな?(いつもならICソケットを使うので、
 ICを取り替えることができますが、今回は直配線なのでそれができずにいます)。

 最初から大人しくMCP4922をつかっておいたほうがよかったかな〜。MCP4922は基準電圧入力があるので、
 多少電源電圧はふらついても、基準が動かなければ出力ノイズもすくないはずだろうし・・・・。

 根本的に電源を取り替えないといけないかな〜・・・・・・。そうなると、つくり直すことになり面倒だな・・・。

 ちょっと、意気消沈中・・・・・。

 もう、この基板はなかったことにしてやろうか・・・。

 とりあえず一杯呑んで、現実逃避しちゃおう(笑。


気をとりなおして、ノイズ問題から 2020.7.15

ダンピング抵抗を入れて、また書き込みサイクルを長くすることで、ノイズは消えたと思っていましたが、やはり
画面上でマウスを激しく動かすと、DACからノイズができます。こちらは電源ノイズよりもはるかに深刻です。
なんせ、間違ったデータの電圧がでてきますからね。
 やっぱり、未配線があった状態で電源を入れてしまって、DAC素子を壊しているのかな〜と思って、
念のため、もう1個新しいのを取り付けて見ることにしました。

新しく増設したDACです。結果は変わらず・・・・。

で、その結果ですが・・・・・結局同じで同様にノイズがでます。すなわちDAC素子は壊れていなかったということでしょう。
ノイズの発生の様子は下図のようになります。DACからは3つの値(−MAX、0、MAX)しか出力しないようにプログラムを書き込みます。
そのため、オシロには-3V,0V,+3Vの3つのラインしか見えないはずなのですが、マウスとかを動かすと、それ以外の値も現れてきます。


ノイズ発生の様子。

ひょっとして、AD1860はスタティック動作ができないのでは?

ひょっとしてAD1860はスタティック動作ができないのでは?という疑念がでてきます。
しかしながら、データシートを読み返しても、それらしいことは書いてありません。
現象的には、どう考えてもDACへの信号の転送中に、RasPiの中で割り込みがかかると問題が発生するようなので、
AD1860はダイナミックな動作しかできない、すなわち連続したクロックが入力されないと動かないのではという疑問が
でてきます。

親戚のPCM61Pではどうか?

ここは、親戚筋のPCM61Pだとどうだろう?という考えがでてきましたが、手元に素子はありますが、またもやICソケットレスで
実装したものですから、取り替えることができません。しかたなく、まずはPCM61Pのマニュアルも読み返してみました。
なにか手がかりがつかめるかもしれません。すると、タイミングチャートの注釈に、超気になることが書いてあります。

PCM61Pのマニュアルに、超怪しい注釈がしれ〜と書いてあります。

If clock is stopped between input of 18-bit data words, latch enable (LE) must remain low
until after the first clock of the next 18-bit data word stream.

直訳すると

 
18ビットのデータワードの入力の間にクロックが停止した場合、ラッチイネーブル(LE)は、
次の18ビットのデータワードストリームの最初のクロックの後までLowのままである必要があります。


ということですが、意味するところは

 データの送信中にクロックが中断したらあきまへんで〜、そのデータは使えませんで〜、次まで待ちや

ということのようです。AD1860もPCM61Pも同様のはずなので、どうやらAD1860もスタティックな動作はできないということでしょう。
まあ、オーディオ用に開発された素子ですから、ビットクロック信号は途切れなく送られてきますからね〜。それを前提にして設計しているんでしょう。
一体全体、内部はどういう構造になっているのだろう?なぜスタティックな動作ができないのだろう?
 おそらく、想像するにAD1860のデータラッチはダイナミックメモリーと同じで、短時間しか記録できない構造になっているのかもしれまん。
ダイナミックメモリーならトランジスタとコンデンサ1個で構築できるので、IC内の素子数を減らすことができますからね。
たぶんそうだ!きっとそうだ!

でも、どちらにしてみ結論としてはAD1860はRasPiとは接続しても使いにくい!ということでしょう。

使うためには、方法がないわけでないと思います。一つは、DACに信号を送出するときはRaasPiのCPUの割り込みをすべて停止すれば
いいはずです。でも、複雑なスケジュールで動いているLINUXの割り込みを止めてしまうと、なんかとんでもないことが起こりそうです。
ネットワークをふくめ、色々なところに弊害がでそうなので、ちょっと躊躇してしまいます。割り込みを停止させる方法はWEBを探せば
でてきますが、ちょっと実行ははばかれます。 残念ながら、AD1860の使用はあきらめましょう・・。

#ちょっと補足
 気になったので、他のDACでも調べてみました。20BitのPCM63Pにおいても、タイミングチャートにPCM61Pと同じ注釈が書いてありました。
さらに、24BitのPCM1704のマニュアルをみると、こんどはちゃんと本文にきちんと書いてありました。もう、大切なことなんだから、
AD1860のデータシートにもちゃんと書いといてほしいものです。って、こんな使い方する人はすくないでしょうが・・・・。

PCM1704のマニュアルに書いてあります。
クロックが止まると、転送すべきデータの正確性が
失われる
とありますね。ダイナミックにデータを保存していることがわかります。


候補2)のMCP4922を実装

失意のまま、しかたなくMCP4922の12BitDACを実装しましょう。
もう、このDACはこの基板では動作のテストしかしないつもりなので、もったいないからソケットを使って実装します。


DAC(MCP4922)を実装しました。これで、ようやく使える素子(4個)が使えない素子(3個)
を越えました。

ちょっとブレイク
ディジタル系の配線に必要不可欠になってきたのがポリウレタン被覆銅線のコイルを抱いたワイヤリングペンです。

でも、これを使う点での一つの恐怖は銅線の「引き抜け」です。まあ、めったにおきませんが、ペンの先端近くで
銅線を切断したときに、なにかのはずみでコイルボビンがくるっと回って、銅線を引き込んでしまったときは、
ものすごく焦ります。コイルボビンをすこし回転させて、ペン先端から銅線が顔をだせば、ほっと一息です。

というのも、シャーペンの先端キャップ部の後ろから銅線を通すのが至難の業だからです。
中に段差があるので、そこに銅線の先端がつっかえると、座屈してしまって、もう挿入をトライできません。そのため、
銅線を通すためには、まず銅線の先端をまっすぐに成形し、そして慎重に先端キャップの真ん中をイメージしつつ挿入していきます。
運がよければ、10回程度トライすれば通ります。運が悪ければ、イライラが募って酒量が増えます(笑。
 で、そんなとき1通のメールを貰い、簡単な銅線の通し方を教えていただきました。下の図をみてもらえばわかるように、
先導線をペン先から通して、2本を半田付けしたのちに、引き出す方法です。 なるほどですね。

 
もう手放せないワイヤリングペンですが、「銅線の引き抜け」の恐怖にさらされるので、
使用後に線を長めに伸ばして曲げておきます。この部分が結構、もったいない。


先端から通した銅線と半田付けして、あとは引っ張るだけです。φ0.5のシャーペン用なので
φ0.16の銅線2本が重なっても抜けます。これがφ0.3のシャーペンだったら無理ですね。


はい、引き抜けました。

MCP4922を動かしてみましょう。

まずは簡単にA-CHは0〜4095で単調増加、B-CHは4095〜0で単調減少するようなデータを入れて
変換速度を観測です。

DACをテスト動作させています。

およそ16msで1周するようなので、1回のデータ送出にかかる時間は

 
16ms/4096/2=1.95us/1データ

になります。やはりPICとかで動かすよりだいぶ早いかんじです。
ただし、MCP4922のセットリング時間は4.5usなのでもうすこしゆっくりとデータを送らないとだめですけどね。

さて、DACは動くことが確認できましたが、出力には相変わらずノイズがのっています。
これをなんとかしないと、12bitの分解能も活かせません。
調べてみると、電源ノイズには間違いないのですがGNDプレーン自身も振られているようなので、
根本的に電源を入れ替えないとだめな感じです。こりゃ、大事だなあ〜。

まずはコレを減らさなくっちゃ。

つくり直し!
 2020.7.17

電源ノイズが大きいとおもったら、オシロプローブのGNDの位置で全然レベルがちがうことに気づきました。
いままで、ノイズの測定点から遠い場所でGNDをとっていましたが、近くのベタ面からGNDをとると小さい値になっています。
もうすこし、GNDのとり方に気をつかえばDCDCをつかってもなんとかなるかな〜と思い、
こんどはDCDCをつかって再度作り直してみることにしました。
なんせ、いままではアナログとディジタルGNDは完全にまぜこぜでした。

作り直すと決めたら、まずは部品の回収です。

とりはずせそうな部品を回収します。勿体ないですからね。

アナログGNDとディジタルGNDを分離するために、ベタ面をディジタルとアナログ面で分離します。
部品面のメッシュ状のベタ面を薄くフライスをつかって銅箔を削りおとします。できるだけ薄〜く削りたいところですが、
結構ざっくりやってしまった感があります・・・。


左側がディジタルGND、右側がアナログGNDにしています。


ベタ面の銅箔を軽く削る予定でしたが、結構深いかも・・。
基板の強度が・・・・

一気に完成!

今回は作り直すと同時に、アナログ回路も追加しました。というのはADCもDACも正電源での動作なので、0-5V間でしか動きません。
それは若干使いにくいので、DACの場合は-2.5Vの下駄をはかせて、±2.5Vの出力になるようにしています。ただし、オペアンプを
反転アンプにしているので、ディジタル値と出力値が反対になるので、これはソフトで修正します(まだしてないけど)。
 ADCについても、同様に正負電圧入力での測定ができるようにしました。また、アナログ値については小さい値もつかう可能性を
考えて入力に計装アンプ(INA128)を入れています。INA128が抵抗1本でゲインが自由に変えられるので便利です。

DACとADCの実装は、本来はGNDの分離境界をまたぐように配置すべきなのかもしれませんが、ひょっとしてまだノイズが
大きいようだったら、ディジタルアイソレータを入れて、完全にディジタルとアナログのGNDを分離してやろうかと考えています。

ただ、ディジタルアイソレータって結構高いので、12bit程度の分解能の基板にはちょっともったいない気がしています。
これが16BitのDAC,ADCをつかうのなら躊躇なく使っているでしょうが・・・・。

あと、今回はDACとADCの基準電圧源にはTL431を使いました(OPアンプで2倍にして約4.95Vの電圧を得ています)。

完成しました。今回は入出力とも正負電圧が扱えるように、OPアンプで電圧の下駄を履かせています。

動作確認です

まずは簡単なプログラムを書いて、動作確認です。
単純に正弦波の出力をDAC(CH1)で出して、それをAD変換して、その変換値を再度DAC(CH2)に通します。
そして、両方のDAC出力(CH1、CH2)がほぼ同等になっているかを確認です。


どっちが入力、出力かは忘れてしまいました。
とりあえず問題なく動いたようです。

調整しましょう!

正負電圧が扱えるようにアナログ回路を追加しましたが、ゼロ調整ができるようなVR等はありません。
抵抗の誤差等がありますから、DACならびにADCのゼロ点は当然ずれているでしょうし、またゲインエラーも
あるでしょう。これらについては、DCで計測して補正値をもとめてソフトに組込みです。
 補正演算は浮動小数点で行うことになるでしょうが、PICと違いRasPiの演算速度は早いので、
速度は気にしないで浮動小数点をつかって補正できるでしょう。
 まあ、速度が気になるならデータ取りと補正は別にしてもいいでしょう。

ちなみに、ノイズレベルは半分程度になりました。
まだまだ、大きいですが、あとはDACはフィルタて逃げましょう。ADCはひたすら平均化です(笑。

現時点での出力のノイズレベルです。


DACの実力は? 2020.7.18

DACの出力電圧を基準電圧として、ADCの校正をおこなおうと考えているのでまずはDACの実力から評価です。
簡単に20点ほどDAC CODEを変更して、でてくる電圧を観測します。なお、DACの出力は-2.5Vの下駄を履かせるため
反転アンプを通しているので、DAC CODEと出力の関係は逆比例になっています。
 DAC CODEと電圧の関係は見かけ上、直線になっています。まあ、当たり前ですね。


まずはDAC CODEと出力電圧の関係です。

問題は、非直線性です。上図の関係から各チャンネルで近似直線を導出して、その直線からの
誤差を示したものが下図になります。縦軸は1LSB単位(1LSB=1.214mV)での誤差になります。
グラフからわかるように最大で3LSB程度の誤差があります。測定点を増やしたらもっと大きくなるかもしれません。
MCP4922の標準エラーが2LSBで最大で12LSBなので、こんなものでしょうか。
まあ、測定方法のエラーもあるかもしれません。

問題は、このエラーの発生状況が一定の特徴の中に納まっていれば、補正もしやすいのですが、
まず2チャンネルある出力の誤差の特徴が互いに違います。片方は上に凸、他方は下に凸です。
そのおおまかな傾向の中に、結構激しい凹凸があります。
 
補正を試みようと思えば、もっと細かく測定点を得る必要がありそうです。
こりゅや、面倒だなあ〜。


CH.Aの積分非直線性エラー(最大で3LSBほどでています)。
               


 CH.Bの積分非直線性エラー(こちらも3LSBほどあります)。

ちなみに、MCP4922のデータシートでのINLを見ても結構凹凸があります。
凸の数を数える32個あるので、下図ではR-2Rの5ビット目の誤差が大きい
ということなんでしょうね。

MCP4922のデータシートから抜粋

もうちょっと、測定点を増やすにしても、まずはI/O基板を仕上げておきましょう。

RasPi用のIO基板が完成!

あと必要なものとして、I./Oエクステンダーを搭載しています。これで入出力に計16ビットのI./Oが使えます。
これでCNCのステージの直接のコントロールを考えています。
また、手前にボリュームとスイッチを設けました。ボリュームはCNCの動作速度などを調整などに使えるでしょう。
スイッチも、CNCの移動ON./OFFに使えます。
 ADCとDACの入出力はRCAのコネクタを使いました(このユニバーサル基板にはRCAコネクタのパターンがあるので)。


Raspberry PiのI/O基板の完成です。

まずは、忘れないようにこのボードの備忘録を書いておきましょう。なんせ1ヶ月も放置したら、
なにがなんだかわからなくなってしまいますから(笑。


面倒くさいといったらありゃしない! 2020.7.19

正確なDACの電圧出力を得るためには、INLの特性を細かく測定しておく必要があります。
先の測定では高々20点程度の測定でしたが、それではINLのばらつきを正確に把握することはできないので、
超面倒ですが200点ほど測定しました。テスターの値を読んでキーボードに叩き込む作業をチャンネルあたり200回、
それを両チャンネルなので400回です。もう、腱鞘炎にかかりそう・・・。

でも測定の甲斐があったのか、INLのばらつきにについてもほぼ連続したデータが取れていると思います。
これで、測定したデータをテーブルにしておいて正確な電圧出力プログラムをつくっていきましょう。

まあ、正確といっても測定するテスターの測定精度が1mVに対して、1LSBが1.2mV程度ですから1LSBは測定上の誤差になってしまいす。
それで、DAC出力の補正プログラムを組んでも1.5LSB程度が限界かもしれません。まあ、補正なしでは3LSB程度の誤差がでますので、
すこしでも解消できればいいでしょう。


CH.AのINL特性


CH.BのINL特性

しかし、暑くなってきたな〜。PC2台も電源いれているからなおのこと。もうPCの電源は落として、RasPiだけ入れて作業しよ〜。

室温も高くなってきたせいか、RasPiの温度もあがりがちです。プログラムを走らすとCPU負荷25%程度でもCPU温度が60℃くらいまであがります。
ちょっと急ごしらえですが、ファンをとりつけましょう。CPUの放熱板にファンをホットボンドで直接接着しました。
ファン電源は12V0.04Aが必要ですが、RasPiは5V電源しかありません。アナログ回路用のDCDCの15Vから失敬する手もありますが、アナログ電源からというのに
ちょっと抵抗があります。そこで、別のDCDCを取り付けました。中華製の安価なものです。大電流だと効率が落ちますが、40mA程度ならかなりの効率です。
ただ、心配はファンの寿命だなあ〜。12Vファンを15Vで動かすので、風量は20%程度増えるのはいいけれど、寿命はかなり落ちるかもしれません。
まあ、ファンの寿命より基板全体の寿命(興味がなくなって、ほっぽらかしされるまでの時間)の方が、圧倒的に短いような気もします(笑。


ファンは放熱板に直付けです。これで稼動中でも40℃程度まで落ち着きました。

はやく養生しなくっちゃ!

しかし、RasPiが裸状態なのは色々なトラブルの元です。通電中に色々な半田作業などをしていると、
切ったリードがRasPiの上に乗っかるときがあります。またテスターのプローブもあたるときがあります。
さらに、別の電源ケーブルの端子があたるときも。
 問題は当たり所がわるいと、いきなりREBOOTになってしまいます。電源部分に触れるのでしょうね。
あるいは、データラインかもしれません。REBOOT程度ならまだいいですが、高電圧が作用すると壊して
しまうかもしれません。
 早く、カバーなどの養生をしなくてはいけないなあ〜。


Raspberry Pi 4B購入! 2020.7.23

I/O基板を動かすのに3B+の速度でも全然不満はなかったのですが、得られた結果をLIBRE OFFICEで処理したり、
また調べ物をしようとWEBを開けたりすると、とたんにRasPiではきびしいな〜という現実にさらされてしまいます。
そのときはPCで作業をすればいいのはわかっているのだけれど、作業をシームレスにするためにも、この際おもいきって
RasPi4Bを導入することにしました。
 4連休ですがとくにGoToする予定もないので、のんびりとセットアップして行きましょう。

秋月で調達

秋月が必ずしも安いというわけではないようなのですが、冷却のためのファンやHDMIケーブルも必要なので、
ワンストップで済む秋月で購入です。とくにmicroHDMIケーブルが250円というのが助かります。
 RasPiのメモリーは2G〜8GBまでありますが、とくに容量は必要ないので2GBを選択です。3B+が1GBだったので
それでも倍ありますから、まずは十分でしょう。

RasPi4Bをはじめ、色々と必要になりそうなものを購入です。HDMIも勿論買いました。

ファン選択は失敗
冷却用に5Vで動くファンも買いましたが、カタログをよくみなかった自分が悪いのですが
消費電流が結構大きいです。0.4Aもあります。RasPiの動作は当面は2AのACアダプタを使う予定なのですが、
0.4Aもファンにとられるのは結構きついです。本来は4Bでは3A以上の電源をつかえと書いてありますが、
以前3B+を使うときに4Aクラスのものを買ったのですが行方不明・・・・。
 それと、このファンを別電源で回してみるとかなり高速に回ります。そのため、風きり音も大きいです。
そこまで風量も要らないので、ちょっとこのファンは在庫品にすることにしました。


ちょっと電流が大きかったファンです。今回は使用をあきらめました。

とりあえず放熱板をとりつけましょう

4Bはかなり発熱するようなので、動作させる前に放熱板もとりつけておきました。
とりあえずICらしきもので放熱板がとりつけられるものは、大小とりまぜてぺたぺた貼り付けます。
 本当はDC-DCのICにもとりつけたかったのですが、周りのチップ部品の方が背が高くて
放熱板がとりつけられませんでした。

放熱板をとりつける前。


とりあえず手持ちの放熱板をぺたぺたとりつけました。

I/O基板と接続

さて、放熱板もとりつけたのでI/O基板と接続です。電源は結局GPIOの端子から供給することにしました。
ファンも3B+でつかっていたものをそのまま流用で、ホットボンドでとりつけています。

I/O基板との接続も完了しました。

ソフトを修正
CPU基板が早くなるのはいいのですが、I/Oのタイミングが変わると周辺ICが動かなくなる場合もあるので、
ソフトを一部修正です。
 WiringPiというGPIOの制御ライブラリーをつかっていますが、そのときのGPIOの発生パルス幅を測定してみたら、
最小で16nSということがわかりました。3B+では40nSだったので、倍以上の高速になっています。このパルス幅だと
周辺ICのスペックを満たしていないところが多くあるので、色々なところにWAITを入れていきます。
ちょっと面倒です。


GPIOのパルスも16nS程度の短くなりました(3B+では40nS)。

早くなったかな?
I/O基板自体を動かすためには、一杯WAITを入れているので3B+のときと動作速度はほとんど変わっていませんが、
WEBの閲覧やオフィスソフトの動作はかなり速くなった気がします。このあたりの感覚は主観もありますが、
客観的に早くなったのは計算速度です。マンデルブローの描画速度は3B+に比べて約9倍ほど早くなりました。

1)マンデルブローの描画速度
RasPi 4B
Display Time=0.665544s
Display Time=0.475520s

RasPi 3B+
Display Time=6.029049s
Display Time=5.574782s

その他、昔につくった数値解析ソフトも走らしてみたところ、3B+では120秒(それでも、昔のコンピュータで2時間くらい
かかっていたので、随分早くなったもんだと関心していいましたが・・・)でしたが、4Bでは40秒弱と3倍程度早くなりました。

いやいや、すごいものですね。

でも、使っていないRasPIが増殖中・・・・、なにか(音楽プレイヤー以外の)用途を考えなくっちゃ!


やっぱりだめかな〜?? 2020.7.25

RaspiがLINUXで動いていることから、リアルタイムな動きはあまり期待していませんでした。
ここでいうリアルタイムは、がちがちのリアルタイムのことで、目的はAD変換をする場合でも、
正確な時間間隔でAD変換値がほしいということです。というのも、AD変換の測定間隔にばらつきがあると、
FFT処理などした場合に、なにを測っているかわからなくなってしまいます。
 でも、RasPiをつかう限り、それは難しいってわかっていたでしょ? といわれそうですが、
補正をすれば簡単に解決すると思っていたからです。

 補正といっても簡単で、AD変換と同時にサンプル時の前後で時間を計っておきます。というのも
RASPIにはシステムタイマーがあってnsec単位で時を刻んでくれます(そのはず)。
そして測定されたAD変換値と時間テーブルをもとに、測定したかった時間毎になるようにAD変換値
を内挿して揃えようと思っていました。これならば、少々の割り込みをくらっても大丈夫なはずです。

でも、念のためどの程度のAD変換時間がばらつくかを調べてみました。

単純に、AD変換を100000回繰り返します。AD変換前後には時間も計測しておきます。
そして、AD変換の時間の頻度をまとめてみました。結果(ヒストグラム)は下図になります。
縦軸はカウント値をLOGにしています。


  AD変換時間のばらつきです。100usecの場所は100us以上を示しています。

結果をみて、最初の印象はかなりばらつくな〜という感じです。17usecの位置にピークがあって
LOG値がほぼ5なので、99%程度は17uSの間隔でAD変換されていることがわかりますが、
それ以上の40usあたりの測定間隔になる頻度も1%程度ありそうです。

で、気になるのが100us以上のAD変換時間を要する点数が結構あります。10点以上ありそうです。
再測定して、横軸を長めにしてみましょう。
ということで、再度測定した結果が下図になります。これをみてがっくりきました。
なんと、400usとか600usとかという値がでてきます。

AD変換時間のばらつきです。600usec程度かかってしまう場合もありそうです。

600usecって、よほど割り込み処理に時間がとられているのだな〜という感じです。
まあ、それは仕方ないとしても、頻度低いといっても600us程度のAD変換時間が発生してしまうのは大問題です。
なんせ通常は17us程度でサンプリングできるところに、600usとかのデータがはいるということは、まるまる30点以上
測定していない空白期間ができるということです。その空白の間は補正しようにも補正しきれません。
 測定のサンプル間隔が1ms程度ののんびりした計測なら、600us程度の空白があっても問題ありませんが、
もっと早い現象を捉えたいんですよね〜。
 
 ちょっと、がっくりです。

 やっぱり割り込み止めないとだめかな〜???。それにしても測定間隔のばらつきがかなりあります。
 こんなデータ収集でいいのだろうか????

 RasPiで高速にAD値(それも等間隔に)を得るのはだめかな〜???

長くなってきたので後編へ!