mercoledì 19 febbraio 2020

Arduino N° 37 - Beacon Fonia/CW per Trasmettitore LPD

Arduino n° 36

 Achille De Santis

 Arduino n° 38





I piccoli moduli per applicazioni IoT a corto raggio funzionano con una particolare tecnica di trasmissione in cui la portante viene attivata dalla stessa modulante.

Un problema è rappresentato dal valore a riposo della modulante: diretto o invertito.
In considerazione delle caratteristiche circuitali, molto spesso si trovano in commercio moduli trasmittenti con modulante inversa, cioè con tensione alta a riposo, un po' come avviene per la codifica di canale per quanto riguarda i segnali di Mark e Space.

Un altro problema è rappresentato dal "ritmo" dei bit di dati che si susseguono nella modulante. Infatti, mancando il comando di PTT, la portante deve essere abilitata dal ritmo di modulazione, che deve avere un determinato duty-cycle, compatibile con il mantenimento in trasmissione. Lunghe sequenze di "zero" tenderebbero a far disabilitare la portante.

Il programma qui proposto lavora a modulante inversa ed è adatto a molti moduli in commercio che usano questa tecnica.


/* --------------------------- Inizio programma -------------------------------------------------
  Achille De Santis V2.0 del 12-12-2014 V3.0 del 13-12-2015
  V4.0 del 13-12-2016. V5 del 28-10-2019
  Beacon RDF CW Multiplo, con 5 messaggi pre-selezionabili.
  1 linea di uscita per la spia di TX;
  1 linea di uscita per il testo CW_BF, invertita.
  5 testi beacon, in uscita, selezionabili alternativamente;
  pin 13: uscita del testo beacon;
  pin 12: spia di portante;
  senza comando di PTT.
*/

// ------------------- I/O -----------------------------------------------
#define U     13        // Uscita testo beacon sul piedino 13.
#define ptt   12        // comando PTT sul piedino 12.
// -----------------------------------------------------------------------
// ------------------ Selezione del beacon --------------------------
#define beaconset1    11
#define beaconset2    10
#define beaconset3    9
#define beaconset4    8
#define beaconset5    7
// ----------------------------------------------------------------------

const int freq = 800;
const int T = 100;            // base tempi.
const int T2=2*T;
const int T3=3*T;
const int T4=4*T;
const int T5=5*T;
const int T6=6*T;
const int T7=7*T;

void intestazione()
  { // Serial.begin(9600);        // velocità seriale
    Serial.println(" ________ Tecnatron Creation ___________");
    Serial.println(" Beacon Fonia/CW per Trasmettitore LPD  --");
    Serial.println(" prof. Achille De Santis - 27-10-2019 ----------");
  }
 
void genera(int T1)   { tone(U, freq); delay(T1);   noTone(U); delay(T);  }
void punto()          { genera(T); }
void linea()          { genera(T3); }

void AR() { punto();linea();punto();linea();punto();delay(T6); }  // AR - messaggio iniziale di accensione Beacon

void MO()
{
  linea(); linea();                 delay (T2);            // M
  linea(); linea(); linea();    delay (T2);            // O
}

void beacon1()  { punto(); linea(); linea(); linea(); linea(); delay (T4); }   // 1
void beacon2()  { punto(); punto(); linea(); linea(); linea(); delay (T4); }   // 2
void beacon3()  { punto(); punto(); punto(); linea(); linea(); delay (T4); }   // 3
void beacon4()  { punto(); punto(); punto(); punto(); linea(); delay (T4); }   // 4
void beacon5()  { punto(); punto(); punto(); punto(); punto(); delay (T4); }   // 5

void setup()
{
 Serial.begin(9600);            // serial monitor output
 intestazione();

 pinMode (U, OUTPUT),   // uscita tono
         (ptt, OUTPUT);         // uscita PTT

 pinMode (beaconset1, INPUT_PULLUP),  // set di messaggi
         (beaconset2, INPUT_PULLUP),
         (beaconset3, INPUT_PULLUP),
         (beaconset4, INPUT_PULLUP),
         (beaconset5, INPUT_PULLUP);

 digitalWrite(U, HIGH);     delay (T7);
 AR();                           // - messaggio iniziale di accensione Beacon
 digitalWrite(U, HIGH);     delay (T3);
}

void loop()
{
  digitalWrite(ptt, HIGH);      // indicatore di trasmissione, opzionale
                                // digitalWrite(U, HIGH);     delay (T5);
  MO();
  if (digitalRead(beaconset1)==LOW)   {beacon1();  }
    else if (digitalRead(beaconset2)==LOW)   {beacon2();  }
           else if (digitalRead(beaconset3)==LOW)   {beacon3();  }
                 else if (digitalRead(beaconset4)==LOW)   {beacon4();  }
                     else if (digitalRead(beaconset5)==LOW)   {beacon5();   } 
  delay (T4);
  digitalWrite(ptt, LOW);
  digitalWrite(U, HIGH); 
  delay (50*T);
 }
// ----------------------------- Fine programma --------------------------------------------------



Simulazione: 

Nessun commento:

Posta un commento