Premessa: questo è un post fiume, scusatemi gli eventuali errori di battitura o di composizione delle frasi che magari ho riscritto dimenticando un pezzo della vecchia versione, se trovate grossi errori od imperfezioni per favore indicatemelo in MP.Ho realizzato un semplicissimo sistema Push-To basato su ESP32 alla portata di chiunque sia in grado installare il software ArduinoIDE sul suo pc e di seguire un tutorial online per la configurazione della piattaforma ESP32.
Il sistema M5Stack è componibile in base ai componenti scelti potrebbe non essere richiesta nessuna capacità elettronica od al massimo eclusivamente effettuare qualche saldatura di interconnessione se si volesse usare i componenti da me usati.
Mi scuso in anticipo per il post logorroico ma cercherò di spiegare tutto al meglio, perchè io ho una memoria breve e se mi verranno richieste informazioni in futuro probabilmente non mi ricorderò esattamente.
Comincio dai credit:
Il sistema di basa sul codice di
M5-DSC dell'utente "anat" di cloudy night (su cui il mio utente è "av_joe")
che a sua volta si basa su
ESP-DSC dell'utente "synfinatic" sempre di cloudy night
che è un port da piattaforma Tensy a piattaforma ESP8266 del suo
TensyDSCNelle intenzioni di chi ha scritto il primo codice si andrà ad emulare il DSC Nexus II della AstroDevices che funziona in WiFi e che ad una richiesta su interfaccia seriale (virtuale) risponde il numero di tic corrispondenti alla posizione attuale dell'encoder, partendo a contare dall'accensione. In pratica è lo stesso identico sistema usato dall'Intelliscope della Orion e da tanti altri sistemi commerciali di cui potete trovare i comandi
a questo link: all'invio di un varattere "Q" il sistema risponde il numero di tic in Azimut seguito dal numero di tic in altezza.
Si potrebbe anche implementare il comando "H" che impostando sul codice il numero di Tic degli encoder lo invierebbe al software del planetario, ma visto che diverse persone potrebbero usare encoder diversi o moltiplicatori mi sembra più semplice non implementare il comando a scanso di equivoci ed errori.
Non fatevi spaventare da tutte queste sigle, sono semplicemente differenti versioni di microprocessore, più o meno potenti e/o costose.
M5Stack è una piattaforma hardware molto semplice composta da moduli impilabili nata per l'educazione e per la prototipazzione veloce senza uso di componentistica esterna, se non nel caso di alcuni moduli specifici.
Il dsc di base si compone esclusivamente del modulo M5Stack core e di 2 encoder.
Il modulo Basic Core è il meno costoso, al momento in cui scrivo su amazon cost 37€, ed è composto da una scatolina di circo 5,5cm di lato ed un paio di altezza, alimentata con USB-C, che comprende al suo interno, oltre al processore ed alle memorie, un piccolo monitor a colori, un piccolo altoparlante (che non useremo), un modulo WiFi, un modulo Bluetooth, varie porte I/O etc.

Esistono altre 2 versioni, la Grey (che contiene in più i sensori di movimento che in questo caso non ci interessano) e la Fire che contiene, oltre ai sensori di movimento non di nostro interesse, più memoria e soprattutto delle porte Grove e che costa al momento, su amazon, tra i 55 ed i 60 euro.
Io ho usato la versione basic che ha perà un problema, tutte le porte di uscita, che sono nel modulo alla base che contiene anche una piccola batterie, sono del tipo dei connettori per i prototipi, quindi senza un attacco sicuro. Per questo motivo io ho comprto un modulo aggiuntivo che si chiama "PLC Proto Industrial Board" (25€ su amazon).
Questo modulo ci fa perdere la piccola batteria, ma aggiunge delle porte aventi terminali a vite e sistema di bloccaggio per una connessione sicura, ci aggiunge anche una porta di alimentazione che accetta da 9V a 24V (oltre alla USB presente sul Core), dei sistemi di fissaggio su guida DIN (fornita) o magnete, ed al suo interno contiene una basetta millefori su cui si potrebbero installare relais o componenti elettronici. Nel caso vogliate usare questa soluzione si necessiterà di un saldatore per saldare dei fili tra le porte I/O presenti sulla basetta verso i terminali, questo è l'unico skill elettronico richiesto.

