HOMEGR Angle Reader
開発

●引き継ぎ状況

Raspberry Piが立ち上がらなくなった。
どうもmicroSDの読み込み速度が著しく低下している模様
一部の内蔵データは救出できた。

●開発の方向性

OSが立ち上がらないので、新しいmicroSDを用意して、OSのインストールからやりなおす。
OSが立ち上がっていた頃も、そもそも正常動作していなかったので、プログラムも自分で作成。
救出データは使えそうなものがあれば流用する。

●作業メモ

◆◆◆H30. 1.18の作業◆◆◆

今日の参考サイト→ラズパイを買ったらそのあとは…

新しいmicroSDを用意、TOSHIBA HC 16GB (バックアップ用に同じのをもう1つ貰っている)
windowsのPCからOSをzip形式でダウンロード。
NOOBS 2.4.5を使用。
展開したファイル群をそのままmicroSDにコピー。
microSDを安全に取り外して、Raspberry Piに装着。
モニター、キーボード、マウスをつないで電源を挿す。(自動的に立ち上がる)
Raspberry PiにOSがインストールされ始める。OS選択はRaspbian。言語設定は日本語にした。
経験的に、OSインストール中はマウスを外しといたほうがいい。(電力不足で停止することがある)

OSインストール完了。
Raspberry Piは初期設定ではsshできないので出来る設定にしておく。
2016-11-25以降版は/boot/にsshという空フォルダを作成して再起動すると有効化するらしい。(参考→Raspberry Pi 3を初回起動してからSSH接続まで)
LANケーブルをつないでみる→汎用ネットで使えず。
実験ネットで登録されている機器は、実験ネットからしか接続できないらしい→2F管理区域でつなぐ。
sshを試みると警告が出て、ssh出来ない。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the RSA host key has just been changed. The fingerprint for the RSA key sent by the remote host is :
この警告はRSA公開鍵のフィンガープリントが一致しない時に出るらしい(参考→SSH接続エラー回避方法…)
ちなみに実験ネットはセキュリティ設定が堅いのでこの参考サイトの回避方法では回避できない。
ということで、フィンガープリントの情報が格納されている/etc/ssh/内のファイルを変更する。


◆◆◆H30. 1.19の作業◆◆◆

救出データにあった/etc/ssh/内のファイル群をコピーして、置き換える。OSインストール時に自動作成された/etc/ssh/内のファイル群は念のため/tmp/に保存しとく。
そして、再度実験ネットにつないで、sshしてみると、
Read from socket failed: Connection reset by peer
となり、また無理だった。
原因は/etc/ssh/内のファイル群のパーミッション設定らしい(参考→Read from socket failed: …パーミッションを変えてしまって ssh でログインできなくなった時…)
各ディレクトリ、ファイルはこのように設定する。
# chmod 755 /etc/ssh # chmod 644 /etc/ssh/*_key.pub # chmod 600 /etc/ssh/*_key
ここまでやると、ssh出来るようになった。
OSインストール時初期設定
username : pi
パスワード'' : raspberry

バックアップを作成する。
Main microSDをLinuxPCに挿して、PCが認識しているデバイスを表示する。
# fdisk -l
ddコマンドでgz圧縮したバックアップファイルを作成、PC内に保存。そのあと、Sub microSDをつないでバックアップを展開。やり方はここ→ ddの進捗を確認 - Qiita

バックアップを取り終わったらSubの方を装填して、西実験室に持っていき所定の位置に設置。
sshすると普通につながった。バックアップ作成はうまくいったようだ。

Raspberry Piにwebサーバ機能を持たせるためApacheをインストールする(参考→Raspberry Piで自宅ウェブサーバ構築 - Qiita)
$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get install apache2
をやればできるのだが、何故か外部ネットワークにつながらず、インストール出来ない。
そこで、microSDを自室に持ち帰り、自分のRaspberry Pi (汎用ネットで登録している)に装填して起動。
sshでアクセスすると、またしても公開鍵がどうこうという警告が出る。
でも、これはmihoからではなく普通のLinuxPCからアクセスすれば、
$ ssh -o 'StrictHostKeyChecking no' pi@hostname
で、無視して入れる。そして、ApacheをインストールしてそのmicroSDを再び実験室のRaspberry Piに挿す。
ブラウザからhttp://okamoto/を見てみる。It works! が表示されたら成功。
/var/www/html/index.htmlが自動的に作られている。

