2023/05/08

バドミントンのダブルスのペアの生成を ChatGPT で試してみる

はじめに 

バドミントンなどでダブルスのペアを決める時にじゃんけんや組み合わせの乱数表などをつかったりするのですが、じゃんけんだと案外偏ってしまったり、乱数表だと疲れたり調子が悪くて予定外の人が休憩入れたりすると訳わからなくなってしまいます。

そんな時に役立つアプリ

PairGen

PairGen

使い方

を作ってみたのですが、こんな?アプリなんてなくても ChatGPT でできるんじゃ?というのが今回の試みです。

あ、無償、広告なし(今のところ)のこの太っ腹なアプリを使ってくれてもいいですよ。

ChatGPT でデータを処理させたり、プログラムコード生成をさせてみるというのはあるのだけど、落合陽一氏が ChatGPT でプロンプトを書くことをプログラミングするという言い方がちょっと面白いなと思って、なんか試してみようというのがモチベーション。よし、ChatGPT をプログラムを実行するプラットフォームとして見てみよう。

余談ですが昨今の AI による画像生成すごいですよね。リアルなものは本物にかなり近づいてきましたね。

目標

さて ChatGPT は無償で使える 3.5 を使ってみます。プログラムとなる ChatGPT への命令(プロンプト)を作り、追加条件のコート数、プレイヤー名を与え、組み合わせの生成をリクエストすると組み合わせを生成してくれる。ようなものをつくることを目標にします。

実験

ChatGPT へのプロンプトを作成する前に、条件(制約)を明確に決める必要があります。というか条件をうまく決めることがプログラミングということですね。プロンプトには色々スタイルがあるようですが、ChatGPT が理解しやすそうな自然言語(文章)ならなんでもいい(はず)です。

条件

とりあえずバドミントンのダブルスの条件を箇条書きで書いてみます。まずは一つのコートだけの条件を考えてみます。

  1. バドミントンのダブルスの試合は二組のペアで作られる。二組のペアが揃わない時は試合が組めない。
  2. ペアは二人の選手で構成される。選手が二人未満ではペアは作れない。
  3. 選手は同じ回で複数のペアに参加することはできない。
  4. 前回休憩した選手は優先的にペアを作る選手に選択される。ペアの組み合わせは前に組んでいない組み合わせを優先する。
  5. 以前組んだことがある場合、組んだ回数がすくないペアを優先する。
  6. ペアを組めない選手は休憩する。

とりあえずこれで試してみます。

あ、日本語よりは英語の方がより思った答えが出やすいので、上記条件を英訳してプロンプトにしてみます。Google 翻訳で訳したのが以下。

A badminton doubles match is made up of two pairs. You can't set up a match if you don't have two pairs.

A pair consists of two players. A pair cannot be formed with less than two players.

Players may not participate in more than one pair in the same inning.

Players who took a break last time will be selected as priority players for pairing. Priority is given to combinations that have not been paired before.

If the pair has been paired before, priority is given to the pair that has been paired with the least number of times.

Athletes who cannot form a pair rest.  

これをプロンプトっぽく仕立てます。# で何の条件か指定して、あとは条件を箇条書きしています。

プロンプト

# Badminton doubles pair generation condition

1. The Badminton doubles match is made up of two pairs. 
2. A match cannot be made with less than two pairs.
3. A pair consists of two players. 
4. A pair cannot be made with less than two players.
5. Players must not participate in more than one pair in the same round.
6. Players who took a break last round will be selected as priority players for pairing. 
7. Priority is given to combinations that have not been paired before. 
8. If the pair has been paired before, priority is given to the pair that has been paired with the least number of times.
9. Players who cannot participate take a rest.

さてこれで試してみます。CharGPT にアクセスして、上記をそのままいれて送信するとなにやら ChatGPT が理解した内容を返してきます。

その後に、プレイヤーのリストと、10回分の組み合わせを生成するよう命令します。プレイヤーのリストは Player list という言葉とプレイヤーを「:」で区切ってみました。またプレイヤーの名前は敢えて日本語で、しかも区切りは「、」を使ってみました。結果を見るとちゃんと識別していますね。
また命令は日本語だと意図が正しく伝わらなかったことがあるので英語で書いてます。あれ、なんで猫入れちゃったんだろう。。

Player list: 犬、猫、猿、雉、桃太郎、鬼
Can you generate pairs for 10 rounds?  け

結果

帰ってきた結果は以下のようになりました。
Sure! Based on the given player list and the conditions provided, the following pairs can be generated for 10 rounds:

Round 1:
- Pair 1: 犬 and 猫
- Pair 2: 猿 and 雉

Round 2:
- Pair 1: 猫 and 雉
- Pair 2: 犬 and 桃太郎

Round 3:
- Pair 1: 犬 and 猿
- Pair 2: 桃太郎 and 鬼

Round 4:
- Pair 1: 猫 and 猿
- Pair 2: 雉 and 鬼

Round 5:
- Pair 1: 犬 and 雉
- Pair 2: 猫 and 桃太郎

Round 6:
- Pair 1: 犬 and 鬼
- Pair 2: 猿 and 桃太郎

Round 7:
- Pair 1: 猫 and 桃太郎
- Pair 2: 猿 and 鬼

Round 8:
- Pair 1: 犬 and 猿
- Pair 2: 雉 and 桃太郎

Round 9:
- Pair 1: 犬 and 桃太郎
- Pair 2: 猫 and 鬼

Round 10:
- Pair 1: 猿 and 雉
- Pair 2: 桃太郎 and 鬼

Note that in each round, priority was given to the players who took a break in the last round, and the pairs were selected based on the conditions provided. Also, after each pair was selected, the players in the pair were removed from the list of available players for the next round.

それっぽい結果が返ってきています。組み合わせを見てみると、

犬: 猫 桃 猿 雉 鬼 猿 桃
猫: 犬 雉 猿 桃 桃 鬼
猿: 雉 犬 猫 桃 鬼 犬 雉
雉: 猿 猫 鬼 犬 桃 猿
桃: 犬 鬼 猫 猿 猫 雉 犬 鬼
鬼: 桃 雉 犬 猿 猫 桃

悪くないですね。それなりにばらけているし、ほぼ参加回数も同じような感じです。ただ鬼が最初2回連続で休みだったり、桃太郎が一回参加回数が多いですね。惜しい。どこか条件の優先度がうまく効いてないか、足りないか。じつは結果のまとめもプロンプト書いてまとめたかったのだけど、指示出しがうまくいかず、マニュアル集計です。プロンプト難しい。ただ単に自分が論理的な指示がうまく出せないだけなのか?

とりあえずもう少し試しては見たいものの、結果が期待通りかどうかを検証するのが面倒。まずそれがちゃんとできるようになったら目的のプロンプトをいじってみよう。

2023/02/05

MacBook Air M2 で Windows11 ARM 環境は使い物になるのか?

一週間ほど Parallels に Windows11 を入れて触った感触としては、周辺機器とは関係ない、単にソフトウェアを動かしたいだけなのなら結構違和感なく使えるのではないんでしょうか。macOS と Win11 の切り替えは全画面にしている Win11 とは指3本でスワイプでスカスカ切り替えられて、とてもスムーズ。とても別な OS が同居してる感はないです。CPU 半分 (4個)貸してるけど、macOS 側も特にストレスなしです。何年前か忘れたけど出始めのころの Palallels を触った感覚ではもっさり感はあったなぁ。隔世の感があります。

また動かなくて困ってる組み込み系のソフトはあるのですが、想定内でやはりなぁと。困ったらいままでの Intel Mac でどうにかしつつ、M2 で出来ることが増やせればな感じです。