In alternativa è possibile usare la versione FIRE delCore M5Stack che comprende 3 porte Grove, 2 delle quali si possono usare per collegare gli encoder.
Come encoder si possono usare tutti gli encoder incrementali a doppia uscita A/B.
Il software utilizza il sistema di quadratura ed è quindi in grado, per esempio, tramite la sfasatura degli impulsi tra A e B (che dovrebbe essere di 90°) di leggere un encoder da 600 impulsi giro con una risoluzione di 2400 impulsi giro (PPR Pulse Per Revolution).
Io ho utilizzato 2 encoder CUI AMT102-V che hanno una risoluzione di 2048 PPR che con quadratura diventano 8192, risoluzione sufficiente per il puntamento dei nostri telescopi. La risoluzione degli encoder può essere aumentata utilizzando delle puleggie moltiplicando la risoluzione della quadratura per il fattore di moltiplicazione della puleggia stessa, per esempio in altezza ho usato una puleggia con moltiplicazione 6 che ha portato ad avere una risoluzione di 49152 PPR.
Gli encoder mi sono costati su Ebay circa 65€ la coppia più circa 22€ per i relativi connettori dupont con una 20 di cm di filo connesso. Sempre della stessa serie ci sono i CUI AMT103 che sono uguali come prestazioni ma più compatti nella forma.

Veniamo ora alla parte difficile, il software.
Per programmare il sistema serve instllare il software ArduinoIDE e caricare i moduli per gestire l'ESP32 M5Stack e gli encoder.
Per far questo vi rimando a tutorial esterni che comunque potrete cercare in rete.
A questo link trovate le istruzioni per installare Arduino IDE, configurare il Board Manager per l'ESP32 scaricando i relativi files seguendo le istruzioni per M5Core, ATTENZIONE non seguite le istruzioni per caricare le librerie di M5Stack, ma scaricatele da
questo indirizzo alla voce "M5Stack Library" che vi rimanderà a
questa pagina di GitHub dove troverete un pulsante verde con una freccia verso il basso e scritto "Code", cliccatelo e selezionate "Download ZIP" a questo punto se guardate sezione della guida per installare le librerie vedrete che alla voce ">Sketch>Include Lubrary" dotto la voce "Manage Libraries" usata sulla guida troverete la voce "add ZIP Library", selezionatela e caricate lo ZIP scaricato da CitHub, questo vi permetterà di avere le librerie aggiornate all'ultima versione.
Vi mancheranno le librerie per utilizzare gli encoder con quadratura, andate sempre su GitHub
a questo indirizzo dove troverele la libreria scritta da Paul Stoffregen per l'utilizzo degli encoder con quadratura.
Scaricate sempre premendo il pulsante verde e selezionando "Download ZIP" e caricate all'interno dell'Arduino IDE facendo, come prima, "Sketch> Include Library> Add .ZIP Libraryes" e selezionando il files appena caricato.
Ora abbiamo l'ambiente di arduino completamente installato e configurato per le nostre necessità.
A questo punto possiamo passare alla compilazione del semplice software ed al caricamento sullo M5Stack.
la versione ufficiale su Cloudy Nights era in Wifi e ve ne posterò una versione, ma io ho preferito modificarla in Bluetooth per un paio di ragioni: la prima è che ho notato che con il wifi di tanto in tanto, se la montatura restava ferma qualche minuto, il collegamento andava in una sorta di sleep e quando si cominciava a muovere il telescopio sull'app restava immobile un paio di secondi per poi saltare alla posizione corretta, cosa che mi pare non succeda con il bluetooth che sembrerebbe più reattivo, seconda problema, a mio parere più importante, il DSC genera una rete WiFi a cui collegarsi con il telefono od il tablet che si settano con il DSC come gateway, questo fa si che il cellulare/tablet non si colleghi più ad internet perchè vede una connessione WiFi attiva, non funzioneranno quindi le app che si collegano in rete e non vi arriveranno, per esempio, i messaggi Wathsapp; se usate un device android dedicato questo problema non si pone perchè comunque non necessiterebbe connessione a internet.
Ho inserito un file di immagine "
superduper.c" per uno splashscreen iniziale, dovrete metterlo nella stessa cartella del progetto arduino dopo averlo
scaricato da qui, potrete cambiare l'immagine generandone una nel corretto formato (potete vedere i parametri di immagine alla riga 13) tramite servizi online (io ho fatto così) oppure potrete toglierla, inserirò un commento nel file alle righe 4-5-6-13-14 per indicare cosa togliere nel caso non vi interessi.

