Läsarna känner till speider - analoger av våra pionjärer, men det visar sig att det också finns ungar - analoger från vår oktober. Godkänd i dem från fem års ålder. Son till författaren Instructsbles under smeknamnet mr_fid har redan antagits, och han kommer att behöva delta på ett större evenemang för hytter och speider, varav en är Morse-kod. För att ytterligare intressera barnet gav mästaren honom en ovanlig leksak.
Det körs den
Arduino Nano och genererar 12 olika ord som matas ut till ljudsignalen med en inbyggd generator (kan växlas med en mekanisk omkopplare) och en RGB-LED. Cykeln kan justeras mellan 100 och 1100 millisekunder. För att växla ord finns en tippbrytare. Konstruktionen drivs av ett 1000 mAh litium-polymerbatteri. Laddkontrollen är inbyggd. Men här är det ännu inte:
Mr_fid tackar Simon Monk för boken Arduino Programming, som han köpte för flera år sedan. När han utarbetade skissen förlitade han sig på exempel från den här boken.
Börjar arbeta med
homebrew kvist, befälhavaren visste bara om morskoden att det fanns en SOS-signal. Jag var tvungen att lära mig materialet och ta reda på att punkten är ett mått, strecket är tre, intervallet mellan bokstäverna i bokstaven är ett mått, mellan bokstäverna är tre, mellan orden är sju.
Vid märkning av plast använder mr_fid maskeringstejp. Tack vare detta syns markörspåret bättre om plasten är mörk. Dessutom är denna tejp matt och borren glider inte när den "siktar".
Det är nödvändigt att i förväg uppskatta vilken av komponenterna i strukturen som kommer att placeras, så att allt passar, och inte en av komponenterna berör de angränsande, inklusive de utskjutande delarna. Mr_fid har inte glömt något annat än ... batteriet. Ja, fallet är ganska rymligt, och sedan hittades en plats för det. Under tiden ...
Även om befälhavaren har en liten bänkborr, även om han använde ett stegborr för större bekvämlighet, är det också en "fiskbens" eller "morot".
När knoppomkopplaren roteras av handtaget måste själva omkopplaren förbli still. För detta finns, utöver axeln, en liten stift som kräver ett extra hål på frontpanelen.
Därför borrade mr_fid först ett hål för axeln, limmade sedan maskeringstejpen på baksidan, satte skiftnyckeln på plats och tryckte på den. Stiftet lämnade ett märke på maskeringsbandet, det återstår att borra ett hål där.
Schemat utan att ta hänsyn till batteri, laddningsregulator och omvandlare ser så här ut:
På frontpanelen, där den trådbundna omkopplaren och ett variabelt motstånd är belägna, kombinerade befälhavaren dessa slutsatser av dessa komponenter som är anslutna till samma punkter i kretsen i fallet (i detta fall, plus och gemensam tråd). Detta tillät bara fyra ledningar mellan frontpanelen och höljet.
Skiftnyckelomkopplaren förvandlas också till ett slags variabelt motstånd, endast ett steg ett, för vilket 11 motstånd per 1 kOhm är lödda till den, som visas på fotografierna. Arduino bestämmer sin position genom en stegvis växlande spänning, för vilken en analog ingång räcker.
större:
För att styra RGB-LED valde mr_fid Arduino-stiften med siffrorna 9, 10 och 11. Dessa är PWM-utgångar, som i nästa firmware gör det möjligt att få fler bitar per färg än tre.
Han anslöt ett plus och en gemensam tråd i omvänd polaritet till ett variabelt motstånd, så att minimipositionen motsvarar cykeln med maximal varaktighet, det vill säga minimihastigheten.
Ett exempel från Simon Monks lärobok är enkel och enfunktionell: den tar data som kommer in via en serieport och översätter den till morskod med en klockcykel på 200 millisekunder. Ytterligare funktioner som läggs till av guiden ger justering av perioden beroende på spänningen som kommer från den variabla motståndsmotorn, såväl som vägran av serieporten till förmån för att lagra 12 fasta ord valda av ratten. Lade också till rutiner för att styra RGB-LED-lägesomkopplingsknappen, ja, och med en diskant med en inbyggd generator kan programmet först styra.
När jag programmerade Arduino, glömde mr_fid helt att leksaken måste matas från något, eftersom brädet har drivits från USB hela tiden. När han kom ihåg var den första tanken att driva allt från "Krona" genom stabilisatorn. Men det passade inte, och först ville befälhavaren placera det utanför, men bestämde sig sedan att använda ett tunt litiumpolymerbatteri med 3,7 V och 1000 mAh.
Med ett nyladdat batteri når spänningen 4,2 V, vilket är tillräckligt för alla kristaller på RGB LED, inklusive blått. Men när det lossnar, sjunker det, och även om 3,3 V räcker kan ljusstyrkan i blått ljus minska kraftigt. Jag var tvungen att använda en booststabilisator med stabila fem volt vid utgången. Och för att inte ta bort batteriet från fodralet vid laddning, lägger författaren till en laddningskontroll och en tvåpolig omkopplare som kopplar batteriet med båda polerna till antingen Arduino eller denna kontroll. Nu kan du ladda leksaken från USB.
Han anslöt allt detta på ett sådant sätt, inte att glömma polariteten och förhindra kortslutning:
Genom att ändra läget för kexomkopplaren kan du välja morskod för följande bokstavskombinationer: HHH (en prick), OOO (en streck), KAT (katt), HUND (hund), ANT (myra), FLY (fluga), RAT (råtta), UGL (uggla), gris (gris), HEN (kyckling), räv (räv) och EMU (emu). Knappen låter dig växla RGB-LED: s driftläge på ringen: ständiga färger - röd, blå, grön, blågrön, gul, hallon, vit, samt en röd prick och en grön streck, färgändring efter varje ord, färgändring efter varje bokstav .
I Arduino laddade mr_fid upp en sådan skiss: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 flagga = 1;
int selectWord;
int djur = 1;
int potValue = 0;
int maxVoltageBits = 1023;
int splitBits = maxVoltageBits / 22;
const int pot = A4;
const int rotaryInput = A5;
char ch;
char * letters [] = {
".-", "-...", "-.-.", "- ..", ".", "..-.", "-.", "....", " .. ",
".---", "-.-", ".- ..", "-", "-.", "---", ".--.", "--.-", ".-."
"...", "-", "..-", "...-", ".--", "-..-", "-.--", "- .."} ;
char * nummer [] = {
"-----", ".----", "..---", "...--", "....-",
".....", "-....", "- ...", "--- ..", "----."};
char * animal3 = "hhhooocatdogantflyratowlpighenfoxemu";
ogiltig installation ()
{
pinMode (ledPinBlue, OUTPUT);
pinMode (ledPinRed, OUTPUT);
pinMode (ledPinGreen, OUTPUT);
pinMode (pot, INPUT);
pinMode (rotaryInput, INPUT);
pinMode (knapp, INPUT);
pinMode (summer, OUTPUT);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
digitalWrite (ledPinGreen, HIGH);
digitalWrite (ledPinRed, LOW);
fördröjning (500);
digitalWrite (ledPinRed, HIGH);
fördröjning (100);
digitalWrite (ledPinBlue, LOW);
fördröjning (500);
digitalWrite (ledPinBlue, HIGH);
fördröjning (100);
digitalWrite (ledPinGreen, LOW);
fördröjning (500);
digitalWrite (ledPinGreen, HIGH);
fördröjning (100);
digitalWrite (summer, HÖG);
fördröjning (100);
digitalWrite (summer, LOW);
int-knappValue = digitalRead (knapp);
if (knappvärde == 1)
{
selectWord = analogRead (rotaryInput);
selectorSwitch1 (selectWord);
}
annars
{
flagga = 1;
}
}
void loop ()
{
wait_for_enter ();
selectWord = analogRead (rotaryInput);
selectorSwitch (selectWord);
potValue = analogRead (pot);
dotDelay = potValue + 100;
i = (djur * 3) -3;
medan (j & lt; 3)
{
ch = djur3 [i];
if (ch & gt; = 'a' && ch & lt; = 'z')
{
flashSequence (bokstäver [ch - 'a']);
}
annars om (ch & gt; = '0' && ch & lt; = '9')
{
flashSequence (bokstäver [ch - '0']);
}
annars om (ch == '')
{
fördröjning (dotDelay * 7);
}
i = i + 1;
j = j + 1;
}
fördröjning (dotDelay * 7);
// toggle =! toggle; // växla färg varje ord (inte nödvändigt)
j är 0;
}
void wait_for_enter ()
{
int-knappValue = digitalRead (knapp);
medan (knappvärde == 0)
{
buttonValue = digitalRead (knapp);
}
}
void flashSequence (char * -sekvens)
{
int k = 0;
medan (sekvens [k]! = '\ 0')
{
flashDotOrDash (sekvens [k]);
k = k + 1;
}
//Serial.print ("");
fördröjning (dotDelay * 3);
toggle =! toggle; // växla färg mellan bokstäver
}
void flashDotOrDash (char dotOrDash)
{
if (dotOrDash == '.')
{
if (flagga == 1)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay);
digitalWrite (summer, LOW);
digitalWrite (ledPinRed, HIGH);
}
annat om (flagga == 2)
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay);
digitalWrite (summer, LOW);
digitalWrite (ledPinBlue, HIGH);
}
annat om (flagga == 3)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay);
digitalWrite (summer, LOW);
digitalWrite (ledPinGreen, HIGH);
}
annat om (flagga == 4)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay);
digitalWrite (summer, LOW);
digitalWrite (ledPinGreen, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
annat om (flagga == 5)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay);
digitalWrite (summer, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
annat om (flagga == 6)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay);
digitalWrite (summer, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
annat om (flagga == 7)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay);
digitalWrite (summer, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
annat om (flagga == 8)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay);
digitalWrite (summer, LOW);
digitalWrite (ledPinRed, HIGH);
}
annat om (flagga == 9)
{
if (växla! = 0)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay);
digitalWrite (summer, LOW);
digitalWrite (ledPinRed, HIGH);
}
annars
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay);
digitalWrite (summer, LOW);
digitalWrite (ledPinBlue, HIGH);
}
}
}
annars
{
if (flagga == 1)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay * 3);
digitalWrite (summer, LOW);
digitalWrite (ledPinRed, HIGH);
}
annat om (flagga == 2)
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay * 3);
digitalWrite (summer, LOW);
digitalWrite (ledPinBlue, HIGH);
}
annat om (flagga == 3)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay * 3);
digitalWrite (summer, LOW);
digitalWrite (ledPinGreen, HIGH);
}
annat om (flagga == 4)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay * 3);
digitalWrite (summer, LOW);
digitalWrite (ledPinGreen, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
annat om (flagga == 5)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay * 3);
digitalWrite (summer, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
annat om (flagga == 6)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay * 3);
digitalWrite (summer, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
annat om (flagga == 7)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay * 3);
digitalWrite (summer, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
annat om (flagga == 8)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay * 3);
digitalWrite (summer, LOW);
digitalWrite (ledPinGreen, HIGH);
}
annat om (flagga == 9)
{
if (växla! = 0)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay * 3);
digitalWrite (summer, LOW);
digitalWrite (ledPinRed, HIGH);
}
annars
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (summer, HÖG);
fördröjning (dotDelay * 3);
digitalWrite (summer, LOW);
digitalWrite (ledPinBlue, HIGH);
}
}
}
fördröjning (dotDelay); // mellan bokstäver
// toggle =! toggle; // växla mellan caractors
}
void selectorSwitch1 (int AI)
{
om ((AI & gt; (oldAI + 10)) || (AI & lt; (oldAI - 10))) // // se om värdet har ändrats?
{
om (AI & gt; 11 * uppdelade bitar) // måste vara 7,8,9,10,11,12.
{
om (AI & gt; 17 * uppdelade bitar) // måste vara 10,11,12.
{
om (AI & gt; 21 * splitBits) // måste vara 12.
{
flagga = 12;
}
annars // måste vara antingen 10.11.
{
om (AI & gt; 19 * uppdelade bitar) // måste vara 11.
{
flagga = 11;
}
annars // måste vara 10.
{
flagga = 10;
}
}
}
annars // måste vara 7,8,9.
{
om (AI & gt; 15 * uppdelade bitar) // måste vara 9.
{
flagga = 9;
}
annars // måste vara 7,8.
{
om (AI> 13 * uppdelade bitar) // måste vara 8.
{
flagga = 8;
}
annars // måste vara 7.
{
flagga = 7;
}
}
}
}
annars // måste vara 1,2,3,4,5,6.
{
om (AI> 5 * uppdelade bitar) // måste vara 4,5,6.
{
om (AI & gt; 9 * uppdelade bitar) // måste vara 6.
{
flagga = 6;
}
annars // måste vara 4,5.
{
om (AI & gt; 7 * uppdelade bitar) // måste vara 5
{
flagga = 5;
}
annars // måste vara 4.
{
flagga = 4;
}
}
}
annars // måste vara 1,2,3.
{
om (AI & gt; 3 * uppdelade bitar) // måste vara 3.
{
flagga = 3;
}
annars // måste vara 1,2.
{
om (AI & gt; uppdelade bitar) // måste vara 2.
{
flagga = 2;
}
annars // måste vara 1.
{
flagga = 1;
}
}
}
}
}
oldAI = AI;
// fördröjning (500);
//Serial.println ();
}
void selectorSwitch (int AI)
{
om ((AI & gt; (oldAI + 10)) || (AI & lt; (oldAI - 10))) // // se om värdet har ändrats?
{
om (AI & gt; 11 * uppdelade bitar) // måste vara 7,8,9,10,11,12.
{
om (AI & gt; 17 * uppdelade bitar) // måste vara 10,11,12.
{
om (AI & gt; 21 * splitBits) // måste vara 12.
{
djur = 12;
}
annars // måste vara antingen 10.11.
{
om (AI & gt; 19 * uppdelade bitar) // måste vara 11.
{
djur = 11;
}
annars // måste vara 10.
{
djur = 10;
}
}
}
annars // måste vara 7,8,9.
{
om (AI & gt; 15 * uppdelade bitar) // måste vara 9.
{
djur = 9;
}
annars // måste vara 7,8.
{
om (AI> 13 * uppdelade bitar) // måste vara 8.
{
djur = 8;
}
annars // måste vara 7.
{
djur = 7;
}
}
}
}
annars // måste vara 1,2,3,4,5,6.
{
om (AI> 5 * uppdelade bitar) // måste vara 4,5,6.
{
om (AI & gt; 9 * uppdelade bitar) // måste vara 6.
{
djur = 6;
}
annars // måste vara 4,5.
{
om (AI & gt; 7 * uppdelade bitar) // måste vara 5
{
djur = 5;
}
annars // måste vara 4.
{
djur = 4;
}
}
}
annars // måste vara 1,2,3.
{
om (AI & gt; 3 * uppdelade bitar) // måste vara 3.
{
djur = 3;
}
annars // måste vara 1,2.
{
om (AI & gt; uppdelade bitar) // måste vara 2.
{
djur = 2;
}
annars // måste vara 1.
{
djur = 1;
}
}
}
}
}
oldAI = AI;
// fördröjning (500);
//Serial.println ();
}
Om du upprepade efter befälhavaren, är nu i dina händer samma leksak som du kan intressera dina barn i Morse-kod. Och när de växer upp, med en enkel firmware-förändring, kan du få grunden för en standard automatisk "räv", genom att överföra ett val av MOE, MOI, MOS, MOH eller MO5, slå på en minut var fjärde minut.
P.S. särskilt för tråkiga människor som finner fel med rubriker: djur är ett samlingsnamn för djur, fåglar och insekter.