Show Posts
Pages: 1 ... 14 15 [16] 17
226  Forum 2005-2010 (read only) / Italiano / Re: millivoltmetro.. ???? on: October 18, 2010, 04:11:43 am
Scusate se insito.....

non riesco a collegare i miei LCD... secondo lo schema necessario per fare questo:
http://www.arduino.cc/playground/Main/LCDVoltmeter

... faccio presente che i miei LCD funzionano benissimo secondo questo schema:
http://arduino.cc/en/Tutorial/LiquidCrystal

non ho capito se si riferiscono a LCD diversi e non compatibili.. .. qualcuno può darmi un'indicazione?
227  Forum 2005-2010 (read only) / Italiano / Re: millivoltmetro.. ???? on: October 14, 2010, 02:36:47 pm

scusate .. non riesco a fare funzionare l'LCD con queste impostazioni:

Code:
// lcd related constants
#define nbrCharPerLine 16 // update depending on LCD
                          // must be  at least 16 characters per line
#define nbrLines 2 // must be 2 lines at least
#define left 0
#define right 1
#define invisible 0
#define visible 1

// declare variables
int RS = 7; // registry select LCD pin 4
int EN = 8; // enable LCD pin 6
int DB[] = {9,10,11,12}; // data bits LCD pins 11, 12, 13 and 14

mentre mi funiona benissimo con queste...
Code:
// LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

qualcuno sa darmi una dritta su come fare a far coincidere le impostazioni di sopra con quelle di sotto che fanno capo alla libreria #include <LiquidCrystal.h>


?????
228  Forum 2005-2010 (read only) / Italiano / Re: millivoltmetro.. ???? on: October 13, 2010, 09:10:25 am
grazie Uwe.. intanto mi sto  guardando la parte software... per l'hardware.. hai qualche schemino che potresti suggerire.... io non sono una cima in elettronica... sono solo un hobbysta insomma ..... credo che mi serva qualcosa con ingresso ad altissima impedenza ...
229  Forum 2005-2010 (read only) / Italiano / Re: millivoltmetro.. ???? on: October 13, 2010, 05:44:12 am
grazie tinman
230  Forum 2005-2010 (read only) / Italiano / millivoltmetro.. ???? on: October 13, 2010, 04:36:27 am
Sto ipotizzando di realizzare un voltmero in grado di misurare tensioni di pochi millivolt.. con l'arduino.. mi serve perchè deve misurare tensioni su due punti distinti e fare dei calcoli.. ma intanto prima di lavorare esattamente a questo propotipo vorrei iniare con la sperimentazione di un millivolmetro che passi i dati letti ad un dispaly lcd...  qualcuno è interessato ??? qualcuno ha già affrontato un problema simile??? ... aspetto notizie..
231  Forum 2005-2010 (read only) / Italiano / Re: Motoriduttori planetari? Motori passo passo? on: October 19, 2010, 08:18:38 am
l'idea di realizzare un rotore per controllo del puntamento di un'antenna interessa anche me.. ma dove si trovano componenti come riduzioni, ingranaggi etc...???
232  Forum 2005-2010 (read only) / Italiano / Re: CW beacon .... Fatto!!! ... almeno credo!!! on: October 17, 2010, 02:05:56 pm
versione più semplice, quella che effettivamente a breve metterò in servizio:

- velocità fissa impostata a priori via software;
- mancanza dell'LCD;
Code:
// 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 );
 }
}      
233  Forum 2005-2010 (read only) / Italiano / Re: CW beacon .... Fatto!!! ... almeno credo!!! on: October 17, 2010, 02:05:00 pm
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:
// 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 );
 }
}    


234  Forum 2005-2010 (read only) / Italiano / CW beacon .... Fatto!!! ... almeno credo!!! on: October 14, 2010, 02:13:18 pm
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:
// 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:
// 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.....
235  Forum 2005-2010 (read only) / Italiano / Re: Problemi di calcolo...... float .. double???? bho! on: October 13, 2010, 04:27:14 am
Ciao lesto.. e grazie per l'attenzione...
si... le frequenze utilizzabili sono le HF.. sotto i 30 Mhz diciamo... rigorosamente dentro le bande ammesse (7.000 Mhz), (14.000 Mhz) etc. ..  per lavorare a frequenze così elevate come dici tu, è molto difficile... sono pochissimi anche i radioamatori che usano frequenze oltre la UHF perche l'autocostruzione è difficile, ci vuole attrezzatura professionale con costi proibitivi,  e molta competenza ...

... per la licenza si deve fare un esame presso il competente servizio territoriale del ministero delle comunicazioni .. a meno che tu non abbia un titolo di studio tipo perito elettronico, specializzato in telecomunicazioni o qualcosa di simile....

per l'ottimizzazoine del software, comunque lo lascerò leggibile appieno voglio eliminare i delay ed utilizzare un controllo con il millis(), così recupero il ritardo che si verifica nell'esecuzione del codice  ...  e quando gli dò la velocità questa corrisponda alla effettiva velocità di digitazione ..

