Čitatelji poznaju izviđače - analoge naših pionira, ali ispada da postoje i mladunci - analozi našeg listopada. Prihvaćen u njima od pete godine. Sin autora Poduke pod nadimkom mr_fid već je usvojen, a on će morati prisustvovati velikom događaju za taksije i izviđače, od kojih će jedan biti Morseov kôd. Kako bi dodatno zainteresirao dijete, majstor mu je dao neobičnu igračku.
Izvodi se na
Težak Nano i generira 12 različitih riječi na zvučni signal s ugrađenim generatorom (može se prebacivati mehaničkim prekidačem) i RGB LED. Ciklus se može prilagoditi između 100 i 1100 milisekundi. Za prebacivanje riječi predviđen je preklopnik. Dizajn pokreće litij-polimerna baterija od 1000 mAh. Ugrađen je regulator za punjenje. Ali ovdje još nije:
Mr_fid zahvaljuje Simonu Monku na knjizi Arduino programiranje, koju je kupio prije nekoliko godina. U izradi skice oslanjao se na primjere iz ove knjige.
Početak rada na
homebrew grančica, majstor je za Morseov kôd znao samo da postoji SOS signal. Morao sam naučiti materijal i otkriti da je poanta jedna mjera, crtica tri, interval između znakova u pismu je jedna mjera, između slova tri, između riječi sedam.
Kod označavanja plastike mr_fid koristi traku za maskiranje. Zahvaljujući tome trag markera se bolje vidi ako je plastika tamna. Pored toga, ova ljepljiva traka je mat i bušilica ne klizi kad "cilja".
Potrebno je unaprijed procijeniti gdje će se koja komponenta građevine nalaziti tako da se sve uklapa, a nijedna komponenta ne dodiruje susjedne, uključujući izbočene dijelove. Mr_fid nije zaboravio ništa osim ... baterije. Pa, slučaj je prilično prostran, a onda je pronađeno mjesto za to. U međuvremenu ...
Iako majstor ima malu bušilicu za klupe, čak je i s njom koristio stepeničnu bušilicu za praktičnost, ali je također "kokoš" ili "mrkva".
Kad se osovina prekidača ručice okreće ručicom, sama sklopka mora ostati nepomična. Za to je, osim osovine, ispred nje mali zupčanik koji zahtijeva dodatni otvor na prednjoj ploči.
Stoga je mr_fid najprije izbušio rupu za osovinu, zatim zalijepio maskirnu traku na stražnju stranu, stavio ključ na mjesto i pritisnuo ga. Pin je ostavio trag na traci za maskiranje, ostaje probušiti rupu tamo.
Shema bez uzimanja u obzir baterije, kontrolera i pretvarača izgleda ovako:
Na prednjoj ploči, na kojoj se nalaze prekidač za biskvit i varijabilni otpornik, majstor je kombinirao one zaključke ovih komponenti koje su u slučaju povezane u iste točke kruga (u ovom slučaju plus i zajednička žica). To je omogućilo da se između prednje ploče i kućišta povuku samo četiri žice.
Ključ s ključem također je pretvoren u neku vrstu varijabilnog otpora, samo korak, za koji je na njemu spojeno 11 otpornika po 1 kOhm, kao što je prikazano na fotografijama. Arduino određuje svoj položaj koračnim promjenom napona, za koji je dovoljan jedan analogni ulaz.
veći:
Za kontrolu RGB LED-a, mr_fid je odabrao Arduino igle sa brojevima 9, 10 i 11. Ovo su PWM izlazi, koji će na sljedećem firmveru omogućiti dobivanje više bita po boji od tri.
U varijabilni otpornik povezao je plus i zajedničku žicu u obrnutom polaritetu, tako da minimalni položaj odgovara ciklusu maksimalnog trajanja, to jest minimalnoj brzini.
Primjer iz udžbenika Simon Monk je jednostavan i jednofunkcionalan: uzima podatke koji ulaze kroz serijski ulaz i prevodi ih u Morseov kôd s ciklusom takta od 200 milisekundi. Dodatne funkcije koje je dodao čarobnjak pružaju podešavanje razdoblja ovisno o naponu koji dolazi od motora promjenjivog otpornika, kao i odbijanje serijskog priključka u korist pohranjivanja 12 fiksnih riječi odabranih pomoću prekidača. Također su dodane rutine za upravljanje tipkom za prebacivanje načina rada RGB-LED i dobro, a s visokotoncem sa ugrađenim generatorom program bi mogao inicijalno kontrolirati.
Pri programiranju Arduinoa, mr_fid je u potpunosti zaboravio da igračku treba hraniti iz nečega, jer je ploča cijelo to vrijeme napajala USB. Kad se sjetio, prva pomisao bila je da sve to pokrene iz "Krone" kroz stabilizator. No, to mu nije odgovaralo i majstor ga je isprva htio smjestiti vani, ali tada je odlučio koristiti tanku litij-polimernu bateriju s 3,7 V i 1000 mAh.
Napon sa svježe napunjenom baterijom doseže 4,2 V, što je dovoljno za sve kristale RGB LED, uključujući i plavu. Ali kako se prazni, on opada, i iako je dovoljno 3,3 V, svjetlina plave svjetlosti može se znatno smanjiti. Morao sam koristiti pojačani stabilizator sa stabilnih pet volti na izlazu. A kako ne bi izvadio bateriju iz kućišta prilikom punjenja, autor je dodao regulator punjenja i dvopolni preokretni prekidač koji povezuje bateriju s oba pola na Arduino ili ovaj regulator. Sada možete napuniti igračku s USB-a.
Sve je to povezao na takav način, ne zaboravljajući polaritet i sprečavanje kratkog spoja:
Promjenom položaja prekidača za kekse možete odabrati Morseov kôd za sljedeće kombinacije slova: HHH (jedna točkica), OOO (jedna crtica), CAT (mačka), DOG (pas), ANT (mrav), FLY (letjeti), RAT (štakor), OWL (sova), PIG (svinja), HEN (piletina), FOX (lisica) i EMU (emu). Gumb vam omogućuje prebacivanje načina rada RGB LED na prsten: stalne boje - crvena, plava, zelena, plavo-zelena, žuta, malina, bijela, kao i crvena točka i zelena crtica, promjena boje nakon svake riječi, promjena boje nakon svakog slova ,
U Arduinu je mr_fid prenio takvu skicu:int dotDelay = 200;
int ledPinRed = 11; // crveni
int ledPinBlue = 10; // plava
int ledPinGreen = 9; // zeleno
int oldAI = 15;
int pat;
int i = 1;
int j = 0;
bool toggle = lažno;
int gumb = 8;
int zvuk = 7;
int zastava = 1;
int selectWord;
int životinja = 1;
int potValue = 0;
int maxVoltageBits = 1023;
int podijeljenoBits = maxVoltageBits / 22;
const int pot = A4;
const int rotaryInput = A5;
char ch;
char * slova [] = {
".-", "-...", "-.-.", "- ..", ".", "..-.", "-.", "....", " .. ",
".---", "-.-", ".- ..", "-", "-.", "---", ".--.", "--.-", ".-".
"...", "-", "..-", "...-", ".--", "-..-", "-.--", "- .."} ;
char * brojevi [] = {
"-----", ".----", "..---", "...--", "....-",
".....", "-....", "--...", "--- ..", "----."};
char * animal3 = "hhhooocatdogantflyratowlpighenfoxemu";
postavljanje praznine ()
{
pinMode (ledPinBlue, OUTPUT);
pinMode (ledPinRed, OUTPUT);
pinMode (ledPinGreen, OUTPUT);
pinMode (posuda, INPUT);
pinMode (rotacijski ulaz, ulaz);
pinMode (tipka, ULAZ);
pinMode (zujanje, IZLAZ);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
digitalWrite (ledPinGreen, HIGH);
digitalWrite (ledPinRed, LOW);
kašnjenje (500);
digitalWrite (ledPinRed, HIGH);
kašnjenje (100);
digitalWrite (ledPinBlue, LOW);
kašnjenje (500);
digitalWrite (ledPinBlue, HIGH);
kašnjenje (100);
digitalWrite (ledPinGreen, LOW);
kašnjenje (500);
digitalWrite (ledPinGreen, HIGH);
kašnjenje (100);
digitalWrite (zujanje, HIGH);
kašnjenje (100);
digitalWrite (zujanje, LOW);
int buttonValue = digitalno čitanje (gumb);
ako (gumbValue == 1)
{
selectWord = analogRead (rotacijski ulaz);
selectorSwitch1 (selectWord);
}
drugo
{
zastava = 1;
}
}
void petlja ()
{
wait_for_enter ();
selectWord = analogRead (rotacijski ulaz);
selectorSwitch (selectWord);
potValue = analogRead (pot);
dotDelay = potValue + 100;
i = (životinja * 3) -3;
dok je (j & 3)
{
ch = životinje3 [i];
ako je (ch & gt; = 'a' && ch & lt; = 'z')
{
flashSequence (slova [ch - 'a']);
}
drugo ako (ch & gt; = '0' && ch & lt; = '9')
{
flashSequence (slova [ch - '0']);
}
drugo ako (ch == '')
{
kašnjenje (dotDelay * 7);
}
i = i + 1;
j = j + 1;
}
kašnjenje (dotDelay * 7);
// toggle =! prebacivanje; // prebacuje boju svake riječi (nije potrebno)
j je 0;
}
void wait_for_enter ()
{
int buttonValue = digitalno čitanje (gumb);
dok (gumbValue == 0)
{
buttonValue = digitalno čitanje (gumb);
}
}
void flashSequence (char * slijed)
{
int k = 0;
while (slijed [k]! = '\ 0')
{
flashDotOrDash (slijed [k]);
k = k + 1;
}
//Serial.print ("");
kašnjenje (dotDelay * 3);
toggle =! prebaciti; // prebaciti boju između slova
}
void flashDotOrDash (char dotOrDash)
{
ako (dotOrDash == '.')
{
ako (zastava == 1)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinRed, HIGH);
}
drugo ako (flag == 2)
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinBlue, HIGH);
}
drugo ako (flag == 3)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinGreen, HIGH);
}
drugo ako (flag == 4)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinGreen, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
drugo ako (flag == 5)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
drugo ako (flag == 6)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
drugo ako (flag == 7)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
drugo ako (flag == 8)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinRed, HIGH);
}
drugo ako (flag == 9)
{
if (prebaci! = 0)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinRed, HIGH);
}
drugo
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinBlue, HIGH);
}
}
}
drugo
{
ako (zastava == 1)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay * 3);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinRed, HIGH);
}
drugo ako (flag == 2)
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay * 3);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinBlue, HIGH);
}
drugo ako (flag == 3)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay * 3);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinGreen, HIGH);
}
drugo ako (flag == 4)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay * 3);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinGreen, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
drugo ako (flag == 5)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay * 3);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
drugo ako (flag == 6)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay * 3);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
drugo ako (flag == 7)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay * 3);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
drugo ako (flag == 8)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay * 3);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinGreen, HIGH);
}
drugo ako (flag == 9)
{
if (prebaci! = 0)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay * 3);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinRed, HIGH);
}
drugo
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (zujanje, HIGH);
kašnjenje (dotDelay * 3);
digitalWrite (zujanje, LOW);
digitalWrite (ledPinBlue, HIGH);
}
}
}
kašnjenje (dotDelay); // između slova
// toggle =! prebacivanje; // prebacivanje između karaktora
}
void selectorSwitch1 (int AI)
{
if ((AI & gt; (oldAI + 10)) || (AI <(oldAI - 10))) // vidjeti je li se vrijednost promijenila?
{
ako (AI> 11 * podijeljeni bitovi) // mora biti 7,8,9,10,11,12.
{
ako (AI> 17 * podijeljeni bitovi) // mora biti 10,11,12.
{
ako (AI> 21 * podijeljeni bitovi) // mora biti 12.
{
zastava = 12;
}
ostalo // mora biti ili 10.11.
{
ako (AI> 19 * podijeljeni bitovi) // mora biti 11.
{
zastava = 11;
}
ostalo // mora biti 10.
{
zastava = 10;
}
}
}
ostalo // mora biti 7,8,9.
{
ako (AI> 15 * podijeljeni bitovi) // mora biti 9.
{
zastava = 9;
}
ostalo // mora biti 7.8.
{
ako (AI> 13 * podijeljeni bita) // mora biti 8.
{
zastava = 8;
}
ostalo // mora biti 7.
{
zastava = 7;
}
}
}
}
ostalo // mora biti 1,2,3,4,5,6.
{
ako (AI> 5 * podijeljeni bitovi) // mora biti 4,5,6.
{
ako (AI> 9 * podijeljeni bitovi) // mora biti 6.
{
zastava = 6;
}
ostalo // mora biti 4,5.
{
ako (AI> 7 * podijeljeni bitovi) // mora biti 5
{
zastava = 5;
}
ostalo // mora biti 4.
{
zastava = 4;
}
}
}
ostalo // mora biti 1,2,3.
{
ako (AI> 3 * podijeljeni bitovi) // mora biti 3.
{
zastava = 3;
}
ostalo // mora biti 1,2.
{
ako (AI & gt; podijeljeni bitovi) // mora biti 2.
{
zastava = 2;
}
drugo // mora biti 1.
{
zastava = 1;
}
}
}
}
}
stariAI = AI;
// kašnjenje (500);
//Serial.println ();
}
nevažeći preklopnik (int AI)
{
if ((AI & gt; (oldAI + 10)) || (AI <(oldAI - 10))) // vidjeti je li se vrijednost promijenila?
{
ako (AI> 11 * podijeljeni bitovi) // mora biti 7,8,9,10,11,12.
{
ako (AI> 17 * podijeljeni bitovi) // mora biti 10,11,12.
{
ako (AI> 21 * podijeljeni bitovi) // mora biti 12.
{
životinja = 12;
}
ostalo // mora biti ili 10.11.
{
ako (AI> 19 * podijeljeni bitovi) // mora biti 11.
{
životinja = 11;
}
ostalo // mora biti 10.
{
životinja = 10;
}
}
}
ostalo // mora biti 7,8,9.
{
ako (AI> 15 * podijeljeni bitovi) // mora biti 9.
{
životinja = 9;
}
ostalo // mora biti 7.8.
{
ako (AI> 13 * podijeljeni bita) // mora biti 8.
{
životinja = 8;
}
ostalo // mora biti 7.
{
životinja = 7;
}
}
}
}
ostalo // mora biti 1,2,3,4,5,6.
{
ako (AI> 5 * podijeljeni bitovi) // mora biti 4,5,6.
{
ako (AI> 9 * podijeljeni bitovi) // mora biti 6.
{
životinja = 6;
}
ostalo // mora biti 4,5.
{
ako (AI> 7 * podijeljeni bitovi) // mora biti 5
{
životinja = 5;
}
ostalo // mora biti 4.
{
životinja = 4;
}
}
}
ostalo // mora biti 1,2,3.
{
ako (AI> 3 * podijeljeni bitovi) // mora biti 3.
{
životinja = 3;
}
ostalo // mora biti 1,2.
{
ako (AI & gt; podijeljeni bitovi) // mora biti 2.
{
životinja = 2;
}
drugo // mora biti 1.
{
životinja = 1;
}
}
}
}
}
stariAI = AI;
// kašnjenje (500);
//Serial.println ();
}
Ako ste ponavljali nakon učitelja, sada je u vašim rukama ista igračka s kojom možete zainteresirati svoju djecu u Morseovom kodu. Kad odrastu, jednostavnim preinakom firmware-a možete dobiti osnovu za standardnu automatsku "lisicu", koja odabire izbor MOE, MOI, MOS, MOH ili MO5, uključivanjem na jednu minutu svake četiri minute.
P.s. posebno za dosadne ljude koji pogriješe s naslovima: životinje su skupno ime životinja, ptica i insekata.