パスワードを変更する
$ passwd $ sudo passwd
で、ユーザパスワードとルートパスワードを設定できる。

新パスワード;
pi *******1
root ******1

◆◆◆H30. 1.20の作業◆◆◆

まず、時計設定を日本時間に変更
$ sudo timedatectl set-timezone Asia/Tokyo
現在時刻表示は
$ date
で出来る。
松田さんが所有していたバックアップにバーコードリーダ(OLM100)の業者の人(?)が作成したと思われるプログラム( get232c.c config.h sio.c )を発見。
移植してみるが、コンパイルエラーを吐くので、エラー原因部分を削除してやると一応コンパイルは成功。
/home/pi/hattoriで
$ ./a.out /dev/ttyUSB0
と、してやると、(/dev/ttyUSB0はOLMに接続するデバイスファイル)
Priase order. 1:Start of measurement. 2:Light on. 3:light off. 4:resolving power = 0.1mm. 5:resolving power = 1mm. 6:internal temperature.
と出る。1を選択すると
Segmentation fault
となり、データは読めない。
2, 3を実行すると、実際にOLMのライトが点灯/消灯した。Raspberry Pi⇔OLMの通信自体は出来ているらしい。
4, 5 は反応がないのでよくわからん。
6はデータを送ってくるが、これも正しいか不明。

◆◆◆H30. 1.22の作業◆◆◆

明日からしばらく西に入れないらしいので、またバックアップを取っておく。コマンドは、
$ sudo dd if=/dev/sdg | gzip -c > grarrbpbu_dd_18-1-22.gz $ sudo gzip -dc < grarrbpbu_dd_18-1-22.gz | sudo dd of=/dev/sdg
でやる。

get232c.c config.h sio.c の解読作業

◆◆◆H30. 1.23の作業◆◆◆

get232c.c config.h sio.c の解読した結果、大体の構造を理解。
(「低水準入出力関数」というのを使っているらしい)
簡単な自作プログラムを作り、動作することを確認。
→位置情報の取得可能に

今後の開発方針
・OLMとの通信テスト用の簡易プログラム
・実行時に位置情報を10回測定し、平均値、標準偏差を表示するプログラム
・毎分実行され、10回測定値の平均値、標準偏差を測定時刻とともにデータファイルに書き込んでいくプログラム

さらにその先
・雷電の実際の角度との較正
・ブラウザからプログラム操作できるcgiの作成(できれば)

確認すべきこと
・データの保存場所oasis?
・大雷電を動かす予定日

◆◆◆H30. 1.24の作業◆◆◆

基本的なプログラムは完成。
・OLMとの通信テスト用の簡易プログラム
 →olmio : ( OLM Input / Output )
・実行時に位置情報を10回測定し、平均値、標準偏差を表示するプログラム
 →olmrr : ( OLM Rawdata Reader )
・毎分実行され、10回測定値の平均値、標準偏差を測定時刻とともにデータファイルに書き込んでいくプログラム
 →olmar : ( OLM Auto Reader )
何れもc++で作成。(コンパイル前のファイル名は「<実行ファイル名>.cpp」)

コンパイルコマンドの例
$ g++ -o olmar olmar.cpp

crontabで自動実行の設定→参考サイト:cronの設定方法 - Qiita
$ crontab -l no crontab for pi $ crontab cron.conf $ crontab -l */1 * * * * /home/pi/GRAR/olmar $ crontab -r $ crontab -l no crontab for pi
cron.conf というファイルは~/に作成している。中身は「 */1 * * * * /home/pi/GRAR/olmar 」という1行だけ記述。

