なんでだ
前回できたーと思い、意気揚々と豆苗買ってきて育ててたら、いつの間にか写真が保存されなくなってた。
やってみたこと
cronで自動実行してるので、なんのエラーか分からない。コマンドライン上で実行してみたら、出るかなーと思ってやってみたら出てくれた。
Traceback (most recent call last): File "/home/pi/nas/shutter.py", line 10, in <module> h = pi.spi_open(0, 50000, 0) File "/usr/lib/python2.7/dist-packages/pigpio.py", line 3787, in spi_open self.sl, _PI_CMD_SPIO, spi_channel, baud, 4, extents)) File "/usr/lib/python2.7/dist-packages/pigpio.py", line 970, in _u2i raise error(error_text(v)) pigpio.error: 'no handle available'
SPI通信を開くところでエラーが出てるみたい。pigpio.error: ‘no handle available’でググるとラズパイのフォーラムが出てくる。
そこのpigpioの作者さんっぽいjoanさんによると
No handle available means that all 32 handles are in use. Assuming you aren’t using 32 devices it means you have opened an I2C device without closing it at the end of the script.
使用可能なハンドルがないということは、32個のハンドルがすべて使用中であることを意味します。 32個のデバイスを使用していない場合、スクリプトの最後でI2Cデバイスを閉じずに開いたことを意味します。(機械翻訳)
使ったあとに閉じろや、ということらしいんだけど、pi.spi_close(h)で閉じてるよね…?フォーラムではコマンドライン上で
for ((i=0; i<32; i++)); do pigs spic $i; done
ってやればハンドラが閉じれるよとアドバイスがあったが、そもそもなんでハンドラが開いたままになってしまうんだろうか。
画像は80枚ほど保存されていた。途中までは保存できてたのになぜ突然?と疑問に思って画像を調べてみると、夜中撮ってるものは大丈夫で、日中撮ったものがダメなようだった。おそらくコードに問題がありそう。でも見てもよく分かんない。ということで以前やったようにcronを
0-59/1 * * * * python /home/pi/nas/shutter.py >> /tmp/shutter.log 2>&1
て感じでログを出力するようにする。再起動して画像とかも削除してまっさらな状態で待つ。で、ログを見てみると
Traceback (most recent call last): File "/home/pi/nas/shutter.py", line 50, in <module> if islighted: NameError: name 'islighted' is not defined
と出力されていた。islightedが定義されてない?あっ!
if bi < 1700: pi.set_mode(17, pg.OUTPUT) pi.write(17, pg.HIGH) islighted = True sleep(0.5)
あ、そういえば閾値を1700に変えた。ここの部分で、if内でしか宣言?代入?してないので、明るいときにはislightedに値が代入されず
if islighted: pi.write(17, pg.LOW)
ここで使う時に空のままで使おうとしてるからエラーになるんだ!で、ここで処理が止まっちゃうからspi_closeができずにハンドラが残っちゃうと。てことは明るさ取得する前に
islighted = False if bi < 1700: pi.set_mode(17, pg.OUTPUT) #略
て初期化してあげればいいね。解決した。
その他
- ハンドラの型はlong
- 修正前はこの値が増えていって、31より大きくなるとno handleエラーになってた。
- pigpiodの再起動でもいけるのかも。
- 検証しようと.sh作ったら権限設定ミスで起動してなかった。ハンドルが溜まってる状態で更に開こうとすると、無いよーってなるはずなのでデーモンを再起動して開放してあげればいいんじゃないだろか。ただ根本解決じゃないのでやっぱり上記のでいいと思う。
- ログはちゃんと取る。
- IDEほしい。
- ぐぬぬ
コメント