2018年3月30日金曜日

天体写真用装置の工作その2(GPIO)

その2だけどまだRaspberry PiというかLinuxの使い方

実際に天体写真用装置を操るにはI/Oを叩く必要があるけどその使い方についてのメモ

I/Oを叩くには
  1. 各種ライブラリを使う
  2. 直接レジスタを読み書きする
  3. sysfsを使う
というのがあるようだが、

1については、お手軽だけどネット上にあるものは急に消えたりすることもあるし(実際にここまでの規模だとそうそう消えるものはないけど)、GitHubから落とすというのも面倒なのでパス。あと、極力外部のものは使わず元々入ってるものを使うというのを良しとする性格にもよる。aptだのyumだのでインストールできるのでもう何を以て元々入っていると言うのかなんてどうでもいいけど、SunOSとかいじってた時代からの感覚なので仕方がない。

2についてはこれで行こうと思ってたところsysfsというものを使うことでもできるということで、お手軽さから3のsysfsを使うことに決定。あと sudo しなくてもできるというのも◎。

コマンドラインからこんな感じでLチカができるということが確認できた。

pi@raspberrypi:/d $ echo 23 >/sys/class/gpio/export
pi@raspberrypi:/d $ echo out >/sys/class/gpio/gpio23/direction
pi@raspberrypi:/d $ echo 1 >/sys/class/gpio/gpio23/value
pi@raspberrypi:/d $ echo 0 >/sys/class/gpio/gpio23/value
pi@raspberrypi:/d $ echo 23 >/sys/class/gpio/unexport


一旦スクリプトにしてみようと思ってコマンドを並べて

#!/bin/sh

echo 23 >/sys/class/gpio/export
echo out >/sys/class/gpio/gpio23/direction
echo 1 >/sys/class/gpio/gpio23/value
sleep 5
echo 0 >/sys/class/gpio/gpio23/value
echo 23 >/sys/class/gpio/unexport


として実行してみると

pi@raspberrypi:/d $ ./a.sh
./a.sh: 8: ./a.sh: cannot create /sys/class/gpio/gpio23/direction: Permission denied
./a.sh: 9: ./a.sh: cannot create /sys/class/gpio/gpio23/value: Permission denied
^C
pi@raspberrypi:/d $


???。同じことやってるのに???。Cで書いても同じ。???

一生懸命考えて、/sys/class/gpio/export にポート番号を書き込んでから /sys/class/gpio/gpio23 ができるまでに時間がかかるのだろうと思って、sleepしてやってみるとうまくいった。Cでも数msec待つとうまくいったのでこれが原因だろうと。

Cで書く時には、statで存在確認できるまで数msec待ち続けるということにする。

2018年3月24日土曜日

Raspberry pi でWindowsの共有をマウントする時のメモ

Raspberry Pi(に限らないけど)でWindowsの共有をマウントする方法のメモ。また必要な時に確実に忘れてるので。

リードオンリー化したRaspberry Piで開発するとソースコードとかの置き場として不揮発的な場所が必要。開発で使うRaspberry Piはそのまま現場にも持っていく(というか現場で使うやつを開発でも使うという感じ)ため候補としては、
  • USBでHDDをつないで、開発の時に接続
  • ネットワーク経由のファイルシステムを開発時にマウント
ネットワーク経由はお手軽だが、100Mだから速度面で不利かなぁと思いつつ、20年以上前には100MでNFSして開発してたからまぁいいかとsshでログインもするしお手軽さを優先してネットワークを採用。

常時動いているNFSサーバはないので、Androidの開発でも使っているWindows10 ProのデスクトップPCをソースコード置き場として使う事に。

CIFSでのマウントはいろいろ先輩達の情報があるからあっさりいくぜと思ってやってみると、

pi@raspberrypi:~ $ sudo mount -t cifs //192.168.2.xxx/share /mnt -o iocharset=utf8,username=foobar
Password for foobar@//192.168.2.xxx/share:  **********
mount error(112): Host is down
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)


PC生きてるのにと思ってぐぐるも先輩達はこれでOKなので納得いかずまじめに英語のサイトを見るとSMBv2(あるいはv3)を指定(vers=2.0)しろと。でやってみるとできた。

pi@raspberrypi:~ $ sudo mount -t cifs //192.168.2.xxx/share /mnt -o iocharset=utf8,username=foobar,vers=2.0
Password for foobar@//192.168.2.xxx/share: 
**********
pi@raspberrypi:~ $ df
Filesystem            1K-blocks       Used Available Use% Mounted on
/dev/root              30568540    5145912  24116344  18% /
devtmpfs                 470180          0    470180   0% /dev
tmpfs                    474788          0    474788   0% /dev/shm
tmpfs                    474788       6344    468444   2% /run
tmpfs                      5120          4      5116   1% /run/lock
tmpfs                    474788          0    474788   0% /sys/fs/cgroup
none                     474788          4    474784   1% /tmp
ramdisk                  474788         60    474728   1% /home_rw
ramdisk                  474788       2248    472540   1% /var_rw
overlay                  474788         60    474728   1% /home
overlay                  474788       2248    472540   1% /var
/dev/mmcblk0p1            42131      21478     20653  51% /boot
tmpfs                     94956          0     94956   0% /run/user/1000
//192.168.2.xxx/share


