Go Down

Topic: CW beacon .... Fatto!!! ... almeno credo!!! (Read 890 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy