機材更新!

By taka_ume - 3月 08, 2020

天気の悪い日が続くと、いろんなものが生えてきます。


ヒートシンクつけたのでわかりずらいですが、Raspberry Pi4です。M1Sもよかったのですが、やはりUSBポート数が多いに越したことはありません。

早速、Ubuntu MATEをインストール。(下記、細かい内容は省いています。すみません)
まずは、Ubuntu Serverをダウンロード(64bit版RaspberryPi4用 )

ダウンロード先:Install Ubuntu Server on a Raspberry Pi 2, 3 or 4

ダウンロードしたイメージをmicroSDカードへ書き込み、PR4を起動します。
なんかひと手間掛けないとMATEがインストールできないようなので、コンソールログイン後にデスクトップ環境のUbuntu MATEをインストールします。

$sudo apt update
$sudo apt upgrade
$sudo apt install ubuntu-mate-desktop

ログインマネージャーは「lightdm」を選択します。これで、自動ログインも可能になります。さらに、リモート制御ができるように「nomachine」を入れておきます。nomachine_6.9.2_1_arm64.debをダウンロードしてインストールします。


BluetoothでAdvanced VXのコントローラと接続するようにしているのですが、GUIではうまくいかなかったので、コマンドライン制御ができるように関連パッケージをインストールします。

sudo apt-get install -y bluetooth
sudo apt-get install -y pi-bluetooth

Kstarsなどのインストールは過去記事の通りです。


ただ、後で気づいたのですがplate solveのデータはKStarsからもインストールできるようなので、今回はそうしてみます。とりあえず、EKOSの設定をCCD・架台ともにシミュレータを設定してINDIサーバーをスタートします。


的のマークを選択して、「options」をクリックします。


Index Filesをクリックし、ロケーションをHomeフォルダーのほうを選択します。そうするとそれぞれのカタログをクリックすることができるようになります。必要なファイルをクリックしてダウンロードしておきます。2MASSは8.0まですべて、Tycho2は全部入れておきました。

この間の撮影では撮影データのダウンロードが途中で止まる現象が出ていましたが、結局CCDカメラの電源容量不足が原因でした。セルフパワータイプのHUBを間に挟むことで止まることなくスケジュールは完了し、さらにデータダウンロード時間が1秒未満となかなかいい感じになりました。

というわけで、接続は次のようになりました。



【3/9追記 すっかり忘れてました…】
さらにSSDにシステムを移行して、USB起動させます。手持ちのSSDは/dev/sda4に新しいパーティションを作りました。ここにSDカード上のシステムをコピーします。

sudo mount /dev/sda4 /mnt
sudo chown ubuntu:ubuntu /mnt
sudo -s
cd /
find . -xdev | cpio -pvdm /mnt

これで、ファイルの時刻やパーミッションなどそのままコピーが完了しました。次のコマンドでデバイスファイルをコピーします。

sudo tar cf a.tar dev
cd /mnt
tar xvf /a.tar

そのあと、「/boot/firmwer/nobtcmd.txt」ファイルの「root=」のところを「root=/dev/sda4」と書き換えます。さらに/mnt/etc/fstabもルートファイルのマウントを「/dev/sda4」に書き換えます。これでリブートすると無事にSSDから起動できました。

さてここまではいいのですが、このままでは時刻を都度設定しなければなりません。どうしたものかと悩んでいたところ、このブログにヒントがありました。(リンク失礼します)


この記事の中で、ブラウザ経由で時刻合わせがもう少しでできそうと書かれていました。ソフト屋さんの端くれとしてはチャレンジするしかないということで、いろいろ調べて何とか出来ました。(いろんなサイトのコードを切り貼りしてます)

とりあえず、Apache2とPHPをインストールします。

$apt install apache2 php

SSLを有効にします。

$ sudo a2enmod ssl
$ sudo a2ensite default-ssl
$ sudo service apache2 restart

nmapで通信ポートの確認をします。(ポート番号443があればOK)

$ nmap localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2020-03-07 17:33 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00048s latency).
Not shown: 993 closed ports
PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
443/tcp   open  https
631/tcp   open  ipp
4000/tcp  open  remoteanything
7001/tcp  open  afs3-callback
20000/tcp open  dnp

Nmap done: 1 IP address (1 host up) scanned in 0.20 seconds

PHPからコマンドが実行できるように、sudoをパスワード無しで実行できるようにします。グローバルなネットには接続しないので、やむを得ずです。

$sudo visudo
www-data ALL=(ALL) NOPASSWD: ALL ← この行を追加する

HTMLファイルのヘッダーにJavascriptで次のコードを記載します。そして、ボタンが押されたら「GetPos」関数が呼び出されるようにします。(今回はこれをgetdate.htmlとしています)

<!DOCTYPE html> <head>     <script>
    function GetPos() {
        // Geolocation APIに対応している
        if( navigator.geolocation )
        {
        // 現在位置を取得できる場合の処理
        //alert( "あなたの端末では、現在位置を取得することができます。" ) ;
        navigator.geolocation.getCurrentPosition(GetPositionProc,errorFunc);
        }

        // Geolocation APIに対応していない
        else
        {
        // 現在位置を取得できない場合の処理
        alert( "あなたの端末では、現在位置を取得できません。" ) ;
        }     
    }
    // 失敗した時の関数
    function errorFunc( error )
    {
    // エラーコードのメッセージを定義
    var errorMessage = {
    0: "原因不明のエラーが発生しました…。" ,
    1: "位置情報の取得が許可されませんでした…。" ,
    2: "電波状況などで位置情報が取得できませんでした…。" ,
    3: "位置情報の取得に時間がかかり過ぎてタイムアウトしました…。" ,
    } ;

    // エラーコードに合わせたエラー内容をアラート表示
    alert( errorMessage[error.code] ) ;
    }
 
    function GetPositionProc(position) {
 
        var geo_text = "緯度:" + position.coords.latitude + "\n";
        geo_text += "経度:" + position.coords.longitude + "\n";
        geo_text += "高度:" + position.coords.altitude + "\n";
        geo_text += "位置精度:" + position.coords.accuracy + "\n";
        geo_text += "高度精度:" + position.coords.altitudeAccuracy  + "\n";
        geo_text += "移動方向:" + position.coords.heading + "\n";
        geo_text += "速度:" + position.coords.speed + "\n";

        var date = new Date(position.timestamp);

        geo_text += "取得時刻:" + date.toLocaleString() + "\n";

        document.getElementById('position_view').innerHTML = geo_text;
     
        var val1 = "date=" + date.toLocaleString();
        val1 += "&latitude=" + position.coords.latitude;
        val1 += "&longitude=" + position.coords.longitude;
        senddata(val1);
    }
 
    function senddata(dat){
        //
        var url = "./getdate.php";
var xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
xhr.send(dat);
        xhr.onreadystatechange = function(){
if(this.readyState === 4){
var list = document.getElementById("list");
list.innerHTML += "<div>"+this.responseText+"</div>";
document.forms.form1.test.value = "";
}
};
    }
    </script>
</head>
<body>
<button onclick="GetPos()">時刻・位置 取得</button>
<pre id="position_view"></pre>
</body>
</html>


次に、データを受け取るPHPスクリプトです。(これは、getdate.phpとしています)

<?php
    header("Content-type: text/plain; charset=UTF-8");
    $date_x= $_REQUEST['date'];
    $latitude_x = $_REQUEST['latitude'];
    $longitude_x = $_REQUEST['longitude'];
 
    $command = 'sudo /bin/date -s "'.$date_x.'"';
    exec($command);
?>

これらを、httpsでアクセスできる場所に入れて、スマホのブラウザからgetdate.htmlをアクセスします。ボタンを押すとスマホの時刻でRP4の時刻が設定されます。うまくいったので、RTCはつけなくてよさそうです。GPSはどうしようかな~。iGPSというのもあって、こちらはスマホのGPS情報をRP4に渡して、内部はgpsdをだまくらかすものらしいのですが、上手く動かず。FireFox Ver49はhttpアクセスでGPS情報がとれるので何とかなりそうでしたが、もう少し時間がかかりそうです。

今晩はどうも晴れているようですが、明日お仕事なんで我慢我慢…

  • Share:

You Might Also Like

3 コメント

  1. taka_umeさん

    こんばんはT-Studioです。
    コメントありがとうございました。
    プログラム素晴らしいですね。(もう少し早くコメントしていただいていた事に気づけば。。(苦笑)
    私の方は単純にJavaスクリプトで時刻取得してxmlファイルをPHPに渡すことでなんとか動作しました。
    プログラムが出来ると世界がひろがりますね。(私は全くの専門外です。)
    今後共よろしくおねがいします。

    返信削除
    返信
    1. T-Studioさん

      taka_umeです。こんばんは。
      こちらにもコメント頂きありがとうございます。
      コメントした後、間に合わなかったかぁと思いましたが、最終的にお役に立てて安堵しました。
      web系のソフトは専門ないですが、ググって切った貼ったでなんとか動くものが出来ました。それが他の方のお役にたったのは嬉しい限りです。
      こちらこそ、今後もよろしくお願いします。

      削除
    2. こちらこそよろしくおねがいします。
      iGPSですが、私のブログのコメントにも記載しましたが、スクリプト起動するとなんとユーザー環境にバーチャルサーバのルートディレクトリができます。(Astroberryの場合は/home/astroberry)
      私は扱いやすいようにプログラムのGPSのポート番号を1000番代に変更してSSLでリダイレクトしました。その後GPSDのサービスを切ってしまうと繋がりました。(GPSDのsockが干渉するようです。)
      taka_umeさんはプログラム書けるのでディレクトリ変更したりなど使いやすいように変更できると思いますよ。

      削除