情けない

まだまだjQueryに不慣れなワタクシ。今回見事にハマったポイントがこれ。

<form action=“target.php” method=”post” enctype=”application/x-www-form-urlencoded” target=”_self” id=“source” accept-charset=”UTF-8″>
</form>

こんなフォームに対して

jQuery(‘<input/>’,type:’hidden’,id:’secret’,value:0}).appendTo(jQuery(‘#source’));

として

<input value=”0″ id=“secret” type=”hidden”>

を付加してsourceをsubmit()してやっても、target.phpにsecretが渡らない。原因は … name属性がないから。正解は

jQuery(‘<input/>’,type:’hidden’,id:’secret’,value:0,name:’secret’}).appendTo(jQuery(‘#source’));

ロスタイムは3時間弱(涙)。

mod_authn_dbdでユーザ認証

本業方面で長〜いこと重宝してきたmod_auth_pgsqlが、Cent7で遂に使えなくなった。正確にはApache2.4からなんだが、代替手法としてmod_authn_dbdをと思ったらこなれた情報が少なくて、動かすまでに結構苦労した。以下はその際の備忘録。

@ 動作環境

[root@tako ~]# cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)

[root@tako ~]# psql –version
psql (PostgreSQL) 9.2.13

[root@tako ~]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Aug 24 2015 18:11:25

@ 準備

1. データベースhogeと、認証に必要なアカウントとパスワードを保持するテーブルmemberを作る。

psql=# select account,password from member;
account| password
—————+———-
user01 | A_235&bc
user02 | &se8ad_3
user03 | i58-Gz23
(3 行)

2. PostgreSQLでpgcryptoを使えるようにする

psql hoge -f /usr/share/pgsql/extension/pgcrypto–1.0.sql
psql hoge -c “create extension pgcrypto”

この段階で「SELECT crypt(password,gen_salt(‘des’)) FROM member WHERE account=‘user01’」として結果が返ればOK。

3. Apacheのディレクティブでmod_authn_dbdのための設定をする

以下は仮想ホストでのそれ。先頭に+++と付いている行がmod_authn_dbdに関するところ。

<VirtualHost www.anywhere.domain:80>
DocumentRoot /var/asproot
+++ DBDriver pgsql
+++ DBDParams “host=localhost dbname=hoge user=postgres password=postgres”
+++ DBDMin  4
+++ DBDKeep 8
+++ DBDMax  20
+++ DBDExptime 300
<Directory “/var/asproot”>
+++ AuthType Basic
+++ AuthName “ASP Server”
+++ AuthBasicProvider dbd
+++ AuthDBDUserPWQuery “SELECT crypt(password,gen_salt(‘des’)) FROM member WHERE account=%s”
+++ Require valid-user
allow from all
Options None
</Directory>
LogLevel debug
ErrorLog logs/asp.err.log
TransferLog logs/asp.access.log
ServerName www.anywhere.domain
</VirtualHost>

※  .htaccessには書けない
※  AuthDVUserPWQueryの%sは’’で囲わない

これが噂のWROOM02

まだ暑かった頃、せっかくソーラー+LiPoの環境があるのだからベランダで温度・湿度・気圧を24時間測定してこれをサーバにアップしてやろう、と考えた。プロトコルはHTTPしか考えていなかったので、最初はRasPiから室内のWi-Fi親機経由にしようかと思った。が、これだとRasPiの消費電力が高すぎて24時間連続運転できない(注1)とわかり☓。

次はArduino(Miniあたり)からBluetoothで室内のRasPiに送信し、そこからサーバへというのを検討。しかし技適の取れたBluetoothモジュールは高いし、またそれだけのためにRasPiを常時起動しておくのは如何にも勿体無いしで、ウ~ンとなっていた。

そんな折、Arduinoから使えるWi-FiモジュールとしてWROOM02というやつの存在を知った。しかもなんとそれ自体単独でArduinoとして動作するというではないか! AVRではないのでスリープとかINTとかがどうなのか心配だが、それはもう試してみるしかあるまい! と早速予約注文、2週間後に届いたのがこれ。忙しさにカマけていて放置状態だったこれを昨日、遂に動かしてみた。

ヘッダピンを付け0と2と15とEN、そしてVccとGNDを先達の教えに従って接続(注2)、手持ちのFTDIアダプタでクロス接続して電源ON。すると「ぐちゃぐちゃぐちゃ … ready」が見えたので「よっしゃー!」とばかりにAT→豆腐。ん?  AT→豆腐。んん?  AT→豆腐 … 「OK」が来ない!

その後も、いくらボーレートを変えても通信パラメータを変えてもリセットしても電源抜いても文字化け続き。果たして俺が何か初歩的なところで間違っているのか、それともモジュールかボードがおかしいのか、調べる気力体力は既に残っていなかった。「動いた」とは、とても言えませんなこれは。

という訳で、初日はここまで。何か進展があったら続き書く。

追記:  一夜明け、何かヒントがないかと探していたら既に同じセンサで同じ事を考え、既に成功させている方々が大勢(涙)。

更なる追記:  実は短気なワタシ、その続きをやる前にこっちを注文しちまいました。それが届いたのでソク足をつけ、試してみたら一発で動くじゃありませんか。むろんWi-Fi接続もできたし、スケッチの書き込みも○。ま、ひとまずこれでブームのケツには追いつけたかなと。

また追記: スイッチサイエンスのがすぱっと動いた一方、マイクロテクニカの方はどーやっても動いてくれない。実はコレ、買ってすぐに取説見てEN/2/15をハンダでショートした。たぶんこのせいなんじゃないかと。悔しいが、しばらく放置する。

注1: テストはB+で行ったが、数時間しかもたない。A+なら多少はマシなんだろうが、どうせ24時間はムリ。

注2: このボード、チップの足がその並び通りピンに出ていない。ENがどこにあるのか、最初わからなかった。いったい何を考えとんだか。

‘BeatRing’ comming soon …

ぐちゃぐちゃ

SparkFunの「Sound Detector(以下SDと略)」と出会ったこの日から、密かに作ってきたのがこれ。いったい何かというと「入力がマイクで出力がリングLED」なVUメータ+スペアナもどきで「LEDの点灯数がレベル、表示色がスペクトラム」という、ただそれだけのもの。AdafruitのPro Trinket(5V)とNeoPixelリング12連(以下NPと略)、そしてスペクトルの取得にはサンハヤトのMM-3830をMCP3208経由で使っている。

予定ではとっくの昔に完成し、ケースに収まって持ち歩きできるようになっている筈だった。それが未だバラック状態なのは、試作を終えてUNOをTrinketに、電源をLiPoに、そして更には充電できるようにとしたところから次々とハマったため。中でもいちばん手を焼いたのがSDで、実はSparkFunのサイトにこんな記述がある。Google翻訳によると

「サウンド検出器は、アナログ回路であり、そのように、それはほとんどのデジタル回路よりも、電源のノイズに敏感です。カプセルは、有効電力レールを横切って座っている分圧器であるので、カプセルの出力上に供給ライン上のノイズを転写します。チェーン内の次の回路は高利得アンプであるため、供給上の任意のノイズは、その後増幅されることになります。そのため、音検出器は、多くの回路よりも慎重な電源構成が必要な場合があります。」

とまあ、こんな調子でアナログ的な弱みがつらつら。そこでDC-DCをいいのに替えたり、あちこちにコンデンサやら抵抗やらを挟んでみたりしたが全然ダメ。その後原因がNP点灯時の電圧降下によるものと判明したところからは、またもや試行錯誤の連続。そしてどうにか安定動作するところまで辿り着いたのが、つい最近のこと。

まだこの先にはハコ入れという難関が控えてはいるが、今度こそ本当にゴールが見えてきたという感じでホッとしているところ。早くこれ持って外へ出たいもんだ。

7セグは絶滅危惧種か!?

これまで回路の電流を測るのにこれを使ってきたが、配線が面倒で毎回思い出すのに苦労していた。どうせハイサイドでしか使わないんだし、もちっと楽なのはないかと思って探していたら、なんとこれまたAdafruitにあった。INA219だそうで、早速購入した。むろん問題なく動いたし、Adafruitの製品らしく小奇麗にまとまっていて◎。

そこで次はバッテリー駆動の際のそれを測るべく、値を手持ちのLCDに出してみた。かー、もっさりしていて見づらい! これではアカンと、隠遁状態だった同じくAdafruitのI2C7セグに交換。1秒おきにVとAを交互に出すようにしてみた。うーん、視認性の良さは比較にならないし、何よりこのキビキビ感が気持ちいい!  やはりこういうのは7セグに限るな、と再認識。

2015-10-16 16.03.47

だがAdafruitのこれ、I2Cで楽なのはいいがデカくて少々お高い。もっとコンパクトで安いのはないかと探したが、ない。んじゃー自作といきますか! と思い立ち、現物見ながら考えようとアキバへ。

ところがビックリ、小型の4桁7セグなんてどこにもない。昔はどこにでもあったもんだが、今や「売れないから置かない」んだそうで。言われてみりゃあ確かに最近、7セグって滅多に見ない。仕方ないので、帰ってからネットでポチることにした。少々テンション↓だが、続きはそれから。

2015-10-16 21.39.26

追記: ひと足先にMAX7219が届いたので、手持ちのこれとの組み合わせで動かしてみた。ライブラリはこれ。今回のTrinketは5V。ISETとVccとの間に抵抗(ここでは10KΩ)を入れないとウンともスンとも言わないので注意(これで1時間近くを無駄にした)。次はこれをどうやって3.3Vで動かしてやろうか、いま思案中。

FirmataをBluetooth経由で

そのうちやってみようと思っていたそれを、Windows版「Firmata Test」から試してみた。以下はその備忘録。

2015-10-14 13.15.12

1. FTDIを使って、ArduinoIDEのシリアルコンソールからHC-06(注)の名前をhogeに変更。

2. スケッチ「StandardFirmata」をTrinketに書き込む。

3. TrinketのRX:TXとHC-06のRX:TXとをクロスで接続する。

4. Windows側でhogeとペアリング、続いてこれに対しBluetoothシリアルポートを設定・開始する。

5. Firmata Testにて、4で作成されたポートを使う。

これでTrinketの13番ピンをHighにすると赤LEDが点灯した。ついでにPWMもLEDで試験してみたのが上の写真(HC-06は3.3Vでは動作しないので、今回はVccにLiPoのそれを入れている)。これは使えるかも!

注: 実際に使用する時はちゃんと技適の取れたやつを用いること。

時代は3.3V

このところi2Cでセンサを試す機会が増えた結果、UNOが出番を失ってTrinket3.3Vがメインになっていた。だがこれ、USBでスケッチの書き込みができるのはいいがシリアルモニタが使えない。なのでFTDIで使ってるんだが、変換器がブラブラしていて実に危なっかしい。落ち着いて作業ができなくて、困ったもんだと思っていた。

そこで目をつけたのがSparkFunのPro Micro3V。USB接続でシリアルモニタが使えるというし、更にはキーボードとかにもなるというのでこれを購入してみようかなと思った。が、そのおネダンたるやTrinketの倍! これでハズレだったらイタイなあとも思い、まずは試しにと買ってみたのが5Vの方のパチモン(敢えてどこのとは書かない)。

そしたらこれが、何の問題もなく動いてくれた。Trinket並にコンパクトだし、シリアルモニタも使えるし、リセット後すぐにスケッチが動き出すし、INTがたくさん使えるしで感動。直ちに3Vのそれ(むろんホンモノ)を注文した。

が、どういう訳かこっちがあまりよろしくない。ホストからボードが見えなくなる現象が頻発して、まともに使えていない(涙)。なので暫く5Vの方を使う事にした。そこでご登場願ったのが、引き出しの奥で眠っていたStrawaberryLinuxのTPS63060と、サンハヤトのMM-TXS01。前者で5Vから3.3Vを作り、後者でi2Cその他のレベル変換を行う。

2015-10-11 11.10.30

ゴージャスですねぇ。ちゃんと動いてくれたし。これで仕事がススムくん♪

ただ3.3Vの方、高かったのになんなんだこれは! ヨソじゃちゃんと動いてるのか?

追記:喜んだのもつかの間、SLEEP_MODE_PWR_DOWNでハングるではないか! 328u4はこれができないのか???

今度はi2Cでハマる

Arduinoから使えるセンサーは、最近どれもみなi2CもしくはSPI。おかげでピンの数が節約できるし、複数のそれを同時に扱う事も楽にできるようになった。まことにありがたい事である。

が、実はそこに大きな落とし穴があった。結論から言うと「MsTimer2とWireが併用できない」。がが~ん!

具体的に言うと、MsTimer2で登録したハンドラ内でi2CのTransmissionをすると、そこから二度と帰って来ない。つまり「バックグラウンドでは一定のタイミングでセンサーから値を取得しておき、フォアグラウンドではそれを必要な時だけLCDとかに出力する」みたいな、カッコいい書き方ができないのだ。

恐らく両者で同じタイマーを使うからだと思うが、PWMとかもこれを使う筈なのでアプリケーションから排他的に利用するなんて、まず無理。そこで調べてみると、Arduino PlaygroundにTimerOne/TimerThreeというのがあった。「おおっ! これならイケるんでは?」と思って前者を試してみたが、やっぱりダメ(涙)。

バッテリーの問題に目処がたったと思ったら、今度はこれだ。さて、どうする?

いちばん簡単なのは「MsTimer2を使わない」こと。loopの中にありったけ条件分岐とその先の処理を書き並べるだけだが、こんなの解決でもなんでもないので×。そこであれこれ考えた末「ArduinoにRTCを外付けしてタイマー割り込みをINTピンで拾う」しかない、という結論に達した。これなら精度も期待できそうだし。

ただ、問題はそのINTピンに余裕がないこと(Pro Trinketにはそもそも1本しかないし)。そしてこの俺がRTCを知らないこと(ああっ)。ま、気長にやりましょ。

追記:RTC-8564NBであっさり動いたのでニンマリ。SLEEP_MODE_PWR_DOWNからすかっと起きてくるのが実に気持ちイイ。