So-net無料ブログ作成
検索選択
Raspberry Pi ブログトップ
前の10件 | -

Raspbian設定 [Raspberry Pi]

また工場に来ている。こないだ借り上げアパートで熱中症になったので今回はホテル。でもシーズンなのでまともなところは満杯。今いるホテルはなかなかすごいところだけど、空調があってネットが来てるだけアパートよりマシ。

ところで遊びや仕事で買ったRaspberry Piがもう10個を超えた。全部でいくつあるのかはっきりとはわからなくなってる(若い頃と違って心情的には十進二桁は無限大と同じ)。しかもどれがどれだかわからなくなってきたので、Raspberry Pi 3(あるいはそれ以降)は全部同じ設定にしなおすことにした。家と横浜のオフィスと工場にバラけてて、会社の方針でvpnは導入しない、ということになった(単に僕しか使わないのに月々費用がかかる)ので管理が面倒になってきた。全部がホスト名以外同じならちょっとでも簡単になるのではないかと期待して。

いつからかは知らないんだけどRaspbianはNFSをルートファイルシステムにしたネットワークブートができるようになったらしい。とりあえず今でもローカルのSDカードにはなるべく書かないようにはしてるんだけど、仕事で使ってるやつはSDカードが壊れたら困るのでネットワークブートにしたい。

でもたぶんかなり遅いだろうし、僕としては全部切り替えるにはまだちょっと時期尚早に思える。とりあえずRaspberry Piをヘッドレスで使うための同じ設定のSDカードを作る手順を備忘録として書いておく。例えばRaspberry Pi Zero Wみたいなのは特にそうだけど、モニタキーボードなしでインストールしようと思う人には参考になるところがあるかも....

続きを読む


RaspbianのMathematicaその2 [Raspberry Pi]

こないだMathematicaのデスクトップ版は11.1が出て、Raspberry PiにバンドルされたMathematicaはまた離されてしまった。しかしし11.1で追加された機能はニューラルネットや機械学習、ビットマップのベクトライズ、Wolframのサーバが持ってるいろんなデータへのアクセス、といったような重い処理ばかりなのでRaspberry Piではどのみち厳しい。

今日ここでは、RaspbianをインストールしてまずMathematica(wolfram-engine)をpurgeする、ということはとりあえずしないで、Mathematicaを試しに使ってみようと思うけど、どこからやればいいの?という人の参考になればと思うことをちょこっとだけ書く。今回は僕が作ったネタではなくてWolframのサイトからのもの....

続きを読む


RaspbianのMathematica [Raspberry Pi]

父の死でまだドタバタしてる。それはそれとして、このブログは元のペースに戻したい。いつまでも死んだ話をトップに置いておくわけにもいかないし。

ということで、平林さんの指摘があったあとでは時期を逸した感があるけど、RaspbianにバンドルされているMathematicaが最新バージョンになった。
0327version.png
手前のウィンドウで表示されてるのが僕のmacBookProのMathematica「システム情報」で、後ろがRaspbian(Raspberry Pi 3 Model B)のもの。ながいこと10.3のままだったのでこれは放置プレイか、と思っていたが、とうとうパソコン版に追いついた。ちなみに今upgradeするとバージョンは同じだけどカーネルのビルドデートが2017031701になっている版(bug fixだろう)がインストールされる....

続きを読む


Raspberry Pi用pigpio Library - その10 [Raspberry Pi]

pigpioライブラリの概観(その1その2その3その4その5その6その7その8その9)の続き。pigpioの話は今日でおしまい。いずれpigpiod_if2をmacOSに移植した話をしようと思うけど、それはもう少し先。

全部をひとつのpdfにまとめたものをここに置いておく。余計な話はなるべく省いたけど、細かいコメントのようなものまでを対象にすると結局書き換えないといけなくなるのでやめた。そのせいで日本語の解説としてみたらかなり冗長なものになってしまっている。そのあたりはごめんなさい。

今日はライブラリそのもののオーバーヘッドとクロス環境で使う場合の問題点について。

続きを読む


Raspberry Pi用pigpio Library - その9 [Raspberry Pi]

pigpioライブラリの概観(その1その2その3その4その5その6その7その8)の続き。あと残りはもうすこしだけ。今日はwaveformとpthread関連について。

続きを読む


Raspberry Pi用pigpio Library - その8 [Raspberry Pi]

pigpioライブラリの概観(その1その2その3その4その5その6その7)の続き。今日はBitbang SPI、I2C、シリアルについて。

続きを読む


Raspberry Pi用pigpio Library(番外編その3) [Raspberry Pi]

昨日の確認結果。Raspberry Pi3にD/AコンバータのMCP4922をSPIのstandard bus(pigpioの言うところの)のほうに繋いで1kHzの三角波を出力させたところ。出力中にはSPIのauxiliary busのほうに繋がったA/DコンバータであるMCP3208には60kHzぐらいのレートで他の信号を別スレッドから同時にサンプルさせている。
1217scope.jpg
自分で言うのもナニではあるけど、これはArduinoじゃないよとわざわざ注釈を入れたいほどの、ふぉとしょで描いたように安定した美しい三角波。変調度は10%ほどの浅いものなので、D/Aの非直線エラーがわかるほどではないが、よくみるとグリッジが出ているのはわかる。

オシロ右下の周波数表示もうれしいことを言ってくれている。ほんとかどうか知らないけど(出力ソフトもオシロも時計を使っているからそれなりに確度は高いか)。

ということでとりあえず、僕としては一件落着。

Raspberry Pi用pigpio Library(番外編その2) [Raspberry Pi]