Nelle righe 7 ed 8 sono definite quale porte GPIO usare per gli encoder, nella versione originale vengono usate le porte 26 e 36 in modo che nel caso si usi un M5Stack Fire si possano usare le porte Grove B per l'asse AZ e la porta Grove C per l'asse di altitudine; io le ho settate sulla 21 e 22, come era inizialmente nel progetto originale prima di renderlo compatibile con la versione Fire, perchè mettendo l'encoder sulle 26 e 36 si sente debolmente gracchiare l'altoparlante quando l'encoder si muovein quanto sono le I/O DAC/ADC.
Cominciamo quindi dalla versione Bluetooth, cliccate su "File>New" e vi si aprirà una nuova finestra all'interno della quale dovrete cancellare tutto ciò che è presente ed incollare il seguente codice:
Codice:
#include <Encoder.h>
#include <M5Stack.h>
#include <BluetoothSerial.h>
#define imgName superduper_map // Cancellare la riga se non interessa l'immagine di splash
#define PicArray extern unsigned char // Cancellare la riga se non interessa l'immagine di splash
PicArray imgName []; // Cancellare la riga se non interessa l'immagine di splash
Encoder encoder0(21, 22); // AZ axis: Ch A to GPIO21, Ch B to GPIO22 se non M5Stack Fire cambiare in 26 e 36
Encoder encoder1(16, 17); // ALT axis: Ch A to GPIO16, Ch B to GPIO17
BluetoothSerial SerialBT;
void setup() {
M5.begin(); // Initialize the M5Stack object
M5.Lcd.setBrightness(4);
M5.Lcd.drawBitmap (0, 0, 320, 240, (uint8_t *)imgName); // Cancellare la riga se non interessa l'immagine di splash
delay (8000); // Cancellare la riga se non interessa l'immagine di splash
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setTextColor(RED);
M5.Lcd.setBrightness(10);
SerialBT.begin("Super-Duper-DSC");
uint8_t mac[6];
{
M5.Lcd.setTextSize(3);
M5.Lcd.printf(" SUPER-DUPER BT\n");
M5.Lcd.setTextSize(1);
M5.Lcd.printf(" ");
M5.Lcd.setTextSize(3);
M5.Lcd.printf("D");
M5.Lcd.setTextSize(2);
M5.Lcd.printf("igital ");
M5.Lcd.setTextSize(3);
M5.Lcd.printf("S");
M5.Lcd.setTextSize(2);
M5.Lcd.printf("etting ");
M5.Lcd.setTextSize(3);
M5.Lcd.printf("C");
M5.Lcd.setTextSize(2);
M5.Lcd.printf("ircles");
M5.Lcd.setTextSize(2);
M5.Lcd.printf("\n\n Connect: ");
M5.Lcd.printf("\n\n via ");
M5.Lcd.printf("\n\n Bluetooth ");
M5.Lcd.printf("\n\n at ");
M5.Lcd.printf("\n\n Super-Duper-DSC ");
M5.Lcd.setTextSize(1);
M5.Lcd.printf("\n\n");
M5.Lcd.setTextSize(2);
M5.Lcd.printf("\n Press buttons for info");
}
delay(8000);
M5.Lcd.writecommand(ILI9341_DISPOFF);
M5.Lcd.setBrightness(0);
}
void loop() {
if (SerialBT.available()) {
while (SerialBT.available()) {
uint8_t c = SerialBT.read();
if (c == 81) { //ascii for "Q"
long encoder0Pos = encoder0.read();
long encoder1Pos = encoder1.read();
SerialBT.printf("%+06d\t%+06d\r",encoder0Pos,encoder1Pos);
}
}
}
delay(50);
if((M5.BtnA.wasPressed())or (M5.BtnB.wasPressed())or(M5.BtnC.wasPressed())) {
M5.Lcd.writecommand(ILI9341_DISPON);
delay(200);
M5.Lcd.setBrightness(10);
delay(8000);
M5.Lcd.writecommand(ILI9341_DISPOFF);
M5.Lcd.setBrightness(0);
}
M5.update();
}
Nel caso preferiate la versione Wifi
Codice:
#include <WiFi.h>
#include <Encoder.h>
#include <M5Stack.h>
#define imgName superduper_map // Cancellare la riga se non interessa l'immagine di splash
#define PicArray extern unsigned char // Cancellare la riga se non interessa l'immagine di splash
PicArray imgName []; // Cancellare la riga se non interessa l'immagine di splash
Encoder encoder0(21, 22); // AZ axis: Ch A to GPIO21, Ch B to GPIO22 se non M5Stack Fire cambiare in 26 e 36
Encoder encoder1(16, 17); // ALT axis: Ch A to GPIO16, Ch B to GPIO17
WiFiServer wifiServer(8888);
void setup() {
M5.begin(); // Initialize the M5Stack object
M5.Lcd.setBrightness(4);
M5.Lcd.drawBitmap (0, 0, 320, 240, (uint8_t *)imgName); // Cancellare la riga se non interessa l'immagine di splash
delay (8000); // Cancellare la riga se non interessa l'immagine di splash
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setTextColor(RED);
M5.Lcd.setBrightness(10);
btStop();
WiFi.mode(WIFI_AP);
uint8_t mac[6];
WiFi.softAPmacAddress(mac);
String macID = String(mac[4], HEX) + String(mac[5], HEX);
macID.toUpperCase();
String AP_Name = "SUPER-DUPER-DSC";
char AP_NameChar[AP_Name.length() + 1];
memset(AP_NameChar, 0, AP_Name.length() + 1);
for (int i=0; i<AP_Name.length(); i++)
AP_NameChar[i] = AP_Name.charAt(i);
String macAddrs = String(mac[0], HEX) + String(mac[1], HEX) + String(mac[2], HEX) + String(mac[3], HEX) + String(mac[4], HEX) + String(mac[5], HEX);
macAddrs.toUpperCase();
char AP_PwdChar[macAddrs.length() + 1];
memset(AP_PwdChar, 0, macAddrs.length() + 1);
for (int i=0; i<macAddrs.length(); i++)
AP_PwdChar[i] = macAddrs.charAt(i);
boolean result = WiFi.softAP(AP_NameChar, AP_PwdChar);
if(result == true)
{
wifiServer.begin();
M5.Lcd.setTextSize(4);
M5.Lcd.printf(" SUPER-DUPER\n");
M5.Lcd.setTextSize(1);
M5.Lcd.printf(" ");
M5.Lcd.setTextSize(3);
M5.Lcd.printf("D");
M5.Lcd.setTextSize(2);
M5.Lcd.printf("igital ");
M5.Lcd.setTextSize(3);
M5.Lcd.printf("S");
M5.Lcd.setTextSize(2);
M5.Lcd.printf("etting ");
M5.Lcd.setTextSize(3);
M5.Lcd.printf("C");
M5.Lcd.setTextSize(2);
M5.Lcd.printf("ircles");
M5.Lcd.setTextSize(2);
M5.Lcd.printf("\n\n\n SSID: ");
M5.Lcd.println(AP_Name);
M5.Lcd.printf("\n PASSWORD: ");
M5.Lcd.println(macAddrs);
M5.Lcd.printf("\n IP: ");
M5.Lcd.println(WiFi.softAPIP());
M5.Lcd.printf("\n PORT: 8888\n\n");
M5.Lcd.setTextSize(1);
M5.Lcd.printf("\n");
M5.Lcd.setTextSize(2);
M5.Lcd.printf(" Center Button for info");
}
delay(8000);
M5.Lcd.writecommand(ILI9341_DISPOFF);
M5.Lcd.setBrightness(0);
}
void loop() {
WiFiClient client = wifiServer.available(); // wait for connection
if (client) {
if (client.connected()) {
while (client.available()>0) {
uint8_t c = client.read();
if (c == 81) { //ascii for "Q"
long encoder0Pos = encoder0.read();
long encoder1Pos = encoder1.read();
client.printf("%+06d\t%+06d\r",encoder0Pos,encoder1Pos);
}
}
}
client.stop();
}
delay(50);
if((M5.BtnA.wasPressed())or (M5.BtnB.wasPressed())or(M5.BtnC.wasPressed())) {
M5.Lcd.writecommand(ILI9341_DISPON);
delay(200);
M5.Lcd.setBrightness(10);
delay(8000);
M5.Lcd.writecommand(ILI9341_DISPOFF);
M5.Lcd.setBrightness(0);
}
M5.update();
}
A questo punto cliccate sul tasto tondo "Verify" appena sopra il codice, il che lancerà la compilazione e la verifica di eventuali errori. Se in basso comparirà sulla riga verde "done compiling" e nella area nera delle scritte bianche vorrà dire che il cosice non presenta grossolani errori, se la compilazione non va a buon fine controllate di aver messo il file dell'immagine "
superduper.c" nella stessa cartella del codice oppure cancellate le righe interessate come descritto sopra, collegate quindi il vostro M5Stack al computer e premete il tasto con la freccia verso destra, ripartirà la compilazione al termine della quale caricherà il software sul DSC, se andrà a buon fine lo m5Stack restarterà mostrando l'immagine prima e le scritte poi. Se il software indica di aver completato l'operazione ma vi sembra che l'apparecchio non sia restartato premete il tasto rosso di accensione che lo resetterà.
Dovrete ora collegare gli encoder alle relative porte GPIO, M5Stack fornisce anche un 5V e massa che potranno essere usati direttamente per alimentare gli encoder stessi senza la necessità di elettronica aggiuntiva.
Di seguito le immagini del pinnout del bus o della base standard dello M5Stack