.. non so se merendo ...

inoltre non ho capito se si opssono usare matrici bidimensionali ... e se così potrei ottimizzare ulteriormente ... ma paino piano.. intanto stiamo sperimentando... comunque sto aprendo un altro tread su un nuovo progetto... dammi la tua opinione...
236  Forum 2005-2010 (read only) / Italiano / Re: Problemi di calcolo...... float .. double???? bho! on: October 12, 2010, 01:07:38 am
Grazie lesto....

il primo problema l'ho già risolto in altro modo... per l'ottimizzazione della ricerca del codice associato alla lettera ci penso un poco...

in realtà il prototipo l'ho già finito e fatto funzionare ieri...
questo è il codice, che ha funzionato ieri per la prima volta,
Code:
// 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 = 25 ; // velocità di manipolazione in caratteri al minuto, molto approssimativamente
String messaggio = "test      test IS0CFU IS0CFU test Abcdefghilmnopqrs 1234567890"; // stringa da trasmettere
// fine personalizzazione


#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

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

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

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

void stampa_lcd (String pm, char l, String m)
{
  lcd.setCursor(0, 0);
  lcd.print("                ");
  lcd.setCursor(0, 0);
  lcd.print(pm);

  m = m.substring(0, m.length()-1) ;
  lcd.setCursor(2, 1);
  lcd.print("             ");
  lcd.setCursor(2, 1);
  lcd.print(l); lcd.print("  "); lcd.print(m);
}

void trova_chrMorse (char l)
{
  if ( l != ' ' )
  {
    for( int i = 0; i < nChar; i++)
      {
        if (l == caratteri_alfab [i])
          {chrMorse = caratteri_morse[i] + 'z'; break;}
       }  
   }
else
{ chrMorse = ' ' ;}

} // trova la stringa morse corrispondente al carattere l e la pone in chrMorse


void digita_chrMorse (String m)
{
  
int tempo = int(2000 / velocita) ;

//Serial.print(tempo);
 
char segno;

for(int i = 0; i < m.length(); i++)
      {
       segno = m.charAt(i);
       switch (segno)
        {
        case '.':
        //Serial.print('.');
        digitalWrite(digitCW, HIGH); tone(7, 1000); delay (1*tempo); digitalWrite(digitCW, LOW); noTone(7); delay (1*tempo);  
        break;

        case '-':
        //Serial.print('-');
        digitalWrite(digitCW, HIGH); tone(7, 1000); delay (3*tempo);  digitalWrite(digitCW, LOW); noTone(7); delay (1*tempo);  
        break;
 
        case 'z':
        //Serial.print("fine lettera");
        delay (5*tempo);
        break;

        case ' ':
        //Serial.print("fine parola");
        delay (7*tempo);
        break;
        }
      }
      //Serial.println();
 }


void loop()
{
  digitalWrite(onRadio, HIGH);
 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); //invia i dati per il controllo durante lo sviluppo
        stampa_lcd     (parte_messaggio, lettera, chrMorse); // invia i dati all'LCD
 
        digita_chrMorse(chrMorse);
     }
digitalWrite(onRadio,LOW);
delay (intervallo);
}
che  devo comunque ancora otimizzare......

per la trasmissione si procede così: tramite il segnale del piedino 9 si commuta la radio in trasmisioone, mentre con il segnale del piedino 8 si invia la manipolazione del codice... sul display lcd visualizzo gli ultimi 16 caratteri inviati (sulla prima riga) e il carattere e la corrispondente stringa morse (in fase di digitazione, sulla seconda riga)... utilizzo un ICOM IC 735 o un KENWOOD almeno adesso per le prove

.. si posso anche ricevere , ma questo non mi interessa poichè voglio realizzare un piccolo trasmettitore da 1 w (beacon) che trasmetta fisso 24/24 ore ad intervalli di 15 minuti .. (bada bene che lo possono fare solo i radiomatori ... io ho la licenza).. i radioamatori che ricevono, da tutto il mondo ti confermano la ricezione con una cartolina QSL, questa è la funzione di una stazione beacon .. anche per sperimentare e verificare la propazione delle onde radio in ogni parte del globo ....

aspetto suggerimenti sull'ottimizzazione del codice.. saluti
237  Forum 2005-2010 (read only) / Italiano / Problemi di calcolo...... float .. double???? bho! on: October 11, 2010, 01:50:30 am
Questo fine settimana ho lavorato al mio primo progetto con l'arduino Uno... sto realizzando un CW beacon, ovvero un automatismo che invia via radio una frase in codice morse ad intervalli regolari. Ci stavo lavorando con un altro sistema ma adesso con l'arduino è tutta unaltra cosa. ma veniamo a noi:

