Indicatore posizione rotore con Display Nokia 5110
Un semplice progetto con Arduino, scritto a 4 mani da IK6GZM Gianluca e IU2GZZ Roberto.
Questo progetto nasce dalla necessità di un collega locale di dotare un controller con indicatore a display ad un rotore HAM IV sprovvisto del suo originale. Mentre i comandi di rotazione sono semplice da realizzare (2 pulsanti per destra-sinistra più eventualmente un terzo per il brake), l’indicazione numerica della posizione comporta qualche problema. Questo perché il centrale del potenziometro, calettato sul rotore stesso, è collegato alla massa comune con la 24V alternata. Questo comporta un ripple che, collegando direttamente un indicatore digitale, ne provoca uno sfarfallio che, inevitabilmente, rende difficile la lettura ed il posizionamento.
Girando su internet, mi sono imbattuto nel sito di GM0ONX che ha trovato una soluzione abbastanza ingegnosa, come riportato nella figura seguente:
(vedi schema_originale.jpg)
In pratica, utilizzando una tensione stabilizzata a 5V, isolando il negativo dal circuito di massa del rotore, tramite un partitore di tensione e regolando l’uscita a 0,036 V, facendola quindi leggere da un voltmetro con fs 199mV, si ottiene una lettura da 0 a 360 gradi. La soluzione è semplice e pococostosa, ma c’è sempre il punto decimale presente e che disturba la lettura, inoltre è un’indicazione scarna, voltmetri già pronti se ne trovano piccoli, se si vuole qualcosa di più grande occorre spendere dai 20 euro in su. A dire il vero, GM0ONX ha realizzato anche una versione con Arduino modificando lo sketch originale di K3NG, risulta un ottimo lavoro ma abbastanza impegnativo da realizzare, con la necessità di un circuito stampato e moduli già assemblati da ordinare (comando relè, encoder, etc). Risulta un prodotto completo e “professionale”, per questo vi rimando alla lettura sulla sua pagina.
Quello che propongo, invece, è un compromesso per tasche sempre meno pingui e sicurezza realizzativa. Utilizzando un Arduino Nano, il modulo display Nokia 5110, i pochi componenti per l’alimentazione, difficilmente si possono superare 10-15 euro di spesa. Inoltre si può realizzare il tutto su una scheda millefori oppure addirittura in aria.
Lo schema realizzato in Fritzing è il seguente:
( vedi rotator_display.jpg)
Quindi il display collegato direttamente al vostro Arduino (Uno, Nano, Mega, etc.) e la tensione di riferimento direttamente all’ingresso analogico A0. Il potenziometro nel circuito, da 500 ohm, simula quello presente all’interno del rotore. Non essendo un esperto di programmazione Arduino ed impantanandomi su alcune funzioni, ho avuto l’aiuto fondamentale di Roberto IU2GZZ e con il quale abbiamo sviluppato lo sketch che propongo.
Il display mostra il valore del posizionamento, con blocco a SUD, da 180 a 180 gradi, mostrando anche i punti cardinali a seconda della lettura della posizione. All’interno dello sketch, comunque, è riportata anche la modifica da effettuare se si vuole il blocco a Nord, avendo così la lettura da 0 a 360 gradi.
Chiaramente, questo dispositivo può essere impiegato su tutti quei controller che sono in abbinamento a rotori con rilevamento della posizione tramite potenziometro calettato. Non va bene quindi per quei rotori che utilizzano encoder rotativi.
Il collegamento è semplice:
(vedi schema_modificato.jpg)
Mantenendo il progetto originale, si toglie il partitore da regolare e si utilizza direttamente la 5V dell’alimentatore collegata all’ingresso analogico A0. Il GND di Arduino va collegato al pin 1 del rotore. Tutto qui. Di seguito riporto lo sketch:
/*
Voltmetro per rotore HAM IV
rilevamento semplice angolare.
Applicabile a tutti i rotori con rilevamento posizione con potenziometro.
di Gianluca Biondi IK6GZM e Roberto Rovida IU2GZZ - Maggio 2020
*/
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
// Software SPI (slower updates, more flexible pin options):
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
const int analogInPin = A0; //ingresso segnale
int sensorValue = 0; //valore segnale rilevato
int outputValue = 0; //valore da scrivere sul display
String direz = " "; //valore del punto cardinale
void setup(){
Serial.begin(9600);
display.begin();
// you can change the contrast around to adapt the display
// for the best viewing!
display.setContrast(100);
display.clearDisplay();
/* titolo programma e riconoscimenti vari
*/
display.setCursor(16,0);
display.println("Controllo");
display.setCursor(16,8);
display.println("Direzione");
display.println("Rotore HAM IV");
display.setCursor(32,26);
display.println("By");
display.setCursor(0,38);
display.println("IK6GZM&IU2GZZ");
delay(2000);
display.display(); // show splashscreen
delay(2000);
display.clearDisplay(); // clears the screen and buffer
}
void loop(){{{
sensorValue = analogRead(analogInPin); //legge il valore dal potenziometro
//outputValue = map(sensorValue, 0, 1023, 0, 360); //in caso necessitasse il blocco rotore a NORD ed ottenere lettura 0-360°, sbarrare le linee seguenti con mapping 180-180°
if (sensorValue < 512.0)
{
outputValue = map(sensorValue, 0, 511, 180, 360); //cambia il valore da letto a desiderato
}
else
outputValue = map(sensorValue, 512, 1023, 0, 180); //cambia il valore da letto a desiderato
}
if ((outputValue > 0) && (outputValue < 46)){
direz = "N "; //serie di istruzioni per ottenere i punti cardinali nella stringa direz
}
if ((outputValue > 44) && (outputValue < 91)){
direz = "NE";
}
if ((outputValue > 89) && (outputValue < 136)){
direz = "E ";
}
if ((outputValue > 134) && (outputValue < 181)){
direz = "SE";
}
if ((outputValue > 179) && (outputValue < 226)){
direz = "S ";
}
if ((outputValue > 224) && (outputValue < 271)){
direz = "SO";
}
if ((outputValue > 269) && (outputValue < 316)){
direz = "O ";
}
if ((outputValue > 314) && (outputValue < 360)){
direz = "NO";
}
}
display.setTextSize(1);
display.setTextColor(BLACK, WHITE);
display.setCursor(20,0);
display.println("AZIMUTH");
display.setCursor(36,40);
display.println(direz); //puntamento riga/colonna per punto cardinale
display.setTextSize(3);
display.setTextColor(BLACK, WHITE);
display.setCursor(65,8);
display.write(9); //simbolo ° per gradi
display.setCursor(10,15);
if (outputValue < 10.0) {
display.print(" ");
display.println(outputValue); //serie comandi di scrittura per valore in gradi
}
else if (outputValue < 100.0) {
display.print(" ");
display.println(outputValue);
}
else {
display.println(outputValue);
}
display.display();
delay(100);
}
Nello sketch sono spiegati i singoli passaggi e comandi per ottenere il risultato finale, occorre scaricare le librerie Adafruit_GFX e Adafruit_PCD8544, inoltre utilizzare una IDE di Arduino recente per la programmazione, poiché le prime versioni non riconoscono alcune librerie.
E’ tutto, se necessitassero ulteriori informazioni o chiarimenti, sono a disposizione sia in e-mail ikgzm@tin.it, oppure sul forum o sul gruppo whatsapp.
Ringrazio ancora Roberto per la sua cortesia e disponibilit a risolvere i problemi incontrati. A tutti voi un augurio di buona realizzazione e buon divertimento.
73 de Gianluca IK6GZM
questo il link per il video dimostrativo:
https://www.youtube.com/watch?v=tCvHMzKJZYU