プロフェッショナル・アンテナローテータコントローラ ─ 衛星追跡ソフトとのシームレス連携(EasyComm IIプロトコル対応)
必要な部品と材料
| Arduino UNO | ×1 |
| ロータリーポテンショメータ(汎用、最大1kΩ、500Ω推奨) | ×2 |
| ロータリーエンコーダ(プッシュボタン付き) | ×2 |
| ブレッドボード(汎用) | ×1 |
| リレーモジュール(汎用、2モジュール×2リレー NO-COM-NC) | ×2 |
| パワーMOSFET Nチャネルモジュール(最小12V/3A) | ×2 |
使用するアプリとオンラインサービス
- Arduino IDE
プロジェクト概要
最新更新:2021年11月
趣味で始めたプロジェクトが、本格的な機器へと進化しました。
このコントローラは、2つのロータリーエンコーダ(方位角Azimuth、仰角Elevation)による手動アンテナ位置決めに加え、USBでPCに接続して衛星追跡ソフトから自動追尾制御が可能です。
- EasyComm IIプロトコル / 9600ボーレート対応の全追跡ソフトと互換:PstRotator、WXtrack、HRD、MacDoppler、WXtoIMGなど
- OrbitronともDDEプラグイン(tripsintech.com)で直接連携
- シリアル出力で実アンテナ位置を返すため、追跡ソフト側で実位置を画面表示可能(現状PstRotatorのみ対応確認)
- ライブラリ非依存(LCD用を除く)、添付回路図のピン配置通りに動作
- 方位角エンコーダのボタンを押すと全動作即時停止、方位角コマンドが10度ステップで設定可能
DCモータ版とACモータ版(リレーのみ)の2バージョンを用意。後者は市販アンテナローテータとインターフェース可能です。
DCモータ版の特長:ソフトスタート/ソフトストップ
PWM出力で滑らかなアンテナ駆動を実現。目標角度と実角度の誤差に比例した電力出力を行うため、起動時は徐々に加速、目標接近時に減速して完全停止します。調整可能なデッドゾーン(微小な目標ズレでは動作しない)も備えています。

