天気の悪い日が続くと、いろんなものが生えてきます。
ヒートシンクつけたのでわかりずらいですが、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をインストールします。
なんかひと手間掛けないとMATEがインストールできないようなので、コンソールログイン後にデスクトップ環境のUbuntu MATEをインストールします。
$sudo apt update
$sudo apt upgrade
$sudo apt install ubuntu-mate-desktop
$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
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カード上のシステムをコピーします。
これで、ファイルの時刻やパーミッションなどそのままコピーが完了しました。次のコマンドでデバイスファイルをコピーします。
さてここまではいいのですが、このままでは時刻を都度設定しなければなりません。どうしたものかと悩んでいたところ、このブログにヒントがありました。(リンク失礼します)
この間の撮影では撮影データのダウンロードが途中で止まる現象が出ていましたが、結局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 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から起動できました。cd /mnt
tar xvf /a.tar
さてここまではいいのですが、このままでは時刻を都度設定しなければなりません。どうしたものかと悩んでいたところ、このブログにヒントがありました。(リンク失礼します)
この記事の中で、ブラウザ経由で時刻合わせがもう少しでできそうと書かれていました。ソフト屋さんの端くれとしてはチャレンジするしかないということで、いろいろ調べて何とか出来ました。(いろんなサイトのコードを切り貼りしてます)
とりあえず、Apache2とPHPをインストールします。
$apt install apache2 php
SSLを有効にします。
$ sudo a2enmod ssl
$ sudo a2ensite default-ssl
$ sudo service apache2 restart
$ sudo a2ensite default-ssl
$ sudo service apache2 restart
$ 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
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
$sudo visudo
www-data ALL=(ALL) NOPASSWD: ALL ← この行を追加する
www-data ALL=(ALL) NOPASSWD: ALL ← この行を追加する
HTMLファイルのヘッダーにJavascriptで次のコードを記載します。そして、ボタンが押されたら「GetPos」関数が呼び出されるようにします。(今回はこれをgetdate.htmlとしています)
<!DOCTYPE html>
<head> <script>
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>
<pre id="position_view"></pre>
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
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);
?>
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情報がとれるので何とかなりそうでしたが、もう少し時間がかかりそうです。
今晩はどうも晴れているようですが、明日お仕事なんで我慢我慢…
3 コメント
taka_umeさん
返信削除こんばんはT-Studioです。
コメントありがとうございました。
プログラム素晴らしいですね。(もう少し早くコメントしていただいていた事に気づけば。。(苦笑)
私の方は単純にJavaスクリプトで時刻取得してxmlファイルをPHPに渡すことでなんとか動作しました。
プログラムが出来ると世界がひろがりますね。(私は全くの専門外です。)
今後共よろしくおねがいします。
T-Studioさん
削除taka_umeです。こんばんは。
こちらにもコメント頂きありがとうございます。
コメントした後、間に合わなかったかぁと思いましたが、最終的にお役に立てて安堵しました。
web系のソフトは専門ないですが、ググって切った貼ったでなんとか動くものが出来ました。それが他の方のお役にたったのは嬉しい限りです。
こちらこそ、今後もよろしくお願いします。
こちらこそよろしくおねがいします。
削除iGPSですが、私のブログのコメントにも記載しましたが、スクリプト起動するとなんとユーザー環境にバーチャルサーバのルートディレクトリができます。(Astroberryの場合は/home/astroberry)
私は扱いやすいようにプログラムのGPSのポート番号を1000番代に変更してSSLでリダイレクトしました。その後GPSDのサービスを切ってしまうと繋がりました。(GPSDのsockが干渉するようです。)
taka_umeさんはプログラム書けるのでディレクトリ変更したりなど使いやすいように変更できると思いますよ。