時計設定→参考サイト:Linuxコマンド集 - 【 date 】 日付や時刻を表示,設定する:ITpro
$ date 2018年 1月 24日 水曜日 14:06:05 JST $ sudo date -s "01/24 16:07 2018" 2018年 1月 24日 水曜日 16:07:00 JST $ date 2018年 1月 24日 水曜日 16:07:12 JST

◆◆◆H30. 1.25の作業◆◆◆

ブラウザから見れるリアルタイムモニタをつくる

仕組みとしては、毎秒実行されるjavascriptでcgiプログラムを読み出し、実行し、返り値をjavascriptで配列に格納して表示する。

まずはcgiの有効化。→参考サイト:Ubuntu ServerでCGIプログラムを動作させる -…
$ sudo a2enmod cgid $ sudo service apache2 restart
cgiファイルの設置場所はapacheのバージョンとかLinux ディストリビューションによって違うらしい。確認すると、
$ apachectl -v Server version: Apache/2.4.25 (Raspbian) Server built: 2017-09-19T18:58:57
ということで、Raspbian用のapacheが入っていることがわかる。調べると、cgi設置ディレクトリは /usr/lib/cgi-bin/ らしい。

次にcgiファイルを作る。cgiはcやc++のようなコンパイルしてできた実行ファイルなら記述言語はなんでもOKらしい。
ファイル作成のルールとしては、出力結果で1行目がcgi形式の宣言、2行目が空白行になるようにすることと、拡張子を.cgiにしておくこと、これだけで良い。
cgi形式一覧はここ、c言語でcgiを作った見本はここにある。
今回はcgiでHTMLページを作る必要はないのでtext/plain形式にする。但し、この書き方をするとMicrosoft Internet Explorerではうまく表示できないみたいですが。

次に、javascriptでtext/plain形式のcgiファイルからデータを読み出して配列に格納するHTMLファイルを作る。
参考サイトはこれ→JavaScriptでCSVファイルを読み込む方法 | UX MILK
このサイトではcsvファイルになっているがtxtファイルでも同じように出来る。そして、text/plain形式のcgiファイルは、読み込まれるとファイルが実行され、その実行結果出力を記載したtxtファイルとして振る舞う。即ちこのやり方でうまくいく。(テストしてみましたが出来ました)
そして、cgiファイル読み込み関数をjavascriptのsetInterval()で一定時間間隔で実行すれば、指定した時間間隔でデータの読み込みが行われ表示値が更新されていく。参考サイト→一定時間で繰り返す(setInterval)−JavaScript入門
これでリアルタイムモニタの完成。

ここで注意が必要なのが、cgiが読み込むデバイスファイル/dev/ttyUSB0のパーミッション設定を
$ sudo chmod 666 /dev/ttyUSB0 $ ls /dev/ttyUSB0 -l crw-rw-rw- 1 root dialout 188, 0 1月 25 15:12 /dev/ttyUSB0
にしておかないといけない模様。660だとファイルのオープンに失敗する。

◆◆◆H30. 1.26の作業◆◆◆

リアルタイムモニタ作成つづき

読み込みcgi, rtolm.cgiの作成の完了。
それを表示するrtmonitor.htmlの作成完了。(場所:~/GRAR/webcontroller/)
シンボリックリンクを張る。
$ cd /var/www/html/ $ ls GRdata index.html $ sudo ln -s /home/pi/GRAR/webcontroller/ controller $ ls GRdata controller index.html

◆◆◆H30. 2. 2の作業◆◆◆

OLMが値を読めなくなったことを確認。どうもこの時大雷電を動かしたらしい。
grar_20180202.txtの記録の一部
5:20:01 1307784 2.36643 5:30:01 1307786 2.06559 5:40:02 1307779 2.64365 5:50:01 1307779 2.13177 6:00:01 1307786 1.64655 6:10:01 1307788 2.4404 6:20:01 1307800 2.78887 6:30:01 0 0 6:40:01 0 0 6:50:02 0 0 7:00:01 0 0 7:10:01 0 0
実験中で西に入れないので、今日はこのまま終了。

◆◆◆H30. 2. 4の作業◆◆◆