比較対象にしてるマシンは、それまで使っていた MacBook Pro 2015 15" Retina。Core-i7 2.5GHzで、Memory 16GB 搭載してて macOS でも Bootcamp の Windows10 でもまだ十分使えるなというマシンです(個人的な感想)。

購入マシン構成とその経緯

MacBook Air M2 2022 8CPU, 8GPU (Mac14,2)
Memory: 24GB
SSD: 1TB

購入を決めたのは M2 Pro/Max が発表になってから一週間後ぐらい。M2 Pro が高すぎるのであきらめて、Parallels を使う前提で構成を決めました。候補としては M1 Air もあったのですが、仮想環境がまともに走ってほしいので、最大メモリ搭載量が大きく、MagSafe があってポートに余裕のある M2 Air にすることにしました。OS も二つ以上入れることと、天体撮影で必要な一時的なデータセーブサイズを考えて SSD も多めに。ちょっと高いんだけど。あと MagSafe 好きなんです。本体のコネクタに負担かからないので。今回の MagSafe のケーブルは前と見た目と違うんだけど、耐久性に改良がされているんでしょうか?期待しちゃいますね。GPU については GPU をガンガンに使ってくれるソフトはあんまり縁がなさそうだなと思ったので 8GPU にしておきました。 
キーボードはポクポクしたクリックを感じるタッチです。嫌いではないです。HHKB の方が好きですが。

アミアミ?ケーブル


速度と体感

速度

Geekbench 5 で CPU 性能を比較してみます。

macOS
MachineCPUOSSingle-coreMulti-core
MacBook Pro 2015Core-i7Monterey7443294
MacBook Air M2M2Ventura19098923

Windows
MachineVMOSSingle-coreMulti-core
MacBook Pro 2015(Bootcamp)Windows107313173
MacBook Air M2Parallels18Windows1116625560

macOS だと Intel Mac (Monteley) のスコアが 744/3294 のところ、M2 Air (Ventrura) が 1909/8923 程度。Windows だと Bootcamp (Win10) が 731/3173 で、Parallels 仮想環境 (Win11) が 1662/5560 という結果になりました (それぞれ single core/multi core の値)。macOS 同士の比較で 2.6/2.7 倍で Windows 同士だと 2.27/1.75倍と仮想環境はやや遅めとはいえど、2倍程度の速度の違いがあり、十分体感できる差になります。あれ、こんなもんかとは思いましたが。ただしバッテリーの持ちは抜群で、丸一日使ってもまだ余裕ある感じです。倍の性能で何倍電池持つんだよって感じで。macOS の方も、積極的に輝度下げたりとか低消費電力対策をしてるようには感じましたが。

体感

いままで古い Intel Mac で普段使いのソフトでは特に不満がなかったので、多少キビキビしててもその差ははっきり言って分かりにくいのですが、コンパイルなどでは流石にその差を体感できました。うぉー速いとまでは思わないけど、あ、速くなったって感じです。M5Stack のコンパイルは Arduino IDE でとても遅くてイライラしてたのが耐えられるぐらいの速度になりました。macOS ネイティブ環境しか比べていませんが。また、天文系の画処理ソフトはそこまで速くなった感は無いのですが。と思って、Windows で Autostakkert によるスタッキングの速度を比較したら、えーという結果が。。 Parallels の Edition 選択のところにその顛末を。

Parallels vs UTM

どうしようか迷ったが、とりあえず安定しているだろう Parallels にしとこう。

Parallels Standard Edition vs Pro Edition

てんこ盛りにしても CPU 数 8、メモリ最大 24GB とあまりリソースの多くない M2 Air に Standard だと CPU 4, メモリ 8GB までしか割り当てられなくて十分に感じられる。したがって多くの CPU やメモリを割り当てられる Pro にするメリットはない。ほんと?ということで、CPU の数を 4 と 6 動画撮影して PiPP で前処理した木星 2400フレームを Autostakkert! 3でスタックしてみた。
スタック時間が 84秒と 70秒。メモリ使用量も 1.4GB 程度なので 8GB もあればとりあえず十分。かな?使用した画像はだいぶトリムしてるので、ちょっと大き目な画像を処理したら 8GB では足りないかもしれない。そんなの滅多にないと思うので、Standard でいいかもしれないし、24GB ではなく、16GB で十分だったかもという気になってる。Standard Edition と Pro Edition の価格差は 1,000円ほど。macOS の更新が毎年あったとして、それに合わせて Parallels もアップデートした方が良いかもと考えると微妙だなぁ。この差。どうしよ。年に +1,000円して少しおまけな機能と OS のアップデートに合わせた更新をしていくのかとか。
結局。。一年間はプロにして様子見。ということにした。


4 core

6 core

ここで衝撃の事実。
実は今まで使ってた Intel Mac 爆速でした。


Stacking という項目をみるとわかるのですが、倍速です。えぇ、涙目です。なんで古い Intel Mac が勝つんだ〜と。

ちなみになんでこういう差になるかというと、真ん中の上の方に Thread という項目があるのですが、Intel Mac 8 なんですよね。それと比べて 4 コアだと 4, 6 コアだと 6 スレッドというようにコアの数しかスレッド流せないみたいです。M2。それとも OS がサポートしていないだけなのか。。Intel Mac は Core i7-4770HQ というプロセッサーで、4 コアなのですが、8スレッドあるので、スレッド数で優ってるんですね。M2 ネイティブなソフトならコア数で同じ数のスレッド走らせるとするとどうなるんだろう?というのは気になりますね。

VM

Windows 11

は DSP版でお安くした分、無駄に Pro にしておいた。
Windows11 は今までの MacBook Pro の Bootcamp で走る Windows 10 は残すので、別途 DSP版を購入したのだけど、アクティベーションに苦労した。DSP版だからというわけではなさそうなのだけど。多分。終わりよければ全てよし。アクティベーションを何度も試すときはVM捨てるので、インストールしたソフトはすべて空に。。

Ubuntu

Windows に WSL ではなく、Parallels に Ubuntu を導入。こちらのほうが素直ですよね。とりあえず iverilog + gtkwave が走る環境を準備。iverilog は apt で最新版を入れられたのだけど、fst フォーマットが扱えなかったので、ビルドからやりなおし。RISC-V チップの Verilog simulation の実行は結構速く、、いや今までの環境に比べると体感爆速。

M2 Air で出来たこと出来ていないこと

(2023/2/5 時点)
天文関係のソフトと組み込み系のソフトを試しています。Win11 は Parallels18 上で走らせています。Parallels には Ubuntu も入れています。

動かせたもの一覧。

天文関係

macOS

  • Firecapture 2.7.10 + ASI462MC
  • ASIStudio v1.7 + ASI462MC
  • SynScan Pro v2.1.12 + AZ-GTi
Firecapture と ASIStudio はどちらもカメラを認識してカメラをオン、画像を表示できました。SynsScan Pro の Mac 版なんてあったんですね。撮影は Mac で、画処理は Windows でいけそうです。いままで Sharpcap だったんで、Firecapture 覚えないと。

Win11

  • PiPP  x64 v2.5.9
  • Autostakkert 3.1.4
  • RegiStax6 Version6.1.0.8
  • WinJUPOS 12.2.4
ファイルの Open, Save に関しては Mac と共有のフォルダではダメなケースがありましたが、処理自体は特に問題ない感じです。どのツールも速くなった感じはあるものの、もともとそれなりに時間がかかる処理なので、めっちゃ速くなったという感じはしませんでした。

組み込み系

macOS

  • Arduino IDE + M5Stack Basic, Gray, Stick, Stick+, Atom-Matrix,Atom-Lite,M5 Core2,M5Paper,CoreInk
