IchigoJam Advent Calendar 2020 - Day 4

ふうせん🎈 FU-SEN です。

風船好きでありますが 🎈😍
実は宇宙好きでもあります。🌏🚀🤩

国際宇宙ステーション(2020/11、ドラゴン宇宙船より)

(NASA Live からの画像。 Media Usage Guidelines | NASA

いつもは何かと NASA Live を見ている事があります。NASA TV とも言われます。

 NASA Live | NASA
 NASA | YouTube

スペースシャトルが飛んでいた事は期間中ずっと聞きっぱなしで仕事をしていた位ですが、
しばらくはソユーズ宇宙船のみで行き来するようになり、
国際宇宙ステーションも通常は 3 人体制になっていたので、
宇宙の出来事を気にしている人も少なくなっていたように思えます。

クルードラゴン コックピット

(NASA Live からの画像。 Media Usage Guidelines | NASA

そんな中の新展開! アメリカの SpaceX によるドラゴン宇宙船(クルードラゴン)によって
2020年11月より野口宇宙飛行士が国際宇宙ステーションの長期滞在に行ってます。
正式にドラゴンで NASA 以外のクルーが乗船したのは野口さんが初になりました。
野口さんの後には星出さんが来年ドラゴンで行く事が決まっていて、
更に若田さんが 2022 年、古川さんが 2023 年に行く事予定である事まで決まっています。
これからしばらく JAXA 宇宙飛行士が国際宇宙ステーションに居る状態がしばらく続くのですね。

ディスプレイを並べて……

スペースシャトルが飛んでいる間も NASA TV を見るのが当たり前だった自分は、
ドラゴン宇宙船の打ち上げより NASA Live を見ながら作業ができるように、
最近新たに液晶ディスプレイを新調しまして、管制官のようにディスプレイを並べて、
NASA Live や国際宇宙ステーションの現在位置をマップで確認したりして、
過ごしているわけです。😄💻.o( 🌏🚀 )
液晶ディスプレイも安くなりました。ワイド画面でも中古で 1 万円しないで入手できます。

IchigoDyhook+IchigoJam

……となると、もう 1 台のパソコン、IchigoJam にも何だかの情報を出しておきたい!
(画像は 2019 年末に発売開始された IchigoDyhook)
当初はソユーズのようないろんな値を出しておこうかと思ったのですが、
そのデータを転送するのに時間を要してしまいます。
そこで、 国際宇宙ステーションの現在位置を IchigoJam で表示できないか? と考えました。


国際宇宙ステーションの緯度・経度を得る

まずは国際宇宙ステーションの緯度・経度を得る必要がありますね。
探してみたところ、JSON 形式で提供しているのを発見。

 Open Notify – API Doc | ISS Current Location

{"timestamp": 1606293740, "message": "success", "iss_position": {"longitude": "138.3451", "latitude": "48.2980"}}

longtime が経度(-が西経、+が東経)、
lalitude が緯度(-が南緯、+が北緯)です。
これを変換すれば良いですね。


サーバで IchigoJam BASIC+MixJuice の形式に変換

IchigoJam BASIC では ?"MJ GETS ~ を送信後、
INPUT で座標を得るようにすれば良いです。
IchigoJam では小数を含む計算になると難しくなってくるので、
それはサーバで処理して、IchigoJam 側での座標にしてしまう事にします。
これで転送情報はエラーの有無、横座標、縦座標の数値のみ。これなら早そうですね。

<?php

$jsonapi = "http://api.open-notify.org/iss-now.json";

$json = file_get_contents($jsonapi); 

$array = json_decode ( $json, true);

if ( $array['message'] != "success" )
{
   $error = 1;
}
else
{
   $error = 0;

   $time =  $array['timestamp'];
   $latitude = intval( ( $array['iss_position']['latitude'] * -1 + 90 ) / 180 * 16 ) + 4;
   $longitude = intval( ( $array['iss_position']['longitude'] + 180 ) / 360 * 32 );
}

header('Content-Type: text/plain');

print "{$error}\n";
print "{$longitude}\n";
print "{$latitude}\n";

🎈 サーバへ置いた iss.php ファイル

header は Content-Type でテキストにしているだけで、なくても問題ありません。
本当に必要なのは最後で行っている print です。

ここでは イチゴジャム レシピ 関連の MixJuice コンテンツ で使用している
さくらのレンタルサーバ を使う考慮で PHP で処理していますが、
JSON を変換して計算して出力しているだけなので、
Go、node.js、Python、Ruby など他のプログラミング言語でも容易に実現できるでしょう。

注意してほしいのが、JSON の緯度は南が-、北が+になっています。
北を画面の上、南を画面の下にしたいので、* -1 として反転しています。


世界地図

一方、IchigoJam では地図を表示させる事になります。
計算しやすいよう、緯度・経度の座標を考慮した世界地図にしました。

POKE #E00,#80,#80,#80,#80,#80,#80,#80,#80
POKE #E08,#8C,#80,#80,#8C,#8C,#80,#80,#80
POKE #E10,#80,#80,#80,#80,#80,#80,#80,#80
POKE #E18,#80,#80,#80,#80,#80,#80,#80,#80
POKE #E20,#80,#88,#80,#80,#8C,#8C,#88,#8B
POKE #E28,#8D,#83,#8B,#8F,#8F,#81,#80,#80
POKE #E30,#80,#80,#80,#80,#80,#8C,#8C,#8E
POKE #E38,#8F,#8C,#8C,#8C,#84,#80,#80,#80
POKE #E40,#80,#8F,#83,#8F,#8F,#8F,#8F,#83
POKE #E48,#88,#81,#82,#83,#80,#82,#80,#88
POKE #E50,#87,#8F,#8F,#8F,#8F,#8F,#8F,#8F
POKE #E58,#8F,#8F,#8F,#8F,#87,#87,#83,#81
POKE #E60,#80,#80,#80,#80,#8B,#8F,#8F,#8F
POKE #E68,#8E,#87,#84,#80,#80,#80,#82,#8C
POKE #E70,#8F,#8F,#8F,#8F,#8F,#8F,#8F,#8F
POKE #E78,#8F,#8F,#8F,#85,#80,#81,#80,#80
POKE #E80,#80,#80,#80,#80,#8A,#8F,#8F,#8F
POKE #E88,#87,#80,#80,#80,#80,#80,#8A,#89
POKE #E90,#82,#81,#8E,#8D,#8F,#8F,#8F,#8F
POKE #E98,#8F,#87,#81,#84,#80,#80,#80,#80
POKE #EA0,#80,#80,#80,#80,#80,#8B,#87,#83
POKE #EA8,#80,#80,#80,#80,#80,#80,#8E,#8F
POKE #EB0,#8D,#8D,#8F,#87,#87,#8F,#8F,#8F
POKE #EB8,#8F,#87,#82,#80,#80,#80,#80,#80
POKE #EC0,#80,#80,#80,#80,#80,#80,#83,#8D
POKE #EC8,#80,#80,#80,#80,#80,#88,#8F,#8F
POKE #ED0,#8F,#8F,#8D,#87,#81,#8A,#85,#82
POKE #ED8,#8D,#80,#80,#80,#80,#80,#80,#80
POKE #EE0,#80,#80,#80,#80,#80,#80,#80,#80
POKE #EE8,#8A,#8F,#8C,#80,#80,#80,#83,#83
POKE #EF0,#8F,#8F,#8F,#81,#80,#80,#80,#80
POKE #EF8,#84,#84,#80,#80,#80,#80,#80,#80
POKE #F00,#80,#80,#80,#80,#80,#80,#80,#80
POKE #F08,#8B,#8F,#8F,#8D,#80,#80,#80,#80
POKE #F10,#8B,#8F,#85,#80,#80,#80,#80,#80
POKE #F18,#81,#81,#80,#83,#80,#80,#80,#80
POKE #F20,#80,#80,#80,#80,#80,#80,#80,#80
POKE #F28,#82,#8F,#8F,#87,#80,#80,#80,#80
POKE #F30,#8A,#8F,#85,#84,#80,#80,#80,#80
POKE #F38,#80,#88,#8E,#8E,#80,#80,#80,#80
POKE #F40,#80,#80,#80,#80,#80,#80,#80,#80
POKE #F48,#80,#8F,#87,#80,#80,#80,#80,#80
POKE #F50,#82,#8F,#80,#80,#80,#80,#80,#80
POKE #F58,#80,#8B,#87,#8F,#85,#80,#80,#80
POKE #F60,#80,#80,#80,#80,#80,#80,#80,#80
POKE #F68,#80,#87,#80,#80,#80,#80,#80,#80
POKE #F70,#80,#80,#80,#80,#80,#80,#80,#80
POKE #F78,#80,#80,#80,#82,#80,#80,#84,#80
POKE #F80,#80,#80,#80,#80,#80,#80,#80,#80
POKE #F88,#82,#81,#80,#80,#80,#80,#80,#80
POKE #F90,#80,#80,#80,#80,#80,#80,#80,#80
POKE #F98,#80,#80,#80,#80,#80,#80,#80,#80
POKE #FA0,#80,#80,#80,#80,#80,#80,#80,#80
POKE #FA8,#80,#88,#80,#80,#80,#80,#80,#80
POKE #FB0,#80,#80,#80,#80,#80,#80,#80,#88
POKE #FB8,#84,#84,#8C,#84,#80,#80,#80,#80
POKE #FC0,#80,#88,#8C,#8C,#8C,#8C,#8C,#8C
POKE #FC8,#8E,#8F,#8C,#80,#8C,#8C,#8F,#8F
POKE #FD0,#8F,#8F,#8F,#8F,#8F,#8F,#8F,#8F
POKE #FD8,#8F,#8F,#8F,#8F,#8F,#8F,#84,#80
POKE #FE0,#8F,#8F,#8F,#8F,#8F,#8F,#8F,#8F
POKE #FE8,#8F,#8F,#8F,#8F,#8F,#8F,#8F,#8F
POKE #FF0,#8F,#8F,#8F,#8F,#8F,#8F,#8F,#8F
POKE #FF8,#8F,#8F,#8F,#8F,#8F,#8F,#8F,#8F

10 CLS
20 COPY #980,#E00,512
30 CONT

 IchigoJam web で実行

世界地図を IchigoJam web で表示

計算しやすいように経度 0 度を画面左右としたため、
日本は右の中央からちょっと上です。
……仮想グラフィックで表示しているので、日本 🗾 は 2 ドット表示 😆
「ワタシノクニ ナイヨー! 😭」と海外の人から怒られそうですが、
それだけの縮小状態なので、ご勘弁を。大きな大陸で世界地図だとは分かるでしょう?

表示が 32✕16 文字分になっています。なので上下 4 文字空白があります。
PHP のソースで経度で + 4 とあるのはこのためです。


IchigoJam+MicJuice で実行!

これらをまとめて IchigoJam のプログラム完成です!

POKE #E00,#80,#80,#80,#80,#80,#80,#80,#80
POKE #E08,#8C,#80,#80,#8C,#8C,#80,#80,#80
POKE #E10,#80,#80,#80,#80,#80,#80,#80,#80
POKE #E18,#80,#80,#80,#80,#80,#80,#80,#80
POKE #E20,#80,#88,#80,#80,#8C,#8C,#88,#8B
POKE #E28,#8D,#83,#8B,#8F,#8F,#81,#80,#80
POKE #E30,#80,#80,#80,#80,#80,#8C,#8C,#8E
POKE #E38,#8F,#8C,#8C,#8C,#84,#80,#80,#80
POKE #E40,#80,#8F,#83,#8F,#8F,#8F,#8F,#83
POKE #E48,#88,#81,#82,#83,#80,#82,#80,#88
POKE #E50,#87,#8F,#8F,#8F,#8F,#8F,#8F,#8F
POKE #E58,#8F,#8F,#8F,#8F,#87,#87,#83,#81
POKE #E60,#80,#80,#80,#80,#8B,#8F,#8F,#8F
POKE #E68,#8E,#87,#84,#80,#80,#80,#82,#8C
POKE #E70,#8F,#8F,#8F,#8F,#8F,#8F,#8F,#8F
POKE #E78,#8F,#8F,#8F,#85,#80,#81,#80,#80
POKE #E80,#80,#80,#80,#80,#8A,#8F,#8F,#8F
POKE #E88,#87,#80,#80,#80,#80,#80,#8A,#89
POKE #E90,#82,#81,#8E,#8D,#8F,#8F,#8F,#8F
POKE #E98,#8F,#87,#81,#84,#80,#80,#80,#80
POKE #EA0,#80,#80,#80,#80,#80,#8B,#87,#83
POKE #EA8,#80,#80,#80,#80,#80,#80,#8E,#8F
POKE #EB0,#8D,#8D,#8F,#87,#87,#8F,#8F,#8F
POKE #EB8,#8F,#87,#82,#80,#80,#80,#80,#80
POKE #EC0,#80,#80,#80,#80,#80,#80,#83,#8D
POKE #EC8,#80,#80,#80,#80,#80,#88,#8F,#8F
POKE #ED0,#8F,#8F,#8D,#87,#81,#8A,#85,#82
POKE #ED8,#8D,#80,#80,#80,#80,#80,#80,#80
POKE #EE0,#80,#80,#80,#80,#80,#80,#80,#80
POKE #EE8,#8A,#8F,#8C,#80,#80,#80,#83,#83
POKE #EF0,#8F,#8F,#8F,#81,#80,#80,#80,#80
POKE #EF8,#84,#84,#80,#80,#80,#80,#80,#80
POKE #F00,#80,#80,#80,#80,#80,#80,#80,#80
POKE #F08,#8B,#8F,#8F,#8D,#80,#80,#80,#80
POKE #F10,#8B,#8F,#85,#80,#80,#80,#80,#80
POKE #F18,#81,#81,#80,#83,#80,#80,#80,#80
POKE #F20,#80,#80,#80,#80,#80,#80,#80,#80
POKE #F28,#82,#8F,#8F,#87,#80,#80,#80,#80
POKE #F30,#8A,#8F,#85,#84,#80,#80,#80,#80
POKE #F38,#80,#88,#8E,#8E,#80,#80,#80,#80
POKE #F40,#80,#80,#80,#80,#80,#80,#80,#80
POKE #F48,#80,#8F,#87,#80,#80,#80,#80,#80
POKE #F50,#82,#8F,#80,#80,#80,#80,#80,#80
POKE #F58,#80,#8B,#87,#8F,#85,#80,#80,#80
POKE #F60,#80,#80,#80,#80,#80,#80,#80,#80
POKE #F68,#80,#87,#80,#80,#80,#80,#80,#80
POKE #F70,#80,#80,#80,#80,#80,#80,#80,#80
POKE #F78,#80,#80,#80,#82,#80,#80,#84,#80
POKE #F80,#80,#80,#80,#80,#80,#80,#80,#80
POKE #F88,#82,#81,#80,#80,#80,#80,#80,#80
POKE #F90,#80,#80,#80,#80,#80,#80,#80,#80
POKE #F98,#80,#80,#80,#80,#80,#80,#80,#80
POKE #FA0,#80,#80,#80,#80,#80,#80,#80,#80
POKE #FA8,#80,#88,#80,#80,#80,#80,#80,#80
POKE #FB0,#80,#80,#80,#80,#80,#80,#80,#88
POKE #FB8,#84,#84,#8C,#84,#80,#80,#80,#80
POKE #FC0,#80,#88,#8C,#8C,#8C,#8C,#8C,#8C
POKE #FC8,#8E,#8F,#8C,#80,#8C,#8C,#8F,#8F
POKE #FD0,#8F,#8F,#8F,#8F,#8F,#8F,#8F,#8F
POKE #FD8,#8F,#8F,#8F,#8F,#8F,#8F,#84,#80
POKE #FE0,#8F,#8F,#8F,#8F,#8F,#8F,#8F,#8F
POKE #FE8,#8F,#8F,#8F,#8F,#8F,#8F,#8F,#8F
POKE #FF0,#8F,#8F,#8F,#8F,#8F,#8F,#8F,#8F
POKE #FF8,#8F,#8F,#8F,#8F,#8F,#8F,#8F,#8F

20 CLS
30 LC 0,4
40 ?"MJ GETS mj.15j.run/p/iss.php
50 INPUT E
60 INPUT X
70 INPUT Y
80 IF E>0 ?"data error!":GOTO 110
90 COPY #980,#E00,512
100 LC X,Y,1
110 WAIT 900
120 GOTO 20

IchigoJam+MixJuice および MicJack でも動作しますが、
特に MicJack は GETS だと動作しないバージョンが確認できていますので、
GET に変更して下さい。GET も動作可能です。

40 ?"MJ GET mj.15j.run/p/iss.php

IchigoJam web でも実行できます。

 IchigoJam web でプログラム読込

気をつけてほしいのは MixJuice を有効にする必要がありますので、
IchigoJam web の画面を表示したら I/O をクリック・タップし、
そのから MixJuice に を入れてから IchigoJam 画面で RUN して下さい。
なので、ここでは RUN を含めていません。

IchigoJam web と他のマップで位置を表示させてみました。

IchigoJam web で位置表示

オーストラリアの左上に カーソル ■ があります。
実施には点滅しているので、わかりやすいです。
ほぼ同じタイミングで他のマップによる表示を行ってみると……

他のマップで位置表示

ほぼ一致してるでしょう?
文字単位で ■ を表示しているので、ズレが生じる場合があります。


朝焼け・夕焼け前後は実際に空で国際宇宙ステーションが見える時間なので、
日本の上を飛んでいるようなら空を見上げてみると良いかもしれません。


IchigoJam Advent Calendar 2020

 IchigoJam Advent Calendar 2020 | Qiita