okamotoと通信できないことを確認。電源が切れている?
→後日確認。

◆◆◆H30. 2. 7の作業◆◆◆

西に入れたので、現地で状況確認。
まず、Rasberry Piはケーブル抜け落ちではなかった。
電源が落ちた理由;
1. cpuに過負荷等で電力不足(有力)
2. 誰かがsudo haltした(考えられにくいが)

次にOLMとの通信確認。
リアルタイムモニタでデータを読み込んでみるが反応なし。
olmioで通信確認してみると、デバイスファイルのオープンには成功するが応答コマンドが返ってこない。

返り値が0だった理由;


2/2の時点から返り値が0になっていたが、写真を見ると、OLMが照らしている位置が上に寄り過ぎではないか、という可能性がある。

電源喪失直前の記録 (grar_20180203.txt の一部)
5:50:01 0 0 6:00:01 0 0 6:10:01 0 0 6:20:01 0 0 6:30:02 0 0 6:40:01 0 0 6:50:01 0 0 7:00:01 0 0 6:36:49 0 0 6:36:49 0 0
2/3の7時過ぎに異常が起こったようである。ちなみに、現段階では時計設定のずれを自力で補正する機能はないので6:36:49という時刻は正確ではない

/dev/ttyUSB0のパーミッション設定を起動時に自動実行
再起動すると、/dev/ttyUSB0のパーミッション設定がリセットされる。
これを起動すると自動的に666に設定するには/etc/rc.localを編集する。参考→ラズベリーパイ:起動時に自動実行したい | 人生は読めないブログ
ここに
sudo chmod 666 /dev/ttyUSB0
と書き加えた。(多分sudoはいらなかったと思う)

まとめ
Raspberry Piの要求にOLMが一切反応しません。

これからどうするか?
・OLMに接続するケーブルを確認
・しばらく電源を切って再起動してみる
 ↓
19:40頃
何故か直りました。
緑のLEDが2つついていたのでエラーコードF6「通信インタフェースの問題」と思い、いろいろ調べていろいろ試していましたが、get2 (get232の簡略改造版)を実行したら、何故か応答が返ってきました。
もしかしてget2には不具合を補正する機能が入っているかも?−−要検証。


◆◆◆H30. 2. 8の作業◆◆◆

位置の修正
読み取り装置全体を下方へ設置し直した。
読み取り値が0になっていた箇所で読めるようになった。

NTPの設定
RCNPのNTPサーバを指定する。
$ sudo apt-get update $ sudo apt-get -y install ntp $ sudo apt-get -y install ntpdate
これで、/etc/default/ntpdateと/etc/ntp.confが現れるので、それの編集をしておく。
今のところ、再起動時に時刻の適切な自動補正が行われているかは不明。
時刻補正をコマンドで行うには、
$ sudo ntpdate -b ntp1.rcnp.osaka-u.ac.jp

◆◆◆H30. 2. 9の作業◆◆◆

キャリブレーション(仮)
1/31のデータを使う。

針で読んだ角度:27.7°
その時の測定値:13078mm

針の下にあったバーコードの数値:13350mm
針下数値-測定値:272mm……(*)

0°のところにあるバーコード数値:18990mm
(*)より予想される0°での読み取り値:18718mm
Excelでプロットするとこんな感じ。
よって、暫定キャリブレーション関数
<読み取り値(mm)>*(-0.00491135)+91.931


◆◆◆H30. 2.13の作業◆◆◆

rtmonitor.htmlを編集。キャリブレーション関数を使用して、リアルタイムで角度が表示できるようにした。


◆◆◆H30. 2.14の作業◆◆◆

.htaccessを有効化する。(参考:Raspberry Pi でLAMP環境を構築する - Qiita)
$ sudo vi /etc/apache2/apache2.conf
 : <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride All ←ここをNoneからAllに変える Require all granted </Directory>  :
$ sudo service apache2 restart

◆◆◆H30. 2.27の作業◆◆◆

較正用情報
39.85[deg] : 10611.1[mm]


