Leserne kjenner speidere - analoger av pionerene våre, men det viser seg at det også finnes unger - analoger fra vår oktober. Akseptert i dem fra jeg var fem år gammel. Sønnen til forfatteren Instructsbles under kallenavnet mr_fid er allerede adoptert, og han vil måtte delta på en stor begivenhet for drosjer og speidere, hvorav den ene vil være morsekode. For å interessere barnet ytterligere ga mesteren ham et uvanlig leketøy.
Den henrettes den
Arduino Nano og genererer 12 forskjellige ord som sendes ut til pipelyden med en innebygd generator (kan byttes med en mekanisk bryter) og en RGB LED. Syklusen kan justeres mellom 100 og 1100 millisekunder. For å bytte ord, er det en tinkerbryter. Designet drives av et 1000 mAh litium-polymerbatteri. Ladekontrolleren er innebygd. Men her er det ennå ikke:
Mr_fid takker Simon Monk for boken Arduino Programming, som han kjøpte for flere år siden. Da han tegnet skissen, stolte han på eksempler fra denne boken.
Starter arbeidet med
homebrew kvist, visste mesteren bare om morskoden at det var et SOS-signal. Jeg måtte lære meg materialet og finne ut at poenget er ett mål, bindestreket er tre, intervallet mellom tegnene i bokstaven er ett mål, mellom bokstavene er tre, mellom ordene er syv.
Ved merking av plast bruker mr_fid maskeringstape. Takket være dette sees markørsporen bedre hvis plasten er mørk. I tillegg er dette limbåndet matt, og boret sklir ikke når du "sikter".
Det er nødvendig å estimere på forhånd hvor av komponentene i strukturen som skal lokaliseres, slik at alt passer, og ikke en av komponentene berører de nærliggende, inkludert de utstående delene. Mr_fid har ikke glemt noe annet enn ... batteriet. Saken er ganske romslig, og da ble det funnet et sted for det. I mellomtiden ...
Selv om mesteren har et lite benkbor, selv om han brukte en trinnbor for enkelhets skyld, er det også en "sildebein" eller "gulrot".
Når bryterakselen dreies av håndtaket, må selve bryteren forbli stille. For dette, i tillegg til skaftet, er det foran en liten tapp som krever et ekstra hull på frontpanelet.
Derfor boret mr_fid først et hull for skaftet, limte deretter maskeringstape på baksiden, satte skiftenøkkelbryteren på plass og presset den. Stiften etterlot et merke på maskeringstape, det gjenstår å bore et hull der.
Kretsen uten batteri, ladestyring og omformer ser slik ut:
På frontpanelet, hvor kjeksbryteren og den variable motstanden er plassert, kombinerte mesteren konklusjonene av disse komponentene som er koblet til de samme punktene i kretsen i saken (i dette tilfellet pluss og felles ledning). Dette tillot bare tre ledninger som kunne trekkes mellom frontpanelet og huset.
Skiftenøkkelbryteren blir også omgjort til en slags variabel motstand, bare en trinn, hvor 11 motstander per 1 kOhm er loddet til den, som vist på fotografiene. Arduino bestemmer sin posisjon ved en trinnvis skiftende spenning, som en analog inngang er nok til.
større:
For å kontrollere RGB-LED valgte mr_fid Arduino-pinnene med nummer 9, 10 og 11. Dette er PWM-utganger, som i neste firmware vil gjøre det mulig å få flere biter per farge enn tre.
Han koblet et pluss og en felles ledning i omvendt polaritet til en variabel motstand, slik at minimumsposisjonen tilsvarer syklusen med maksimal varighet, det vil si minimumshastigheten.
Et eksempel fra Simon Monks lærebok er enkel og enkeltfunksjonell: den tar data som kommer inn gjennom en serieport og oversetter den til morskode med en klokkesyklus på 200 millisekunder. Ytterligere funksjoner lagt til av veiviseren gir justering av perioden avhengig av spenningen som kommer fra motoren med variabel motstand, samt avslag på serieporten til fordel for lagring av 12 faste ord valgt av rattbryteren. Også lagt rutiner for å kontrollere bytte av RGB-LED-modus-modus, vel, og med en tweeter med en innebygd generator kunne programmet kontrollere i utgangspunktet.
Når du programmerte Arduino, glemte mr_fid helt at leketøyet må mates fra noe, fordi brettet har fått strøm fra USB hele denne tiden. Da han husket, var den første tanken å drive det hele fra “Krona” gjennom stabilisatoren. Men det passet ikke, og først ønsket mesteren å plassere det utenfor, men bestemte seg da for å bruke et tynt litium-polymerbatteri med 3,7 V og 1000 mAh.
Med et nyladet batteri når spenningen 4,2 V, noe som er nok for alle krystallene på RGB LED, inkludert blå. Men når det slipper ut, synker det, og selv om 3,3 V er nok, kan lysstyrken til blått lys reduseres betraktelig. Jeg måtte bruke en booststabilisator med stabile fem volt ved utgangen. Og for ikke å fjerne batteriet fra saken når du lader, la forfatteren en ladekontroller og en to-polers reverseringsbryter som kobler batteriet med begge polene til enten Arduino eller denne kontrolleren. Nå kan du lade leketøyet fra USB.
Han koblet alt dette sammen på en slik måte, ikke glemme polariteten og forebygging av kortslutning:
Ved å endre plasseringen av kjeksebryteren, kan du velge Morse-kode for følgende bokstavkombinasjoner: HHH (en prikker), OOO (en strek), KAT (katt), HUND (hund), ANT (maur), FLY (fly), RAT (rotte), ULL (ugle), PIG (gris), HEN (kylling), FOX (reve) og EMU (emu). Knappen lar deg bytte driftsmodus for RGB LED på ringen: konstante farger - rød, blå, grønn, blågrønn, gul, bringebær, hvit, samt en rød prikk og en grønn strek, fargeendring etter hvert ord, fargeendring etter hver bokstav .
I Arduino lastet mr_fid opp en slik skisse:int dotDelay = 200;
int ledPinRed = 11; // rød
int ledPinBlue = 10; // blå
int ledPinGreen = 9; // grønt
int oldAI = 15;
int pat;
int i = 1;
int j = 0;
bool toggle = falsk;
int-knapp = 8;
int summer = 7;
int flagg = 1;
int selectWord;
int dyr = 1;
int potValue = 0;
int maxVoltageBits = 1023;
int splitBits = maxVoltageBits / 22;
const int pot = A4;
const int rotaryInput = A5;
røye ch;
char * letters [] = {
".-", "-...", "-.-.", "- ..", ".", "..-.", "-.", "....", " .. ",
".---", "-.-", ".- ..", "-", "-.", "---", ".--.", "--.-", ".-".
"...", "-", "..-", "...-", ".--", "-..-", "-.--", "- .."} ;
røye * tall [] = {
"-----", ".----", "..---", "...--", "....-",
".....", "-....", "--...", "--- ..", "----."};
røye * dyr3 = "hhhooocatdogantflyratowlpighenfoxemu";
ugyldig oppsett ()
{
pinMode (ledPinBlue, OUTPUT);
pinMode (ledPinRed, OUTPUT);
pinMode (ledPinGreen, OUTPUT);
pinMode (pott, INPUT);
pinMode (rotaryInput, INPUT);
pinMode (knapp, INPUT);
pinMode (summer, OUTPUT);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
digitalWrite (ledPinGreen, HIGH);
digitalWrite (ledPinRed, LOW);
forsinkelse (500);
digitalWrite (ledPinRed, HIGH);
forsinkelse (100);
digitalWrite (ledPinBlue, LOW);
forsinkelse (500);
digitalWrite (ledPinBlue, HIGH);
forsinkelse (100);
digitalWrite (ledPinGreen, LOW);
forsinkelse (500);
digitalWrite (ledPinGreen, HIGH);
forsinkelse (100);
digitalWrite (summer, HØY);
forsinkelse (100);
digitalWrite (summer, LAV);
int buttonValue = digitalRead (knapp);
if (knappverdi == 1)
{
selectWord = analogRead (rotaryInput);
selectorSwitch1 (selectWord);
}
annet
{
flagg = 1;
}
}
void loop ()
{
wait_for_enter ();
selectWord = analogRead (rotaryInput);
selectorSwitch (velgord);
potValue = analogRead (pot);
dotDelay = potValue + 100;
i = (dyr * 3) -3;
mens (j & lt; 3)
{
ch = dyr3 [i];
if (ch & gt; = 'a' && ch & lt; = 'z')
{
flashSequence (bokstaver [ch - 'a']);
}
ellers hvis (ch & gt; = '0' && ch & lt; = '9')
{
flashSequence (bokstaver [ch - '0']);
}
ellers hvis (ch == '')
{
forsinkelse (dotDelay * 7);
}
i = i + 1;
j = j + 1;
}
forsinkelse (dotDelay * 7);
// toggle =! toggle; // veksle farge hvert ord (ikke nødvendig)
j er 0;
}
void wait_for_enter ()
{
int buttonValue = digitalRead (knapp);
mens (knappverdi == 0)
{
buttonValue = digitalRead (knapp);
}
}
void flashSequence (char * -sekvens)
{
int k = 0;
while (sekvens [k]! = '\ 0')
{
flashDotOrDash (sekvens [k]);
k = k + 1;
}
//Serial.print ("");
forsinkelse (dotDelay * 3);
toggle =! toggle; // veksle farge mellom bokstaver
}
void flashDotOrDash (char dotOrDash)
{
if (dotOrDash == '.')
{
if (flagg == 1)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay);
digitalWrite (summer, LAV);
digitalWrite (ledPinRed, HIGH);
}
annet hvis (flagg == 2)
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay);
digitalWrite (summer, LAV);
digitalWrite (ledPinBlue, HIGH);
}
annet hvis (flagg == 3)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay);
digitalWrite (summer, LAV);
digitalWrite (ledPinGreen, HIGH);
}
annet hvis (flagg == 4)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay);
digitalWrite (summer, LAV);
digitalWrite (ledPinGreen, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
annet hvis (flagg == 5)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay);
digitalWrite (summer, LAV);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
annet hvis (flagg == 6)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay);
digitalWrite (summer, LAV);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
annet hvis (flagg == 7)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay);
digitalWrite (summer, LAV);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
annet hvis (flagg == 8)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay);
digitalWrite (summer, LAV);
digitalWrite (ledPinRed, HIGH);
}
annet hvis (flagg == 9)
{
if (veksle! = 0)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay);
digitalWrite (summer, LAV);
digitalWrite (ledPinRed, HIGH);
}
annet
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay);
digitalWrite (summer, LAV);
digitalWrite (ledPinBlue, HIGH);
}
}
}
annet
{
if (flagg == 1)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay * 3);
digitalWrite (summer, LAV);
digitalWrite (ledPinRed, HIGH);
}
annet hvis (flagg == 2)
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay * 3);
digitalWrite (summer, LAV);
digitalWrite (ledPinBlue, HIGH);
}
annet hvis (flagg == 3)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay * 3);
digitalWrite (summer, LAV);
digitalWrite (ledPinGreen, HIGH);
}
annet hvis (flagg == 4)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay * 3);
digitalWrite (summer, LAV);
digitalWrite (ledPinGreen, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
annet hvis (flagg == 5)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay * 3);
digitalWrite (summer, LAV);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
annet hvis (flagg == 6)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay * 3);
digitalWrite (summer, LAV);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
annet hvis (flagg == 7)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay * 3);
digitalWrite (summer, LAV);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
annet hvis (flagg == 8)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay * 3);
digitalWrite (summer, LAV);
digitalWrite (ledPinGreen, HIGH);
}
annet hvis (flagg == 9)
{
if (veksle! = 0)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay * 3);
digitalWrite (summer, LAV);
digitalWrite (ledPinRed, HIGH);
}
annet
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (summer, HØY);
forsinkelse (dotDelay * 3);
digitalWrite (summer, LAV);
digitalWrite (ledPinBlue, HIGH);
}
}
}
forsinkelse (dotDelay); // mellom bokstaver
// toggle =! toggle; // veksle mellom caractors
}
void selectorSwitch1 (int AI)
{
hvis ((AI & gt; (oldAI + 10)) || (AI & lt; (oldAI - 10)))) // se om verdien har endret seg?
{
hvis (AI & gt; 11 * deltBiter) // må være 7,8,9,10,11,12.
{
hvis (AI & gt; 17 * deltBiter) // må være 10,11,12.
{
hvis (AI & gt; 21 * deltBiter) // må være 12.
{
flagg = 12;
}
annet // må være enten 10.11.
{
hvis (AI & gt; 19 * deltBiter) // må være 11.
{
flagg = 11;
}
ellers // må være 10.
{
flagg = 10;
}
}
}
annet // må være 7,8,9.
{
hvis (AI & gt; 15 * deltBiter) // må være 9.
{
flagg = 9;
}
ellers // må være 7,8.
{
hvis (AI> 13 * deltBits) // må være 8.
{
flagg = 8;
}
ellers // må være 7.
{
flagg = 7;
}
}
}
}
annet // må være 1,2,3,4,5,6.
{
hvis (AI> 5 * deltBiter) // må være 4,5,6.
{
hvis (AI & 9; deltBiter) // må være 6.
{
flagg = 6;
}
ellers // må være 4,5.
{
hvis (AI & gt; 7 * deltBiter) // må være 5
{
flagg = 5;
}
ellers // må være 4.
{
flagg = 4;
}
}
}
ellers // må være 1,2,3.
{
hvis (AI & 3; deltBiter) // må være 3.
{
flagg = 3;
}
ellers // må være 1,2.
{
hvis (AI & delt; bit) // må være 2.
{
flagg = 2;
}
ellers // må være 1.
{
flagg = 1;
}
}
}
}
}
gammelAI = AI;
// forsinkelse (500);
//Serial.println ();
}
void selectorSwitch (int AI)
{
hvis ((AI & gt; (oldAI + 10)) || (AI & lt; (oldAI - 10)))) // se om verdien har endret seg?
{
hvis (AI & gt; 11 * deltBiter) // må være 7,8,9,10,11,12.
{
hvis (AI & gt; 17 * deltBiter) // må være 10,11,12.
{
hvis (AI & gt; 21 * deltBiter) // må være 12.
{
dyr = 12;
}
annet // må være enten 10.11.
{
hvis (AI & gt; 19 * deltBiter) // må være 11.
{
dyr = 11;
}
ellers // må være 10.
{
dyr = 10;
}
}
}
annet // må være 7,8,9.
{
hvis (AI & gt; 15 * deltBiter) // må være 9.
{
dyr = 9;
}
ellers // må være 7,8.
{
hvis (AI> 13 * deltBits) // må være 8.
{
dyr = 8;
}
ellers // må være 7.
{
dyr = 7;
}
}
}
}
annet // må være 1,2,3,4,5,6.
{
hvis (AI> 5 * deltBiter) // må være 4,5,6.
{
hvis (AI & 9; deltBiter) // må være 6.
{
dyr = 6;
}
ellers // må være 4,5.
{
hvis (AI & gt; 7 * deltBiter) // må være 5
{
dyr = 5;
}
ellers // må være 4.
{
dyr = 4;
}
}
}
ellers // må være 1,2,3.
{
hvis (AI & 3; deltBiter) // må være 3.
{
dyr = 3;
}
ellers // må være 1,2.
{
hvis (AI & delt; bit) // må være 2.
{
dyr = 2;
}
ellers // må være 1.
{
dyr = 1;
}
}
}
}
}
gammelAI = AI;
// forsinkelse (500);
//Serial.println ();
}
Hvis du gjentok etter mesteren, er nå i dine hender det samme leketøyet som du kan interessere barna dine i morsekode. Og når de blir store, med en enkel firmwareforandring, kan du få grunnlaget for en standard automatisk "reve", ved å overføre et valg av MOE, MOI, MOS, MOH eller MO5, slå på i ett minutt hvert fjerde minutt.
PS! spesielt for kjedelige mennesker som finner feil med overskrifter: dyr er et samlingsnavn for dyr, fugler og insekter.