« 2013年9月 | トップページ | 2013年11月 »

2013年10月の2件の記事

2013年10月25日 (金)

RasPiライブカメラの回路図、CGIソースの公開とその他の工作

 お約束の、ライブカメラ一式の回路図とサーバーのCGIソースコードを公開する。

 これだけでライブカメラは動かない。RaspberryPiのOSのインストールから始まって、wiringPiライブラリ、mjpg-streamerパッケージのインストール、Apache2のインストール、各種パラメーターファイルの設定など、これ以外にしなければならない作業は山ほどある。

 しかし、これらの作業の情報源はここでなくても沢山あるし、既にこれまでの記事で紹介もしている。あらためてこの手順を書き出すのも無駄な話だ。そこでこのあたりは思い切って全部省略し、固有のものだけに絞って公開することにした。

Livecamera  公開するものは、全体の回路図、カメラサーバーのHTMLファイル(というよりperlで書いたCGIプログラム)、mjpg-streamerの起動スクリプト、それと前回のSAMBAのシャットダウンで作ったCソースプログラムなどである(これは直接ライブカメラとは関係ないがついでに)。

 モータードライバー(Tiny2313)のソースコードは、既に公開しているものもあるが、完成版として、チルト、パンを別にしたソースをAVRStudioのプロジェクトフォルダーの形で置いておく。パン部は、普通の1相励磁のマイクロステッピング制御、チルト部は、1-2相励磁の少し強力なマイクロステッピングである。

 回路図は見にくいようなら、CGIのフォルダーの中に、Bsch3のソースファイル、LiveCamera.CE3を入れておいたので、これをBsch3で開けば細かいところまで調べられるだろう。

 回路図で、ユニークなところは、チルト部のデジタル入力にパスコンが入っているところだろう。理屈はともかく、これで誤動作がピタリと消えた。制御線をモーターの電源と一緒にしてコネクターで長く引き回したので誘導が起きたのだと思う。ただ、完全な対症療法なので、すべてでうまくいく保証はない。うまくいかなければ、各自工夫していただきたい。

 Raspiとモータードライバー(Tiny2313)とはフォトカプラーで分離している。必ずしも必要なものではない。RasPiのVccが3.3Vで、Tiny2313が5Vなので、レベルシフターのつもりでつけた。グランドが分離されているので、誤接触などでRaspiが壊れる危険が少なくなったくらいの効果は期待できる。

以下に、CGIソースとBsch3ファイルを固めたzipファイルと、モータードライバーのソース、あわせて3つのファイルを置きます。 

「LiveCam_Sch_Cgi.zip」をダウンロード

「CAM2313_PAN.zip」をダウンロード

「CAM2313_TILT.zip」をダウンロード

暫くぶりの秋葉原でBeagleBoneBlackを買ってしまう(10/16/2013)
 ライブカメラ開発が一段落したので、このところご無沙汰だった秋葉原を3 週間ぶりに訪れた。ライブカメラのプロジェクトに忙しく、やりかけになっている電子工作がいくつかあるのでその部品を揃えるためである。台風の通過直後で雨は完全にあがっていたが風はまだ強い。

 秋葉原では、秋月や、千石に行く前に必ず覗いていくところがある。「あきばおー」などに代表される、激安ショップである。まず必ずSDカードの値段の動きを調べる。2Gの古い規格のSDカードが逆にレアものとして高くなっているのが面白い。SDカード以外でチェックするのが、USBのAC充電アダプターである。¥500以下で5V 1Aを供給するACアダプターとして使うためだ。

 この日見つけたのが、Appleの超高いUSB充電アダプターのコンパチ品だ。値段はたったの¥400。 今まで買ったものに比べると一番小さい。うまく動けば儲けものだ。表示パッケージを見ていて思わず笑ってしまった。

