1. はじめにローテータをパソコンでコントロールする仕掛けを作りました もともと ローテータのコントローラ自体がリモコンな訳ですから リモコンのリモコンということになります 最近は 無線機をパソコンに接続してリモートシャックから運用されている方もかなりいらっしゃるようです となると 無線機だけではな

Similar documents

3軸加速度センサーモジュール MM-2860 書込み済みマイコンプログラム通信コマンド概要

VFD256 サンプルプログラム

データアダプタ概要

VB 資料 電脳梁山泊烏賊塾 音声認識 System.Speech の利用 System.Speech に依るディクテーション ( 音声を文字列化 ).NetFramework3.0 以上 (Visual Studio 2010 以降 ) では 標準で System.Speech が用意されて居るの

ルーレットプログラム

Arduino UNO IS Report No. Report Medical Information System Laboratory

(Microsoft Word \203v\203\215\203O\203\211\203~\203\223\203O)

プロセス間通信

ファイル操作


Microsoft Word 練習問題の解答.doc

プリンタ印字用 DLL 取扱説明書

バスケットボール

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ

かべうちテニス

ブロック パニック

ICONファイルフォーマット

ファイル監視

グラフィックス

正規表現応用

ブロック崩し風テニス

API 連携方式 外部 DLL の呼び出し宣言 外部 DLL の呼び出し宣言のサンプルコード (Microsoft Visual C#.NET の場合 ) プログラムコードの先頭で using System.Runtime.InteropServices; が必要 クラスの内部に以下のような外部 D

ウィンドウ操作 応用

Oracle Lite Tutorial

GS1-128 の描画 DLL について (ver. 2.3) 動作環境など動作環境 WindowsXP Windows Vista Windows7 Windows8/8.1 Windows10 上記 OS について すべて日本語版を対象としております 32bit アプリケーションから呼び出される

Msako技術資料 

2CH DC (PU-2709) DC DC Arduino 製作に必要な部品などを表にまとめてみましょう 用意するもの 型番など 必要数 メモ Arduino Arduino UNO R3 1 パルスを作るマイコンボード 28BYJ-48 1 ACアダプター DC5V 1 DCジャック

Mathematica で Arduino を利用する (2012 年度 ) はじめに情報工学部では全学科で Arduino を導入して フィジカルコンピューティングに関連した教育を行ってきている 電子情報工学科ではいくつかの実験演習を通じて Arduino を取り入れてきている ここでは 電子情報

ASP.NET 2.0 Provider Model 概要

Oracle Lite Tutorial

IP RFID RFID IP RFID IP RFID IP RFID IP RFID IP RFID RFID RFID RFID RFID RFID POS IP RFID i

MS5145 USB シリアル エミュレーション モードの設定

DAOの利用

C#の基本

新・明解Java入門

Userコントロール

Microsoft Word - DT-5100Lib_Manual_DotNet.doc

Java演習(4) -- 変数と型 --

コンピュータ概論

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

sinfI2005_VBA.doc

My関数の作成演習問題集

1 1 Arduino とは Arduino アルドゥイーノ は ワンボードマイコンの一種で オープンソースハードウェアであ り 組み立て済みの基板を購入することもできるほか 誰でも自分の手で Arduino を組み立てる ことができます USBコネクタでPCと接続して利用します デジタルポートとア

ピコ秒パルスレーザ基板ライブラリ (tmhidld.dll) 説明書 珠電子株式会社 2013/04/30 概要 ピコ秒パルスレーザ基板を制御するための.Net Framework 4.0 ライブラリについて説明します ユーザアプリケーション (VB.net VC.net VC#.net LabVI

CONTEC DIOプロバイダ ユーザーズガイド

電子13-06 エネメータ専用ソフト SAVER CAST for EneMeter Ver3.00設定方法.ppt

赤外線レーザー 360 距離センサ XV-11 LIDAR Sensor 取り扱い説明書 もくじ お使いになるまえに 各部のなまえと扱い方 2 使い方 (Processing GUI で使う ) 必要なソフトのインストール 3 接続方法 3 GUI の操作方法 4 使い方 ( ロボットに組み込む )

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

CommCheckerManual_Ver.1.0_.doc

Secure iNetSuite for .NET 4.0Jの新仕様について

Microsoft Word - VB.doc

CashDrawer ライブラリ API 仕様書 2014/07/09 CashDrawer ライブラリ API 仕様書 Rev / 10

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF

1. UART について UART は Universal Asynchronous Receiver Transmitter の頭文字をとったもので 非同期シリアル通信と呼ばれます シリアル通信とは 一本の信号線でデータをやりとりするために 1bit ずつデータを送出することをいいます データを受

1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )

K227 Java 2

CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x

BASICとVisual Basic

デジモード ソフト設定例 RigExpert TI-8 USB トランシーバインターフェース 取説もご熟読の上 TI-8 をご活用ください 日本語版作成 :JA1SCW 日下覚 第 1 版

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  

1. ネットワーク経由でダウンロードする場合の注意事項 ダウンロード作業における確認事項 PC 上にファイアウォールの設定がされている場合は 必ずファイアウォールを無効にしてください また ウイルス検知ソフトウェアが起動している場合は 一旦その機能を無効にしてください プリンターは必ず停止状態 (

TWE-Lite R 取扱説明書

VB プログラム Form1.vb メイン画面 Imports System.Windows.Forms.DataVisualization.Charting Imports System Imports System.Net Imports System.Net.Sockets Imports S

1. A/D 入力について分解能 12bit の A/D コンバータ入力です A/D 入力電圧とディジタル値との対応は理論上 入力電圧 0V : 0 入力電圧 +3V : 4095 です 実際はオフセットと傾きがあり ぴったりこの数値にはなりません 2. A/D 入力に使用する信号 STM32L_A

Android プログラム ガイド

スライド 1

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

倉庫番

SDC_SDIO_STM32F4 の説明 2013/09/17 SDIO インターフェースで SD カードをアクセスするプログラムのプロジェクトサンプルです FAT でファイルアクセスするために FatFs( 汎用 FAT ファイルシステム モジュール ) を使用しています VCP(USB 仮想 C

SP-1221 LIN I/F 基板 ユーザーズマニュアル 作成日 :2017 年 10 月 17 日

訂正 _ 第 1 回 1 Arduino Arduino を用意する 入力 アナログ Analog 入出力 任意の電圧を扱える 電源系 外部入力 7 12V デジタル digital 入出力 リセットボタン Low High いわゆる 01 が入出力される 通常は Low 0V GND High 5

Transcription:

Arduino で作る ローテータ用リモコン 製作メモ 2013 年 11 月 30 日 難波秀文 1

1. はじめにローテータをパソコンでコントロールする仕掛けを作りました もともと ローテータのコントローラ自体がリモコンな訳ですから リモコンのリモコンということになります 最近は 無線機をパソコンに接続してリモートシャックから運用されている方もかなりいらっしゃるようです となると 無線機だけではなくて ローテータの制御も遠隔操作したいことでしょう 冬は寒いので コタツトップパソコンで運用したいと思ったりすることもあります 簡易的なリモートシャックです 大型のアンテナだと GD2 も大きいので なるべく低速で回転させるようにしているのですが そうなると 目的の方位に達するまでに結構な時間を要します その間 ずっとローテータのボタンを押して 動きを見守るなんて とてもかったるいので Preset 動作をさせれば良いのですが 分解能が粗くて私としては我慢できません 私は 4 本のタワーを建てていて 4 台のローテータがあるのですが ローテータを回す時に 椅子から立ち上がる必要があり その時にヘッドフォンのコードが短がすぎるために いちいちヘッドフォンを外さねばならないなんていう不自由さのため パソコンでローテータをコントロールしたいと考えたのです 前置きが長くなりましたが YAESU のローテータ G-2800SDX と G-1000DXA を対象とします (G-2800SDX を 2 台 G-1000DXA を 2 台使っています ) ローテータ側にインテリジェントにするために ArudinoDuemilanove を使いました パソコン側のアプリは Visual Basic 2010 Express を用いて開発しました 2. インタフェース 2 種類のインタフェースを試しました 一つはパソコンから USB ケーブルで Arduino に接続して Arduino からローテータコントローラに接続するという簡単なものです 部品点数も少なくて製作も簡単なのですが kw クラスの電力を扱うハイパワー局では高周波が回り込んで ローテータが誤動作するという可能性があります ( 実際私の場合 リニアアンプを使用すると回り込むという現象が起きました ) 二つ目のインタフェースは回り込みを防止するために パソコンと Arduino の間をフォトカプラで絶縁する回路を設けたバージョンです このために 余分に USB シリア 2

ル変換器を設け Arduino の電源をローテータコントローラから供給してもらうように ローテータ側の一部を改造しました ( パターンを 1 箇所カットして 1 本のジャンパ配線を追加するというものです ) ハードウェア的には異なるものですが Arduino 側のファームウェアやパソコン側のアプリは全く同じものを使用します それぞれのインタフェース回路を以下に示します 回路図 1 USB インタフェース版 3

回路図 2 絶縁型シリアルインタフェース版 3 コマンドの定義パソコンからはシリアルポートを通じてコマンドを送信します コマンドを受信した Arduino は コマンドに応じた動作をし 必要な場合にはレスポンスを返信します コマンドは 5 種類です 簡単のために A/B/C/D/E コマンドとしました A コマンドは 'A' 一文字だけで CW( 右回転 ) のスイッチを ON にします B コマンドは 'B' 一文字だけで CCW( 左回転 ) のスイッチを ON にします C コマンドは 'C' 一文字だけで CW および CCW のスイッチを OFF にします D コマンドは 'D' 一文字だけで 角度の問合せをします Aruduino は角度 (000~449) およびステータス (0 1または 2) を数字 4 文字で返信します ステータスが 0 の時はローテータが停止していることを 1の時は CW 方向に回転中であることを 2の時は CCW 方向に回転中であることを意味します 例えば 4

CW 方向に回転中で角度が 273 の時は 2731 を返します E コマンドはプリセット値をロードしスタートさせます E コマンドは 数字 3 文字の角度と 'E' の 4 文字で構成されます プリセット動作が開始され ローテータが動作し始めると 方位とプリセット値の差が 5 度以内になると停止します C コマンドを受信した時にも動作を停止します シリアル通信のパラメータは次の通りとします ボーレート :1200BPS 8 ビットキャラクタ 2 ストップビットノーパリティー 4 Arduino のファームウェア Arduino について詳しい説明は割愛します インターネットで検索すると色々と紹介さ れています 要は Arduino はマイコンボードで フリーの開発環境やライブラリが提供されていて とても簡単にファームウェアのプログラミングや書き込みができるものだということです ソースコードを以下に示します /* Title: RotCtrl Description: Rotator Controller for YAESU G-2800SDX and G-1000DXA Author: H.NAMVA JH4ADK Original Issued on: 2013.11.18 Last Updated on: 2013.12.09 verion 1.01 */ const int analoginpin = A0; // Analog input pin that the potentiometer is attached to const int CW_OutPin = 2; const int CCW_OutPin = 3; char rxbuf[10]; byte rxbuflen; int TargetDir; boolean Preset; byte MotorDirection; void setup() { // initialize serial communications at 9600 bps: Serial.begin(1200); // initialize Digital Output pins pinmode(cw_outpin, OUTPUT); pinmode(ccw_outpin, OUTPUT); 5

TargetDir = 0; Preset = 0; MotorDirection = 0; void RotCW() { digitalwrite(ccw_outpin, LOW); digitalwrite(cw_outpin, HIGH); MotorDirection = 1; void RotCCW() { digitalwrite(ccw_outpin, HIGH); digitalwrite(cw_outpin, LOW); MotorDirection = 2; void RotSTOP() { digitalwrite(ccw_outpin, LOW); digitalwrite(cw_outpin, LOW); MotorDirection = 0; void loop() { byte recvbyte; int CurrentDir; int sensorvalue; int delta; if(serial.available() > 0){ recvbyte = Serial.read(); switch(recvbyte){ case 'A': // CW start RotCW(); break; case 'B': // CCW start RotCCW(); break; case 'C': // stop rotation RotSTOP(); Preset = 0; break; case 'D': // direction inquery // read the analog in value: sensorvalue = analogread(analoginpin); // map it to the range of the analog out: CurrentDir = map(sensorvalue, 0, 1023, 0, 450); Serial.print(CurrentDir); Serial.println(MotorDirection); break; case 'E': // set direction and rotate automatically // stop rotation RotSTOP(); rxbuf[rxbuflen+1] = 0; // append nul char TargetDir = atoi(rxbuf); sensorvalue = analogread(analoginpin); 6

CurrentDir = map(sensorvalue, 0, 1023, 0, 450); delta = abs(currentdir - TargetDir); if (delta >= 360) { delta -= 360; if (delta > 5){ if (TargetDir <= 75){ if (CurrentDir >= 360) { if (TargetDir > (CurrentDir - 360)) { RotCW(); else{ RotCCW(); else if (CurrentDir > 270) { RotCW(); else if (CurrentDir < TargetDir) { RotCW(); else{ RotCCW(); else if (TargetDir < 360) { if (CurrentDir > 360) { RotCCW(); else{ if (CurrentDir < TargetDir){ RotCW(); else{ RotCCW(); break; default: if (recvbyte >= '0' && recvbyte <= '9'){ rxbuf[rxbuflen++] = recvbyte; if (rxbuflen > 4) { else if (Preset){ sensorvalue = analogread(analoginpin); CurrentDir = map(sensorvalue, 0, 1023, 0, 450); delta = abs(currentdir - TargetDir); if (delta >= 360) { delta -= 360; if (delta < 5) { RotSTOP(); Preset = 0; else if ((CurrentDir > 450) (CurrentDir < 5)){ RotSTOP(); Preset = 0; 7

5 パソコン側アプリパソコン側のアプリは Visual Basic 2010 Express で作成しました ZIP 形式でプロジェクトファイルごと配布しています COM ポート番号は COM8 にプログラムで固定していますので 使用されるパソコンの COM ポートに合わせて変更して ビルドしてください アプリの画面は次のようなものです 上段の少し大きめの数字 (173 と表示 ) は方位角を示します CW ボタンを押せば時計回り ( 右回り ) に回転し CCW ボタンを押せば反時計回り ( 左回り ) に回転します Preset の角度を数値 (0~359) で設定して START ボタンを押せば ローテータが指定された方位に向かって回転し始めます Preset の角度と方位角との誤差が ±5 度以下になると停止します もしも Preset の角度と現在の方位角との誤差が ±5 度以下であれば START ボタンを押しても回転しません STOP を押すと 回転を停止します 回転中は CW または CCW ボタンの色がグリーンになります 停止すると これらの色がシルバーになります パソコン側アプリのソースコードを以下に示します 'Title: Rotator Control Panel 'Author: H.NAMVA 'Original issued on:f 2013.11.18 ver 1.00 'Last updated on: 2013.12.09 ver 1.01 Public Class Form1 Private RxBuf(1024) As Byte Private RxBufLength As Integer 8

Private strazimuth As String = "" Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim availableserialports As System.Collections.ObjectModel.ReadOnlyCollection(Of String) = My.Computer.Ports.SerialPortNames Try If availableserialports.contains(comport.portname) Then If COMPort.IsOpen Then MessageBox.Show(COMPort.PortName & " is already OPENED", "error", _ MessageBoxButtons.OK, MessageBoxIcon.Error) Me.Close() Else COMPort.Open() End If Else MsgBox(COMPort.PortName & " is not available") Me.Close() End If Catch ex As Exception Debug.Print(ex.Message & " in Form1_Load") Me.Close() End Try Delegate Sub ModifyAzimuthLabel() Sub ModifyAzimuth() Dim temp As String = "" Dim direction As Integer Dim overlap As Integer Dim motor As Integer Try direction = Integer.Parse(strAzimuth) motor = direction Mod 10 direction = direction \ 10 lblazimuth.text = direction.tostring If direction >= 360 Then overlap = direction - 360 lblaz2.text = "(" & overlap.tostring & ")" lblaz2.visible = True Else lblaz2.visible = False End If If motor = 1 Then 'CW btncw.backcolor = Color.LimeGreen ElseIf motor = 2 Then 'CCW btnccw.backcolor = Color.LimeGreen Else btncw.backcolor = Color.Silver btnccw.backcolor = Color.Silver End If TxbRx.AppendText(strAzimuth & vbcrlf) If Len(TxbRx.Text) > (TxbRx.MaxLength - 1000) Then ' サTイCズYがa 大 aきチáく-なeりe 過 sぎチêた? らc Aデf ー [ タ^をd 半? 分 a 消 A 去? すチEるe temp = Mid(TxbRx.Text, TxbRx.MaxLength / 2, Len(TxbRx.Text)) TxbRx.Text = temp End If Catch ex As Exception Debug.Print(ex.Message & "in ModifyAzimuth") End Try 9

Private Sub COMPort_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles COMPort.DataReceived Dim ModAzi As New ModifyAzimuthLabel(AddressOf ModifyAzimuth) Try strazimuth = COMPort.ReadLine() Debug.Print("data received: " & strazimuth) lblazimuth.invoke(modazi) Catch ex As Exception Debug.Print(ex.Message & vbcrlf & "RxBufLength = " & RxBufLength.ToString) End Try Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick COMPort.Write("D") Private Sub btncw_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btncw.click COMPort.Write("A") Private Sub btnccw_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnccw.click COMPort.Write("B") Private Sub btnstop_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnstop.click COMPort.Write("C") Private Sub btnstart_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnstart.click Dim preset As Integer Try preset = Integer.Parse(TxbPreset.Text) COMPort.Write(preset.ToString("D3") & "E") Catch ex As Exception MsgBox("Invalid Preset Value") Debug.Print(ex.Message & "in btnprest") End Try End Class 10

4 調整パソコンに表示される方位角とローテータコントローラに表示される方位角が一致するように調整する必要があります 次の手順で調整します 1) ローテータコントローラを操作して アンテナの方位を 360 度 ( ゼロではなくて 丁度一回転したところ ) に合わせます 2) ローテータコントローラの後ろにあるトリマ (OUT VOL. ADJ) を回して パソコン側アプリの表示が 360 になるようにします 調整はこれだけで OK です 11