ローテーター G-1000-DXAをarduinoでコントロールできないかと思い試してみることにした。
まずコントローラー背面のコネクターからさがす。
昔のマウスやキーボードについていたものと同じなのが判明。
故障したマウスからケーブルを取り使用。
配線はarduinoの7,8番(5V)を2つのフォトカプラの入力アノードに、
2つのフォトカプラの出力コレクタに1,2番(9.5V)をつなぎ、
フォトカプラ入力カソードに220ΩをはさんでGNDに
A3(アナログ入力)を4番に、
GNDはフォトカプラ出力のエミッタに、接続。
3番の回転制御端子は0-5Vを加えるとスピードが変化しますとあるが
試しにエネループ4本を接続したところ1.4Aも流れてしまい、動きも少しの間だけ早くなったがその後
動きが変になり、うまくいかなかった。
Arduinoのアナログ出力につないでもダメだったので、今のところ、つなぎ方がわからない。
アプリでの動作はスピードが遅い事以外はうまくいった。
---------------------------- arduinoのスケッチ ----------------------------------------
int analogPin = 3; //ローテーターの電圧
int RPin = 7;
int LPin = 8;
int SpeedPin = 9;
int val = 0; //電圧5V/1024の値(0-1023の整数値)
float f;
float z;
float Freqf;
int Freqval = 0;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(RPin, OUTPUT); //R
pinMode(LPin, OUTPUT); //L
digitalWrite(RPin, LOW);
digitalWrite(LPin, LOW);
analogWrite(SpeedPin, 0);
Serial.begin(9600); //9600 115200
while(!Serial);
}
void loop() {
f = analogRead(analogPin); //入力ピンの読み取り val = analogRead(analogPin);
z = f *5 / 1024; //Serial.print(z); //電圧の表示 val *5 / 1024 //Serial.print("V ");
val = (int) f; //Serial.print(val); //Serial.print(" ");
Freqf=(z-0.15)*97.74182;
Freqval = (int) Freqf; //Serial.print(" "); //Serial.print(Freqval);
Serial.println(Freqval); //Serial.println("_Degree");
delay(200);
//Serial.println("Hello,world."); //delay(1000);
String str = Serial.readStringUntil('Q');
if (str == "hello") { digitalWrite(LED_BUILTIN, HIGH); Serial.println(str); delay(2000); }
if (str == "R") { digitalWrite(LPin, LOW); digitalWrite(RPin, HIGH); delay(100); }
if (str == "L") { digitalWrite(RPin, LOW); digitalWrite(LPin, HIGH); delay(100); }
if (str == "N") { digitalWrite(RPin, LOW); digitalWrite(LPin, LOW); delay(100); }
if (str == "0") { analogWrite(SpeedPin, 0); delay(100); } //Serial.println(str);
if (str == "1") { analogWrite(SpeedPin, 51); delay(100); } //Serial.println(str);
if (str == "2") { analogWrite(SpeedPin, 102); delay(100); } //Serial.println(str);
if (str == "3") { analogWrite(SpeedPin, 153); delay(100); } //Serial.println(str);
if (str == "4") { analogWrite(SpeedPin, 204); delay(100); } //Serial.println(str);
if (str == "5") { analogWrite(SpeedPin, 255); delay(100); } //Serial.println(str);
digitalWrite(LED_BUILTIN, LOW);
}
------------------------------- Delphi6のソース --------------------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Synaser, ExtCtrls, StdCtrls, jpeg , Math;
type
TForm1 = class(TForm)
Memo1: TMemo;
Timer1: TTimer;
Label1: TLabel;
Edit_CommNum: TEdit;
btnStart: TButton;
btnStop: TButton;
edSend: TEdit;
btnSend: TButton;
Button_L: TButton;
Button_N: TButton;
Button_R: TButton;
Button_1V: TButton;
Button_2V: TButton;
Button_3V: TButton;
Button_4V: TButton;
Button_5V: TButton;
Button_0V: TButton;
Image1: TImage;
Label2: TLabel;
Edit_Degree: TEdit;
Label3: TLabel;
Button1: TButton;
Edit_Interval: TEdit;
Label_Interval: TLabel;
Edit_DegreeNow: TEdit;
Label_DegreeNow: TLabel;
Button_Sapporo: TButton;
Button_Obihiro: TButton;
Button_Asahikawa: TButton;
Image2: TImage;
Label4: TLabel;
Button_RTS_ON: TButton;
Button_RTS_OFF: TButton;
EditCOM_Other: TEdit;
Button_COM3_Start: TButton;
Button_COM3_Stop: TButton;
Button_DTR_ON: TButton;
Button_DTR_OFF: TButton;
Panel_RTS: TPanel;
Panel_DTR: TPanel;
Edit_SendString: TEdit;
Edit_Recvstring: TEdit;
Button_Test_SendString: TButton;
Button_Test_Recvstring: TButton;
Label_Test: TLabel;
procedure btnStartClick(Sender: TObject);
procedure btnStopClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure btnSendClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Button_LClick(Sender: TObject);
procedure Button_NClick(Sender: TObject);
procedure Button_RClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button_0VClick(Sender: TObject);
procedure Button_1VClick(Sender: TObject);
procedure Button_2VClick(Sender: TObject);
procedure Button_3VClick(Sender: TObject);
procedure Button_4VClick(Sender: TObject);
procedure Button_5VClick(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Button1Click(Sender: TObject);
procedure Edit_IntervalKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Button_SapporoClick(Sender: TObject);
procedure Button_ObihiroClick(Sender: TObject);
procedure Button_AsahikawaClick(Sender: TObject);
procedure Image2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Button_RTS_ONClick(Sender: TObject);
procedure Button_RTS_OFFClick(Sender: TObject);
procedure Button_COM3_StartClick(Sender: TObject);
procedure Button_COM3_StopClick(Sender: TObject);
procedure Button_DTR_ONClick(Sender: TObject);
procedure Button_DTR_OFFClick(Sender: TObject);
procedure Button_Test_SendStringClick(Sender: TObject);
procedure Button_Test_RecvstringClick(Sender: TObject);
private
{ Private 宣言 }
ser: TBlockSerial;
Degree_Now:Integer;
AutoTurn:Boolean;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
bmp: TBitmap; jpg: TJPEGImage;
begin
Left:=100;Top:=100; AutoTurn:=False;
btnStart.Click;
jpg := TJPEGImage.Create;
bmp := TBitmap.Create;
try
jpg.Assign(Image1.Picture); //jpg
bmp.Assign(jpg);
Image2.Picture.Assign(bmp);
Image1.Picture:=Image2.Picture;
finally
jpg.Free;
bmp.Free;
end;
Height:=470;Width:=536;
end;
procedure TForm1.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
Button_N.Click; Sleep(1500); btnStop.Click;
Button_COM3_Stop.Click;
end;
procedure TForm1.btnStartClick(Sender: TObject); // Start ボタン押下時
begin
if Assigned(ser) then begin Beep; ShowMessage('Not Open Comm!'); Exit; end;
ser := TBlockSerial.Create;
ser.Connect(Edit_CommNum.Text); // COM ポートの指定を伴って接続
ser.Config(9600, 8, 'N', SB1, False, False); //115200 9600
Timer1.Enabled := True;
Edit_CommNum.Color:=clLime;
{ ボーレート他の設定//Config(baud, bits: integer; parity: char; stop: integer; softflow, hardflow: boolean); virtual;
パラメーター
ボー : 接続速度を定義します。ボーレートは、1秒あたり50?4000000ビットです。(ハードウェアに依存します!)
ビット : 通信のビット数。
パリティ : 通信パリティを定義します(N-なし、O-奇数、E-偶数、M-マークまたはS-スペース)。
やめる : ストップビットの数を定義します。定数SB1、SB1andHalf、およびSB2を使用します。1,1.5,2
ソフトフロー : XON / XOFFハンドシェイクを有効にします。
ハードフロー : CTS / RTSハンドシェイクを有効にします。
}
end;
procedure TForm1.btnStopClick(Sender: TObject); // Stop ボタン押下時
begin
Button_N.Click;
Timer1.Enabled := False;
if not Assigned(ser) then Exit;
ser.Free;
ser := nil;
Edit_CommNum.Color:=clWindow;
end;
procedure TForm1.Timer1Timer(Sender: TObject); // タイマーイベント
var
buf: string; x,y:Extended; r:Integer;
begin
if not Assigned(ser) then Exit;
if not ser.CanRead(0) then Exit;
buf := ser.Recvstring(0);
if buf = '' then else
begin
Memo1.Lines.Append(buf);
Edit_DegreeNow.Text:=buf;
Degree_Now:=StrToInt(buf);
end;
x:=0;y:=0;
if Edit_DegreeNow.Text='' then else
begin
r:= StrToInt(Edit_DegreeNow.Text);
x:=144/Sqrt( (tan(DegToRad(450-r)))*(tan(DegToRad(450-r))) +1 ); //90-r
y:=Sqrt( (144)*(144) - x*x );
if (StrToInt(Edit_DegreeNow.Text) > -11 ) and (StrToInt(Edit_DegreeNow.Text) < 0 ) then begin x:=-Abs(x); y:=-Abs(y);end;
if (StrToInt(Edit_DegreeNow.Text) > -1 ) and (StrToInt(Edit_DegreeNow.Text) < 91 ) then begin x:= Abs(x); y:=-Abs(y);end;
if (StrToInt(Edit_DegreeNow.Text) > 90 ) and (StrToInt(Edit_DegreeNow.Text) < 181 ) then begin x:= Abs(x); y:= Abs(y);end;
if (StrToInt(Edit_DegreeNow.Text) > 180 ) and (StrToInt(Edit_DegreeNow.Text) < 271 ) then begin x:=-Abs(x); y:= Abs(y);end;
if (StrToInt(Edit_DegreeNow.Text) > 270 ) and (StrToInt(Edit_DegreeNow.Text) < 361 ) then begin x:=-Abs(x); y:=-Abs(y);end;
if (StrToInt(Edit_DegreeNow.Text) > 360 ) and (StrToInt(Edit_DegreeNow.Text) < 450 ) then begin x:= Abs(x); y:=-Abs(y);end;
end;
//ここに現在の方向表示、Image1に Image2の画像を入れてから針を描画 400*400 senter 197,162 地図をクリックすると回転
Image2.Picture:=Image1.Picture;
Image2.Canvas.Pen.Width:=2; Image2.Canvas.Pen.Color:=clRed; Image2.Canvas.Brush.Color:= clBlack;
Image2.Canvas.moveto(197,162);
Image2.Canvas.Ellipse(194, 159,200,165);
Image2.Canvas.lineto(197+Trunc(x),162+Trunc(y));
//Memo1.Lines.Add( Edit_DegreeNow.Text + '度 ' + IntToStr(Trunc(x)) + ' , ' + IntToStr(Trunc(y)) ) ;
if Edit_Degree.Text='' then else
begin
x:=0;y:=0;
if Edit_Degree.Text='' then else
begin
r:= StrToInt(Edit_Degree.Text);
x:=144/Sqrt( (tan(DegToRad(450-r)))*(tan(DegToRad(450-r))) +1 ); //90-r
y:=Sqrt( (144)*(144) - x*x );
if (StrToInt(Edit_Degree.Text) > -11 ) and (StrToInt(Edit_Degree.Text) < 0 ) then begin x:=-Abs(x); y:=-Abs(y);end;
if (StrToInt(Edit_Degree.Text) > -1 ) and (StrToInt(Edit_Degree.Text) < 91 ) then begin x:= Abs(x); y:=-Abs(y);end;
if (StrToInt(Edit_Degree.Text) > 90 ) and (StrToInt(Edit_Degree.Text) < 181 ) then begin x:= Abs(x); y:= Abs(y);end;
if (StrToInt(Edit_Degree.Text) > 180 ) and (StrToInt(Edit_Degree.Text) < 271 ) then begin x:=-Abs(x); y:= Abs(y);end;
if (StrToInt(Edit_Degree.Text) > 270 ) and (StrToInt(Edit_Degree.Text) < 361 ) then begin x:=-Abs(x); y:=-Abs(y);end;
if (StrToInt(Edit_Degree.Text) > 360 ) and (StrToInt(Edit_Degree.Text) < 450 ) then begin x:= Abs(x); y:=-Abs(y);end;
end;
Image2.Canvas.moveto(197,162);
Image2.Canvas.Pen.Color:=clLime;
Image2.Canvas.lineto(197+Trunc(x),162+Trunc(y));
end;
if (Edit_DegreeNow.Text = '-10') or (Edit_DegreeNow.Text = '-9') then Button_N.Click;
if (Edit_DegreeNow.Text = '418') or (Edit_DegreeNow.Text = '417') then Button_N.Click;
if Edit_Degree.Text='' then Exit;
//if Edit_Degree.Color =clWindow then Exit;
if AutoTurn=True then //手動時は以下スキップするルーチンが必要
begin
if ( Degree_Now < StrToInT(Edit_Degree.Text) ) and ( Degree_Now > StrToInT(Edit_Degree.Text) -5 ) then Button_N.Click;
if ( Degree_Now > StrToInT(Edit_Degree.Text) ) and ( Degree_Now < StrToInT(Edit_Degree.Text) +5 ) then Button_N.Click;
end;
end;
procedure TForm1.btnSendClick(Sender: TObject); // Send ボタン押下時
begin
if not Assigned(ser) then Exit;
ser.SendString(edSend.Text);
end;
procedure TForm1.Button_LClick(Sender: TObject); begin if not Assigned(ser) then Exit; ser.SendString('L'); Edit_Degree.Color:=clLime; end;
procedure TForm1.Button_NClick(Sender: TObject); begin if not Assigned(ser) then Exit; ser.SendString('N'); Edit_Degree.Color:=clWindow; AutoTurn:=False; end;
procedure TForm1.Button_RClick(Sender: TObject); begin if not Assigned(ser) then Exit; ser.SendString('R'); Edit_Degree.Color:=$AAAAFF; end; //clRed
procedure TForm1.Button1Click(Sender: TObject);
begin
//Button_N.Click; Sleep(1500);
if Edit_Degree.Text = '' then begin Beep; Exit; end;
if Degree_Now < StrToInT(Edit_Degree.Text) then begin Button_L.Click; AutoTurn:=True; end;
if Degree_Now > StrToInT(Edit_Degree.Text) then begin Button_R.Click; AutoTurn:=True; end;
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
//var X2,Y2:Integer;
begin
// if (Edit_Degree.Color=clLime) or ( Edit_Degree.Color=$AAAAFF) then begin Button_N.Click; Sleep(1500);end;
// X2:=X-197; Y2:=Y-162; //ここから角度計算して edSend.Textに入力
// Edit_Degree.Text := FloatToStr( Int( 180/3.141 * (ArcTan2(Y2, X2) + 3.141/2 ) ) );
// if StrToInT(Edit_Degree.Text) <0 then Edit_Degree.Text:=IntToStr( 270 + 90+StrToInT(Edit_Degree.Text) );
// Button1.Click;
end;
procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
X2,Y2:Integer;
begin
if (Edit_Degree.Color=clLime) or ( Edit_Degree.Color=$AAAAFF) then begin Button_N.Click; Sleep(1500);end;
X2:=X-197; Y2:=Y-162; //ここから角度計算して edSend.Textに入力
Edit_Degree.Text := FloatToStr( Int( 180/3.141 * (ArcTan2(Y2, X2) + 3.141/2 ) ) );
if StrToInT(Edit_Degree.Text) <0 then Edit_Degree.Text:=IntToStr( 270 + 90+StrToInT(Edit_Degree.Text) );
Button1.Click;
end;
procedure TForm1.Button_0VClick(Sender: TObject); begin if not Assigned(ser) then Exit; ser.SendString('0'); end;
procedure TForm1.Button_1VClick(Sender: TObject); begin if not Assigned(ser) then Exit; ser.SendString('1'); end;
procedure TForm1.Button_2VClick(Sender: TObject); begin if not Assigned(ser) then Exit; ser.SendString('2'); end;
procedure TForm1.Button_3VClick(Sender: TObject); begin if not Assigned(ser) then Exit; ser.SendString('3'); end;
procedure TForm1.Button_4VClick(Sender: TObject); begin if not Assigned(ser) then Exit; ser.SendString('4'); end;
procedure TForm1.Button_5VClick(Sender: TObject); begin if not Assigned(ser) then Exit; ser.SendString('5'); end;
procedure TForm1.Edit_IntervalKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_RETURN then Timer1.Interval:=StrToInt(Edit_Interval.Text);
end;
procedure TForm1.Button_SapporoClick(Sender: TObject); begin Edit_Degree.Text:='230'; Button1.Click; end;
procedure TForm1.Button_ObihiroClick(Sender: TObject); begin Edit_Degree.Text:='110'; Button1.Click; end;
procedure TForm1.Button_AsahikawaClick(Sender: TObject); begin Edit_Degree.Text:='300'; Button1.Click; end;
end.
-------------------------------------------------------------------------------------------------------
made by JJ8XNP 2019/10/31
■■■■■■■■■■■■■■■ローテーターG-1000-DXAの接続ケーブルの延長用ケーブル作成 2021/04/03■■■■■■■■■■■ コネクターの型番 千石電商オンラインショップ 日本圧着端子製造 (JST) ELP-06V 【4.5mm】ELコネクタ プラグハウジング 6P 日本圧着端子製造 (JST) ELR-06V 【4.5mm】ELコネクタ リセプタクルハウジング 6P 日本圧着端子製造 (JST) LLF-41T-P1.3E 【4.5mm】ELコネクタ プラグハウジング用ソケットコンタクトピン(ELP用) 日本圧着端子製造 (JST) LLM-41T-P1.3E 【4.5mm】ELコネクタ リセプタクルハウジング用ピンコンタクトピン(ELR用) 6芯ケーブル10m VCTF 6 x 0.75SQ ビニルキャブタイヤコード 灰色 電線ストア ドットコム ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■