S_pa246113 何とブランド名が、PineAppleで、商標は、Appleのリンゴの上に、緑の葉がついている。パイナップルのつもりだろう。冗談としか思えないが、なんでもありの中華ならではの商品だ(こいつは、帰って測定して見たら無負荷で5.2Vとまともで今のところ無事動いている)。

 千石では、裸で使っているカマデンのデジタルアンプ用のケースを探す。このアンプは机の上に置いてPC音源のアンプにしているが、ケーブルが多く、電源の入りきりをジャックの抜き差しでやっているので操作性が悪い。いずれケースに入れようと思っていた。

 どんなケースにするか色々迷ったあげく、ありきたりだが、ガイガーカウンター2号機にも使ったタカチのSW-125 ¥280を選んだ。密閉ケースなので、アンプの放熱のための通風孔はどこかに空ける必要があるが、大きな音は殆ど出さないのでいらないかもしれない。

 ケースに固定するフォンジャックとDCアダプタージャックも忘れずに買う。DCアダプターのコネクターは規格があるようで微妙に違う時があり、気をつけないと、同じ2.1mmのプラグでも入らなかったり、丈が余るものがある。スイッチやボリュームは手持ちで間に合わせるつもり。

 秋月へまわる。特に目当ての品物はない。しかし、店内を見ているうち、とうとうこらえきれなくなってBeagleBoneBlackに手を出してしまった(¥4980)。今、これで何かを作ろうと計画しているものはない。

 雑誌付録のSH2A、RX61などCPU基板や、mbedなど、まだ手つかずの沢山の積み基板があるのだが、欲しいとなると止められなかった。このあいだ、すんさんの掲示板で、次から次に基板を買っている人に注意したのと同じようなことをやっている。思わず一人で苦笑いである。

S_pa256133 そもそも、秋葉に来たのは、デジタルアンプの部品以外に、積み基板のひとつ、雑誌付録の富士通のARM基板、FM3をGNU環境で動かすことだった。そのためにJTAGの20ピンのボックスコネクターや、USBタイプAコネクターなどを買いに来ていたのだけれど、結局、その競合機種(でもないが)を買ってしまったことになる。一体何をやっているんだろうね。

台風26号の気圧変化はすごいことになっていた(10/17/2013)
 関東地方は、この週明けに台風が襲い伊豆大島では土石流で沢山の犠牲者が出た。我家は幸いなことに観葉植物の鉢が倒れたくらいで何の被害もなかったが、台風の去った翌日気圧計をみたらすごいことになっていた。

 昨夜の気圧がグラフの限界を大きく下回っている。このグラフの下限は、975hPaなのだが、それを大きく下回っている。我家は東京の基準気圧より10hPaほど低いので、960hPaくらいまで下がったようだ。

S_pa166101 STM32を使ったこのグラフィック気圧計は、このあいだのI2Cルーチンの修理以来、全くトラブル無しに稼動中だ。これも、ケースに入れてやらねばならないのだが、そのままになっている。そういえば、気圧計と言えば、最近はO-Familyさんが先鞭をつけた新しい気圧センサーチップLPS331APを使ったものが流行である。こいつは、今のMPL115より1桁ほど精度が良く、取り扱いも簡単だ。

 秋葉原での買い物を整理していて、確かLPS331APは買ってあったことを思い出し、なにげなく探しているうちに恐ろしいものを見つけた。部品箱に封を切っていないLPS331APのパッケージが2つも発見されたのである。何と、知らないうちに2つも買ってしまってあった。

 LPS331APが話題になった頃、秋葉原で何度か買い物しているうちに、知らない間に買ってしまったのだろう。文庫本では、もう何度か経験済みだが電子部品の2重買いは始めてである。情けない話だが、2つのパッケージの前で、また苦笑いである。まあ予備と考えれば無駄ではないと負け惜しみ。

久しぶりの工作が楽しい(10/18/2013)
 カマデンのデジタルアンプのケースを作り始めた。このデジタルアンプは、グルンディッヒのスピーカーとセットで、USBを通したPCのオーディオシステムになっている。電源は、アダプタープラグの抜き差しで良く消し忘れる。

 消し忘れると、PCの電源を入れたときにUSBから大きなショックノイズが出て精神衛生上良くない。まず電源スイッチを作りたい。それとアンプの前のボリュームである。現在は、最大増幅率のままの入力なのでプリアンプのS/N比がシビアになる。

 レイアウトに迷う。普通のオーディオアンプのように、前面を操作面、裏面を入出力コネクターにするべきなのだが、アンプ基板の入出力端子が両側面にあるので、面倒である。しかも、コネクターやボリュームをケースに固定すると保守性が悪くなる。といって中継コネクターはアナログなのでなるべく避けたい。

