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

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について。

続きを読む


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

僕の今いる会社が今年に入って左前なので、去年まで専門の設備屋さんに投げていた新規製品用の調整設備や光学測定装置は、僕が自分で構想して組図を描いてバラシのメカ図面の漫画を描いて加工屋さんに加工図面を起こしてもらってそれで加工してもらって上がってきたらメカを組んで回路基板やケーブルを半田付けしてプログラムを書いて、と何から何まで全部やる事にした。そうすると設備屋さんに投げるのに比べて、見た目はカッコ悪いわ信頼性は低いわで人には見せられないけど、費用は2、3割で済ますことができる。

調整法と評価法の確立は光学設計の一部である、と普段から言っているのでその延長線上ではある。が、やはり時間はかなり取られてしまう。ここんとこずっと土日はホスト用のMacとハードウェア制御用のRaspberry Piのソフトを書くので潰れてしまっている。昨日今日もせっかく天気が良かったのに、ずっとうちでシコシコ過ごしてしまった。

それから解放されるためには会社が黒に浮かなければいけないけど、いつになるんだろう。それはいいとして、こんなことを繰り返してしまうと、僕がある日突然ボケたり、いや、それはもうすでにそうなってるのでそうではなくて、例えば僕が会社を辞めたり事故にでもあって死んだらどうするのか。でもまあそれは小さな会社ならどこでも同じかもしれないけど。

というようなことではあるけど、このブログではそんなことはどうでもよくて、pigpioライブラリの概観(その1その2その3その4その5)を続ける。前回コールバックは便利である、という話をした。実はpigpioのコールバックは前回のだけでなくて他にもいろいろ用意されていてなかなか面白い。今日はその残りについて....

続きを読む


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

pigpioライブラリの概観の続き(その1その2その3その4)。最近僕はずっとこれで遊んでばかりいる。今日はこのライブラリのいちばんの特徴である高精度ソフトウェアPWMとコールバックについて。

前も書いたかもしれないけど、PWM制御のサーボモータを持っている人はぜひこのpigpioのPWMを試してみてほしい。Raspberry Piのどのピンからでも安定した信号が出せるのに驚くから。

そしてPWMもすごいけど、ソフトウェア的にはこのコールバックはめちゃ便利である。デジタルなイベントを監視する必要がある人にはこれもぜひ試してもらいたい。退屈なポーリングのコードなのに応答性やパフォーマンスで苦労した人ならこの便利さはわかると思う....

続きを読む


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

pigpioライブラリの概観の続き(その1その2その3)。ちょうど今僕もこれを使おうと思って勉強してるのでどんどん進める。今日から具体的なCで呼ぶための関数を見てみる...

続きを読む


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