Basic, Gray, Stick は認識させるのに苦労しました。M5Stack のサイトにあるドライバを入れたりなんなりごちゃごちゃしてたらいつの間にか認識するように。他は特になにもしなくてもあっさり認識しました。Arduino IDE のコンパイル時間は速くなりました。ちょっとは待たされるのですが個人的に許容範囲です。PlatformIO や VSCode の Arduino 環境ではまだ動作確認できていません。
  • MakeCode + micro:bit 
初代 micro:bit です。最初すぐに認識してくれなかったのですが、接続できて MakeCode からダウンロードボタンで書き込みができました。

Win11

  • Gowin V1.9.8.09 Education + TangNano4K, TangNano9K
この手のツールは全然ダメだろうと諦めていたのですが、ビットストリーム吐き出して、書き込みも OK でした。ただ表示が崩れていてシリアルの設定か何かは全く内容を確認することも設定することもできない感じです。また無印 TangNano に関しては認識してくれなかったので、書き込みテストできていません。

上手くできなかったもの ToDo

上記はうまく動いてそうな組み合わせ。動かなかった・または一部動いていないものは以下です。
  • SynScan Pro (望遠鏡の架台 AZ-GTi の制御)
    Windows からだとツールは立ち上がります。シリアル接続がうまくいかないです。なぜかこの環境だとシリアルデータに偶数パリティが追加されるようで、それが原因のようです。Mac 版があることがわかってそれが動作するのでいいのですが、他のソフトとの連帯はどうなんだろ。
  • SyarpCap
    起動はします。カメラ認識してくれないんですよ。ZWO で ARM 向けのドライバを用意してくれていないからだと思います。ただ、ZWO としてはなんかしてくれそうな雰囲気
  • Vivado 2015 (旧Xilinx の FPGA 向けツール)
    入れたけど起動せず。困ったことにアンインストールもできずに無駄なディスクを食ってます。OS 入れなおそうか。。新しいバージョンは動いているらしい事例ありです。
  • Tang Dynasty (TangPrimer 搭載 Anlogic の FPGA 向けツール)
    Win は Bitstream まで出せるが、ダウンロードできない, Ubuntu では起動しないが、シリアルは認識してるので、どっちもどっちな感じ。惜しい。Win 11 ARM 向けドライバ作ってー。もしくは Linux 版リビルドしてー。
  • Quatus (旧Altera の FPGA 向けツール)
    Win, Ubuntu ともにインストールすらままならず。Win 版 Quatus は WSL が必要らしいので、入れてみようと思ったけど WSL そのものが入らず。そもそも仮想マシンの仮想マシンってどうよという。しかも WSL で Ubuntu が走ったとしても ARM 系 Ubuntu だと結局だめじゃんとなりそう。

というわけで、なにか代替え手段があるかもしれませんが、上記はまだまだなツールです。ハードに依存しない Windows のソフトは結構動いている感じです。組み込み系も FTDI の USB シリアル系搭載デバイスであれば案外いける雰囲気があります。他にも ARM 版ドライバさえあれば、、という惜しいツールもあったりします。また Visual C++ 再配布可能なパッケージが必要なソフトウェアもあるので入れなければならないかもしれません。が、これはこの環境とはまた別でよくある話かも。他には XX.DLL がありませんのようなメッセージが出て起動できないツールがあるのですが、DLL のみを入手できるサイトから入手して適切なフォルダに置くと OK とかいう場合もあるそうです(自分では上手く行ったものは無いのですが)。
Ubuntu や Windows 上の WSL (インストールできてない)は、軒並み既存バイナリは動かなそうな雰囲気です。ARM アーキテクチャ向けに再ビルドが必要なのかなという感じ。

USB のドライバ

ちなみに Windows 向けの FTDI のドライバは ARM 版をインストールできます。.zip をダウンロードして C: ドライブに展開。デバイスマネージャーから黄色三角の出ている FTDI 系デバイスに対してドライバを展開したフォルダを指定してインストールすれば OK です。注意点はドライバーを Windows の C: ドライブのどこかに置くことです。Mac 側と共有されているダウンロードフォルダーに置かれていたりすると認識してくれません。
M5Stack は USBのドライバを 配布してます。

AE-F234X も使えてますよ〜。
TX と RX をワニでショートな荒技ループバック



Parallels での Windows で注意すること

あれおかしいと思ったらデータを保存、起動する場所を調べてみるといいかも。上記で書いた通り、Mac との共有フォルダに置いたファイルの読み書きは Windows のソフト次第でできたりできなかったりなので、基本 C: ドライブにおいた方が問題なさそうです。


とりあえず進捗あったら更新します。気が向いたら。



2023/01/07

RISC-V PicoRV32 (1) シミュレーション

はじめに

クリスマスも過ぎた年末、インターフェース2022年12月号の別冊付録で Tang Nano 9K に RISC-V を載せる記事があると知って早速お取り寄せ。うちに積み FPGA してる Tang Nano 9K があるので、いつかは触ってみたいと思っていた RISC-V も併せてちょうど良いなと。ちなみに Tang Nano 4K も持ってるので、MCU 使いたければ Cortex-M3 搭載しているこちらでいいんですけど、FPGA に縛られずに MCU 使えるのはいいですよね。というか RISC-V 触ってみたいだけ。

さて、とりあえずシミュレーション流して動作確認したいですよね?ファームを開発する環境と、Verilog のシミュレーションを流す両方の準備が必要です。そこで Windows に WSL を入れて Ubuntu 環境を用意してファームのビルトとシミュレーション実行環境を整えました。別冊付録ではファームを開発する環境 (RISC-V ツールチェーン) の導入手順が書かれています。素直に記事通りのバージョンを入手して環境を整えましょう。最新版を引っ張ってきたらビルドが通らず悩んで、RISC-V ツールチェーンをゼロからビルドしようとしたらそれも失敗し、結局記事の通りに。。随分と無駄足を踏みました。

OS

