2022/02/19

G-5500DCコントローラーを作ってみた

G-5500DCを便利に使うべく、インターフェースボックスを作りました。

できること

  • 角度のデジタル表示
  • AZ/ELのプリセット動作
  • PCからのコントロール (SatPC32)

今までは、リグだけはPC任せで、ペン、パドル、EL、AZの操作をしてましたが、
手放し/目線を反らさずSat通信ができるようになりました😃

動画をTwitterに投稿したところ・・・、


回路図/ソフトを希望されている方から返信をいただきました。


趣味が仕事になると楽しくなくなるので、無料で公開します。
ハードを作って、Arduino IDEでソースを書き込んでもらえば動きます。

  • シリアル通信はPC→本機の方向の通信のみで、PCへのデータ送信はありません。
  • 必要に応じてソースの改造をしてみてください。
  • ハード故障や事故には対応しません。自己責任でお願いします。

中身 (ケースはYM-150)


回路図


ソース (Arduino IDEにコピペして書き込んでください。)

  1. //
  2. // G-5500DC controller V1.1 - (c) JM2FCJ 2022
  3. // 1.0 -> 1.1
  4. // シリアル実装
  5. //
  6.  
  7. #include <Wire.h>
  8. #define OLED_ADRS 0x3C
  9.  
  10. // OLED command
  11. int DisplayON = 0x0F;
  12. int ClearDisplay = 0x01;
  13. int ReturnHome = 0x02;
  14. int CursoleOff = 0x0C;
  15.  
  16. // DIO
  17. int s4Pin = 5; // 黒スイッチ: no assign
  18. int s2Pin = 3; // 白1スイッチ: Flip Mode
  19. int s3Pin = 4; // 白2スイッチ: Remote Mode
  20. int s1Pin = 2; // 赤スイッチ: ALL STOP
  21. int s5Pin = 6; // Presetスイッチ
  22. int s5LEDPin = 7; // PresetスイッチのLED
  23. int ELDownPin = 8; // G-5500DC EL down
  24. int ELUpPin = 9; // G-5500DC EL up
  25. int AZCCWPin = 10; // G-5500DC AZ CCW
  26. int AZCWPin = 11; // G-5500DC AZ CW
  27.  
  28. // ADC
  29. int ELVRPin = 0; // ADC EL VR
  30. int AZVRPin = 1; // ACD AZ VR
  31. int ELPOSPin = 2; // ADC G-5500DC EL
  32. int AZPOSPin = 3; // ADC G-5500DC AZ
  33.  
  34. int ELVR = 0;
  35. int AZVR = 0;
  36. int ELPOS = 0;
  37. int AZPOS = 0;
  38.  
  39. int SerTargetEL = 0;
  40. int SerTargetAZ = 0;
  41.  
  42. int FlipMode = 0;
  43. int RemoteMode = 0;
  44. int PresetMode = 0;
  45. char* GotoEL = " ";
  46. char* GotoAZ = " ";
  47.  
  48. char L1[20] = ""; // OLED 1行目
  49. char L2[20] = ""; // OLED 2行目
  50.  
  51.  
  52. void setup() {
  53. pinMode(s1Pin, INPUT);
  54. pinMode(s2Pin, INPUT);
  55. pinMode(s3Pin, INPUT);
  56. pinMode(s4Pin, INPUT);
  57. pinMode(s5Pin, INPUT);
  58. pinMode(s5LEDPin, OUTPUT);
  59. pinMode(ELDownPin, OUTPUT);
  60. pinMode(ELUpPin, OUTPUT);
  61. pinMode(AZCCWPin, OUTPUT);
  62. pinMode(AZCWPin, OUTPUT);
  63.  
  64. Wire.begin(); // I2C init
  65. init_oled();
  66.  
  67. Serial.begin(9600);
  68. Serial.setTimeout(100);
  69.  
  70. attachInterrupt(0, allstop, FALLING);
  71. }
  72.  
  73.  
  74. void loop() {
  75. char SerAZ[3];
  76. char SerEL[3];
  77. ELVR = analogRead(ELVRPin) * 180.0 / 1023.0;
  78. AZVR = analogRead(AZVRPin) * 450.0 / 1023.0;
  79. ELPOS = (analogRead(ELPOSPin) - 27) * 180.0 / 890.0;
  80. AZPOS = (analogRead(AZPOSPin) - 13) * 450.0 / 907.0;
  81.  
  82. delay(100);
  83.  
  84. if(RemoteMode == 1){
  85. PresetMode = 0;
  86. digitalWrite(s5LEDPin, LOW);
  87. FlipMode = 0;
  88. if(Serial.findUntil("W", "W")){
  89. delay(10);
  90. SerAZ[0] = Serial.read();
  91. delay(1);
  92. SerAZ[1] = Serial.read();
  93. delay(1);
  94. SerAZ[2] = Serial.read();
  95. delay(1);
  96. SerEL[0] = Serial.read(); // スペースを読み飛ばすため必要
  97. delay(1);
  98. SerEL[0] = Serial.read();
  99. delay(1);
  100. SerEL[1] = Serial.read();
  101. delay(1);
  102. SerEL[2] = Serial.read();
  103.  
  104. if(SerAZ[0] != 0){
  105. SerTargetAZ = (SerAZ[0]-48) * 100 + (SerAZ[1]-48) * 10 + (SerAZ[2]-48) * 1;
  106. SerTargetEL = (SerEL[0]-48) * 100 + (SerEL[1]-48) * 10 + (SerEL[2]-48) * 1;
  107. }
  108. else{
  109. SerTargetAZ = 0;
  110. SerTargetEL = 0;
  111. }
  112.  
  113. sprintf(L1, "ELr %3d AZr %3d ", SerTargetEL, SerTargetAZ);
  114. writeCommand(0x80);
  115. for(int i=0; i<20; i++){
  116. writeData(L1[i]);
  117. }
  118. }
  119. }
  120. if(digitalRead(s2Pin) == LOW){
  121. delay(50);
  122. if(FlipMode == 0){
  123. FlipMode = 1;
  124. }
  125. else{
  126. FlipMode = 0;
  127. }
  128. }
  129.  
  130. if(digitalRead(s3Pin) == LOW){
  131. delay(50);
  132. if(RemoteMode == 0){
  133. RemoteMode = 1;
  134.  
  135. SerTargetEL = ELPOS;
  136. SerTargetAZ = AZPOS;
  137. sprintf(L1, "Waiting for Data ");
  138. writeCommand(0x80);
  139. for(int i=0; i<20; i++){
  140. writeData(L1[i]);
  141. }
  142. }
  143. else{
  144. RemoteMode = 0;
  145. }
  146. }
  147.  
  148. if(digitalRead(s5Pin) == LOW){
  149. delay(50); // 1回押しなら、PresetMode1 角度があってもPresetを継続
  150. if(PresetMode == 0){
  151. RemoteMode = 0;
  152. PresetMode = 1;
  153. digitalWrite(s5LEDPin, HIGH);
  154. }
  155. else{
  156. RemoteMode = 0;
  157. PresetMode = 0;
  158. digitalWrite(s5LEDPin, LOW);
  159. }
  160. delay(1000); // 長押しなら、PresetMode2にする 角度があったらPreset終了
  161. if(digitalRead(s5Pin) == LOW){
  162. RemoteMode = 0;
  163. PresetMode = 2;
  164. digitalWrite(s5LEDPin, HIGH);
  165. delay(100);
  166. digitalWrite(s5LEDPin, LOW);
  167. delay(100);
  168. digitalWrite(s5LEDPin, HIGH);
  169. delay(100);
  170. digitalWrite(s5LEDPin, LOW);
  171. delay(100);
  172. digitalWrite(s5LEDPin, HIGH);
  173. delay(100);
  174. digitalWrite(s5LEDPin, LOW);
  175. delay(100);
  176. digitalWrite(s5LEDPin, HIGH);
  177. }
  178. }
  179.  
  180. if((PresetMode == 1) || (PresetMode == 2)){
  181. if((ELVR - ELPOS) > 0){
  182. digitalWrite(ELDownPin, LOW);
  183. digitalWrite(ELUpPin, HIGH);
  184. GotoEL = "Up ";
  185. }
  186. else if((ELVR - ELPOS) < 0){
  187. digitalWrite(ELUpPin, LOW);
  188. digitalWrite(ELDownPin, HIGH);
  189. GotoEL = "Dwn";
  190. }
  191. else{
  192. digitalWrite(ELUpPin, LOW);
  193. digitalWrite(ELDownPin, LOW);
  194. GotoEL = " ";
  195. if(PresetMode == 2){
  196. if(((AZVR - AZPOS) > 1 ) || ((AZVR - AZPOS) < -1 )){ // AZがまだあっていないときはPreset継続
  197. ;
  198. }
  199. else{ // AZがあっていたらPresetを抜ける
  200. PresetMode = 0;
  201. digitalWrite(s5LEDPin, LOW);
  202. }
  203. }
  204. }
  205. if((AZVR - AZPOS) > 1){
  206. digitalWrite(AZCCWPin, LOW);
  207. digitalWrite(AZCWPin, HIGH);
  208. GotoAZ = "CW ";
  209. }
  210. else if((AZVR - AZPOS) < -1){
  211. digitalWrite(AZCWPin, LOW);
  212. digitalWrite(AZCCWPin, HIGH);
  213. GotoAZ = "CCW";
  214. }
  215. else{
  216. digitalWrite(AZCWPin, LOW);
  217. digitalWrite(AZCCWPin, LOW);
  218. GotoAZ = " ";
  219. if(PresetMode == 2){
  220. if(((ELVR - ELPOS) > 0 ) || ((ELVR - ELPOS) < 0 )){ // ELがまだあっていないときはPreset継続
  221. ;
  222. }
  223. else{ // ELがあっていたらPresetを抜ける
  224. PresetMode = 0;
  225. digitalWrite(s5LEDPin, LOW);
  226. }
  227. }
  228. }
  229. }
  230. else if(RemoteMode == 1){
  231. if((SerTargetEL - ELPOS) > 0){
  232. digitalWrite(ELDownPin, LOW);
  233. digitalWrite(ELUpPin, HIGH);
  234. GotoEL = "Up ";
  235. }
  236. else if((SerTargetEL - ELPOS) < 0){
  237. digitalWrite(ELUpPin, LOW);
  238. digitalWrite(ELDownPin, HIGH);
  239. GotoEL = "Dwn";
  240. }
  241. else{
  242. digitalWrite(ELUpPin, LOW);
  243. digitalWrite(ELDownPin, LOW);
  244. GotoEL = " ";
  245. }
  246. if((SerTargetAZ - AZPOS) > 1){
  247. digitalWrite(AZCCWPin, LOW);
  248. digitalWrite(AZCWPin, HIGH);
  249. GotoAZ = "CW ";
  250. }
  251. else if((SerTargetAZ - AZPOS) < -1){
  252. digitalWrite(AZCWPin, LOW);
  253. digitalWrite(AZCCWPin, HIGH);
  254. GotoAZ = "CCW";
  255. }
  256. else{
  257. digitalWrite(AZCWPin, LOW);
  258. digitalWrite(AZCCWPin, LOW);
  259. GotoAZ = " ";
  260. }
  261. }
  262. else{
  263. digitalWrite(ELDownPin, LOW);
  264. digitalWrite(ELUpPin, LOW);
  265. digitalWrite(AZCCWPin, LOW);
  266. digitalWrite(AZCWPin, LOW);
  267. GotoEL = " ";
  268. GotoAZ = " ";
  269. }
  270.  
  271. if(FlipMode == 0){
  272. sprintf(L1, "EL %3d AZ %3d ", ELVR, AZVR);
  273. if((ELPOS < -3) && (AZPOS < -3)){
  274. sprintf(L2, "Rotor - offline ");
  275. RemoteMode = 0;
  276. }
  277. else{
  278. sprintf(L2, "%s %3d %s %3d ", GotoEL, ELPOS, GotoAZ, AZPOS);
  279. }
  280. }
  281. else{
  282. if(AZPOS < 180){
  283. AZPOS = AZPOS + 180;
  284. }
  285. else{
  286. AZPOS = AZPOS - 180;
  287. }
  288. if(AZVR < 180){
  289. AZVR = AZVR + 180;
  290. }
  291. else{
  292. AZVR = AZVR - 180;
  293. }
  294. sprintf(L1, "EL* %3d AZ* %3d ", -(ELVR - 180), AZVR);
  295. if(((ELPOS - 180) < -3) && ((AZPOS - 180) < -3)){
  296. sprintf(L2, "Rotor - offline ");
  297. }
  298. else{
  299. sprintf(L2, "%s %3d %s %3d ", GotoEL, -(ELPOS -180), GotoAZ, AZPOS);
  300. }
  301. }
  302.  
  303. if(RemoteMode == 0){
  304. writeCommand(0x80);
  305. for(int i=0; i<20; i++){
  306. writeData(L1[i]);
  307. }
  308. }
  309.  
  310. writeCommand(0x20+0x80);
  311. for(int i=0; i<20; i++){
  312. writeData(L2[i]);
  313. }
  314.  
  315. contrast_max();
  316. }
  317.  
  318.  
  319. void allstop(){
  320. RemoteMode = 0;
  321. PresetMode = 0;
  322. FlipMode = 0;
  323. digitalWrite(s5LEDPin, LOW);
  324. digitalWrite(ELDownPin, LOW);
  325. digitalWrite(ELUpPin, LOW);
  326. digitalWrite(AZCCWPin, LOW);
  327. digitalWrite(AZCWPin, LOW);
  328. }
  329.  
  330.  
  331. void writeData(byte t_data)
  332. {
  333. Wire.beginTransmission(OLED_ADRS);
  334. Wire.write(0x40);
  335. Wire.write(t_data);
  336. Wire.endTransmission();
  337. delay(1);
  338. }
  339.  
  340.  
  341. void writeCommand(byte t_command)
  342. {
  343. Wire.beginTransmission(OLED_ADRS);
  344. Wire.write(0x00);
  345. Wire.write(t_command);
  346. Wire.endTransmission();
  347. delay(1);
  348. }
  349.  
  350.  
  351. void contrast_max()
  352. {
  353. writeCommand(0x2a);
  354. writeCommand(0x79);
  355. writeCommand(0x81);
  356. writeCommand(0xFF);
  357. writeCommand(0x78);
  358. writeCommand(0x28);
  359. delay(1);
  360. }
  361.  
  362.  
  363. void init_oled()
  364. {
  365. delay(100);
  366. writeCommand(ClearDisplay);
  367. delay(20);
  368. writeCommand(ReturnHome);
  369. delay(20);
  370. writeCommand(DisplayON);
  371. delay(20);
  372. writeCommand(ClearDisplay);
  373. delay(20);
  374. writeCommand(CursoleOff);
  375. delay(20);
  376. }

0 件のコメント:

コメントを投稿

1.2 GHz 直下LNA製作

以前435 MHzの直下LNAを作ってうまくいったので、調子に乗って1.2 GHzのを作り始めたのが去年の6月。1.2 GHz帯に都合の良いSAWフィルターが無く、マイクロストリップラインでBPFを構成し実測してみましたが、誘電率が正確にわからなかったので一つ目は見事失敗でした。...