/**************************************************************** NS-701 WiFi Autoguider 2016,6/25 -- 6/27 (C) 2016 NS_KIKAKU Ver1,0 2016,6/27 ****************************************************************/ #include #include #include //********************************* // NS701 pin番号定義 #define G16 16 //端子割り込み attachInterrupt に反応しなかった2015,12/12 #define G15 15 #define G14 14 #define G13 13 #define G12 12 ; #define G5 5 #define G4 4 ; #define G2 2 ; #define G0 0 // NS701 ENCODER入力 #define DEC_A G14 #define DEC_B G12 #define RA_A G13 #define RA_B G4 // NS701 オートガイド出力 #define DU G14 #define DD G12 #define RL G13 #define RR G4 // NS701 モータドライブ出力 1パルス方式 #define DEC_PLS G14 #define DEC_DIR G12 #define RA_PLS G13 #define RA_DIR G4 // NS701 I2C/DHT11 #define SCL G5 #define SDA G2 // NS701 WR スイッチ #define WRsw G0 // NS701 TLED ランプ #define TLED G15 //********************************* // 定義 #define VERSION "NS-701 WiFi Autoguider Ver1.0#" #define GVP "NS701#" #define GVN "1.00#" #define OK 1 #define NG 0 //********************************* // マクロ // NS701 オートガイド出力信号 #define bsetDU digitalWrite(DU, HIGH) #define bclrDU digitalWrite(DU, LOW) #define bsetDD digitalWrite(DD, HIGH) #define bclrDD digitalWrite(DD, LOW) #define bsetRL digitalWrite(RL, HIGH) #define bclrRL digitalWrite(RL, LOW) #define bsetRR digitalWrite(RR, HIGH) #define bclrRR digitalWrite(RR, LOW) // TLED #define bsetTLED digitalWrite(TLED, HIGH) #define bclrTLED digitalWrite(TLED, LOW) #define okLED tledtimerz =20; #define startLED tledtimerz =150; #define guideLED tledtimerz =5; //********************************* const char *ssid = "*********"; // <<<< SSID const char *password = "*********"; // <<<< パスワード #define fixedIPaddr 192,168,3,99 // <<<< 参考例、 固定IPアドレス //boolean fixedIP = true; //固定IPアドレス 有効 boolean fixedIP =false; // 無効 // provide text for the WiFi mode const char *str_mode[]= { "WIFI_OFF", "WIFI_STA", "WIFI_AP", "WIFI_AP_STA" }; // provide text for the WiFi status const char *str_status[]= { "WL_IDLE_STATUS", "WL_NO_SSID_AVAIL", "WL_SCAN_COMPLETED", "WL_CONNECTED", "WL_CONNECT_FAILED", "WL_CONNECTION_LOST", "WL_DISCONNECTED" }; //********************************* // グローバル変数 int _pcflag; int _pcsw; char* p; int result =NG; //コマンドの実行結果を入れる OK or NG //********************************* // TLED int tledtimerz; //点滅時間 ledtimer *10ms ダウンカウンタ ->0 int tledstate =LOW; //0:消灯 1:点灯 #define TLEDBLINK_TIME 5 //点滅周期を決める int blinkz; //点滅 working int tledstate_off_time =LOW; //点滅以外の状態を指定する //********************************* // Timer割り込み Ticker Ticker_timer; int timer10ms; // 10ms upタイマ int timer1s; // 1s upタイマ int t10; // working //********************************* // Telnet Server WiFiServer telnetServer(23); WiFiClient serverClient; //********************************* // _muart() Telnet serverコマンドを受信、実行する int usw; #define CMD_BUF_SIZE 32 //受信したコマンドをcopyしておく。@___#+NULL 終端に0を付ける。 char cbuf[CMD_BUF_SIZE+1]; //1文字+する。NULL文字用、文字列の終端 int cbuf_pnt; int cbuf_cnt; //cbuf コマンド文字数 #を含む char rxdt; //受信文字 #define TIMEOUT 500 //コマンド Timeout * 10ms int timeoutz; //Timeout working //*********************************************************** // WiFi接続する void connectWifi() { Serial.println(); Serial.print("Connected to SSID: "); Serial.println(ssid); // use in case of mode problem WiFi.disconnect(); // switch to Station mode if (WiFi.getMode() != WIFI_STA) { WiFi.mode(WIFI_STA); } WiFi.begin ( ssid, password ); // ... Give ESP 15 seconds to connect to station. unsigned long startTime = millis(); while (WiFi.status() != WL_CONNECTED && millis() - startTime < 15000) { delay(500); Serial.print("."); } if (fixedIP ) WiFi.config(IPAddress(fixedIPaddr), WiFi.gatewayIP(), WiFi.subnetMask()); //固定IPアドレス; Serial.println(""); // Check connection if (WiFi.status() == WL_CONNECTED) { Serial.print("IP address: "); Serial.println(WiFi.localIP()); } else { Serial.print("WiFi failed to ssid : "); Serial.println(ssid); Serial.print("WiFi password <"); Serial.print(password); Serial.println(">"); Serial.println("Check for wrong typing!"); } } // connectWiFi() //*********************************************************** // WiFi接続エラー void wifiError() { while(1) { bclrTLED; delay(300); bsetTLED; delay(300); } } //*********************************************************** // Telnet Server を実現する。 void telnet_server() { if (telnetServer.hasClient()) { if (!serverClient || !serverClient.connected()) { if (serverClient) { serverClient.stop(); //旧clientを終了する Serial.println("client_stop#"); } serverClient = telnetServer.available(); //new clientを有効にする Serial.println("new_client#"); serverClient.flush(); // clear input buffer if (serverClient && serverClient.connected()) serverClient.println(VERSION); //タイトルを表示する } } _muart(); // Telnet serverコマンドを受信してから実行する。 } //******************************************************************************************* // Telnet serverコマンドを受信してから実行する。 //******************************************************************************************* // コマンドを受信する Serial void _muart() { switch (usw) { case 0: //:を検出する if (serverClient.available() == 0) return; //受信なし rxdt =serverClient.read(); //受信1文字を読む if (rxdt != ':') return; cbuf_pnt =0; //cbuf ポインタを設定する 0,1,2... cbuf_cnt =0; //cbuf コマンド文字数 0 #を含む timeoutz =TIMEOUT; //Timeout usw =1; return; break; case 1: //コマンドをcbufに全て格納する。:は含まない。#を含む if (timeoutz == 0) { usw =0; //timeoutエラーである。 //Serial.print('T');////////// return; } if (serverClient.available() == 0) return; //受信なし rxdt =serverClient.read(); //受信1文字を読む if (! isascii(rxdt)){ //文字を検査する 文字が0x00〜0x7Fならtrue usw =0; //ASCII文字ではない return; } cbuf[cbuf_pnt] =rxdt; //cbufに受信文字を入れる if (rxdt == '#') { cbuf[cbuf_pnt+1] =char(NULL); //終端にNULL(0)を付ける 修正2016,1/2 usw =2; //コマンドを格納終了、次は実行する return; } cbuf_pnt++; cbuf_cnt++; if (cbuf_cnt == CMD_BUF_SIZE) { usw =0; //コマンドがcbufサイズをオーバした。不正コマンドである return; } break; case 2: exe_command(); //コマンドを実行する usw =0; break; default: break; } } //******************************************************************************************* // コマンドを実行する LX200,NS700コマンド //******************************************************************************************* void exe_command(){ cbuf_pnt =0; switch (getdt()){ case '#': //コマンドが空である。無効 break; case 'M': // :Mw# :Me# :Ms# :Mn# コマンド switch (getdt()){ case 'w': // :Mw#コマンド if (getdt() != '#') break; bsetRR; bclrRL; guideLED; break; case 'e': // :Me# コマンド if (getdt() != '#') break; bsetRL; bclrRR; guideLED; break; case 's': // :Ms#コマンド if (getdt() != '#') break; bsetDD; bclrDU; guideLED; break; case 'n': // :Mn# コマンド if (getdt() != '#') break; bsetDU; bclrDD; guideLED; break; default: break; } break; case 'Q': // :Qw# :Qe# :Qs# :Qn# Q# コマンド switch (getdt()){ case 'w': // :Qw#コマンド if (getdt() != '#') break; bclrRR; break; case 'e': // :Qe# コマンド if (getdt() != '#') break; bclrRL; break; case 's': // :Qs#コマンド if (getdt() != '#') break; bclrDD; break; case 'n': // :Qn# コマンド if (getdt() != '#') break; bclrDU; break; case '#': // :Q# コマンド bclrRR; bclrRL; bclrDD; bclrDU; break; default: break; } break; case '@': //NS700コマンド 書式 :@____# switch (getdt()){ case 'V': // :@V# タイトル、バージョン if (getdt() != '#') break; serverClient.print(VERSION); break; case 'L': // :@L# TLEDを点滅させる Lチカ if (getdt() != '#') break; okLED; break; default: break; } break; default: break; } } //******************************************************************************************* //******************************************************************************************* // 初期設定 //******************************************************************************************* void setup() { // Initialize UART for message print. Serial.begin(115200); while (!Serial) { ; } //*********************************************************** // portを初期化する pinMode(TLED,OUTPUT); // オートガイド信号 pinMode(DU,OUTPUT); pinMode(DD,OUTPUT); pinMode(RL,OUTPUT); pinMode(RR,OUTPUT); pinMode(WRsw,INPUT); bclrTLED; bclrDU; bclrDD; bclrRL; bclrRR; //*********************************************************** // wifiルータに接続する bsetTLED; delay(500); bclrTLED; delay(500); bsetTLED; delay(500); bclrTLED; connectWifi(); if (WiFi.status() == WL_CONNECTED) { Serial.print("WiFi mode: "); Serial.println(str_mode[WiFi.getMode()]); Serial.print ( "Status: " ); Serial.println (str_status[WiFi.status()]); } else { Serial.println(""); Serial.println("WiFi failed, push RESET button."); wifiError(); } //*********************************************************** // Telnet server telnetServer.begin(); telnetServer.setNoDelay(true); usw =0; //_muart() Telnet serverコマンドを受信、実行する Serial.println("Please connect Telnet Client"); Serial.print(WiFi.localIP()); Serial.println(" 23' to connect"); //*********************************************************** // Timer割り込み _inz_mtimer(); tledstate =LOW; //0:消灯 1:点灯 tledstate_off_time =LOW; //点滅以外の状態を指定する Ticker_timer.attach_ms(10, _mtimer); Serial.println(VERSION); startLED; _pcflag =0; _pcsw =0; } // setup() //******************************************************************************************* //******************************************************************************************* // main loop //******************************************************************************************* void loop() { telnet_server(); //Telnet Serverを実行する dspTLED(); delay(10); } //****************************************************************************** // Timer割り込み 10ms //****************************************************************************** // timer10ms++;  10ms upタイマー // timer1s++;   1s upタイマー //********************************* // 初期化 void _inz_mtimer(){ timer10ms =0; // 10ms upタイマ timer1s =0; // 1s upタイマ t10 =0; blinkz =TLEDBLINK_TIME; //点滅周期 10ms } //********************************* // Timer割り込み void _mtimer(){ // 10ms upタイマ timer10ms++; t10++; //**** タイムアウト->0 if (timeoutz !=0) timeoutz--; //**** blink時間 if (tledtimerz !=0) { tledtimerz--; blinkz--; if (blinkz == 0){ blinkz =TLEDBLINK_TIME; //点滅周期 tledstate = !tledstate; //**** TLED 点滅コントロール //dspTLED(tledstate); } }else{ tledstate = tledstate_off_time; } // 1秒タイマ upタイマ if (t10 == 100) { timer1s++; t10 =0; } } //********************************* // TLEDを表示する void dspTLED() { if (tledstate == 1) { bsetTLED; }else{ bclrTLED; } } //********************************* // cbufから、文字を取り出す。 char getdt(){ rxdt = cbuf[cbuf_pnt]; cbuf_pnt++; return rxdt; }