• Welcome to Forum Astronomskog Magazina. Please login or sign up.
 

DIY: WiFi dongle za SynScan

Started by CyberianIce, November 07, 2021, 09:57:31 pm

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

CyberianIce

Pricali smo nedavno o slicnim stvarima pa pomislih bas sam mnogo toga pravio a nista nisam ni dokumentovao ni podelio sa svetom, pa evo da opisem kako sam resio WiFi dongle.

Posto AstroEQ radi na Synta kompatibilnom protokolu, softveri ga vide kao SkyWatcher teleskop te tako i komuniciraju sa njim. Kada je povezan preko USB-a na racunar, SynScan Pro aplikacija ga prepoznaje i sve komande izvrsava uredno. Medjutim da bi to isto bilo moguce raditi i na SynScan aplikaciji sa telefona, potrebno je konektovati se na mehaniku putem bezicne mreze. Zato se koristi onaj njihov WiFi dongle, koji je u stvari transparentni WiFi serial bridge. On slusa na portu 11880/UDP ekskluzivno i provlaci AT komande napred-nazad sa i na serijski interfejs a SynScan aplikacija ima daisy chain na portu 11882/TCP kako bi se na nju dalje mogao nakaciti neki planetarijum softver (npr Stelarijum u mom slucaju).





Postojali su neki slicni projekti, ali za moj konkretan slucaj nisu radili pa sam bio slobodan da ih malo modifikujem. Oni su pisani za NodeMCU a posto ja koristim Wemos D1 Mini. Evo to radi na 3.3V a na drugom kraju je Arduino Mega 2560 koji radi na 5V logiki, morao sam dodati TTL šifter. Ti raniji projekti su koristili swapped pins (UART na pinovima GPIO13 i GPIO15, kako bi se izbeglo slanje smeca u pravcu mehanike tokom butovanja?) medjutim sa TTL shifterom na ovim pinovima Wemos uopste nece da se butuje, i posle minut-dva potpuno crkava (mozda Wemos nema interni pull-up na RX?). Zato u ovom kodu koristim standardne UART pinove RX/TX i sve radi fino.  Jedino je vazno napomenutu da ESP8266 hoce da povuce i do 660mA pa ga nikako ne treba napajati preko arduinovog 5V pina, vec na neko zasebno napajanje.


Šema:



#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

#define mountBaudRate 9600

#define bufferSize 8192
#define SerialBufferSize 64

#define WiFi_Access_Point_Name "SynScan_WiFi_1234"
#define WiFi_Password "password"
#define udpPort 11880
WiFiUDP udp;
IPAddress remoteIp;
int UDPremoteudpPort;

uint8_t udpBuffer[bufferSize];
uint8_t udpIndex = 0;
char udpMessage[bufferSize];
char serialBuffer[SerialBufferSize];
uint8_t serialIndex = 0;

byte data = 0;
bool Wificommand = false;
boolean ignore = false;

void setup() {
  delay(5000);
  Serial.begin(mountBaudRate);
  WiFi.mode(WIFI_AP);
  IPAddress ip(192, 168, 4, 1);
  IPAddress subnet(255, 255, 255, 0);
  WiFi.softAPConfig(ip, ip, subnet);
  WiFi.softAP(WiFi_Access_Point_Name, WiFi_Password);
  udp.begin(udpPort);
}

void loop() {
  int packetSize = udp.parsePacket();
  int SerialSize = 0;
  if (packetSize > 0) {
    remoteIp = udp.remoteIP();
    UDPremoteudpPort = udp.remotePort();
    udp.read(udpBuffer, bufferSize);
    for (int j = 0; j < packetSize; j++) {
      udpMessage[j] = udpBuffer[j];
    }
    if (udpBuffer[0] == 58) {
      Wificommand = false;
    } else {
      Wificommand = true;
    }
    if (Wificommand == false) {
      Serial.write(udpBuffer, packetSize);
      ignore = true;
      delay(15);
    } else {
      udp.beginPacket(remoteIp, UDPremoteudpPort);
      udp.write("+CWMODE_CUR:1");
      udp.endPacket();
      yield();
      delay(10);
      udp.beginPacket(remoteIp, UDPremoteudpPort);
      udp.write("OK");
      udp.endPacket();
      yield();
    }
  }
  SerialSize = Serial.available();
  if (SerialSize > 0) {
    serialIndex = 0;
    for (int i = 0; i < SerialSize; i++) {
      char data = Serial.read();
      serialBuffer[serialIndex] = data;
      serialIndex++;
    }
    byte firstChar = serialBuffer[0];
    if (firstChar == 61 || firstChar == 33) {
      udp.beginPacket(remoteIp, UDPremoteudpPort);
      for (int j = 0; j < SerialSize; j++) {
        udpMessage[j] = serialBuffer[j];
      }
      udp.write(serialBuffer, serialIndex);
      udp.endPacket();
      yield();
      serialIndex = 0;
    } else {
      yield();
      serialIndex = 0;
    }
  }
}


SynScan Pro aplikacija ima par prednosti. Jedna od njih je sto GoTo pokrete uvek za vrsava sa N i E. Ako je objekat u pravcu W i S, ona ga namerno promasi za nesto sitno, da bi ga vratila nazad finim pomerajem uvek sa N i sa E. To za koliko ce da ga masi se jos moze podesavati u zazorima. U svakom slucaju meni nije narocito interesantno posto umesto zupcanika koristim ozubljeno remenje, ali mi je
interesantno sto ima korekciju za Polar Alignment poput one u OnStep-u. Nakon inicijalnog alignmenta, odmotace teleskop tamo gde bi neka zvezda trebala biti u centru, pa ako nije u samom centru pomocu Alt i Az podesavanjima mehanike moze da se dovede i time se navodno useveravanje dodatno poboljsava.

Pre ovoga sam koristio ESP-Link, ali on ne radi na UDP-u pa SynScan aplikacija nije mogla da ga vidi. On je jedino radio kao VCOM (preko USR-VCOM). A ova stvar moze da radi i jedno i drugo, ako out of box, uz minimalan dodatak u kodu ce sasvim sigurno moci.

https://github.com/CyberianIce/SyntaWiFi
Telescopius
AstroBin
Sky-Watcher 200P | Meade Instruments DS2090 | Tair-3-Phs | Celestron CG-5 | OnStepX | Canon EOS 600D AstroMod | ZWO ASI120MM-S