Go Down

Topic: CW beacon .... Fatto!!! ... almeno credo!!! (Read 854 times) previous topic - next topic

Paolo S

Credo di aver finito la realizzazione del prototipo che avevo in mente ...
Questa è la versione con l Display LCD.. configurato come da qui:
http://arduino.cc/en/Tutorial/LiquidCrystal
Code: [Select]
// personalizzazione
int intervallo = 10 * 1000; // 10 è l'intervallo in secondi tra una trasmissione e l'altra...in realtà dovrà essere dell'ordine dei minuti
int velocita = 60 ; // velocità di manipolazione in caratteri al minuto, molto approssimativamente
String messaggio = "ABCDEF GHILMN OPQRS TUVZ"; // stringa da trasmettere
// fine personalizzazione464654 6 54 47

int tempo = int(5300 / velocita) ;

#include <LiquidCrystal.h>
int lMax = 16 ; // n° di caratteri max da visulaizzare sull'LCD

int nChar = 39; // n° di caratteri di cui si compone il codice morse (lettere, numeri, punteggiatura e qualche altro segno, vedi caratteri_alfab[] e caratteri_morse[]
char   caratteri_alfab [] = { 'A'  , 'B'   , 'C'   , 'D'  , 'E' , 'F'   , 'G'  , 'H'  , 'I' , 'J'   , 'K'  , 'L'   , 'M' ,'N'  , 'O'  , 'P'   , 'Q'   , 'R'  , 'S'  , 'T', 'U'  , 'V'   , 'W'  , 'X'  ,  'Y'  , 'Z'   ,  '0'   ,  '1'   ,  '2'   ,  '3'   ,  '4'   ,  '5'   ,'6'     ,'7'     , '8'    ,'9'     ,'.'      ,','      ,'?'     };
String caratteri_morse [] = { ".-" , "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--","-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", ".-.-.-", "--..--","..--.."};

String chrMorse;

const int onRadio =  9;      // accende la radio
const int digitCW =  8;      // digita il morse
const int tonePin =  7;      // the number of the tone pin
const int onDisplay = 6;     // accende display

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
 pinMode(onRadio, OUTPUT);  
 pinMode(digitCW, OUTPUT);  
 pinMode(tonePin, OUTPUT);      
 pinMode(onDisplay, INPUT);      
lcd.begin(16, 2);
//Serial.begin(9600);
}

void stampa_seriale(String pm, char l, String m, String nC){ Serial.print(pm); Serial.print(" "); Serial.print(l); Serial.print(" "); Serial.print (m); Serial.print(" "); Serial.print (nC); Serial.println();}// serve solo per fare i controlli durantelo sviluppo

void stampa_lcd (String pm, char l, String m, String nC)
{
lcd.setCursor(0, 0) ; lcd.setCursor(0, 0); lcd.print(pm);
lcd.setCursor(12, 1); lcd.print(nC); lcd.print(" ");
lcd.setCursor(2, 1) ; lcd.print("          "); lcd.setCursor(1, 1); lcd.print(l); lcd.print("   "); lcd.print(m);
}

void trova_chrMorse (char l) // trova la stringa morse corrispondente al carattere l e la pone in chrMorse
{
 if ( l != ' ' )
 {
   for( int i = 0; i < nChar; i++)
     {
       if (l == caratteri_alfab [i])
         {chrMorse = caratteri_morse[i]; break;}
      }  
  }
  else {chrMorse ="";};
}

void digita_chrMorse (String m)
{
char segno;
for(int i = 0; i < m.length(); i++)
   {
      segno = m.charAt(i);
      switch (segno)
       {
       case '.':
       digitalWrite(digitCW, HIGH); tone(7, 1000); delay (1*tempo); digitalWrite(digitCW, LOW); noTone(7); delay (1*tempo);  
       break;
       case '-':
       digitalWrite(digitCW, HIGH); tone(7, 1000); delay (3*tempo);  digitalWrite(digitCW, LOW); noTone(7); delay (1*tempo);  
       break;
       }
   }
}