◆◆◆H30. 3.28の作業◆◆◆

3/24に全館停電があり、ラズパイ、OLMともに電源喪失した。
電源回復後に自動復帰したが、ラズパイ⇔OLMの通信が出来なくなっていた。
いつものようにget2でライトのon, offのコマンドを送り続けると復帰した。
時計の自動調整は機能しているようで、確認すると正確な時刻になっていた。
読み取り分解能設定1mmにすると角度変換が機能しないので注意。

◆◆◆H30. 4. 4の作業◆◆◆

坂口さんの協力により、実施されたキャリブレーション用データ。
詳細は後日追記する。

角度[deg]読み[mm]
26.513319.7
2713217.1
2813013.4
2912810.4
3012607.5
3112403.5
3212200.2
3311996.7
3411793.4
3511589.4
3611386.1
3711182.5
3810978
3910775.6
4010571.4
4110368.6
4210164.8
439961.9
449757.7
459553.7
469350.3
479147.5
488943.4
498740.4
508536.2
518332.8
528129.7
537926.3
547722.2
557518.7

◆◆◆H30. 4.20の作業◆◆◆

関数の設定
先日測定したキャリブレーション用データを基に変換関数の作成
35°のところに目盛盤レールに段差があるのでこの前後で別の関数を定義する。
1次関数フィッティング結果
root [17] gr5->Fit("pol1","","",7500,11670); **************************************** Minimizer is Linear Chi2 = 6.35032e-005 NDf = 19 p0 = 91.9429 +/- 0.00311838 p1 = -0.00491335 +/- 3.23708e-007 root [18] gr5->Fit("pol1","","",11670,13320); **************************************** Minimizer is Linear Chi2 = 2.31728e-005 NDf = 7 p0 = 91.9701 +/- 0.015036 p1 = -0.0049155 +/- 1.19276e-006

◆◆◆H30. 5.25の作業◆◆◆

実験系サーバーへの自動書き込み機能の実装を目指す

sshを自動化するにはsshpassというのが便利らしい。
sudo apt-get install sshpass
これをsabのmicroSDにインストールした。
参考web→ ターミナルからパスワード入力無しでssh接続するsshpassを使ってパスワード指定のSSH接続を行ってみる

c++からlinuxコマンドを実行するにはsystem関数をつかう
参考web→system、_wsystem(C++)


◆◆◆H30. 5.28の作業◆◆◆

自分のPC内の(~/HTMLpub/GR-AngleReader/stdata/)に測定データのバックアップを取る。
scp pi@okamoto:/var/www/html/GRdata/grar_2018\* ~/HTMLpub/GR-AngleReader/stdata/
grar_2018\*と指定することで2018年の測定データを一括でコピーできる。

そしてmsdを差し替えて再起動。例によってolmと通信できなくなるので、
./get2 /dev/ttyUSB0
で復帰。

実験系サーバーには本当はソケット通信とかでSQLとかでデータを書き込むのがよかったが、 今のところやり方がよくわからないので、 実験系サーバー上でデータを読み書きするコマンド(セキュリティの都合上ここには書きません)を暫定的に使うことにした。
先日インストールしたsshpassを使って
sshpass -p **PASSWORD** ssh user@server コマンド > /dev/null
でokamotoから書き込める。ちなみに > /dev/null 部分は実行結果をコンソールに出力しないための処理である。
これを使ってolmarからsystem関数で書き込みコマンドを実行して実験系サーバーにデータを書き込む機能を追加した。
このためにolmarにも読み取り値を角度に変換する機能を追加した。

ついでに、ラズパイが再起動したときにolmと通信できなくなる症状対策をした。
具体的に問題となるのは、olmarが実行途中で一時停止してしまい、終了しないことである。
つまり、olmと通信できない状態の時にcrontabでのolmar自動実行プロセスが終了されずにどんどん増えていくということである。

これを回避するために実行途中のolmarが存在する時に、次のolmar実行プロセスではデータ取得を行わずに終了するように変更した。

今日更新したolmar→olmar.cpp




戻る