I lettori conoscono gli scout - analoghi dei nostri pionieri, ma si scopre che ci sono anche cuccioli - analoghi del nostro ottobre. Accettato in loro dall'età di cinque anni. Il figlio dell'autore Instructbles con il soprannome mr_fid è già stato adottato e dovrà partecipare a un grande evento per taxi e scout, uno dei quali sarà il codice Morse. Per interessare ulteriormente il bambino, il maestro gli ha regalato un giocattolo insolito.
Viene eseguito il
Arduino Nano e genera 12 parole diverse in uscita al segnale acustico con un generatore integrato (commutabile da un interruttore meccanico) e un LED RGB. Il ciclo può essere regolato tra 100 e 1100 millisecondi. Per cambiare le parole, viene fornito un interruttore per armeggiare. Il design è alimentato da una batteria ai polimeri di litio da 1000 mAh. Il controller di carica è integrato. Ma qui non è ancora:
Mr_fid ringrazia Simon Monk per il libro Arduino Programming, che ha acquistato diversi anni fa. Nel redigere lo schizzo, si è basato su esempi tratti da questo libro.
Iniziare a lavorare
homebrew ramoscello, il master sapeva solo del codice Morse che c'era un segnale SOS. Ho dovuto imparare il materiale e scoprire che il punto è una misura, il trattino è tre, l'intervallo tra i caratteri nella lettera è una misura, tra le lettere è tre, tra le parole è sette.
Quando si contrassegna la plastica mr_fid utilizza il nastro adesivo. Grazie a ciò, la traccia del marker si vede meglio se la plastica è scura. Inoltre, questo nastro adesivo è opaco e il trapano non scivola quando "mira".
È necessario stimare in anticipo dove si troveranno i componenti della struttura, in modo che tutto si adatti, e nessuno dei componenti tocchi quelli vicini, comprese le parti sporgenti. Mr_fid non ha dimenticato altro che ... la batteria. Bene, il caso è abbastanza spazioso, e quindi è stato trovato un posto per esso. Nel frattempo ...
Sebbene il maestro abbia un piccolo trapano da banco, anche con esso ha usato un trapano a gradino per una maggiore comodità, ma è anche una "spina di pesce" o "carota".
Quando l'albero dell'interruttore della manopola ruota con la maniglia, l'interruttore stesso deve rimanere fermo. Per fare questo, oltre all'albero, di fronte c'è un piccolo perno che richiede un foro aggiuntivo sul pannello frontale.
Pertanto, mr_fid ha prima praticato un foro per l'albero, quindi ha incollato il nastro protettivo sul retro, messo in posizione l'interruttore della chiave inglese e premendolo. Il perno ha lasciato un segno sul nastro adesivo, resta da fare un buco lì.
Lo schema senza tenere conto della batteria, del controller di carica e del convertitore è simile al seguente:
Sul pannello frontale, dove si trovano l'interruttore del biscotto e la resistenza variabile, il master ha combinato le conclusioni di questi componenti che sono collegate agli stessi punti del circuito nel caso (in questo caso, il filo positivo e il filo comune). Ciò ha consentito di tracciare solo quattro fili tra il pannello anteriore e l'alloggiamento.
L'interruttore a chiave viene inoltre trasformato in una sorta di resistenza variabile, solo una fase uno, per la quale vengono saldati 11 resistori per 1 kOhm, come mostrato nelle fotografie. Arduino determina la sua posizione tramite una tensione che cambia gradualmente, per la quale è sufficiente un ingresso analogico.
più grande:
Per controllare il LED RGB, mr_fid ha scelto i pin Arduino con i numeri 9, 10 e 11. Queste sono uscite PWM, che nel prossimo firmware consentiranno di ottenere più bit per colore di tre.
Ha collegato un filo positivo e uno comune in polarità inversa a un resistore variabile, in modo che la posizione minima corrisponda al ciclo di massima durata, ovvero alla velocità minima.
L'esempio del libro di testo di Simon Monk è semplice e monofunzionale: prende i dati che arrivano attraverso la porta seriale e li traduce in codice Morse con un ciclo di 200 millisecondi. Le funzioni aggiuntive aggiunte dalla procedura guidata forniscono la regolazione del periodo in base alla tensione proveniente dal motore a resistenza variabile, nonché il rifiuto della porta seriale a favore della memorizzazione di 12 parole fisse selezionate dal selettore. Aggiunte anche routine per il controllo del pulsante di commutazione della modalità RGB-LED, e con un tweeter con un generatore integrato, il programma poteva inizialmente controllare.
Durante la programmazione di Arduino, mr_fid ha completamente dimenticato che il giocattolo deve essere alimentato da qualcosa, perché la scheda è stata alimentata da USB per tutto questo tempo. Quando ricordò, il primo pensiero fu di alimentare tutto dalla "Krona" attraverso lo stabilizzatore. Ma non si adattava, e all'inizio il maestro voleva posizionarlo all'esterno, ma poi decise di utilizzare una sottile batteria ai polimeri di litio con 3,7 V e 1000 mAh.
Con una batteria appena caricata, la tensione raggiunge 4,2 V, che è sufficiente per tutti i cristalli del LED RGB, incluso il blu. Ma mentre si scarica, cade e, sebbene 3,3 V siano sufficienti, la luminosità della luce blu può diminuire notevolmente. Ho dovuto usare uno stabilizzatore boost con una stabilità di cinque volt in uscita. E per non rimuovere la batteria dalla custodia durante la ricarica, l'autore ha aggiunto un controller di carica e un interruttore di inversione a due poli che collega la batteria con entrambi i poli all'Arduino o a questo controller. Ora puoi caricare il giocattolo da USB.
Ha collegato tutto questo in modo tale, senza dimenticare la polarità e la prevenzione del corto circuito:
Modificando la posizione dell'interruttore per i biscotti, è possibile selezionare il codice Morse per le seguenti combinazioni di lettere: HHH (un punto), OOO (un trattino), CAT (gatto), CANE (cane), ANT (formica), FLY (mosca), RAT (ratto), OWL (gufo), maiale (maiale), gallina (pollo), FOX (volpe) ed EMU (emu). Il pulsante consente di cambiare le modalità di funzionamento del LED RGB sull'anello: colori costanti - rosso, blu, verde, blu-verde, giallo, lampone, bianco, nonché un punto rosso e un trattino verde, cambio di colore dopo ogni parola, cambio di colore dopo ogni lettera .
In Arduino, mr_fid ha caricato un tale schizzo:int dotDelay = 200;
int ledPinRed = 11; // rosso
int ledPinBlue = 10; // blu
int ledPinGreen = 9; // verde
int oldAI = 15;
int pat;
int i = 1;
int j = 0;
bool toggle = false;
pulsante int = 8;
int buzzer = 7;
int flag = 1;
int selectWord;
int animal = 1;
int potValue = 0;
int maxVoltageBits = 1023;
int splitBits = maxVoltageBits / 22;
const int pot = A4;
const int rotaryInput = A5;
char ch;
char * letters [] = {
".-", "-...", "-.-.", "- ..", ".", "..-.", "-.", "....", " .. ",
".---", "-.-", ".- ..", "-", "-.", "---", ".--.", "--.-", ".-."
"...", "-", "..-", "...-", ".--", "-..-", "-.--", "- .."} ;
char * numbers [] = {
"-----", ".----", "..---", "...--", "....-",
".....", "-....", "--...", "--- ..", "----."};
char * animals3 = "hhhooocatdogantflyratowlpighenfoxemu";
void setup ()
{
pinMode (ledPinBlue, OUTPUT);
pinMode (ledPinRed, OUTPUT);
pinMode (ledPinGreen, OUTPUT);
pinMode (pot, INPUT);
pinMode (rotaryInput, INPUT);
pinMode (pulsante, INPUT);
pinMode (buzzer, OUTPUT);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
digitalWrite (ledPinGreen, HIGH);
digitalWrite (ledPinRed, LOW);
ritardo (500);
digitalWrite (ledPinRed, HIGH);
ritardo (100);
digitalWrite (ledPinBlue, LOW);
ritardo (500);
digitalWrite (ledPinBlue, HIGH);
ritardo (100);
digitalWrite (ledPinGreen, LOW);
ritardo (500);
digitalWrite (ledPinGreen, HIGH);
ritardo (100);
digitalWrite (buzzer, HIGH);
ritardo (100);
digitalWrite (buzzer, LOW);
int buttonValue = digitalRead (pulsante);
if (buttonValue == 1)
{
selectWord = analogRead (rotaryInput);
selectorSwitch1 (selectWord);
}
altro
{
flag = 1;
}
}
void loop ()
{
wait_for_enter ();
selectWord = analogRead (rotaryInput);
selectorSwitch (selectWord);
potValue = analogRead (pot);
dotDelay = potValue + 100;
i = (animale * 3) -3;
while (j & lt; 3)
{
ch = animals3 [i];
if (ch & gt; = 'a' && ch & lt; = 'z')
{
flashSequence (lettere [ch - 'a']);
}
else if (ch & gt; = '0' && ch & lt; = '9')
{
flashSequence (lettere [ch - '0']);
}
altrimenti if (ch == '')
{
ritardo (dotDelay * 7);
}
i = i + 1;
j = j + 1;
}
ritardo (dotDelay * 7);
// toggle =! toggle; // attiva / disattiva il colore ogni parola (non necessaria)
j è 0;
}
void wait_for_enter ()
{
int buttonValue = digitalRead (pulsante);
while (buttonValue == 0)
{
buttonValue = digitalRead (pulsante);
}
}
void flashSequence (sequenza char *)
{
int k = 0;
while (sequenza [k]! = '\ 0')
{
flashDotOrDash (sequenza [k]);
k = k + 1;
}
//Serial.print ("");
ritardo (dotDelay * 3);
toggle =! toggle; // attiva / disattiva il colore tra le lettere
}
void flashDotOrDash (char dotOrDash)
{
if (dotOrDash == '.')
{
if (flag == 1)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinRed, HIGH);
}
altrimenti if (flag == 2)
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinBlue, HIGH);
}
altrimenti if (flag == 3)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinGreen, HIGH);
}
altrimenti if (flag == 4)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinGreen, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
altrimenti if (flag == 5)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
altrimenti if (flag == 6)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
altrimenti if (flag == 7)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
altrimenti if (flag == 8)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinRed, HIGH);
}
altrimenti if (flag == 9)
{
if (attiva! = 0)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinRed, HIGH);
}
altro
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinBlue, HIGH);
}
}
}
altro
{
if (flag == 1)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay * 3);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinRed, HIGH);
}
altrimenti if (flag == 2)
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay * 3);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinBlue, HIGH);
}
altrimenti if (flag == 3)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay * 3);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinGreen, HIGH);
}
altrimenti if (flag == 4)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay * 3);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinGreen, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
altrimenti if (flag == 5)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay * 3);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
altrimenti if (flag == 6)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay * 3);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
altrimenti if (flag == 7)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay * 3);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
altrimenti if (flag == 8)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay * 3);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinGreen, HIGH);
}
altrimenti if (flag == 9)
{
if (attiva! = 0)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay * 3);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinRed, HIGH);
}
altro
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (buzzer, HIGH);
ritardo (dotDelay * 3);
digitalWrite (buzzer, LOW);
digitalWrite (ledPinBlue, HIGH);
}
}
}
delay (dotDelay); // tra le lettere
// toggle =! toggle; // passa da un fattore all'altro
}
void selectorSwitch1 (int AI)
{
if ((AI & gt; (oldAI + 10)) || (AI & lt; (oldAI - 10))) // vedi se il valore è cambiato?
{
if (AI & gt; 11 * splitBits) // deve essere 7,8,9,10,11,12.
{
if (AI & gt; 17 * splitBits) // deve essere 10,11,12.
{
if (AI & gt; 21 * splitBits) // deve essere 12.
{
flag = 12;
}
altrimenti // deve essere 10.11.
{
if (AI & gt; 19 * splitBits) // deve essere 11.
{
flag = 11;
}
altrimenti // deve essere 10.
{
flag = 10;
}
}
}
altrimenti // deve essere 7,8,9.
{
if (AI & gt; 15 * splitBits) // deve essere 9.
{
flag = 9;
}
altrimenti // deve essere 7.8.
{
if (AI & gt; 13 * splitBits) // deve essere 8.
{
flag = 8;
}
altrimenti // deve essere 7.
{
flag = 7;
}
}
}
}
altrimenti // deve essere 1,2,3,4,5,6.
{
if (AI & gt; 5 * splitBits) // deve essere 4,5,6.
{
if (AI & gt; 9 * splitBits) // deve essere 6.
{
flag = 6;
}
altrimenti // deve essere 4,5.
{
if (AI & gt; 7 * splitBits) // deve essere 5
{
flag = 5;
}
altrimenti // deve essere 4.
{
flag = 4;
}
}
}
altrimenti // deve essere 1,2,3.
{
if (AI & gt; 3 * splitBits) // deve essere 3.
{
flag = 3;
}
altrimenti // deve essere 1,2.
{
if (AI & gt; splitBits) // deve essere 2.
{
flag = 2;
}
altrimenti // deve essere 1.
{
flag = 1;
}
}
}
}
}
oldAI = AI;
// ritardo (500);
//Serial.println ();
}
selettore void Switch (int AI)
{
if ((AI & gt; (oldAI + 10)) || (AI & lt; (oldAI - 10))) // vedi se il valore è cambiato?
{
if (AI & gt; 11 * splitBits) // deve essere 7,8,9,10,11,12.
{
if (AI & gt; 17 * splitBits) // deve essere 10,11,12.
{
if (AI & gt; 21 * splitBits) // deve essere 12.
{
animale = 12;
}
altrimenti // deve essere 10.11.
{
if (AI & gt; 19 * splitBits) // deve essere 11.
{
animale = 11;
}
altrimenti // deve essere 10.
{
animale = 10;
}
}
}
altrimenti // deve essere 7,8,9.
{
if (AI & gt; 15 * splitBits) // deve essere 9.
{
animale = 9;
}
altrimenti // deve essere 7.8.
{
if (AI & gt; 13 * splitBits) // deve essere 8.
{
animale = 8;
}
altrimenti // deve essere 7.
{
animale = 7;
}
}
}
}
altrimenti // deve essere 1,2,3,4,5,6.
{
if (AI & gt; 5 * splitBits) // deve essere 4,5,6.
{
if (AI & gt; 9 * splitBits) // deve essere 6.
{
animale = 6;
}
altrimenti // deve essere 4,5.
{
if (AI & gt; 7 * splitBits) // deve essere 5
{
animale = 5;
}
altrimenti // deve essere 4.
{
animale = 4;
}
}
}
altrimenti // deve essere 1,2,3.
{
if (AI & gt; 3 * splitBits) // deve essere 3.
{
animale = 3;
}
altrimenti // deve essere 1,2.
{
if (AI & gt; splitBits) // deve essere 2.
{
animale = 2;
}
altrimenti // deve essere 1.
{
animale = 1;
}
}
}
}
}
oldAI = AI;
// ritardo (500);
//Serial.println ();
}
Se hai ripetuto dopo il maestro, ora nelle tue mani c'è lo stesso giocattolo con cui puoi interessare i tuoi figli al codice Morse. E quando crescono, con un semplice remake del firmware, è possibile ottenere le basi per una "fox" automatica standard, trasmettendo una scelta di MOE, MOI, MOS, MOH o MO5, accendendosi per un minuto ogni quattro minuti.
Post scriptum soprattutto per le persone noiose che trovano difetti nei titoli: gli animali sono un nome collettivo per animali, uccelli e insetti.