先日pigpioライブラリはスレッドセーフではないということに気がついた話をした。もちろんライブラリ全体として基本的にはスレッドセーフではないことにかわりはない(全部の組み合わせでスレッドセーフ性を保証するのは大変)。しかし、今日pigpioのSPIまわりのソースを見ていて驚いた。サイトにはなんの言及もないけど、SPIの二つのバスはそれぞれ独立なスレッドから呼べるように書いてあった。

具体的に言えば、ソースによるとふたつのバスは別々にpthreadのmutexで排他制御するように書かれていた。片方のSPIバスの異なるチャンネル(チップセレクト)を別のスレッドから同時に使うことはできない(排他制御を受ける)けど、一方のバスを使いながら、もう一方のバスを違うスレッドから使うぶんには問題がないように書かれていた。

それを見てびっくりしたので、あらためて今日実験用のコードを書いて試してみた。スレッドをふたつ立ち上げて一方のSPIに繋がったD/A(MCP4922)をループさせて正弦波や三角波を出力させながら、もう一方のSPIに繋がったA/D(MCP3208)から信号を読んでみた。D/Aはクロックが20MHzで2バイトで出力命令が完了するので、約1MHzのサンプリングが可能になる。A/Dのほうは2MHzクロックで3バイトを使うので、およそ70kHz弱のサンプリングが可能のはずである。

やってみるとほぼその通りの結果になった。D/Aのスレッドには波形出力以外なにもさせていないので、1kHzぐらいだとRaspberry Piからソフトウェアで生成したとは思えないようなきれいな正弦波や三角波が出力できたし、階段型になっているのがわかるけど50kHzぐらい(20段の階段)なら正弦波と三角波の区別がつくくらいの波形になった。

先日はなんでうまくいかなかったか、というとどうやらスレッドにいろんなことをさせすぎてたせいらしい。よけいなことをしてそれがたまたまスレッドセーフでない書きかたになってしまっていた(どこがポイントだったかは自分のコードを改めて見直してわかったけど、それは恥ずかしくてここに書けない)。ようするに僕のマルチスレッドの書き方がヘボだっただけだということ。D/Aで波形出力したかったら専用スレッドにしてD/Aだけをぶんまわすように書くべきだということがあらためてわかった。まあ知ってる人は知ってるんだろうけど。

ところで、Microchip Technology社のD/A、A/Dはどっちも数百円で手に入るけど、実に優秀だわ。僕みたいな素人がちょこちょこっと半田付けするだけでちゃんと動く。もちろん非直線エラーとかは個別に実測して較正しないといけないんだろうけど、誤差1%以下で十分な用途ならバカチョンで使えそうである。たいしたもんだ。



ということで、何度も言を翻すことになりましたが、もう一回修正します。pigpioを使えばそれぞれのSPIバスの最大スループットが同時に実現可能です。もちろんマルチスレッドの書き方に注意して、という条件付きで。

それとあらためて、読むことのできるソースは読んだい方がいい、と自戒を込めて主張する。還暦過ぎた僕がそう感じるのだから、若い人にはさらに自らを戒めてほしい、と思う。

Raspberry Pi用pigpio Library(番外編) [Raspberry Pi]

先日、pigpioのSPIが2本使えるので、独立に読み書きできる、と書いた。もちろん独立なのはそうなのだけど、僕がやりたかったA/DコンバータとD/Aコンバータをそれぞれのバスに繋いで、それぞれの最大スループットで読み書きできる、というのは嘘だった。ごめんなさい。

実際に回路を作って繋いでみるまで気がつかなかったのは僕がバカなんだけど、pigpioそのものはリエントラントには書かれていない。pigpioの関数群は基本的には排他制御が必要で、つまり僕がやりたかったような、それぞれのSPIバスを別々のスレッドから呼ぶなどと言うことことはできない。実際に繋いでドライブしてみてそれに初めて気がついた。

D/Aを高速で回すことはもちろんできた。ところがA/Dを読みに行くとD/Aが失速する。あれえ、おっかしいなあ、と思いながら回路を確認したけど、これは外付けもほとんどなくて間違いようがない。

自分の書いたpigpioを呼ぶ下位関数と、それを呼んでいる上位関数をしばらく眺めていて、気がついた。D/Aはスピードを出すために専用のスレッドから呼んでいる。A/Dのほうはpigpio関数の排他制御をせずにメインスレッドからときどき読みに行くように書いてしまった。とうぜん、A/Dを読みに行くとき、たまたまD/Aへの出力の最中だった場合データがぶっ壊れてしまう。よく考えたら、いやよく考えなくても当たり前だった。

ちゃんとmutex_lockを入れると、データが壊れることはなくなったけど、A/Dを読んでいる間(約15$\mu$秒)はD/Aの波形が止まってしまう。すっごい残念。

Raspberry Piに使われているSoCのSPIバスそのものは完全に独立しているので、SPIレジスタの読み書きさえ排他制御すれば問題ないし、レジスタの読み書きは実際には多くがアトミックな操作なので、注意して書けばロックは必要なくなる。でもpigpioにとっては排他制御が必要な部分とそうでない部分は入りくんでいるので、スレッドセーフにするのは容易ではない(少なくともSPIでの読み込みはSPIへの命令とは別にしないと実現できない)。

僕がやりたかったことを実現するにはpigpioでもダメで自分でレジスタアクセスのコードを書くしかない。

ということで、前回ふたつのSPIバスがいかにも完全に独立に使えるように書いたけど、それは嘘、間違いです。一部の単純な関数を除いてpigpioライブラリの各関数はスレッドセーフではありません。お気を付けください。そして、ごめんなさい。

Raspberry Pi用pigpio Library - その7 [Raspberry Pi]

pigpioライブラリの概観(その1その2その3その4その5その6)の続き。今日は僕がpigpioを知るきっかけになったSPIについて。

続きを読む


前の10件 | - Raspberry Pi ブログトップ
メッセージを送る