Octal
- Group
- Member
- Posts
- 181
- Location
- Chiaravalle Ancona
- Status
- Offline
|
|
Ciao a tutti. Sono Gigi
Avendo come generatore un cinesissimo XR2206, aspettando di poter prendere qualcosa di meglio, ho pensato di migliorarlo un poco. Ne ho approfittato per fare un po di esercizio con Maria Silvia…. Il generatore cinese usa un integrato monolitico e lo schema segue quello applicativo del datasheet dell’integrato, ridotto al minimo per abbassarne i costi.(meno di 10€ con il contentore!!) Si presenta come una scatolina di plexiglas con tre potenziometri, attenuazione, frequenza e frequenza fine. Per cambiare gamma si utilizza un ponticello posizionabile in 5 posizioni. L’uscita può essere selezionata sinusoidale o triangolare tramite un altro ponticello. Un’altra uscita per l’onda quadra, non attenuabile.
Uno dei limiti più evidenti, è la mancanza di una scala per impostare la frequenza. Perché non metterci un frequenzimetro? Nella filosofia di fare tutto con quello che si ha in casa, usiamo un arduino, il NANO, si compravano un tot all’etto… e un display LCD 16x2 recuperato da una vecchia centralina d’allarme. Le librerie FreqCount.h fanno al nostro caso, contano gli impulsi in un secondo… Ora rimane il problema dei ponticelli, antipatici da usare. Avevamo un paio di cd 4066, interruttori bidirezionali cmos, perché non provare ad usarli? Alla prova dei fatti la resistenza interna e la capacità non incidono eccessivamente sulla funzionalità dell’oscillatore. Ulteriore miglioria, modulare il segnale. Dal datasheet del xr2206, si vedono più ingressi per la modulazione, AM, FM, FSK…. BINGO! Il piedino 1 dell’integrato è l’ingresso per la modulazione AM e bias. Tolto l’integrato dallo zoccolo, piegato il piedino verso l’estero, reinserito l’integrato, ecco il nostro ingresso di modulazione AM. Un partitore con un potenziometro, forniscono la tensione di bias.
Ora tocca programmare l’ARDUINO NANO. Due pulsanti, uno per cambiare gamma sequenzialmente, l’altro per il cambio d’onda da Sinusoidale a triangolare e viceversa. I pulsanti attivano tramite due diodi, l’ingresso interrupt e le relative funzioni. Il segnale per il frequenzimetro, lo preleviamo dall’uscita ad onda quadra. Ora ci sono due problemi, il livello del segnale dell’XR2206 è a 12v, l’ingresso dell’arduino accetta fino a 5v, il segnale del generatore si abbassa notevolmente superati i 300/400 KHz. Inserendo un Trigger di Smith cmos (CD40106) alimentato a 5v. si prendono i classici due piccioni con una fava.
Ultima chicca, sostituire il potenziometro della regolazione fine, con un multigiri .
Non vogliamo metterci anche un contenitore?
Mi sa che abbiamo esagerato un pochino… E' da migliorare, ma funziona Il resto alla prossima puntata Sketch ARDUINO:
#include <liquidcrystal.h> #include <freqcount.h> int range = 7; int SinTria = 8; int freq = 12; int state = 0;
LiquidCrystal lcd(11, 10, 6, 9, 4, 3);
void setup() {
FreqCount.begin(1000); lcd.begin(16, 2); pinMode (range, INPUT); pinMode (SinTria, INPUT); pinMode (freq,INPUT); pinMode (13,OUTPUT); pinMode (14,OUTPUT); pinMode (15,OUTPUT); pinMode (16,OUTPUT); pinMode (17,OUTPUT);
attachInterrupt(0,GestInt,RISING); lcd.setCursor(12, 0); lcd.println("Tri"); lcd.setCursor(0, 0); lcd.println('13');
} byte SETPin[] = {13,14,15,16,17}; int pinAttivo = 13;
void loop() {
if (FreqCount.available()) { lcd.setCursor(0, 1); unsigned long count = FreqCount.read(); lcd.println(count); lcd.print(" "); } //lcd.print(millis()/1000); }
// VOID VARI
void GestInt() { volatile int rangeR = digitalRead (range); volatile int sinRead = digitalRead (SinTria); if (rangeR == 1){ rangeUP(); } if (sinRead == 1){ Onda (); } }
void rangeUP() { pinAttivo++; if (pinAttivo >= 18) { pinAttivo = 13; } for (byte i = 0; i < 5; i++) { digitalWrite(SETPin[i], HIGH); digitalWrite(pinAttivo, LOW); lcd.setCursor(0, 0); // lcd.println(pinAttivo); if (pinAttivo==13){ lcd.println("Banda 1 "); } if (pinAttivo==14){ lcd.println("Banda 2 "); } if (pinAttivo==15){ lcd.println("Banda 3 "); } if (pinAttivo==16){ lcd.println("Banda 4 "); } if (pinAttivo==17){ lcd.println("Banda 5 "); } }
}
void Onda() { state = !state; digitalWrite(18, state); if (state == 1){ lcd.setCursor(13, 0); lcd.println("Tri"); } if (state ==0){ lcd.setCursor(13, 0); lcd.println("Sin"); } }
|
|