ランサムウェアの関係で無効化されてるらしい(多分)。 随分前からSMBv1はもう使うなという声を聞いたことがあったがその関係か。そこらへんのパッチを当ててなくてウィルスを社内にばらまいて、かなりあわあわしてたという某社の話を聞いたっけ。

現場に持っていく時は当然マウント先がないので、fstabにはかかず。マウントコマンドを1行スクリプトにして開発時にマウントするということで一件落着。fstabにパスワードを生書きしなくて済むし。

参考サイト
https://serverfault.com/questions/414074/mount-cifs-host-is-down

2017年10月15日日曜日

Arduinoのブートローダー焼き器作った

タイマーレリーズのプロトタイプをArduinoのシールドとして作ったが、Arduino UNOを一つ占有したり、高さが高くて適当なケースがなさそうなので、専用ボードとして作ることにした。

そのための第一歩として、Arduino UNOのブートローダー焼き器をシールドで作った訳だが、やはりArduino UNOを一つ占有してしまうわけで...


ブートローダー焼き専用ボードを作ることにした。

Arduinoのサイトを参考にこんな回路に


Arduinoのサイトには見当たらなかったが、ブートローダーを焼く時は10μFのケミコンが必要ということらしいので、その部分を追加(これはシールドバージョンでも同じ)。何かあった時(例えばブートローダー書き込み用スケッチに不具合があってフィックスした物がリリースされるとか)用にスケッチを書き込む時は10μFは不要というか無い方がよさそうなので、スケッチを書き込む時と切り替えるためのスイッチを設けた。

ということで完成 v(^ ^)。これでバンバン焼ける。


これに先立ってArduino UNOのまがい物を作った。何かのプロトタイプとか検証する時にブレッドボードにいちいち組むのが面倒なので、I/Oを引き出すためのソケット付き。


もう一つ作るものがあって、その後やっとタイマーレリーズの作成。

2017年8月1日火曜日

タイマーレリーズの仕様など

タイマーレリーズの仕様とかアイデアを忘れないように書き留めておくことにする。こうしておけば会社からも見ることができる(書き込みはダメなんだっけな?フィルタ出来なさそうな気がするので書けそうな気がするけどやめとく)。

勉強、検証の結果、実装がめんどくさくなって端折る機能も出てくるかも。

名称は統一感がないけど雰囲気で。

要件としては
  • 露光時間を指定できる
  • 露光と露光の間のインターバルを指定できる
  • 上記露光パターンを繰り返し実行できる
  • 露光繰り返しを開始するまでのディレイを指定できる 
  • 設定および進行状況を表示する(小型のLCD)
だけ。

動き

  • 待機、パラメータ設定、露光の3つの状態を使う
  • 待機状態で設定ボタンを押すとパラメータ設定モードになる
  • パラメータ設定状態で決定ボタンを押すとパラメータ設定を終えて待機モードになる(左右上下以外のボタンでも設定状態を終了してもよさそう)
  • 待機状態で、露光ボタンを押すと露光モードになる。
  • 待機状態で、1ショット、バルブ撮影ができる。
  • バルブ撮影は、機械的にやるのは大変なので、トグル動作とする。
  • パラメータ設定モードの時に、露光ボタン、1ショットボタン、バルブボタンを受け付けるかどうかは未定。律儀にパラメータ設定モードを終了しないとできないか、それとも、その状態で実行するか(特に露光モードは、修正中のパラメータでえいっと走るか。なんか気持ち悪いかも)
  • 露光状態に強制停止を押すとストップ(撮影初めてから、「あっ間違えた」って事がわりとある)

ボタンの設計

ボタンは以下の9個でいいだろう。
  • 撮影スタート
  • 強制停止
  • パラメータ設定用の左右上下 (4個)
  • 設定/決定
  • 1ショット撮影(撮影時にテスト)
  • バルブ撮影(トグル動作)
このままだとボタンだけでI/Oを食いつぶすので、抵抗で分圧してアナログ入力で判定する。

強制停止は割り込み使った方がいいか他のと同じようにするのがいいかは勉強しだい。あと、分圧の間隔が狭くなって判定が微妙になるのを避ける目的で独立ボタンに割り振るかも。抵抗の誤差とアナログ入力の分解能次第。

Arduinoのリセットスイッチも引き出す。まさかのためのリセット。

画面イメージ

16x2のLCD (1602)を使って、

0123456789 ABCDEF
EXP:9999sD:99s
INT:999sREP:999

この画面イメージができた時点ですでに各種パラメータの設定値は決まった。
  • 露光時間は0秒~9999秒
  • インターバルは0秒~999秒
  • 繰り返し回数は0回~999回
  • 開始までのディレイは0秒~99秒