Aggiunta al post originale ha scritto:
Come da richiesta in post seguente aggiungo uno schemino per far capire i collegamenti necessari, non credo che esista un sistema più semplice di così

A schermo la differenza tra i due codici è che la versione bluetooth da solo un messaggio generico su come connettersi, mentre la versione WiFi riporta anche i parametri di connessione quali SSID, Password, indirizzo IP e Porta da settare su Skysafari.

l'immagine di splash e le scritte son settate molto deboli, quindi di giorno con forti luci potrebbero non essere visibili, dopo qualche secondo lo schermo si spegne per non disturbare, se serve rivedere il messaggio basta premere un tasto e lo schermo si riaccenderà per qualche secondo.
Il DSC si accende automaticamente quando sente un'alimentazione, se usate la versione Core senza modulo PLC aggiuntivo od usate la versione Fire e quindi usate la piccola batteria interna (110mAh vella versione Basic e 500mAh nella versione Fire) una pressione prolungata del tsto rosso vicino alla porta USB accenderà o spegnerà il sistema, una pressione breve lo restarterà resettandolo.
Passiamo al collegamento con l'APP.
Questo DSC si interfaccia nativamente con Skysafari nelle versioni Plus e Pro in quanto la versione base non gestisce i telescopi.
le due versioni costano, secondo il
sito ufficiale , 15$ e 40$ rispettivamente, ma quando ho installato io la versione pro costavano dallo store 7€ e 9€.
Accendete il DSC e connettetelo dal telefono via bluethoot (purtroppo il PIN del bluetooth non funziona su ESP32 quindi non va messo, se il telefono lo chiede mettete 0000) o via WiFi (SSID e Password le vedete sul display) in base alla versione che avete installato; a questo punto lanciate Skysafari ed andate in "Impostazioni>Telescopio>Configurazione", come "Tipo di telescopio" selezionate "Basic Encoder System" (ho provato anche come Orion Intelliscope e funziona), come "Tipo Montatura" selezionate "Spingi verso Alt-Az." e nella stessa finestra vanno settati anche gli step giro dei vostri encoder.
Nello screenshot che vi allego vedrete i miei settaggi, usando io dei CUI AMT102-V potete vedere 8192 (2048 tic che in quadratura diventano 8192) in Azimut dove è collegato direttamente sull'asse di rotazione, mentre in altezza io ho settato 49152 tic che il risultato dei 2048ppr dell'encoder, moltiplicato per 4 della quadratura e moltiplicto ulteriormente per 6 in quanto uso una puleggia per collegare l'encoder all'asse di rotazione. Se uno degli assi si dovesse muovere al contrario basterà cambiare il segno da "+" a "-" davanti al numero per invertire la direzione.
Infine, sempre nella finestra della configurazione telescopio trovate un pulsante con scritto "velocita lettura" che se non ricordo male è impostata a 4, io l'ho impostata a 10 per la massima reattività.