void loop()
{
boolean displayOn=true;
int viaPulsante = millis();
int statoPulsante =0;
digitalWrite(onRadio, HIGH);delay(1000);
char lettera ;
 String parte_messaggio = "               " ;
 messaggio = messaggio.toUpperCase(); // trasforma tutto in maiuscolo
   for(int i = 0; i < messaggio.length(); i++)
     { statoPulsante = digitalRead(onDisplay);
       if ( statoPulsante && millis()-viaPulsante>2000){viaPulsante = millis(); if (displayOn){lcd.noDisplay(); displayOn =false;} else {lcd.display(); displayOn =true;};};
       lettera=messaggio.charAt(i);
       parte_messaggio = parte_messaggio + lettera;
       if (parte_messaggio.length() > lMax ){parte_messaggio = parte_messaggio.substring (parte_messaggio.length()-lMax );}; //taglia la parte di messaggio già trasmesso agli ultimi lMax caratteri. Per poter visualizzare sull'LCD - max 16 caratteri
       trova_chrMorse (lettera);
       stampa_lcd     (parte_messaggio, lettera, chrMorse, String( messaggio.length()-i)); // invia i dati all'LCD
       //stampa_seriale (parte_messaggio, lettera, chrMorse, String( messaggio.length()-i)); //invia i dati per il controllo durante lo sviluppo
       digita_chrMorse(chrMorse);
       if (messaggio.charAt (i+1) != ' ') {delay(3*tempo);} else {delay(7*tempo);};
     }
lcd.clear() ;
delay(1000); digitalWrite(onRadio,LOW);
delay (intervallo);
}



senza LCD
Code: [Select]
// personalizzazione
int intervallo = 10 * 1000; // 10 è l'intervallo in secondi tra una trasmissione e l'altra...in realtà dovrà essere dell'ordine dei minuti
int velocita = 60 ; // velocità di manipolazione, in caratteri al minuto ......  approssimativamente .......
String messaggio = "ABCDEF GHILMN OPQRS TUVZ"; // stringa da trasmettere
// fine personalizzazione

int tempo = int(5300 / velocita);

int nChar = 39; // n° di caratteri di cui si compone il codice morse (lettere, numeri, punteggiatura e qualche altro segno, vedi caratteri_alfab[] e caratteri_morse[]
char   caratteri_alfab [] = { 'A'  , 'B'   , 'C'   , 'D'  , 'E' , 'F'   , 'G'  , 'H'  , 'I' , 'J'   , 'K'  , 'L'   , 'M' ,'N'  , 'O'  , 'P'   , 'Q'   , 'R'  , 'S'  , 'T', 'U'  , 'V'   , 'W'  , 'X'  ,  'Y'  , 'Z'   ,  '0'   ,  '1'   ,  '2'   ,  '3'   ,  '4'   ,  '5'   ,'6'     ,'7'     , '8'    ,'9'     ,'.'      ,','      ,'?'     };
String caratteri_morse [] = { ".-" , "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--","-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", ".-.-.-", "--..--","..--.."};

String chrMorse;
int lMax=14;

const int onRadio =  9;      // accende la radio
const int digitCW =  8;      // digita il codice morse ...
const int tonePin =  7;      // the number of the tone pin

void setup()
{
 pinMode(onRadio, OUTPUT);  
 pinMode(digitCW, OUTPUT);  
 pinMode(tonePin, OUTPUT);      
//Serial.begin(9600);
}

void stampa_seriale(String pm, char l, String m, String nC){ Serial.print(pm); Serial.print(" "); Serial.print(l); Serial.print(" "); Serial.print (m); Serial.print(" "); Serial.print (nC); Serial.println();}// serve solo per fare i controlli durantelo sviluppo

void trova_chrMorse (char l) // trova la stringa morse corrispondente al carattere l e la pone in chrMorse
{
 if ( l != ' ' )
 {
   for( int i = 0; i < nChar; i++)
     {
       if (l == caratteri_alfab [i])
         {chrMorse = caratteri_morse[i]; break;}
      }  
  }
  else {chrMorse ="";};
}