0秒とか0回はないな。あまり常識的でない数字は除外するか。設定モードが終わって決定ボタンを押したらあらかじめ決めておいた最低値に設定するとか。

    2017年7月30日日曜日

    タイマーレリーズの作成始めました

    長らく作ろうと思いつつなかなか手を動かせなかったタイマーレリーズの作成に本格的に取り掛かることにした。

    その類の製品は売ってるのに敢えて作るのは以下の理由。実際にいくつか買って失敗している。
    • 時間が正確でない。露光時間を300秒で設定してるのに299秒になってる。299秒みたく中途半端な数字であろうがスタックするのが全部同じなら問題ないわけだけど、気持ち悪い。この考え病気の元。
    • 電源スイッチがない。キヤノン純正のも写真を見た感じでは電源スイッチらしきものが見当たらない。写真に写ってないところにあるのかもしれないけど。
    • 操作性がイマイチな感じ。というかボタンの押し感が悪いとか。
    • ハングした。もうこれダメ orz
    物はAruduinoで作成。これまでこの手はおもちゃとして買ってはいたもののおもちゃとして使うこともなく工作箱の中で眠ってたので、初めて実用的な工作。

    バージョン-1はモックということで、部品は以下二つ。
    • マルツのMaruduino UNO R3
    • Arduinoコンパチの 1602液晶 IIC/I2Cタイプ
    NewliquidCrystal_1.3.4.zip (https://bitbucket.org/fmalpartida/)

    https://arduino-info.wikispaces.com/LCD-Blue-I2C を参考に(というかそのままパクって)、

    結線。 
    LCDArduino
    GNDGND
    VCC5V
    SDAA4
    SCLA5





    で、
    • 実行前のディレイを6秒
    • 繰り返しを3回
    • 露光時間を3秒
    • インターバルを2秒
    とハードコーディングで動かしたのが、これ


    とりあえずモック完成。

    この後の流れは
    1. カメラとの接続
    2. 各パラメータをボタンとかで設定。これでほぼ完成
    3. 大きめのケース入れ。これ結構ハードル高し
    適宜リファイン。これで夏を乗り切る。

    将来的にはPICしたいかも。

    スケッチを描いての感想
    • 最近やってるkotlinのせいで行末のセミコロン付け忘れ多し
    • char[] の扱い。文字数+1個が必要。忘れてはないけど、めんどくさかった。
    最低限カメラとの接続はさっさとやろ。

    2017年2月1日水曜日

    ubuntuでUEFIでRAID1した時にハマったこと

    普通に、ubuntuをRAID1でインストールしようとしたら、最後の方のgrubインストールでエラーが。これはfatalだ。と。RAIDでなく、HDD単体でインストールするも同じ。ubuntu grubをキーにネットで探すもそれらしいものが見つからず。

    が、なんのことはない。HDDをgptにすればよいということだった。UEFIからブートするようにするには、gptでなければならないらしい。このHDDはFreeNASでデータ領域としてRAID1してたやつだったからgptでなかったんだろう。きっと。昔の型式(?)を選べるMBもあるらしいけど、うちのはダメだったので素直にgptに。

    で、後にもはまる可能性もあるので、その時のためのメモ。

    ubuntuのdesktop版でTry Ubuntuを起動。


    gpartdでcreate partition





    partitionを作るときのタイプをgptに。





    で、grubインストールできてブートできるようになってるはずなので、本来の目的のserverのインストール。

    無事

    生意気にも Serial のところをマスクしてみた。

    ちなみに、どこからか検索して飛んできた人がいるといけないので、注意しとくと用語の使いかたとか適当です。

    2016年12月13日火曜日

    UNC 3/8と1/4の変換

    カメラ用品のアルカスイス互換化をすべくネットを廻っていたら、UNC 3/8と1/4の変換パーツについて書いてあるサイトが出てきた。

    3/8の雲台



    と1/4の三脚


    を組み合わせるのに、いままではこんなのをつかっていた。



    が、取り外すとき(取り外すなんてのは殆どないはずだが、なにかのきっかけで外すことがある)にはどちらかにひっついてしまうわけで、三脚に残ったり

     雲台に残ったり。

    でも、残ったやつは手ではなかなか外れないので、ラジペンで三脚か雲台のどちらかについたやつを外す必要がある。



    どっちも、滑ってしまうときがあり面倒に思うことも。

    で、SUNWAYFOTOから出ている変換パーツ。マイナスドライバーで締めたりできる。


    底から見ると、





    と内側と外側のどちらもマイナスドライバーを入れられる構造に。

    これだと、三脚に残った場合も、



    雲台に残った場合も、


    ドライバーで簡単に取り外しができる。

    Amazonでは、SUNWAYFOTO TN-2 UNC 3/8 1/4 ネジ径変換アダプター 5個セット TN-2 として売られている。

    どっちも3/8で揃えたい気はするが。