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