void digita_chrMorse (String m)
{
char segno;
for(int i = 0; i < m.length(); i++)
   {
      segno = m.charAt(i);
      switch (segno)
       {
       case '.':
       digitalWrite(digitCW, HIGH); tone(7, 1000); delay (1*tempo); digitalWrite(digitCW, LOW); noTone(7); delay (1*tempo);  
       break;
       case '-':
       digitalWrite(digitCW, HIGH); tone(7, 1000); delay (3*tempo);  digitalWrite(digitCW, LOW); noTone(7); delay (1*tempo);  
       break;
       }
   }
}

void loop()
{
digitalWrite(onRadio, HIGH);delay(1000);
char lettera ;
 String parte_messaggio = "               " ;
 messaggio = messaggio.toUpperCase(); // trasforma tutto in maiuscolo
   for(int i = 0; i < messaggio.length(); i++)
     { lettera=messaggio.charAt(i);
       parte_messaggio = parte_messaggio + lettera;
       if (parte_messaggio.length() > lMax ){parte_messaggio = parte_messaggio.substring (parte_messaggio.length()-lMax );}; //taglia la parte di messaggio già trasmesso agli ultimi lMax caratteri. Per poter visualizzare sull'LCD - max 16 caratteri
       trova_chrMorse (lettera);
       //stampa_seriale (parte_messaggio, lettera, chrMorse, String( messaggio.length()-i)); //invia i dati per il controllo durante lo sviluppo
       digita_chrMorse(chrMorse);
       if (messaggio.charAt (i+1) != ' ') {delay(3*tempo);} else {delay(7*tempo);};
     }
delay(1000); digitalWrite(onRadio,LOW);
delay (intervallo);
}


.... questo è il primo esperimento.... adesso prepariamo l'hardaware.... il prototipo comunque funziona.... mi piace questo arduino.....

Paolo S

#1
Oct 17, 2010, 09:05 pm Last Edit: Oct 17, 2010, 09:11 pm by paolosanna Reason: 1
Ultima versione:

le caratteristiche fondamentali sono:
- accensione radio/ commutzione RX/TX
- visualizzaione della digitazione con led ( da cui si prende il segnale per il comando della digitazione sulla radio);
- controllo acustico con nota a 1000 Hz della digitazione;
- Controllo della velocita di digitazione tramite potenziometro (10 - 120 car/min);
- visualizzazione sull'LCD di
- sulla prima riga: ultimi 16 caratteri inviati;
- sulla seconda riga:  carattere in fase di digitazione, corrispondente stringa morse, velocita di manipolazione e caratteri mancanti alla fine della digitazione;
- possibilità di spegnere/riaccendere il display;
- possibilita di inserire n righe diverse di testo da inviare.. ciascuna con un tempo di standby;

Pin  9;     // accende|spegne oppure commuta RX|TX  la radio
Pin  8;     // digita il morse
Pin  7;     // pin da cui si preleva la nota a 1000 Hz
Pin  6;     // pulsante accende|spegne il display
Pin A0;    // Ingresso analogico dal potenziometro

Questo è il codice ...

Code: [Select]
// personalizzazione
int nFrasi = 3;
String messaggio [] = {"test frase 1 frase 1 12345 67890 ABCD E F G HILMNO PQRST UVZ FRASE 1", "Frase 2 Frase 2 Frase 2 test test test", "ABC FRASE 3 DEFG HIL MNO PQRSTUVZ"};  // stringhe da trasmettere
int intervallo   []=  {2*60 , 5*60, 2*60};  // intervallo di stand by, in minuti alla fine della trsmissione della iesima frase
// fine personalizzazione

#include <LiquidCrystal.h>

int lMax = 16 ;    // n° di caratteri max da visulaizzare sull'LCD
int velocita ;     //velocita' calcolata in base al valore letto dal potenziometro
int tempo;         //contiene la durata dell'unita(punto) [millis/u] corrispondente alla velocita V [car/min]... circa
boolean displayOn; // contiene lo stato acceso|spento dell'LCD
long viaPulsante ; // contatore, parte alla pressione del pulsante acceso|spento onDisplay