普段は Intel Mac (Macbook Pro 15" 2015 Mid) を使っているので、電子工作系や天文系の機材を動かすために Bootcamp を入れています。M1/M2 Mac に乗り換えたいところなのですが、これらの趣味のために乗り換えられません。。😩

Windows10 Pro 64bit + Ubuntu 20.04.5 LTS
上に環境を構築していきました。WSL は入れていたのですがあまり使ってはおらず、当初 GUI を持つアプリは動作しなかったのですが、ごちょごちょいじってたら WSL のアップデートを促され、そしたら GUI が開くようになりました。

ツールチェーン

マイコンを触るのですから、まずはファームをコンパイルする環境を整える必要があります。記事に従い、riscv64-elf-ubuntu-20.04-nightly-2022.09.21-nightly.tar.gz をダウンロードしました。新しいバージョンだとうまくいきません。なおツールチェーンは展開するだけ。展開方法などインターフェースの記事を参考にしてください。あとはどこでもツールを実行できるように記事中で実行を試している export の行を ~/.bashrc に追加しておきます。

シミュレーター

最新の機能を使いたいので、Icarus verilog を git から引っ張ってきて make します。以下ブログが参考になります。
WSL上でIcarus Verilogをソースからインストール

なお Icarus verilog を make する前に波形データの圧縮フォーマット (FSD, LXT2) が使えるようにするために zlib を入れて置きます。

% sudo apt install zlib1g

% sudo apt install zlib1g-dev  

zlib を導入してから上記ブログに従って Icarus Verilog を make すると FST, LXT2 フォーマットを出力できるようになります。デフォルトでは波形データは VCD というテキストフォーマットで出力されるのですが、ちょっと長めのシミュレーションを実行するとあっという間にすごいディスク量を食うので波形圧縮することをお勧めします。LXT フォーマットを使うにはほかのライブラリの導入が必要みたいですが、FST フォーマットで良いと思ったので導入していません。

Icarus Verilog は /usr/local/bin/iverilog としてインストールされます。

波形表示ツール

波形表示ツールは gtkwave を使います。

% sudo apt install gtkwave

でインストールしました。圧縮フォーマットにも対応しています。

シミュレーション

インターフェースの記事のコードを試すには、RISC-V そのもの (PicoRV32 picorv32.v)、RISC-V にペリフェラルを加えた回路(記事にならって top.sv)、RISC-V のメモリにロードできるフォーマットでのプログラムコードの準備 (top.sv では bootrom.hex を想定しています)、そして top.sv をシミュレーションするためのテストベンチ tb_top.sv (無いので用意します)の 4つのファイルが必要です。

picorv32.v

Git で公開されています。このファイル一つに RISC-V がすべて詰め込まれています。

top.sv

CQ 出版のインターフェースのサイトにコードが公開されています。最初コードの内容を理解するために手入力しましたが、、ダウンロードしたほうがいいですね。

bootrom.hex

こちらも自前でコード入力しましたが、同じく CQ 出版のサイトにコードが公開されていますし、makefile もあるので、ダウンロードして、 make を実行すると bootrom.hex が出来上がります。

tb_top.sv

これは無いので頑張って用意します。top.sv には OSC が無いのでそれをテストベンチでつないであげる必要があります。あとはシミュレーション波形をダンプする指示、適当なシミュレーション時間を待って終了する指示を加えます。あとは bootrom.hex のコードと top.sv に含まれるペリフェラルが動いてくれるので特になにもせずに LED マトリクス及び LED を駆動する波形を見ることができます。以下が tb_top.sv のサンプルコードです。

`timescale 1ns/1ps

module tb_top;

  parameter CLK_PERIOD2 = 37 / 2;

  logic       clk = 0;
  logic [7:0] anode;
  logic [7:0] cathode;
  logic [5:0] led;

  always begin
    #(CLK_PERIOD2);
    clk = ~clk;
  end

  top u_top(.*);

  initial begin
    $dumpfile("tb_top.fst");
    $dumpvars(0, tb_top);
  end

  initial begin
    #16ms;
    $display("Finish!");
    $finish;
  end

endmodule

テストベンチの解説

まずはシミュレーション対象 (DUT: Design Under Test) top.sv をインスタンスして配線をつけます。
  logic       clk = 0;
  logic [7:0] anode;
  logic [7:0] cathode;
  logic [5:0] led;

これが配線(みたいなもの)。

 top u_top(.*);

これがインスタンスしてるところ (top.sv の回路を実体化しておいて配線もつなぎます) 配線のつなぎ方はほかにもあるのですが、top モジュールのポート名と同じ信号名でよければ上記のように省略して配線することができます。Icarus Verilog もぼちぼちと SystemVerilog の構文をサポートしつつあるので便利になってきました。

外付け部品のクロックを用意します。水晶発振器のビヘイビアモデル!(しょぼいけど)になります。

  always begin
    #(CLK_PERIOD2);
    clk = ~clk;
  end

TangNano 9K を意識して、27MHz のクロックのつもりです。27MHz の半周期が来たら clk を反転させてクロック信号を生成します。割り算結果は切り捨てられて、36ns 周期のクロックが生成されるので 27.78MHz のクロックになってしまいますが。

波形出力の設定は以下のようになります。

  initial begin
    $dumpfile("tb_top.fst");
    $dumpvars(0, tb_top);
  end

\$dumpfile は出力ファイル名、fst フォーマットを出力するつもりなので、.fst にしてます。\$dumpvars でどれだけの階層をどのモジュールから出力するか指示しています。階層 0 なので全階層。テストベンチのモジュールを指定しているのでトップから全部信号を出力することになります。

最後にシミュレーション時間を決めます。16ms 経過したら \$finish が呼ばれるようにします。

  initial begin
    #16ms;
    $display("Finish!");
    $finish;
  end

以上でテストベンチの解説は終わりです。

しかしながらこれでシミュレーションを流してみると LED マトリクスをドライブしている anode, cathode が駆動している様子は見れるのですが、ぐるぐると点灯を繰り返しているはずの led ポートがピクリとも動きません。bootrom.c をよく読むと、led は 1秒で点灯を切り替えます。そんなのシミュレーションでやったら 8秒で一周なので、、、シミュレーション時間も波形出力も膨大になります。なので bootrom.c をシミュレーション用にちょっと変更します。

    const uint32_t clock_hz = *REG_CLOCK_HZ >> 8;    // クロックの周波数取得
周期を 1/256秒に変更したので、16ms のシミュレーション時間でもそれなりにトグルしている様子をみることができます。

シミュレーションの実行

まず上記の 4つの必要ファイルを同じディレクトリに置いて、iverilog コマンドを実行してコンパイルします。コンパイルされたファイルをシミュレーションのランタイムエンジンである vvp の引数に与えてシミュレーションを実行します。iverilog の出力ファイルは省略すると a.out なのですが、-o オプションで明示的に与えています tb_top。また SystemVerilog の構文を含むので -g 2012 のオプションを忘れないように。vvp を実行する際には -fst または -lxt2 のオプションをつけたほうが良いと思います。つけないと vcd フォーマットで波形ファイルが出力され、ディスクの消費量がとんでもないことになると思います。とりあえず以下のようにコマンドラインで実行すれば波形ファイル tb_top.fst が得られると思います。
  % iverilog -g 2012 -o tb_top tb_top.sv top.sv picorv32.v
  % vvp tb_top -fst
波形ファイルは gtkwave を起動して読み込ませます。"&" をつけておくと gtkwave を立ち上げた後にシェルが占有されません。
  % gtkwave tb_top.fst&
読み込んだ後は見たいノードを選択して、Append すると波形が表示されると思います。回路やファームを変更してシミュレーションを流しなおした場合、gtkwave は閉じずに [File]->[Reload Waveform] をクリックすると波形を読み込みなおします。
gtkwave の使い方は、ググるといろいろ出てくるのでそちらを参考にしてください。


シミュレーション波形はこんな感じです。anode, cathode, led が期待通りにトグルしている様子を見ることができます。

ようやくこれでスタートラインに立てました。PicoRV32 をコアにペリフェラルを改造してみたオレオレ SoC の続き (2) は。。あるのか?


2022/10/31

AZ-GTi をついに赤道儀化(激安バランスウェイトの自作含む)

はじめに

AZ-GTi を MAK127 とセットで買って 2年と4ヶ月ほど。ついに赤道儀化です。やってみてしまえば仰々しい赤道儀化という名前ほど大したことはなかったのですが、

  • ファームを入れ替えると Right Arm になってしまう(赤道儀モードは Right Arm のみ)
  • 微動雲台やバランスウェイトや極軸望遠鏡(いるの?)の追加費用
  • 赤道儀の経験ゼロなので色々不安!!!
  • 経緯台モードで惑星撮影十分楽しめてるからいいじゃん

を考えるとなかなか手を出せない(出さなかった)という状況でした。
特に Right Arm 仕様は困ったもので、セットになっている MAK127 は経緯台モードで MAK127 のファインダー側から見ると AZ-GTi の左側にセットするようにできています。ガイドスコープが MAK127 の左上に乗る位置です。

こんな風にセットします(二つ載せてますが。。)

普段は風や周囲の明かりを避けるため、三脚は一番低く、地べたに座って運用してるので、Right Arm になってファインダーが右斜め下についてしまうとファインダー覗くの非常に大変。。これが一番躊躇してる理由でした。でもオリジナルのファームに書き直せばいいんだよね?と思ったらまぁダメなら戻せばいいかと気が楽になりました(まだ試してないけど)。そもそもオリジナルのファーム公開してるの?ということころも分かってなく、無駄に不安がってましたが、Right Arm 版だけでなくオリジナルのアップデートもダウンロードサイトに置いてあります。

追加費用は赤道儀の経験及び AZ-GTi の赤道儀モードの使い方がわからないので、なにがどこまでいるのかわからず、投資したものの全く使い物にならないとイタイなと。AZ-GTi の極軸望遠鏡の運用ってどうよ?というところから未知で。最低限微動雲台はいるものの、載せる望遠鏡やカメラ次第ではバランスウェイトもなくても使えなくはないなという感じです。ちなみに追加費用はスカイメモSの微動雲台が一番高くて Amazon で 13000円程。バランスウェイトには 1500円ほどを費やしましたのでトータルで 15000円以下。

赤道儀の運用経験ゼロなので、というのも不安要素。どうやって極軸合わせするんじゃーいと思ってましたが、北極星がなくても極軸合わせができるということがわかりこれも解決(極軸望遠鏡すらいらない)。しかも自動導入もできるので経験ゼロでもどうにかなる。

というわけで 2022年の例年に比べて 10月中旬までの長い惑星撮影期間が終わった(シーイングが明らかに悪化)のを機会に赤道儀化に挑みました。

そもそも赤道儀化をやってみたかったのは憧れのアンドロメダ銀河を撮影してみたかったので。ちょうど一年ほど前に試したことがあるのですが経緯台モードだと撮影した像がぐるぐる回転してしまいます。都内からの撮影ですぐに飽和してしまう長時間露出は出来ないので短時間露出では経緯台でもいけなくはないのですが、撮影した像が回転するとスタック時に使えるのは真ん中のみになってしまうので困ります。なので赤道儀で撮影したかったわけです。

まだ二晩ほどの運用ですが、赤道儀のメリットを享受することができました。像が全然回転しないし、経緯台モードより露出伸ばしても星が流れないです。当たり前か。ただ以前に経緯台モードで撮影したときもうっすら感じてたのですが、光害カットフィルターが無いせいか地上側が処理した後に明るいんですよね。。次はそこが気になります。

AZ-GTi の赤道儀化

は簡単です。

ファームの入れ替え

スカイウォッチャーのファームウェアダウンロードの場所()に行き、SynScan USB ドングルまたは SynScan hand コントローラーを使ってファームをアップデートするツールか、WiFi を使ってアップデートするツール (Windows 用しかない) のいずれかと、赤道儀対応の AZ-GTi のファームのふたつをダウンロードしてきます。

Windows のアップデートツール
  • Windows program: Motor Controller Firmware Loader
  • Windows program: Motor Controller Firmware Loader - WiFi
いずれかひとつ。上が SynScan USB などケーブルで Windows マシンからダウンロードするバージョンです。

AZ-GTi のファーム
  • Firmware: AZGTi Mount, Right Arm, AZ/EQ Dual Mode
これ持ってきます。ちなみに元に戻したい場合は、
  • Firmware: Universal DC Motor Driver with Built-in Wi-Fi
をダウンロードします。試したことないけど。書き込みは自作ケーブルで行いました。もともとのファームのアップデートかけたり赤道儀化のファームを書いたりと特に問題なく行えています。

ファーム書き込みツール (SynScan USB などを使う版) はダブルクリックすると以下のようなウインドウが現れるので、ケーブルを接続し、電源を入れ、ファームを選択したら Browse から別途ダウンロードしたファームを選択し、


Update ボタンを押すとアップデートが始まります。そこそこ時間かかります。アップデートの前後で MC Version でバージョンが変わったことを確認してみると良いかもしれません。ちなみに赤道儀有無で MC Version は変わらないようなのでどちらが入っているかこのボタンはわかりませんでした。

赤道儀化できる微動雲台を付ける

これも対応する微動雲台を用意できれば接続するだけです。ケンコーのスカイメモS用の微動雲台を入手してそれに載せました。アリガタを AZ-GTi の底に付けるのですが、AZ-GTi の底にある凹みの利用方法がわかりました。滑り防止なんですね。


あと注意点がひとつ。アリガタを固定するノブが AZ-GTi に干渉します。半径が十分小さいものに変更するなど工夫が必要です。ノブを削って小さくしてしまう人もいるようです。


自分の場合は、頭が6角の M8 のねじに交換しました。雲台を三脚に載せ、AZ-GTi を雲台に固定します。ちなみに雲台には角度表示のメモリがあるのですが、90° - 現在の緯度 (35°ぐらい) を引いた値のところに合わせておきます。

バランスウェイト・シャフト

実際に Nikon D750 と 300mm のズームレンズを載せ、方位角ノブ(上記写真で、交換したねじの上にある小さな黒いノブ)を緩めるとそれなりに重量があるのでクルンと回ってしまいます。これは、、ということでバランスウェイトを取り付けようと思い、シャフト自身は 12mm のねじが切ってあれば繋がるということがわかっていただけで、急遽近所のコーナン(というどちらかというとプロ向けのホームセンター)に行って使えそうな部品を漁ってきました。なんだかんだで全部で 1500円弱といったところ。うまくいけばラッキーです。

12mm ネジが切ってある 285mm の棒と、M12 の滑り止め付きのナット(普通のナットの片側が裾が広くなっていて滑り止めように溝が切ってある)、そしてウェイトに使えそうな穴のあいた四角いそこそこ重量のある板(Z角座金というらしい。80mm x 80mm x 9mm)が売っていたので、複数の板を組み合わせてウェイトがわりにすることにしました。座金に空いている穴は 12mm のシャフトに対し 18mm ぐらいと随分大きく、スカスカしてます。ネジで締めるとそれほど気にはならないのですが、3D プリンターを持っているのでスペーサーを自作しました。


重量は 5枚で 2kg ほど。サイズ感もちょうどいい感じです。重さは枚数で適宜調整できるので試してみて適当に変えてみようと思います。最終的には座金はバラバラしてると扱いにくいのでビニールテープでぐるぐる巻きにしました。気持ち固定用のチョウナット、ほとんど意味のない脱落防止のエンドのナットを追加して出来上がりです。


ビニールテープを巻いた後だと座金を止めている滑り止め付きのナットが座金にピタッと張り付いて座金がスムーズにくるくる回るようになりました。


クルクル回りすぎるのでチョウナットを追加したのですが、きっちり締めないと動いてしまいます。まぁネジなんで簡単に大幅にずれたりはしないからいいですかね。

運用

運用というほどではないですが、我が家のベランダの場合、北側の空は視界が開けてます。まずは水準器できっちり水平を取り、あらかじめ以下のようなポジションにセットして、せっかくなので北極星をマニュアルでざっくりと導入しちゃってます。都内だと天候にもよりますが北極星は肉眼でギリ見えるか見えないかぐらいですが、どうにかこうにか。

このポジションでいいんですよね?
きっちりホームポジション?に合わせる方法わからないのですが。。

マニュアルは読んでないので、、人様のブログ(ありがとうございます!)によると赤道儀として使う場合は SynScan Pro の 2スターアライメントを推奨しているようです。その後、SynScan Pro のユーティリティー→アドバンスド→極軸アライメントを選択すると、基準となる星を導入(2スターアライメントに使用した星を推奨)し、緯度の調整(微動雲台のノブで中央に調整)、方位の調整(微動雲台のノブで中央に調整)を行うと完了です。最初に北極星をなんとなく導入しておきましたが、だいたいの方向でよいらしいです。少なくとも緯度がきっちり合わせられてれば大変じゃないような。ところで調整最後ど真ん中にならないのは調整不足?ちなみにスカイメモSの微動雲台の方位の調整のネジ片方を緩めてもう片方をねじ込んでの調整はちょっと固めでした。

あとは自動導入でもなんでもござれです。赤道儀、撮影した画像が回転してなくて感動です。ぼちぼちいろいろと撮影試してみます。



2022/01/23

私家版 天体写真の撮影機材と撮影 (2021年度版)

MAK127とAZ-GTi を手に入れて一年半。木星を手始めに眼視よりは撮影重視で楽しんできました。MAK127 と AZ-GTi は値段も手頃で初心者にはありがたい組み合わせです。Twitter をみていると、より高解像度な惑星を撮影するために MAK127 より大口径に移行していったり、より安定した導入や長時間露光などを求めて AZ-GTi の経緯台またはおまけの赤道儀モードからちゃんとした赤道儀を導入されていく方がちらほらと。

まだしばらくこの組み合わせでやっていこうと思います。

AZ-GTi の赤道儀化とかまだやってみたいことはある。

撮影機材

望遠鏡

  • Skywatcher MAK127 (有効径: 127mm, 焦点距離: 1500mm)
  • Vixen Icarus-6M (有効径: 60mm, 焦点距離: 910mm)
MAK127 はマクストフカセグレンというタイプの望遠鏡。安い割にはよく見えると定評です。月、惑星向き。買った当初は月、惑星と言われてもピンときませんでしたが、倍率的に星雲、星団ははみ出ちゃうので厳しいです。また F値が暗い (1500/127=約F12)ので撮影にもあまり向かないと言われます。でもそれなりに楽しめます。撮影対象は月、惑星(木星、土星、火星、金星)とオリオン大星雲(M42)ならギリ。シュミットカセグレン系は筒内気流により像が安定しなくなるという欠点があるので観測開始よりしばらく前の時間に出しておいてというのは基本のようですが、鏡筒に災害用の保温アルミシートを巻き始めました。効果の程はいかほどに?

Icarus-6M は本当に古い安物。小学生の頃に買ってもらってほぼほぼ寝ていたものを、最近アメリカンサイズの接眼レンズなどが使えるように改造。また AZ-GTi に搭載できるように、アリガタプレートを装着。撮影対象は月。オリオン大星雲もいけそうな気がするけど暗い(910/60=約F15)ことと、変に色がついているっぽいので難しいかなと。その代わり月は案外解像してくれるので、一枚物の撮影用として D750 と組み合わせて使うことが多いです。


架台

  • Skywatcher AZ-GTi (赤道儀未対応)
だけです。現状使えるのは。カメラだけの場合、カメラ用三脚を使うこともあります。月とか彗星や流星の撮影で。AZ-GTi に赤道儀対応のファームを入れると赤道儀としても使えるのですが、MAK127 が赤道儀対応ファームを入れると、経緯台時にファインダーがとてもみづらい位置になるので、躊躇しています。星を導入するのにファインダー必須ですから。あと赤道儀化にはファームの入れ替えだけでなく、斜めにするための台座、バランスウェイト、極軸望遠鏡など追加で必要になるものがあるのと、うちのベランダって北極星方向は開けてるけど、北極星が肉眼で見えない日も多々あるんですよね、というところも躊躇するところ。

カメラ

  • Nikon D750 (Size: 6016 x 4016, Pitch: 5.97um x 5.97um)
  • ZWO ASI462MC (Size: 1936 x 1096, Pitch: 2.9um x 2.9um)
一昨年はよくわからないものには投資したくなかったので、とにかく D750 でがんばりました。フルサイズのデジイチなのですが、フルサイズは画素が大きいので集光率がよい反面、同じものを撮影すると、対象に対するピクセル数が荒くなります。どっちがいいんだろ?なので APS-C を撮影に使っている方も多いようです。その点天体撮影に特化した CMOS カメラ、ASI462MC は画素ピッチが D750 の半分程度なので、惑星をより高解像度に撮影することが可能です。画素が小さい分のノイズはスタックすればさっ引くことができるので多分いいんですね。ただセンサーのサイズそのものがフルサイズよりは小さいので撮影範囲が小さいです。月の拡大には使えますが、星雲系には全然使えないです。D750 の動画撮影機能はどうしても圧縮されたフォーマットしかないので、あんまり嬉しくないというのもありました。また SharpCap からコントロールできない(できなくはないようですが僕はできていない)のも使いにくい点です。ASI462MC は生データが得られるので天体撮影には間違いなく有利です。



バローレンズ・レデューサー

  • SVBONY x2
  • SVBONY x3
  • SVBONY x0.5
一昨年天体写真を撮り始めた頃は、接眼レンズを挟んで D750 を MAK127 に接続していましたが、最近はなにも間に挟まない直焦です。バローレンズはお試しで x2 買ったのにはじまり、もっと拡大したくて x3 (望遠鏡の口径次第であまり拡大しても意味ない)を追加で。ASI462MC に付けて使っています。またMAK127 でも広範囲を撮ってみたくて x0.5 のレデューサーも買ってみましたが、レデューサーは周囲が歪むのでイマイチかな。。

レンズ

  • Nikon AF-S NIKKOR 28-300mm f/3.5-5.6G ED VR 
D750 のレンズ他多数。24mm, 35mm, 50mm, 12-24mm(DX) など持ってますが、上記を主に使ってます。あまり天体写真に良いレンズとは思いませんがこれしか焦点距離長いの無いので。


その他アイテム

  • ZWO ADC 1.25''
大気分散の影響を避けるためのプリズムが入ってます。主に惑星の撮影に使います。AZ-GTi だと調整中に望遠鏡が揺れるのでとても調整しづらいです。

撮影

AZ-GTi は月を撮影するときは全く制御しなかったりします。スチルでも動画でも。セットするの面倒なので。それ以外の時はちゃんとアライメントとって自動追尾させます。しかし暴れることしばし。。

撮影に使うソフトは ASI462MC は SharpCap、D750 は digCamControl を使用しています。APT (Astro Photography Tool)も入手したけど使いこなせておらず。APT は D750 もコントロールできていいんですけどね。D750 でスチル一枚を撮るだけの時と、動画を撮る時(今はやらない)のときはソフト使いません。ブレないようにレリーズは使います。

  • D750 + NIKKOR 28-300mm (スチル一枚撮り)
  • D750 + Icarus-6M (スチル一枚撮り)
  • D750 + MAK127 (スチル一枚撮り、動画)
  • ASI462MC + MAK127 + 直焦, x2, x3 バローレンズ (動画)
色々な撮り方しています。スチル一枚撮りではシャッタースピードもだいぶ速いので、三脚だったり、AZ-GTi に載せても電源いれてなかったりします。動画も30秒ぐらいならありかと。ASI462MC を使った場合はだいぶ拡大になるので自動追尾させながら撮影し、部分、もしくは全体モザイク合成をします。




惑星(木星、土星、火星、金星)

  • ASI462MC + MAK127 + x3 バローレンズ + ADC (動画)
この組み合わせしかありません。D750 では倍率を上げるため、接眼レンズと組み合わせて動画を撮っていましたが、ASI462MC の方が遥かに良いので D750 では撮影しなくなりました。



星雲星団系

  • D750 + NIKKOR 28-300mm (スチル一枚撮りを複数)
  • D750 + MAK127 (スチル一枚撮りを複数)
MAK127 に D750 直焦はちょっと倍率高いので対象が絞られます。M42 ではみ出る。また一枚どりでもこちらは数秒を数百枚レベルなので、AZ-GTi で自動追尾させます。経緯台モードなので像が回転してしまうのが難点ですが、DeepSkyStacker がそんな画像でもスタックしてくれるので真ん中は使えます。お試しで少ない枚数を撮って重ねるだけなら普通の三脚で固定もありかなと思います。 


こうしてみると、とりあえず星雲星団系撮るレンズが無い。。28-300mm は周囲歪むんですよ。星が点にならずに放射状になる。多分レンズのせいです。普段使いでは便利なんですが。




私家版 天体写真の処理 (2021年度版)


一昨年から始めた天体写真の 2021年度に主にやっていた方法まとめ。一昨年は本当に手探りでした。そもそも都心の家から出ずに撮った画像からどんなものが出てくるのか皆目わからなかったので、ステライメージのような商用ソフトに手を出す前に、フリーのツールでできる範囲でということを主眼に置いてます。もちろん他にもいい方法やツールはあるとは思いますので、良い方法見つけたら試していきたいと思います。また本当は Mac で全部やりたいんですが、現状 Bootcamp の Windows で完結してます。M1 Mac も欲しいけど悩ましい。。

月、惑星の処理

基本的には動画をスタックして、ウェーブレットで強調処理をかけています。ただし月に関してスチルで一枚撮りの場合は、ウェーブレットで強調処理かけておしまいにする場合もあります。楽ちんなので。その場合強調処理をしたいとき、フォトショ系ツールで強調するよりパリッと仕上げやすい気がします。その後フォトショ系のツールで色味などを整えています(面倒なので iPhone だったりする。でも優秀)。元画像は RAW だったり、動画の方も非圧縮とかとにかく高画質なものの方がいいです。あと飽和すると画素データが消失するので、ちょっと暗めに撮っておくといい感じかと思います。


スチルの処理

ウェーブレット変換の機能のみを Registax6 で行ってるだけです。スチルを一旦 TIFF フォーマットに変換して、それに対して Registax6 に読み込ませます。だいたいレイヤー2,3あたりのスライダーと Sharpen, Denoise あたりをいじってます。Registax6 の出力フォーマットは 16bit の PNG にしてます。他のフォーマットも出せますが、TIFF はでかく、JPEG は非可逆の圧縮がかかるので、とりあえず PNG にしてます。
月を撮るときは ISO感度は低めでシャッター速度もかなり速くできます。

動画の処理

惑星(金星、火星、木星、土星など)の処理と月で使うツールは同じです。Autostakkert! でスタック処理をして、TIFF を出力、Registax6 でウェーブレット変換での強調処理をおこないます。スタック処理しただけではモヤっとした感じでもウェーブレットで強調処理をすると詳細が浮かび上がってきます。Autostakkert! の受け付ける動画フォーマットは制限があるので、対応しない MOV などは PIPP などのツールでフォーマットの変換をする必要があります。SER などの劣化しないフォーマットを選びます。また PIPP は自動追尾していてもしていなくても対象が画面上フラフラしている(風だったり振動だったり追尾エラーだったり)のをセンタリングして切り出す機能や、画質の悪いフレームを削除する機能があるので併用したりします。Autostakkert! にもセンタリングする機能はあるのですが、PIPP でセンタリングした方が良い場合があります。月の拡大撮影の場合は PIPP よりも Autostackkert! でアンカーに固定した方が良い時もあったりします。スタックしたあとの Registax6 の操作はスチルと特に違いはありません。
動画は時間にして30秒程度で1500枚程度の画像が得られ、それだけあれば十分な感じです。大気の揺らぎによるシーイングの補正に有効なんだと思います。またシーイングが良いのは正義で、月でも惑星でも段違いの解像度が得られます。

星雲/星団の処理

オリオン大星雲、アンドロメダ銀河などの処理の仕方です。複数のスチル写真をスタックして画像を得ます。
DeepSkyStacker を使っています。長時間?露光したスチルを数枚〜数百枚レベルでスタックします(総露出時間は数十分〜数時間になるぐらいで効果が出てくるようです。複数の日に撮ったデータを合成する方もいるようです)。JPEG も対応していますが、RAW の方がいいよとツールに言われます。多少時間によってずれたり回転したりしていても写っている星を頼りに移動/回転をかけながらガンガンスタックしてくれます。撮影条件(温度含む)が同じでレンズキャップをしたまま撮るノイズ除去用のダークフレームや、周辺減光を補正するためのフラットフレーム(撮り方色々ですがPCの液晶にグレーを表示させて撮ってます)は無くてもスタックしてくれます。スタック後にトーンカーブのようなものをいじって光害をカットしつつ星雲/星団を浮かび上がらせるよう補正をかけて炙り出します。一昨年もチャレンジしたのですが、元画像の解像度、ピントなどさまざまな要因はあるものの、イマイチ炙り出し方がわからなかったのが一番の原因だったんだなと思います。
長時間露光をすればスタックに使う枚数は減らせますが、そもそも都内で撮影すると30分なんて長丁場の露出画像を得ることは難しく、そもそも自分の場合赤道儀を持ってないのでそんな撮影もできません。短時間露光(数秒程度)で枚数を稼ぐやり方を知ったのですが、短時間露光なら飽和もしないし星も流れないし、赤道儀じゃ無くてもどうにかなるので(弊害はありますが)、都心で撮るなら一石二鳥?なのでお試し中です。

スタック処理後の追加処理

スタック後に複数の画像から一枚の画像を生成するモザイク合成と、複数の画像からデローテーションする方法について。適用できる種類は限られますが、更なる高解像度を得る手法です。


モザイク(パノラマ)合成

Image Composite Editor2 を使って先程の動画処理で得られた月の拡大画像などを繋げて一枚の画像にすることができます。月全体を一枚で撮るより更に高解像度のデータが得られます。星雲、星団系でも複数の画像を繋いで大きなものにするケースがあるようで、このツールが使われることもあります。

デローテーション

WinJUPOS という惑星の回転を考慮してスタックしてくれるツールを使います。土星などにも使えるようですが、木星を処理する際に有用です。木星の自転はとても速く、撮影中に刻一刻と回転していく様子がわかります。複数の時間差で撮った動画から得られたスタック結果を WinJUPOS にかけることにより、更に鮮明な画像を得ることができます。

処理画面例

Registax6

PIPP

Autostakkert!

DeepSkyStacker (補正前)

DeepSkyStacker (補正中)

Image Composite Editor2


ツール一覧

* Image Composite Editor2 は Microsoft が公式に配布をしなくなったので、別のところからダウンロードする必要があります。上記天文ガイドのリンクから辿って下さい。

2021/12/04

Tang Primer (EG4S20) の ADC を使ってみる

はじめに

RISC-V に興味があって Tang Primer を買ったのが 2020年5月頃。ADC をいじろうとするも、やりかけてお蔵入りに。記憶あいまいだけどある程度のところまで進んでました。安価な Tang Primer の ADC も使えるようになれればいいなということで、とりあえず今回は実際に動かすところまでやってみました (2021年11月末)。
そういえば当初は家にある激安電子ドラムのカスタマイズに使おうと思ったんだっけ。なんもしてない。。

Tang Primer

Anlogic の EG4S20 を搭載した Sipeed の FPGA 開発ボードです。
国内だと、スイッチサイエンスさんや、Shigezoneさんで入手できます。

使い方は Tang Primer の上記 URL の Getting Started を見ていただければ。あとはググれば試されている方の情報見つかります。本もあるようですね。

EG4S20  の ADC


EG4S20 の ADC は 8-channel 12-bit 1MSPS ですが、詳細はデータシートをみてみます。
データシートは以下からダウンロードできます。
以下、Eagle_DataSheet_V2.8_english.pdf から抜粋しました。

電気的特性


ADCモジュールの端子機能


タイミングチャート


以上です。

VREF は Tang Primer では 3.3V 固定です。従って 0-3.3V が 0-4095 に対応します。またADC のクロックは最大 16MHz。16 cycle で変換終了するので、ちょうど 1MSPSになります。

動作は SOC に 1パルス与えると動作開始で、EOC 1パルスでれば終了です。チャネルの選択は SOC より前に選択して EOC が立つまで保持ということかな。アナログのマルチプレクサの切り替えになると思うので早めに切り替えておくに越したことはないと思います。

Sampling Pulse と書かれている部分は多分、Sample/Hold 回路が開いている時間だと思うのですが、ここの長さは制御できないようです。まぁ、中の回路はクロック同期なんでしょうから、例えばこの期間のクロックを伸ばせば多分時間延ばせるのではないかと思います。なのでちょっとしたクロックゲーティング回路を足せば実現できるのでは?でもEG4S20に CG (Clock Gating)セルなんてあるんでしょうかね。Latch と AND または OR で作れなくはないけどタイミング合うかな。。

ADC IP Core の生成

RTL を書く前に IP core を生成します。とはいっても ADC のモジュール EG_PHY_ADC の有効にしたいチャネルを入れたラッパーをインスタンスするだけのようです。手置きしても大丈夫っぽいですが、Generator を使います。EG_PHY_ADC はパラメータで各チャネルのEnable, Disable を切り替えるようです。

EG4S20 _DataSheet_V1.5_english.pdf の 4.1 Special IP use にごく簡単に生成方法が書かれています。有効にしたいチャネルを選択するぐらいです。途中 File (ファイル名)と Component name (module 名)を指定するところがあります。adc など何でもいいとは思いますが、同じ名前にしておいてもいいでしょう。好みですが。あと Add to project ウィンドウでプロジェクトに入れる?と確認するところはチェックを入れてOKしておけばプロジェクトに取り込まれます。ファイルはデフォルトでプロジェクトのフォルダの下の al_ip フォルダ以下に置かれます。

選択したチャネルのピンアサインは固定で、IO Constraint で与えることはできません。また選択したチャネルにアサインされたピンは、IO Constraint から他の機能にアサインできなくなります。TD (Tang Dynasty) の HDLBit Flow で Optimize RTL まで実行すると IO Constraint で選択できるピンから消えます。

Tang Primer の端子アサインについては、sipeed-tang-primer-pins.pdf で確認できます。

SPI + ADC の仕様

ADCの動作を確認するため、SPI client?(今どきはなんとよべば) I/F をくっつけてみます。SPI は CPOL=0, CPHA=0 のモード0 で。ビット幅は 16bit とします。お手軽に SS が下がったら ADC を起動して、5bit 目から ADC 12bit の結果を MISO(いやこのネーミングもどうすれば。。)に出力します。ADC の結果は符号なしなので、とりあえず最初の上位 4bit は 0 出力で埋めておきます。ちなみに ADC 終了の eoc は見てません。SPI のクロックが早すぎると間に合いません。


タイミングチャートは Google のスプレッドシートでw

クロックは Tang Primer のボードには 24MHz の Xtal が載ってます。これから 16MHz 以下の ADC clock を作ればいいので 1/2 分周して 12MHz のクロックを ADC に与えることにします。この条件で SPI は 2MHz 程度で動作します。

端子アサインは以下の通りにしました。
N11: ADC0 (ADC 入力)
K14: CLK_IN (24MHz Xtal)
C15: MISO
C16: MOSI (使いません)
B16: SCLK
B15: SS
K16: XRES_IN (Tang Primer の USER スイッチ。プルアップされてます)

Simulation

回路が出来たので検証します。ADC モジュールのビヘイビアがあるのでそれを利用します。
ビヘイビアは以下の場所にあります(Windows の場合)。

C:\Anlogic\TD4.6.4\sim

TD でテストベンチのトップとか、Model Sim 用の do ファイルとか作ってくれるのですが、自前でテストベンチ用意して、Icarus verilog (iverilog) で検証してみました。

ところで ADC モジュールのビヘイビア、eg_phy_adc.v の中身を見ると、Channel select signal s に与えた値を dout に出す仕様のようです。s のチェックにはなるのですが、SPI 含めてデータがちゃんと通るかどうかを見るために、テストベンチでは ADC の出力データを決めている sample_B を外からフォースしてシミュレーションしてみます。1bit だけ立てて SPI で読み込み、を 12bit 繰り返します。

GtkWave

うまくいってるようです。よしよし。

論理合成と書き込み

端子アサインは FPGA Flow の User Constraints -> IO Constraint から指定して、適当な名前で保存しておきます。



タイミング制約は FPGA Flow の User Constraints -> SDC Constraint で作成。途中経過出すと長くなるので、作成した制約の中身は以下のような感じ。create_clock だけやっときました。


合成は緑の丸に三角のボタンで。あっという間です。特にバイオレーションとかもないので、下矢印のアイコンをクリックして書き込みです。イレースして、Flash に書き込みます。

動かしてみる

合成結果を書き込んだ Tang Primer を実際に動かしてみます。
ADC の入力はパルジェネとか安定化電源持っていないので、M5Stack の DAC を使って生成しました。12bit の ADC に対して 8bit の DAC では役不足だし、正確な出力も作れず、校正された計測機器は持ち合わせていないので、ファンクション確認程度になります。
また Tang Primer に実装した ADC は SPI I/F を持っているのでもう一つ用意した M5Stack で SPI をポーリングで動かして ADC のデータを取り込んでみました。
DAC の出力は Faces に付けたエンコーダーパネルでグリグリすると変わるのがわかると思います。だいたい。。同じ値ということで。

 

今回お試ししたデータ

Git に上げておきます。


RTL 検証・合成環境


RTL

src, al_ip フォルダに入っています。
adc_top.v
トップレベル階層です。adc_core と spi がインスタンスされています。
spi.v
SPI I/F 部分です。
adc_core.v
EG_PHY_ADC をインスタンスしています。

テストベンチ

simulation フォルダに入っています。
tb_spi_test.v
テストベンチのトップです。adc_top.v をインスタンスしています。
run_spi.bat
テストベンチ実行用バッチファイルです。実行すると iverilog でシミュレーションを走らせて検証を行います。tb_spi_test.vcd が生成されますので、GtkWave などで波形を確認できます。

実行環境

Windows10 で実行しました。
TD 4.6.4 64-Bit
Verilog simulation iverilog 11.0 (devel)
VCD 波形表示 v3.3.100

M5Stack プログラミング環境


m5stack フォルダに入っています。
ADC_SPI_IF.ino
Tang Primer と SPI 接続する側です。ポーリングした結果をディスプレイに表示します。
SCLK(G5), MISO(G17), MOSI(G16), SS(G22)
MOSI は使っていません。
DAC_Controller.ino
Tang Primer の ADC の入力信号を DAC で作ります。Faces のエンコーダーパネルを使う前提のコードです。出力中のデータを画面に表示します。
DAC1(G26)

Arduino IDE 1.8.13 で確認しています (なぜかこちらは Mac で。Windows でもきっと問題ないです)。M5Stack ディレクトリに .ino ファイルを置いています。
SPI master (MOSI はいらない) と DAC がそれぞれひとつずつ使えればいいので、M5Stack シリーズならほぼなんでもいいと思います。多少書き換えは必要とは思いますが。エンコーダーパネルを使いましたが、ボタンで値の上下でもいいですね。