S_pa226106  とりあえずは電源スイッチの新設である。スイッチは最初はロッカースイッチと思ったが、ケースが小さいとこいつは意外に操作しにくい。結局レガシーなスナップスイッチに落ちつく。LEDは手持ちのブラケットLEDをつける。緑が欲しかったが、赤しか残っていなかった。

 相手はABS樹脂なので、穴あけ工作は楽だ。スピーカー端子とDCアダプター端子、ヘッドフォン入力をつけ、保守性を上げるために基板の出力をターミナルブロックにして、ケース工作はほぼ完成した。

デジタルアンプのハム退治(10/19/2013)

 ボリュームはまだついていないが、ステレオフォン入力端子を追加したので、とりあえず動作テストに入る。うーむ、ハムが出る。特に、未入力(端子が浮いている)のときはちょっと耐え難いほどの音だ。アンプを最大入力で入れているので、ボリュームを追加すれば小さくなるのだろうが、それにしても大きすぎる。

 ハム退治にとりかかる。これが結構難しい。デジタルアンプは差動入力なので、アースが必要なのだが、これが意外とクリティカルなのである。フォンジャックのグランド線のアース点で微妙にハムレベルが異なる。

 不思議なのは、手で基板のグランドを触れるとハム音がなくなることだ。要するに、入力端子のアースが十分でないことを物語る。あわててウェブで対策を調べる。そう、考えていた通り、アースの取り方がまずいようだ。

 これまでのアース点は、ハンダ付けが楽なので、既存のRCAジャックの大きな取り付け部にステレオフォンジャックのグランドを接続していたのだが、これをオペアンプ入力のグランドに換えてみると、ハム音がぐっと小さくなった!おおお、こんなところでも微妙なのだ。

S_pa226107 それでは、というので、今まで気楽に、基板のべたグランドと、左右のRCAジャックを錫メッキ線でつないでいたアース線をはずし、左右のオペアンプ出力、ステレオフォンジャックアースをまとめて基板べたグランドに一点アースにしてみた。やった、やった。ハム音は完全に消えてなくなった。

 容量の大きいハンダごてを持っていないので、見映えの良いハンダ付けには出来なかったけれど、結果に大満足である。ハム退治は昔から沢山苦労してやってきたけれど、こんなに効果的に消せたことは珍しい。

リチウムバッテリーを生き返らせて胸をなでおろす(10/20/2013)
  ハムも出なくなってデジタルアンプのフィールドテストに入る。音源のためLPCMプレーヤー1号機を棚から出して動かそうとしたら、動かない。バッテリーの電圧を測ったら何と0Vである。スイッチを切り忘れたらしい。この忙しい時に限って緊急事態発生である。

 このリチウムバッテリーは、携帯電話からの流用品で代わりはない。1号機を生かそうと思ったら大改造が必要になる。ちょっと顔が青ざめる。リチウムバッテリーは過放電すると生き返らない可能性があり、しかも過放電後の下手な充電は危険である。

 もうだめかと思ったが、ものは試しと自前の充電基板に恐る恐る接続し、電圧計をつけて、最初は数秒から始まって、手で触って温度を調べながら、少しづつ通電してみた。電圧は、3.6Vくらいから始まる。

S_pa256135 暫く充電して、充電を止め、電圧を見ると、3.5Vで、みるみる電圧が下がっていく。あーあ、やっぱりだめか。諦めきれず、また充電。おおお、少し電圧が上がったか。何度か繰り返すうちに、発熱もせず、充電電圧が順調に3.7Vまで上がった。はずしても電圧は下がらない。

 良いぞ、トリクル充電をしてくれたようだ。そのあと、PCの横でウェブを見ながら、充電を見守る。順調に定電流充電のあと、定電圧充電に移行し(チップの発熱でわかる)、無事、充電電圧が4.2Vまで上がった。よーし、生き返ったようだ。

 暫く、プレーヤーを動かし様子を見る。大丈夫なようだ。しっかり充電されている。死んだと思ったリチウムバッテリーが生き返った。リチウムバッテリーって、思っていたより丈夫なものだと感心する。