int nChar = 39; // n° di caratteri di cui si compone il codice morse (lettere, numeri, punteggiatura e qualche altro segno, vedi caratteri_alfab[] e caratteri_morse[]
char   caratteri_alfab [] = { 'A'  , 'B'   , 'C'   , 'D'  , 'E' , 'F'   , 'G'  , 'H'  , 'I' , 'J'   , 'K'  , 'L'   , 'M' ,'N'  , 'O'  , 'P'   , 'Q'   , 'R'  , 'S'  , 'T', 'U'  , 'V'   , 'W'  , 'X'  ,  'Y'  , 'Z'   ,  '0'   ,  '1'   ,  '2'   ,  '3'   ,  '4'   ,  '5'   ,'6'     ,'7'     , '8'    ,'9'     ,'.'      ,','      ,'?'     };
String caratteri_morse [] = { ".-" , "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--","-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", ".-.-.-", "--..--","..--.."};
String chrMorse;

const int onRadio =  9;      // accende|spegne oppure commuta RX|TX  la radio
const int digitCW =  8;      // digita il morse
const int tonePin =  7;      // pin da cui si preleva la nota a 1000 Hz
const int onDisplay = 6;     // pulsante accende|spegne il display
const int analogInPin = A0;  // Ingresso analogico dal potenziometro

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //attribuisce all'LCD i suoi pin/controlli

void stampa_seriale(String pm, char l, String m, int v, String nC){ Serial.print(pm); Serial.print(" "); Serial.print(l); Serial.print(" "); Serial.print (m); Serial.print(" "); Serial.print (v); Serial.print(" "); Serial.print (nC); Serial.println();}// serve solo per fare i controlli durantelo sviluppo

void stampa_lcd (String pm, char l, String m, int v, String nC)
{
lcd.setCursor(0, 0) ; lcd.print(pm);
lcd.setCursor(0, 1) ; lcd.print("            "); lcd.setCursor(0, 1); lcd.print(l); lcd.print(" "); lcd.print(m);
lcd.setCursor(12, 1) ; lcd.print("c"); lcd.print(nC); lcd.print(" ");
}

void ritardo (int r) // simula un delay(r).. ma con controlli all'interno
{
long rr = millis();
while ((millis()-rr) < r)
  {
    velocita = map(analogRead(analogInPin), 0, 1023, 15, 120);  //calcola la velocita corrispondente alla lettura del potenziometro
    lcd.setCursor(8, 1) ; lcd.print("v"); lcd.print(velocita);  // stampa la velocita sull'LCD
    if ( digitalRead(onDisplay) &&( millis()-viaPulsante>2000)){viaPulsante = millis(); if (displayOn){lcd.noDisplay(); displayOn =false;} else {lcd.display(); displayOn =true;};}; //accende|spegne l'LCD escludendo doppi comandi entro i 2 secondi
  }
}

void trova_chrMorse (char l) // trova la stringa morse corrispondente al carattere l e la pone in chrMorse
{
 if ( l != ' ' )
 {
   for( int i = 0; i < nChar; i++)
     {
       if (l == caratteri_alfab [i])
         {chrMorse = caratteri_morse[i]; break;}
      }  
  }
  else {chrMorse ="     ";};
}

void setup()
{
 pinMode(onRadio, OUTPUT);  
 pinMode(digitCW, OUTPUT);  
 pinMode(tonePin, OUTPUT);      
 pinMode(onDisplay, INPUT);      
 pinMode(analogInPin, INPUT);

 lcd.begin(16, 2);
 velocita = map(analogRead(analogInPin), 0, 1023, 15, 120);  // determina la velocita (tra 15 e 120) in base alla lettura del potenziometro
 tempo = int(5600.0/velocita) ;  //calcola il tempo dell'unità (punto|spazio) in millisecondi perchè corrisponda la velocità in Car/min
 Serial.begin(9600);
}

