自作ドームコントローラー リレー制御部&ドーム回転角度検知制御部 仕様案 検討

天文ドーム

1.リレー制御部
1) 使用機材
 Waveshare社 Pico-Relay-B、リレー制御はラズパイ Pico。Wifi無し。
 リレーのOn,Offは、On:電源通電、Off:電源遮断
2) 仕様
i) 前提
 a) 8リレーあるが、4リレーのみを使用
 b) ブザーは特段自分は聴こえないので対応しない
 c) RGB LED制御はしない事とする。
 d) スリット開閉は、自動停止するのでTO時間で自動Off操作を考慮。時間は60秒。
 e) 左右回転は起動と停止が必要
 f) スリット開き閉じ、ドーム左回転右回転はリレーが別(全4リレー)であるので、
  同一対象のOn、Onは出来ないように制御する。但し、Off、Offは支障なし。
 g) リレーのOn、Offの物理的な状態は読みだせない。ソフト管理のみ。
 h) Dome主制御部には定期的にKeepAlive信号を送る。
 i)PicoにはRTCが内蔵されているので利用するが、バックアップは無い。
 j) 最終的な手段として、リセットボタンによる手動リセットが出来る。
 k) 別途のハンドコントローラーでもスリット開閉ドーム回転が出来るが、その操作と
  本制御部との同期は行わない。ハンドコントローラー操作でも最終的にOffになる。
ii) 制御仕様
 a) 電源投入、リセット時の初期動作は、回転停止、スリット閉となるようにする。
  完了時全リレー Offに初期設定。5秒後USBシリアルに #SR; 送る。
 b) スリット開閉時は自動停止もあるが、Dome主制御からの停止機能を有する。
 c) 主制御部とのプロトコルは、対象装置の動作指定とする。
 d) 緊急時の対応を考慮し、Haltコマンド機能を有する。
  → 外部からのボタン操作等でGPIOピンでの操作とするかも知れない。
 e) Halt受信時は、全てのリレーを一律Off とする動作を行う。
 f) 制御プロトコルコマンドの多重処理は行わない。コマンドに優先度もなし。
  コマンド終了時にはリターンを返す。返送情報は検討。
  但し、実行結果のみであり、実行動作は継続。
 g) ドーム開閉にて、開け/閉じリレー操作中の閉じ/開けリレー操作が入った場合は、
  リレーコントローラー側で対応中開閉動作停止Offを実行し、ガード時間取った後
  当該リレーのOn操作を行う。
 h) ドーム左右回転にて、左回転/右回転操作中の右回転/左回転操作が入った場合は、
  リレーコントローラー側で対応中回転動作停止Offを実行し、ガード時間取った後
  当該リレーのOn操作を行う。
 i) 動作ロックになった折の為、WatchDog機能を持たせる。WatchDogエラー時は
  システムリセットとなる。
 j) 制御コントローラーからのリセット指示を受けられ、自立リセットを行う。
 k) Dome主制御部へKeepAliveメッセージを20秒周期にて送信する。
  ”System Restarting”送信を起点とする。
 l) Pico内にRTCを有しているので、起動時にDome主制御部からの日時時刻設定する。
  RTCはバックアップが無いため電源投入時は不定乃至は0リセット状態と考える。
  尚、Pico内で時刻を意識するのは、自動スリット閉じを行うため。
 m) GPIOピンを使い、午前0時のトリガー情報を受取り日時情報の更新検討。
 n) スリットの長時間開状態を回避するため、午前6時には自動スリット閉じを行う。
 o) ドーム回転は、回転始動後n分で自動停止(左右リレーOff)とする。
 p) 可能であれば、雨センサーのレベル情報をPicoのGPIOピンにも入れて、センサー
  検知時に自動スリット閉じとする。雨センサー劣化もあるので処理組込みのみ。
iii) USB通信仕様
 a) シリアル通信(速度:115200bps)
 b) 起動(電源On,リセット)時、リレー制御から”#SR; (System Restarted)出力
 c) KeepAliveメッセージ #SN; を20秒周期でリレー制御から通知、逆は無し
 d) 通信メッセージ仕様
 ①コマンドフォーマット:全半角 In #+Command+;
        Out #+OK+;
  スリット開  In #SO; Out #OK; 全て対応リレーは内部処理にて
  スリット閉  In #SC; Out #OK;
  スリット停止 In #SA; Out #OK;
  ドーム右回転 In #DR; Out #OK;
  ドーム左回転 In #DL; Out #OK;
  ドーム停止  In #DA; Out #OK;
  アクション停止In #HT; Out #OK;
  状態要求   In #ST; Out #OK:yyyyMMddHHmmss:ABCD;
       Outは、Pico時刻、
       ABCDはスリット開、閉、回転右、左で0/1でOff/On
       尚、スリットは開閉始動後60秒はOn状態
  時刻設定   In #TS:日時; Out #OK;
    日時情報 yyyyMMddHHmmss
  リセット実行 In #RS; Out #OK; 返送後自己リセット動作
 ②自律メッセージ
  再起動時: #SR; System Restarting.
  Keep Alive通知:#SN; System Normal running.
    指定動作中にエラー等が発生した場合。 #ER;
    このエラーは定義だけで実際には検知出来ないと思われる。
    → 多重要求でキュー満杯時に発生と想定。