questo è il codice che ho già scritto ieri:
Code:
// personalizzazione
int intervallo = 5 * 1000; // 5 è l'intervallo in secondi tra una trasmissione e l'altra...in realtà dovrà essere dell'ordine dei minuti
int velocita = 30 ; // velocità di manipolazione in caratteri al minuto
String messaggio = "CQ CQ de IS0CFU IS0CFU etc etc"; // stringa da trasmettere
// fine personalizzazione

int lMax = 14 ; // n° di caratteri max da visulaizzare sull'LCD

int nChar = 40; // 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 ledPin =   13;      // the number of the LED pin
const int tonePin =  11;      // the number of the tone pin

void setup()
{
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);      
  pinMode(tonePin, OUTPUT);      
}

void stampa_seriale(String pm, char l, String m){ Serial.print(pm); Serial.print(" "); Serial.print(l); Serial.print(" "); Serial.print (m); Serial.println();}// serve solo per fare i controlli durantelo sviluppo
void stampa_lcd    (String pm, char l, String m){}// da sviluppare in un secondo tempo, dopo verificato che funziona bene tutto

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


void digita_chrMorse (String m)
{
  
int tempo = int(60*1000) / ( 20 * float(velocita)) ;
tempo = 100;

Serial.print(tempo);
 
char segno;

for(int i = 0; i < m.length(); i++)
      {
       segno = m.charAt(i);
       switch (segno)
        {
        case '.':
        Serial.print('.');
        digitalWrite(ledPin, HIGH); tone(11, 1000); delay (1*tempo); digitalWrite(ledPin, LOW); noTone(11); delay (2*tempo);  
        break;

        case '-':
        Serial.print('-');
        digitalWrite(ledPin, HIGH); tone(11, 1000); delay (3*tempo);  digitalWrite(ledPin, LOW); noTone(11); delay (2*tempo);  
        break;
 
        case ' ':
        Serial.print(' ');
        delay (5*tempo);
        break;
        }
      }
      Serial.println();
      delay (7*tempo);
 }


void loop()
{
  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); //invia i dati per il controllo durante lo sviluppo
        //stampa_lcd     (parte_messaggio, lettera, chrMorse); // invia i dati all'LCD
 
        digita_chrMorse(chrMorse);
     }

delay (intervallo);
}

La prima domanda è la seguente: come mai la seguente espressione
Code:
int tempo = int(60*1000) / ( 20 * float(velocita)) ;
mi dà sempre come risultatao (mi pare) -27 ... mentre invece dovrebbe dare 100 posto che velocità e pari a 30??
ho provato in ntutti modi, variabile double, float, dentro la funzione, fuori etc.. pare che la divisione proprio non gli vada bene... spiegatemi un poco..

altra domanda:
per prelevare il tono da 1000 Hz dal piedino 11 come devo fare... perchè ho provato semplicemente con un piccolo auricolare ma non c'era nulla.. o forse c'è qualcosa di sbagliato nel codice? .. oppure l'ampiezza del segnale è così bassa da essere impercettibile senza amplificazione?... bho!!!!

altra domanda?
cè qualche suggerimento per otimizzare il codice?.. per esempio
per associare la giusta stringa di caratteri (punto - linea) alla generica lettera dell'alfabeto uso un ciclo for per scorrere l'array e quando trovo la lettera uso l'indice per leggere la stringa morse.. in questo modo:
Code:
void trova_chrMorse (char l){ for( int i = 0; i < nChar; i++){if (l == caratteri_alfab [i]){chrMorse = caratteri_morse[i];}}} // trova la stringa morse corrispondente al carattere l e la pone in chrMorse
cè qualche sistema per otimizzare questa funzione.. non è che è meglio utilizzare una struttura tipo "switch case" ... se qualcuno vuole dermi la propia opinione .. ne farò tesoro.. grazie..


238  Forum 2005-2010 (read only) / Italiano / Re: Caratteri sbagliati su LCD on: October 12, 2010, 01:41:12 am
io ho avuto problemi con la trattazione delle stringhe da visualizzare (su un altro tipo di lcd)...
... prima di addebitare i problemi di visualizzazoine al display verifica su serial.print che le stringhe da stampare siano corrette..
insomma il problema potrebbe non essere nel display.... (credo ... almeno io farei così) .....
239  Forum 2005-2010 (read only) / Italiano / Re: arduino sbaglia la divisione??? on: October 11, 2010, 05:48:07 am
casting??.. e cosè.. faccio una ricerca su questo forum?
240  Forum 2005-2010 (read only) / Italiano / arduino sbaglia la divisione??? on: October 11, 2010, 05:35:34 am
Scusate se ripeto la domanda ma non riesco a venirne a capo.. come mai questo:

int tempo = int((60*1000) / ( 20 * float(velocita))) ;

mi dà sempre come risultato (mi pare) -27 ... mentre invece dovrebbe dare 100 posto che velocità e pari a 30??

ho provato in ntutti modi, variabile double, float, dentro la funzione, fuori etc.. pare che la divisione proprio non gli vada bene...

qualche suggerimento????
Pages: 1 ... 14 15 [16] 17