void loop()
{
char lettera ;
int r;          //valore di ritardo da passare alla funzione ritardo(r)

for (int k =0; k < nFrasi; k++)
{
  String parte_messaggio = "               " ;
  digitalWrite(onRadio, HIGH); ritardo(1000);
  digitalWrite(digitCW, HIGH); tone(tonePin, 1000);ritardo (30*tempo);digitalWrite(digitCW, LOW); noTone(tonePin);ritardo (30*tempo);  //digita una linea lunga 10 tratti
  messaggio[k] = messaggio[k].toUpperCase(); // trasforma tutto in maiuscolo
   for(int i = 0; i < messaggio[k].length(); i++)
     {
       tempo = int(5600.0/velocita) ;  //calcola il tempo dell'unità (punto|spazio) in millisecondi perchè corrisponda la velocità in Car/min
     
       lettera=messaggio[k].charAt(i);
       parte_messaggio = parte_messaggio + lettera;
       if (parte_messaggio.length() > lMax ){parte_messaggio = parte_messaggio.substring (parte_messaggio.length()-lMax );}; //taglia la parte di messaggio già trasmesso agli ultimi lMax caratteri. Per poter visualizzare sull'LCD - max 16 caratteri

      trova_chrMorse (lettera);
      stampa_lcd     (parte_messaggio, lettera, chrMorse, velocita, String( messaggio[k].length()-i)); //invia i dati all'LCD
//       stampa_seriale (parte_messaggio, lettera, chrMorse, velocita, String( messaggio[k].length()-i)); //invia i dati per il controllo durante lo sviluppo
     if (lettera != ' ')
      {
         for(int j = 0; j < chrMorse.length(); j++)
            {
              switch (chrMorse.charAt(j))
               {
                 case '.':r=1; break;
                 case '-':r=3; break;
               }
              digitalWrite(digitCW, HIGH); tone(tonePin, 1000);ritardo (r*tempo);digitalWrite(digitCW, LOW); noTone(tonePin); ritardo (1*tempo);  //digita il singolo segno linea o punto
            }
          ritardo(2*tempo);
      }
     else
      { ritardo(7*tempo);}
   }
lcd.clear() ;
ritardo (5*tempo); digitalWrite(digitCW, HIGH); tone(tonePin, 1000);ritardo (30*tempo);digitalWrite(digitCW, LOW); noTone(tonePin);  //digita una linea lunga 10 tratti'
ritardo(1000); digitalWrite(onRadio,LOW);
ritardo (intervallo[k] * 1000 );
}
}    




Paolo S

#2
Oct 17, 2010, 09:05 pm Last Edit: Oct 18, 2010, 09:14 am by paolosanna Reason: 1
versione più semplice, quella che effettivamente a breve metterò in servizio:

- velocità fissa impostata a priori via software;
- mancanza dell'LCD;
Code: [Select]
// personalizzazione
int nFrasi = 2;
String messaggio [] = {"Test Frase 1 TEST TEST Frase 1 frase 1 frase 1", "Test Frase 2 Frase 2 Frase 2 Test Test Test ABCDEF GHI LMN OPQR STUVZ 123 456 7 89 0"};  // stringhe da trasmettere
int intervallo   []=  {10*60 , 5*60};  // intervallo di stand by, in minuti alla fine della trsmissione della iesima frase
// fine personalizzazione

int velocita = 80 ;     //velocita' in Car/min
int tempo;

int nChar = 39; // n° di caratteri di cui si compone il codice morse (lettere, numeri, punteggiatura e qualche altro segno, vedi caratteri_alfab[] e caratteri_morse[]
char   caratteri_alfab [] = { 'A'  , 'B'   , 'C'   , 'D'  , 'E' , 'F'   , 'G'  , 'H'  , 'I' , 'J'   , 'K'  , 'L'   , 'M' ,'N'  , 'O'  , 'P'   , 'Q'   , 'R'  , 'S'  , 'T', 'U'  , 'V'   , 'W'  , 'X'  ,  'Y'  , 'Z'   ,  '0'   ,  '1'   ,  '2'   ,  '3'   ,  '4'   ,  '5'   ,'6'     ,'7'     , '8'    ,'9'     ,'.'      ,','      ,'?'     };
String caratteri_morse [] = { ".-" , "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--","-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", ".-.-.-", "--..--","..--.."};
String chrMorse;