iv) 実装方針
 a) 特段の処理能力を必要としないので、MicroPythonでの実装で考える。
 b) タイマー的な並行処理を想定するので、マルチスレッド実装する。又、これにより
  リレーの同時制御が発生する可能性もあるので、リレー制御はスレッド化した個別
  キュー制御(又はFIFO)で考慮する。キュー長は3程度で良いと考える。
 c) b)項により順序制御となるが、一部緊急性の高い処理(アクション停止)
  では、既存キューをリセット等して優先制御する。又は、専用処理を考慮。
 d) スリット起動は60秒タイマーで自動停止があるが、停止の安全方向への制御で
  あるので、これについては特に別対応(強制Off)は行わない。
 e) スリット動作と回転動作(リレー)は独立しているので、同時動作可能とする。

2.ドーム回転角度検知制御部
1) 使用機材
 RP2040を用いたマイコンにて制御する。候補Waveshare社 RP2040-LCD-0.96。
 RP2040(ラズパイPicoの心臓部)にはProgramableIO(PIO)があり、高速レスポンス
 での処理が可能であるので、エンコーダーのパルスカウントには都合が良い。
 このマイコンに合せて原点センサーの信号を入れて、エンコーダーのカウント数+
 原点センサーにてドームの位置を論理的に渡す制御部とする。
 RP2040-LCD-0.96にはLCDが付いているので、直接LCD上にドームスリット角度位置
 情報を表示。
2) 仕様
i) 前提
 a) マイコンへの入力は、エンコーダーのパルス信号(A相、B相)、原点センサー信号を
  入力する。
 b) 原点位置からのエンコーダー論理変換パルス数値と全周パルス数値から角度位置を算出
  する。
 c) パルス値と方向角度位置情報をLCD上に常時表示する。
 d) 外部インターフェースは、Dome主制御部のみとしシリアルIF(又はUSB)接続する。
 e) インターフェース情報は、スリット角度位置(最小単位1度又は0.5度)を基本とする。
 f) リセット時はDome主制御部から初期位置情報の通知を考慮する。
 g) 電源投入時初期位置不定の場合には手動でのドーム回転が望ましい。
 h) エンコーダーの回転による 正 負 の処理はマイコンにて判断し加減算する。
  但し、逆回転で負数値になることも想定し、初期値やリセット値を考慮とする。
ii) 制御仕様
 a) 電源投入、リセット時の動作は、初期設定完了5秒後シリアルに #SR;
  システムリスタートを送る。
 b) 初期設定時の初期状態は位置が不定であるので、当該状態表示(361度を想定)
  とする。LCD上には不定の表示(Unknown)とする。
 c) ドーム回転にて原点通過時には位置情報を全状態に関わらずリセットする。
  角度0度、エンコーダー値後記。
 d) 位置情報は 0度~359度 で1度単位とする。エンコーダー数値からの換算値にて
  小数値角度の場合は、小数点で四捨五入とする。
 e) 359度を超えても原点が分からない(360度越え)場合は、不定の状態とする。
  この状態で原点通過の場合は、0度にリセットする。エンコーダー値も初期値とする。
 f) エンコーダーの数値は右回転、左回転にて加減算する。
 g) 位置角度が1度変わる都度、角度位置情報を通知する。
 g) KeepAliveメッセージ #SN; を20秒周期で位置情報を付与して通知する。
iii) シリアル通信仕様
 a) シリアル通信(速度:115200bps、8Bit、NonParity、 StopBit1)
 b) 起動(電源On,リセット)時、位置認識制御部側から”#SR; 出力
 c) 通信メッセージ仕様
 ①コマンドフォーマット:全半角 In #+Command+; Out #+OK+角度+;
  状態要求 In #AR;Out #OK:DDD; DDDスリット位置角度、361は不定
  位置初期化 In #AS:DDD; Out #OK:DDD;
 ②自律メッセージ
  再起動時: #SR; System Restarting.
  Keep Alive通知:#SN:DDD; DDDスリット位置角度、361は不定
iv) 実装方針
 a) 内部主制御はそれ程処理能力も必要としないので、Pythonにて実装を考えたい。
  しかし、PIO対応関係でC/C++対応も考える。
 b) エンコーダー信号の論理変換は、PIOで行う事とする。単に角度増減値かも知れない。
 c) 原点検知も同様にPIOにて行う。
 d) エンコーダと原点検知を同一ステートマシンで行う場合の効果を見極め。PIOで保持
  出来る角度情報は要検討。原点からのパルス絶対値(角度でなく)も想定。
 d) PIO部は角度情報を保持できれば、内部主制御側からの読出し、及び「1度」等更新
  毎のステートマシン通知で考慮。都度更新通知の角度値については要検討。
 e) 内部主制御部にてLCD上に角度情報を表示する。

コメント

タイトルとURLをコピーしました