デジタルアンプのケース完成。すっきりして満足だったが(10/23/2013)
 音を出しながら、残りの工作を急ぐ。ボリュームは、例のLM380革命アンプで使ったウェブで評判の良いマルツ製(RD925G)の予備を使う。基板固定のボリュームだが、ちゃんとシャフトにはネジがついており、生意気にもストッパーの突起部まである。

 削ってしまおうと考えたが、心意気を尊重して、ケースにミニリューターの丸やすりで凹部を削りピッタリ入るように加工した。もともとのRCAジャック入力はケースの外に出すことを結局やめた。入力はステレオフォンジャックのみとする。まあサブアンプだ、とりあえずは良いだろう。

S_pa226109 ケースが完成した。干渉しないことを確かめて、基板の固定のスペーサーを底板に接着剤で固定する。アンプ基板とケースは結局すべてコネクターで分離できるようにした。スピーカー出力は、基板用の端子ブロック、電源は2Pコネクター、入力は最後まで迷ったが、3Pのピンソケットで分離する。

 底板にゴム足をつけて出来上がりである。PC机の上に置いてみる。これまでスピーカーケーブル、電源ケーブル、入力ケーブルが散乱していた机の上は見違えるように綺麗になった。ケーブルがすべて後ろに隠れるのが良い。

S_pa226104

 ああ、放熱孔を開けるのを忘れていた。小音量でしか使わないのでなくても良いと思うが、密閉のままでは何となく不安である。開けることにする。最初、アンプモジュールの上の天板に開けようと思ったが、どうも見映えが悪い。

 というので、両側面に穴を空けることにする。ちゃんと定規を引いて結構気を遣って穴を6ヶづつドリルスタンドを使って開けたのだが、できてみると、これが完全に不揃いである。今まで上機嫌だった気分が、あっという間にしぼんでしまった。

S_pa226110 それにしても、両側の目立たないところに穴を開けたのが不幸中の幸いである(上に開けて不揃いだと見るたびに落ち込むところだった)。ドリル穴はセンターポンチなどで先行して決めておかないと、正確な位置に穴を開けるのはとても難しいことを今さらのように学んだ。今度は失敗しないぞ。

| | コメント (4) | トラックバック (0)

2013年10月12日 (土)

もう一台のRaspberryPiをSAMBAサーバーにする

 RaspberryPi(以下Raspi)とUSBカメラで、お家(うち)ライブカメラを作るプロジェクトは、5ヶ月近くかかったが、めでたくウェブでライブ画像を見ながら遠隔地からカメラを上下左右に振れるところまで来た。

 留守中の猫の監視用なのだが、今はまだカメラ可動部やRaspiが裸で、このままカメラを動かせば、すぐに猫の襲撃を受けることは必至である。何らかの対策なしに運用には入れない。といって、すぐに気の利いた解決策も思いつかない。

 そういえば、ライブカメラのRaspiを含めた全体の回路図や、AVRのソースコード、RaspiのapacheのCGIやHTMLファイルの公開はまだしていない。隠すつもりは全くない。たださぼっているだけで、この先の自分のためにもまとめておきたいのだが、何かこう気が抜けてしまって、どうも重い腰が上がらない。

S_pa126094 そんなこともあって、ライブカメラのプロジェクトは少しお休みし、工作机のまわりを片付けたり、半かけになっている他の工作を再開したりして気力が戻るのを待つことにした。

SAMBAサーバーを羊羹(ようかん)の紙箱に入れる(10/2/2013)
 がた老AVR研究所は、Raspiを2台持っている。1台はライブカメラ用で、もう1台は、この間動かしたSAMBAサーバー(Windows用のリモートサーバー)にするつもりでいる(2013/5/12「機嫌の悪いRaspberryPi基板を飼いならす」)。 家族が独立し、家の中に共用サーバーをたてる強い必然性はなくなったのだが、所長一人でも、1Fの居間と地下のオーディオルーム兼工作室にそれぞれあるPC間のデータ交換の需要は見込める。

 それに、RaspiとPCの間でデータ共有ができるのが大きい。Raspiでの開発のソースコード入力は、Raspiの環境でやるより、PCで作ってからRaspiに送る方が効率が良いからである。