const int onRadio =  9;      // accende|spegne oppure commuta RX|TX  la radio
const int digitCW =  8;      // digita il morse
const int tonePin =  7;      // pin da cui si preleva la nota a 1000 Hz


void stampa_seriale(String pm, char l, String m, int v, String nC){ Serial.print(pm); Serial.print(" "); Serial.print(l); Serial.print(" "); Serial.print (m); Serial.print(" "); Serial.print (v); Serial.print(" "); Serial.print (nC); Serial.println();}// serve solo per fare i controlli durantelo sviluppo



void ritardo (int r) //
{ delay(r); }

void trova_chrMorse (char l) // trova la stringa morse corrispondente al carattere l e la pone in chrMorse
{
 if ( l != ' ' )
 {
   for( int i = 0; i < nChar; i++)
     {
       if (l == caratteri_alfab [i])
         {chrMorse = caratteri_morse[i]; break;}
      }  
  }
  else {chrMorse ="     ";};
}

void setup()
{
 pinMode(onRadio, OUTPUT);  
 pinMode(digitCW, OUTPUT);  
 pinMode(tonePin, OUTPUT);      
 tempo =(6000.0/velocita) ;  //calcola il tempo dell'unità (punto|spazio) in millisecondi perchè corrisponda la velocità in Car/min
 Serial.begin(9600);
}

void loop()
{
char lettera ;
int r;          //valore di ritardo da passare alla funzione ritardo(r)

for (int k =0; k<nFrasi; k++)
{
  String parte_messaggio = "               " ;
  digitalWrite(onRadio, HIGH); ritardo(1000);
  digitalWrite(digitCW, HIGH); tone(tonePin, 1000);ritardo (30*tempo);digitalWrite(digitCW, LOW); noTone(tonePin);ritardo (30*tempo);  //digita una linea lunga 10 tratti
  messaggio[k] = messaggio[k].toUpperCase(); // trasforma tutto in maiuscolo

   for(int i = 0; i < messaggio[k].length(); i++)
     {
 
       lettera=messaggio[k].charAt(i);
       parte_messaggio = parte_messaggio + lettera;
       if (parte_messaggio.length() > lMax ){parte_messaggio = parte_messaggio.substring (parte_messaggio.length()-lMax );}; //taglia la parte di messaggio già trasmesso agli ultimi lMax caratteri. Per poter visualizzare sull'LCD - max 16 caratteri

       trova_chrMorse (lettera);
       stampa_seriale (parte_messaggio, lettera, chrMorse, velocita, String( messaggio[k].length()-i)); //invia i dati per il controllo durante lo sviluppo

       if (lettera != ' ')
       {
         for(int j = 0; j < chrMorse.length(); j++)
            {
              switch (chrMorse.charAt(j))
               {
                 case '.':r=1; break;
                 case '-':r=3; break;
               }
              digitalWrite(digitCW, HIGH); tone(tonePin, 1000);ritardo (r*tempo);digitalWrite(digitCW, LOW); noTone(tonePin); ritardo (1*tempo);  //digita il singolo segno linea o punto
            }
          ritardo(2*tempo);
      }
      else
      { ritardo(7*tempo);}

  }

ritardo (5*tempo); digitalWrite(digitCW, HIGH); tone(tonePin, 1000);ritardo (30*tempo);digitalWrite(digitCW, LOW); noTone(tonePin);  //digita una linea lunga 10 tratti'
ritardo(1000); digitalWrite(onRadio,LOW);
ritardo (intervallo[k] * 1000 );
}
}      

Go Up