A questo punto uscite dalle impostazioni e cercate l'icona "Telescopio", cliccatela e vi comparirranno alcuni pulsanti: il primo è "Connetti", premendolo, se avete fatto tutto giusto, il DSC si connetterà e vi mostrerà la posizione del telescopio, fate girare gli encoder e vedrete che il puntatore si sposterà in accordo. Se a questo punto funziona tutto potete installare gli encoder sul telescopio, nei prossimi post vi spiegherò come ho installato io i miei.

Ecco che siamo arrivati all'utilizzo.
Ogni volta che accenderete, o che resetterete il DSC premendo il tasto rosso di accensione, il sistema leggerà 0° sia in altezza che azimut, quindi andremo a posizionare il telescopio puntandolo in orizzontale verso nord, daremo una pressione al tasto di accensione ed attenderemo la comparsa delle scritte, a questo punto il sistema ha già un primo punto di riferimento per l'allineamento, collegate il telescopio da skysafari che visegnerà gli 0° su entrambi gli assi come posizione di partenza ed andate a puntare un oggetto qualsiasi, vi consiglio di andare su una stella molto luminosa, vedrete che skysafari ve la mostrerà vicino al crocicchio del telescopio, più avrete posizionato il telescopio orissontalmente (basta una bolla) e verso nord più skysafari sarà vicino alla stella scelta; toccate la stella sullo schermo e vi verrà evidenziata, centratela bene nell'oculare e poi nel tab dove avete la connessione del telescopio premete sul tasto "Allinea", avete dato ora con successo la vostra prima stella di allineamento. Passate a scegliere una seconda stella luminosa, possibilmente abbastanza distante oltre il meridiano ed ad un altezza diversa, ripetete l'operazione di allineamento.
Skysafari prevede un massimo di 2 stelle di allineamento, potete continuare ad allineare stelle per migliorare la precisione in una certa area del cielo, ma solo le ultime due selezionate verranno tenute in considerazione.
Ora il sistema è pronto per l'uso, abbiamo due opzioni, possiamo cercare direttamente sulla mappa un oggetto, evidenziarlo toccandolo e poi premendo nella barra del telescopio il tasto "Spingi verso", oppure possiamo andare sull'icona della lene, ci si apriranno le liste di oggetti con un opzione di ricerca in testa (attenzione che non tutti i nomi sono nella dicitura italiana, per esempio Arturo lo si trova solo come Arcturus), selezionate un oggetto, vi si aprirà una pagina con la descrizione in fondo alla quale avrete il tasto "spingi verso".
Seguite la freccia sullo schermo fino a sovrapporre l'oggetto al crocicchio, zoommate per un maggiore aiuto, e ve lo dovreste trovare nel campo dell'oculare se non avete spinto troppo con gli ingrandimenti.
Se dovesse interessare ho testato il sistema anche con Ascom ed Indi e funziona: con indi se non ricordo male avevo usato gli indi_dsc_telescope driver, avevo avuto difficoltà a connettere il DSC ed a collegare la pipe della seriale al bluetooth perchè l'interfaccia usata da ubuntu pretendeva il pin di connessione (se non ricordo male), connettendo da riga di comando ero riuscito a farlo funzionare, non chiedetemi come perchè non lo ricordo e non vedo l'utilità di usare un pc con il push-to, detto questo con ASCOM avevo usato i driver di David Ek, trovate il link sul sito ascom o con ricerca su google. Se non ricordo male in entrambi i casi andavano settati come "Simple" o "basic" indicando il numero di tic giro come con Skysafari.
In seguito posterò in questo thread come ho installato il DSC sul mio Explore Scientific Ultra Light Dobson Gen II da 16 pollici