S_pa126086 Raspiはコネクターが基板4方に発散しており、そのままでは接続したケーブルが机の上のスペースを無駄にとって始末が悪い。SAMBAサーバーとして運用するには、いずれ本格的なケースに入れる必要がある。あれこれ考えているが、これもうまいアイデアが浮かばない。そのうち思いついて何かの整理用に残してあった紙箱に一式を放り込んでみた。

 これが意外とうまく行ったのである。ケーブルが周りと干渉することもなく、移動させるのにも気を使わない。この箱は、羊羹で有名なとらやの紙箱で結構しっかりしている。Raspiは最初、送られてきたピンクのケースに穴を開けて入れていたのだが、放熱を考慮して、ケースからとりだした。

S_pa126096 USBハブや、2.5インチHDDなどから出るUSBケーブルは、アマゾンから短いケーブルや、軸を換えられる3Dコネクターを取り寄せたので、箱の中もきれいに納まった。それより机の上が見違えるほどすっきりした。このままでも良いような気がしてきた。

 SAMBAサーバーは購入直後、動くことを確認しているが、もういちどテストする。順調に立ち上がった。このサーバーの消費電力は、HDD(2.5")を入れても10W以下なので、常時ONでも問題ない。しかし留守中や、夜中でも動かしておくのには抵抗がある。

 作業が終わったら電源を切るようにしたいのだが、Linuxをいきなり止めるのは、危険である。といって、電源を切るだけのために、コンソールを立ち上げてコマンドを打ち込むのも芸がない。何とかならないかと考えるうち良いアイデアが湧いた。

 Raspiの特長であるGPIOのどれかのPINにスイッチをつけ、その入力で、shutdownコマンドを出すプログラムを作って、デーモンにしておけば良い。sambaサーバーの立ち上げは、ハブの電源をONするだけで勝手に立ち上がるし、終了はボタン一押しで決まる(誤動作をさけるためにボタン長押しが良いだろう)。

S_pa126091  本当の電源断は、これでは出来ないが、shutdownしたあとのRaspiは、生きている時と違って、発熱量がごく僅かなので放っておいても資源の無駄遣いにならない。よし、これは面白そうだ。やってみよう。

 目の前に目新しい目標ができて、俄然やる気が出てきた。すぐにウェブを前に、色々情報を調べ始める。いっそのこと、サーバーの電源も自動的に入り切り出来るようにならないだろうか。SSRを使うか。いろいろと妄想がふくらむ。

スイッチひとつでRaspiを安全に停止させる方法を実装する(10/3/2013)
 RaspiのGPIOの入力データは、wiringPiライブラリに、digitalRead( )という関数が用意されて簡単に読むことが出来る。しかし、普通の8ビットマイコンのように、ループで待ち続けてはファイルサーバーとしての仕事に差し障る。

 ここは当然、スイッチ割り込みでプログラムが起動するようにしないといけない。サーバーの仕事より、こちらの方がCPUを喰ってしまう本末転倒のようなことは、所長の職人魂が許さない。

 しかし、wiringPiは割り込みをサポートしているのだろうか。まずはウェブで、「wiringPi 割り込み」で検索する。大丈夫。ちゃんとwiringPiでも割り込みをサポートしていた。ただしV2からだ。あわててインストールしたwiringPiを確かめる。よし、2.13だ。

 ウェブには既に、いくつかのサイトで割り込みを使ったソースプログラムが紹介されており、wiringPiのサンプルプログラムにも割り込みを使ったプログラムがある。心配なさそうだ。   

 さらに、ウェブを読み込む。ふむ、割り込みを扱う関数は2種類ある。ひとつは、割り込みが来るまで、ひたすら待ち、望みの割り込みが来たら次のステップに行く、waitForInterrupt(割り込みピン、タイムアウト時間)というのがある。

 もうひとつは、wiringPiISR(割り込みピン, 割り込みタイプ, 割り込み先関数エントリー)という関数だ。呼ばれる関数のエントリーを指定しておき、割り込みが起きた時、この関数へジャンプして、その処理が終わると元のプロセスに戻る。一般的なマルチプロセスのサポートである。

 今度の用途は、複雑な処理をするわけではなく、所定のピンにつけられたスイッチがONされるのをひたすら待ち、待ちが解消されたらsystemコマンドで、shutdown を出すという至極簡単なロジックである。

 waitForInterruptの方が簡単そうだったが、ちょうど、wiringPiISRを利用したソースリストを見つけたので、とりあえず、これをまるまる利用させてもらって組むことにする。以下のソースのような感じ。

#include < wiringpi.h >
void send_shut(void) {
   system("sudo shutdown -h now" );   //ピンがグランドになるとシャットダウン
} 

int main(void){
   int setup = 0;
   int GPIO_PIN = 24;
   
   setup = wiringPiSetupSys();    //初期化(正しくはwiringPiSetupGpio)
   piMode(GPIO_PIN, input);       //入力ピンに設定
   pullUpDnControl(GPIO_PIN, PUD_UP);    //プルアップ
   while(setup != -1){                   //ひたすら待つ。
       wiringPiISR( GPIO_PIN, INT_EDGE_FALLING, send_shut ); 
       sleep(10000);
   }
   return 0;
}

sleep(10000)というのが少し気に入らないが、簡単なプログラムなのでwiringPi関数が所定の機能どおり動けば、すぐ動くだろう。あとはgccの環境セットアップとライブラリの確認である。

Raspberryで、はじめてgccを使ってコンパイルする(10/5/2013)
 gccの環境は問題なかった。このRaspiのディストリビューション(Raspbian)にはgccがインストール済みであった。恥ずかしながら、実は、所長はgccをコンソールから使うのは、20年近く前からのLinuxの経験を含めて全くの始めてである。

 ウェブで勉強する。何か至極簡単そうだ。あっという間にHello World出力のプログラムが動くようなことが書いてある。あの鬼のように長いパラメーターを入れたmakeのコンパイルの時と同じコマンドとは思えない簡単さだ。

 言われるままに前記のソースコードを、コンソールから簡易エディターnanoで入力し、以下のgccコマンドを入れる。

gcc -v send_shut.c -lwiringPi.h

たったのこれだけである。-vを入れたお陰で、makeのときに御馴染みのメッセージが沢山出て一瞬でコンパイルは終わった。最初、ヘッダーファイルが見つからないと怒られたが、wiringPiをインストールしたときに、./buildを忘れていたことがわかり、再度実行して、表記どおりのコマンドでコンパイルが通った。

Gcc_compile  始め、実行ファイルができてないと騒いだのは秘密(パラメーターなしだと、a.outが実行ファイルなんですよね)として、./a.outでとりあえず実行させてみる。いきなりsysytemコマンドでshutdownさせるのではテストが続かないので、これをコメントにし、printfで適当なメッセージを出力させる。

 出た。プログラムが開始したことを示すメッセージが出た。へー、簡単にプログラムが動くんだ。妙なところで感心する。スイッチを押してみる。当然のように反応なし。そうだよな、そう甘くはない。

 さて、デバッグである。wiringPiには、いくつかのGPIOをチェックするコマンドが用意されている。これを使ってひとつづつ、wiringPiの関数がそのとおり動いているかチェックしていった。コンパイルはあっという間に終わるので、ひとつづつでも手間はかからない。

 piModeでピンが入力モードになったのは、gpio readallで確かめられた。次は、プルアップさせるpullUpDnControl(GPIO_PIN, PUD_UP)である。うーむ、上手く動いていない。スイッチは、ピンをショートする形でプログラムは立下りを調べているので、これでは割り込みは起きない。テスターで測っても、Highになっていない。

 ピンを間違えていないか。RaspiのGPIOピンのアサインはえらく複雑で、少なくとも3種類のピン番号の系列があり、しかも初期化によって同じピンで番号が違ってしまう。何度も確認する。しかし間違っていない。

ピンがプルアップされない理由がわかった(10/6/2013)
 思わぬところで暗礁に乗り上げた。24番PINがプルアップされない。余程、強制的に、プルアップ抵抗を外付けしてしまおうと思ったが、せっかくの機能が動いていないと言うのは気分が悪い。何か情報がないか、ウェブを調べる。

 しかし、めぼしい情報は得られない。仕方がないので、別の関数waitForInterruptを使って割り込みを待つプログラムにしてみた。wiringPiの公式サンプルプログラムwfi.cを参考にする(ただし、このwfi.cは、別スレッドを新たに立てる複雑なプログラムでそのままは使えない)。

 このソースコードを参考に、ピンの初期化を、system("gpio edge 24 falling"); というwiringPiのコマンドで代用して動かしてみる。ついでにプルアップを、sysytem("gpio -g mode 24 up")でごまかす。 S_pa126092

 これで見事に、スイッチ入力が有効になった。スイッチを押すたびに、コンソールにメッセージが出る。良いぞ。ただ、チャタリングがひどいので、wiringPiに標準でついてくるms単位のウエイト関数delay( ms )を使って判断を遅らす。これでチャタリングも止まった。

 しかし、動いたことは動いたのだが、問題が残った。system関数で、gpioコマンドを出す方法は、ピン番号がコマンド列にキャラクターで入っているので、決め打ちしかできない。他は変数なのに美しくない。sprintfでコマンド文字列を変数から作る方法もあるが、この程度のプログラムではおおごとだ。

 何かもっと上手い方法はないか、さらに探す。だいたいどうして前のpullUpDnControl( )が動かないのか。本家のウェブスペックを読むうち、遂にその謎が解決した。このスペックは邦訳がでていて、ちょっと意味の取れないところがあったので原文を読んでいて発見した。

 GPIOの初期化に3つも種類があるので、その差を調べていたら、今、こちらで使っている初期化関数、wiringPiSetupSys( )は、pullUpDnControl( )をサポートしていないことがわかった。

 pullUpDnContro( )の説明には、Sys modeでは動かないと書いてあるのだが、このSys modeが理解できなくて、初期化のwiringPiSetupSysのsysに結びつかなかったのである。

要するに、pullUpDnControlを使うには、/sys/class/gpioという仮想ファイルを初期化するwiringPiSetupSysではなく、管理者権限のあるユーザーしか使えないwiringPiSetupGpioで初期化する必要があるということだ。

 なーんだ。そうだったのか。あわてて初期化をwiringPiSetupGpioの方に換え、もういちど最初のwiringPiISRのコードに戻る。はい、おめでとうございます。最初のコードも問題なく動いた。

 やれやれ、手間がかかった。それにしても、これだけのことで大騒ぎだ。しかしいつものことながら解決した時の気分は最高である。ついでに、topコマンドで、このPGMの使用率を測る。スイッチを連打しても殆どゼロ。大満足である。

rc.localに入れてタクトスイッチでshutdown成功(10/8/2013)
  スイッチでシステムを落とすことにとりあえず成功した。次はこのプログラムの自動化である。デーモンを何処に入れるかで迷う。推奨されていないらしいが、もっとも簡単な、rc.localにコマンドを入れてテストする。

 動かない。考えてみたら、ユーザーがログオンされていない状態で、標準出力をデーモンから期待するのは無理と言うことがわかる。

 乱暴だが、shutdownコマンドを入れて、sendshut(シャットダウンさせるプログラム名)を実際に動かしてみる。 見事、システムが落ちた。これでSAMBAサーバーはスイッチひとつで安全にとめることが出来るようになった。

 デーモンプログラムは色々作法があって、最近は、このrc.localではなく別個のデーモンセットを独立して作っていくことが推奨されているようだが、まあ、それほどこだわることでもないだろう。とりあえず、このまま少し運用してみようと思う。それより、スイッチの実装をどうするかだ。

 このブログの原稿も、データをここに置くことにする。ここに置いておけば、地下でも1階でも好きな時に原稿をいじることができ、変更漏れに気を遣うこともない。寝る前に地下に降りて、スイッチを押せばSAMBAは一日の仕事を終えてお休みになる。

| | コメント (0) | トラックバック (0)

« 2013年9月 | トップページ | 2013年11月 »