ACモータ版でもソフトスタート/ソフトストップを実現するベータ版があります(ACディマーモジュール使用、現在方位角のみ対応)。試したい方はメールでご連絡ください。
180度仰角システム用バージョン、0.1度精度版もありますが、後者は極めて安定したポテンショメータ読み取りと堅牢な構造が必要なため非推奨です。詳細は私のWebページで公開中。
キャリブレーション手順(必須)
- ポテンショメータキャリブレーション:0-359°/0-90°の正確な読み取りを保証。使用するポテンショメータの種類に関わらず必須。
- モータキャリブレーション:ソフトスタート/ストップ機能のチューニング用。デフォルト設定が気に入らない場合のみ実施。
詳細な解説は動画とWebページを参照。コードは改良を重ねているため最新情報はWebページで確認を。ご質問は YO3RAK@gmail.com まで(このプラットフォームではコメント通知が来ないため)。フィードバック大歓迎です!
スケッチ
DCモータ版(2021年11月版・ソフトスタート/ストップ対応)
/* AZ/EL Antenna Rotator controller for Arduino - DC motors
* Viorel Racoviteannu - https://racov.ro - YO3RAK@gmail.com
* nov 2021 - cracked the secret of Soft-Start */
#include
#include
LiquidCrystal_I2C lcd(0x27, 16, 2);
// カスタム文字:上下矢印
byte DownArrow[8] = { B00000, B00100, B00100, B00100, B10101, B01110, B00100, B00000 };
byte UpArrow[8] = { B00000, B00100, B01110, B10101, B00100, B00100, B00100, B00000 };
/********** アンテナ動作パラメータ(ここを調整)**********/
int AzMin = 1, AzMax = 1023; // 方位角ポテンショメータ最小/最大
int ElMin = 1, ElMax = 1023; // 仰角ポテンショメータ最小/最大
int AzErr = 8, ElErr = 4; // 動作しない許容誤差(デッドゾーン)
int Amax = 25, Emax = 15; // ソフトストップ開始角度差
int PwAzMin = 30, PwAzMax = 100; // 方位角モータ最小/最大電力(%)
int PwElMin = 30, PwElMax = 100; // 仰角モータ最小/最大電力(%)
/*********************************************************/
// エンコーダピン割り当て(割り込み使用)
enum AzPinAssignments { AzEncoderPinA=2, AzEncoderPinB=3, AzClearButton=4 };
enum ElPinAssignments { ElEncoderPinA=6, ElEncoderPinB=5 };
// 変数宣言多数(実角度、目標角度、PWM値、移動平均バッファ、シリアル通信用等)
void setup() {
Serial.begin(9600); Serial.setTimeout(50);
lcd.init(); lcd.backlight();
lcd.createChar(1, DownArrow); lcd.createChar(2, UpArrow);
// ピンモード設定、割り込みアタッチ、移動平均初期化、初期表示等
}
void loop() {
// 移動平均フィルタで実角度を平滑化(25サンプル)
// エンコーダ読み取り、シリアルコマンド処理
// 実角度≠目標角度なら AzimRotate()/ElevRotate() でPWM制御
// 表示更新(500msごと)、エンコーダボタンで10度ステップ切替等
}
// 以下、AzimRotate(), ElevRotate(), SerComm(), DisplAzim(), DisplElev(),
// ReadAzimEncoder(), ReadElevEncoder(), doEncoderA(), doEncoderB() 等の実装
// SerComm()では 形式のEasyComm IIコマンドを解析し、
// 照会コマンド受信時は "+実方位角.0 実仰角.0" で応答
ACモータ版(2021年8月版・ドライ接点出力)
市販ローテータと接続可能なドライ接点(ON/OFF)出力版。ソフトスタート/ストップなし、シンプルな方向制御のみ。
回路図:
キャリブレーション手順(プレーンテキスト)
ポテンショメータ限界キャリブレーション(0-359°/0-90°)
1. コード内の DisplAzim()/DisplElev() のシリアル出力行をアンコメント 2. アップロードしてシリアルモニタを開く 3. エンコーダでアンテナを方位角0°、仰角0°に動かし、表示される値をメモ(AzMin, ElMin) 4. 方位角359°、仰角90°に動かし、値をメモ(AzMax, ElMax) 5. コード冒頭の AzMin,AzMax,ElMin,ElMax にメモした値を設定 6. シリアル出力行を再度コメントアウトしてアップロード
モータキャリブレーション(ソフトスタート/ストップ用)
デフォルト設定で問題なければ不要。調整したい場合のみ: - Amax/Emax: ソフトストップ開始角度差(重いアンテナなら大きく) - PwAzMax/PwElMax: 最大電力%(速すぎれば下げる) - PwAzMin/PwElMin: 負荷下でモータが止まらない最小電力% - AzErr/ElErr: デッドゾーン(小さいほど高精度だが微振動しやすい)
回路図
DCモータ版用:

ACモータ版用:

製造プロセス
- Arduino MegaでPWM制御:プッシュボタン付きLEDフェード制御チュートリアル
- Arduino NanoとMPU-6050で作るリアルタイムジャイロスコープゲーム
- DHT11温湿度センサーで作る温度アラート – LEDとピエゾブザーで視覚/聴覚通知
- Unopad: Ableton Live連携シームレスなArduino MIDIコントローラー
- Arduinoでアイアンマンを自作:部品・センサー・手順ガイド
- Arduinoでシンプルな障害物センサーを自作 – IR LEDとフォトダイオード入門
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
- Arduino Unoと1Sheeldで作る4x4x4 LEDキューブ – インタラクティブLEDプロジェクト
- ゲーム用カスタムArduinoジョイスティックハンドルの製作
- Arduino 101で作る万歩計:DHT11温湿度センサー&LCD表示付き