Czytelnicy znają zwiadowców - analogi naszych pionierów, ale okazuje się, że są też młode - analogi naszego października. Przyjmowane w nich od piątego roku życia. Syn autora Instructbles pod pseudonimem mr_fid został już adoptowany i będzie musiał wziąć udział w ważnym wydarzeniu dla taksówek i zwiadowców, z których jednym będzie Morse. Aby dodatkowo zainteresować dziecko, mistrz dał mu niezwykłą zabawkę.
Jest wykonywany w dniu
Arduino Nano i generuje 12 różnych słów na sygnał dźwiękowy z wbudowanym generatorem (przełączanym mechanicznym przełącznikiem) i diodą LED RGB. Cykl można ustawić w zakresie od 100 do 1100 milisekund. Do przełączania słów służy przełącznik majstrujący. Konstrukcja zasilana jest baterią litowo-polimerową 1000 mAh. Kontroler ładowania jest wbudowany. Ale tutaj jeszcze nie jest:
Mr_fid dziękuje Simonowi Monkowi za książkę Arduino Programming, którą kupił kilka lat temu. Przygotowując szkic, oparł się na przykładach z tej książki.
Rozpoczęcie pracy nad
domowej roboty, mistrz wiedział o kodzie Morse'a tylko, że był sygnał SOS. Musiałem nauczyć się materiału i dowiedzieć się, że punkt to jedna miara, myślnik to trzy, odstęp między znakami w liście to jedna miara, między literami jest trzy, między słowami jest siedem.
Podczas znakowania tworzywa sztucznego mr_fid używa taśmy maskującej. Dzięki temu ślad znacznika jest lepiej widoczny, jeśli tworzywo sztuczne jest ciemne. Ponadto taśma klejąca jest matowa, a wiertło nie ślizga się podczas „celowania”.
Konieczne jest wcześniejsze oszacowanie, który ze składników konstrukcji zostanie zlokalizowany, aby wszystko pasowało, a żaden z elementów nie dotyka sąsiednich, w tym wystających części. Mr_fid nie zapomniał o niczym innym niż ... baterii. Cóż, skrzynia jest dość przestronna, a potem znaleziono miejsce na nią. W międzyczasie ...
Chociaż mistrz ma małą wiertarkę stołową, nawet z nią użył wiertarki krokowej dla większej wygody, jest to również „jodełka” lub „marchewka”.
Gdy wałek przełącznika gałki jest obracany przez uchwyt, sam przełącznik musi pozostać nieruchomy. W tym celu oprócz wału, przed nim znajduje się mały kołek, który wymaga dodatkowego otworu na panelu przednim.
Dlatego mr_fid najpierw wywiercił otwór na wał, a następnie przykleił taśmę maskującą z tyłu, umieścił przełącznik klucza na miejscu i nacisnął go. Szpilka pozostawiła ślad na taśmie maskującej, pozostaje tam wywiercić otwór.
Schemat bez uwzględnienia akumulatora, kontrolera ładowania i konwertera wygląda następująco:
Na panelu przednim, gdzie znajduje się przełącznik do ciastek i rezystor zmienny, mistrz połączył wnioski tych elementów, które są podłączone do tych samych punktów obwodu w obudowie (w tym przypadku plus i wspólny przewód). Umożliwiło to przeciągnięcie tylko czterech drutów między panelem przednim a obudową.
Przełącznik klucza zamienia się również w rodzaj rezystora zmiennego, tylko krokowego, dla którego wlutowano do niego 11 rezystorów na 1 kOhm, jak pokazano na zdjęciach. Arduino określa swoją pozycję poprzez skokowo zmieniające się napięcie, do którego wystarczy jedno wejście analogowe.
Większe:
Aby kontrolować diodę RGB, mr_fid wybrał piny Arduino o numerach 9, 10 i 11. Są to wyjścia PWM, które w następnym oprogramowaniu pozwolą uzyskać więcej bitów na kolor niż trzy.
Podłączył plus i wspólny przewód w odwrotnej polaryzacji do rezystora zmiennego, tak aby minimalna pozycja odpowiadała cyklowi maksymalnego czasu trwania, czyli minimalnej prędkości.
Przykład z podręcznika Simona Monka jest prosty i jednofunkcyjny: pobiera dane przychodzące przez port szeregowy i tłumaczy je na kod Morse'a w cyklu 200 milisekund. Dodatkowe funkcje dodane przez kreatora zapewniają dostosowanie okresu w zależności od napięcia pochodzącego z silnika z rezystorem zmiennym, a także odmowę portu szeregowego na rzecz przechowywania 12 stałych słów wybranych za pomocą przełącznika tarczowego. Dodano również procedury kontrolowania przycisku przełączania trybu RGB-LED, no cóż, a dzięki głośnikowi wysokotonowemu z wbudowanym generatorem program mógł początkowo kontrolować.
Podczas programowania Arduino mr_fid całkowicie zapomniał, że zabawka musi być zasilana z czegoś, ponieważ płyta była zasilana z USB przez cały czas. Kiedy przypomniał sobie, pierwszą myślą było zasilenie tego wszystkiego od „Krona” poprzez stabilizator. Ale nie pasowało i na początku mistrz chciał umieścić go na zewnątrz, ale potem postanowił użyć cienkiej baterii litowo-polimerowej o 3,7 V i 1000 mAh.
Przy świeżo naładowanym akumulatorze napięcie osiąga 4,2 V, co wystarcza na wszystkie kryształy LED RGB, w tym na niebieski. Ale gdy się rozładowuje, spada i chociaż wystarczy 3,3 V, jasność niebieskiego światła może znacznie się zmniejszyć. Musiałem użyć stabilizatora doładowania ze stabilnym pięcioma woltami na wyjściu. Aby nie wyjmować baterii z etui podczas ładowania, autor dodał kontroler ładowania i dwubiegunowy przełącznik cofania, który łączy baterię z dwoma biegunami z Arduino lub tym kontrolerem. Teraz możesz naładować zabawkę z USB.
Połączył to wszystko w taki sposób, nie zapominając o polaryzacji i zapobieganiu zwarciom:
Zmieniając pozycję przełącznika ciastek, możesz wybrać kod Morse'a dla następujących kombinacji liter: HHH (jedna kropka), OOO (jedna kreska), CAT (kot), DOG (pies), ANT (mrówka), FLY (mucha), RAT (szczur), OWL (sowa), PIG (świnia), HEN (kurczak), FOX (lis) i EMU (emu). Przycisk umożliwia przełączanie trybów pracy diody RGB na pierścieniu: stałe kolory - czerwony, niebieski, zielony, niebiesko-zielony, żółty, malinowy, biały, a także czerwona kropka i zielona kreska, zmiana koloru po każdym słowie, zmiana koloru po każdej literze .
W Arduino mr_fid przesłał taki szkic:int dotDelay = 200;
int ledPinRed = 11; // czerwony
int ledPinBlue = 10; // niebieski
int ledPinGreen = 9; // zielony
int oldAI = 15;
int pat;
int i = 1;
int j = 0;
bool toggle = false;
przycisk int = 8;
int brzęczyk = 7;
flaga int = 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 * litery [] = {
„.-”, „-...”, „-.-.”, „- ..”, „.”, „..-.”, „-.”, „....”, „ .. ”,
„.---”, „-.-”, „.- ..”, „-”, „-.”, „---”, „.--.”, „--.-”, „.-.”,
„...”, „-”, „..-”, „...-”, „.--”, „-..-”, „-.--”, „- ..”} ;
char * numbers [] = {
„-----”, „.----”, „..---”, „...--”, „....-”,
„.....”, „-....”, „--...”, „--- ..”, „----.”};
char * animals3 = "hhhooocatdogantflyratowlpighenfoxemu";
void setup ()
{
pinMode (ledPinBlue, OUTPUT);
pinMode (ledPinRed, OUTPUT);
pinMode (ledPinGreen, OUTPUT);
pinMode (pot, INPUT);
pinMode (rotaryInput, INPUT);
pinMode (przycisk, WEJŚCIE);
pinMode (brzęczyk, WYJŚCIE);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
digitalWrite (ledPinGreen, HIGH);
digitalWrite (ledPinRed, LOW);
opóźnienie (500);
digitalWrite (ledPinRed, HIGH);
opóźnienie (100);
digitalWrite (ledPinBlue, LOW);
opóźnienie (500);
digitalWrite (ledPinBlue, HIGH);
opóźnienie (100);
digitalWrite (ledPinGreen, LOW);
opóźnienie (500);
digitalWrite (ledPinGreen, HIGH);
opóźnienie (100);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (100);
digitalWrite (brzęczyk, LOW);
int buttonValue = digitalRead (przycisk);
if (buttonValue == 1)
{
selectWord = analogRead (rotaryInput);
selectorSwitch1 (selectWord);
}
jeszcze
{
flaga = 1;
}
}
void loop ()
{
wait_for_enter ();
selectWord = analogRead (rotaryInput);
selectorSwitch (selectWord);
potValue = analogRead (pot);
dotDelay = potValue + 100;
i = (zwierzę * 3) -3;
podczas gdy (j <3)
{
ch = zwierzęta3 [i];
if (ch & gt; = 'a' && ch & lt; = 'z')
{
flashSequence (litery [ch - 'a']);
}
w przeciwnym razie, jeśli (ch & gt; = „0” && ch & lt; = „9”)
{
flashSequence (litery [ch - '0']);
}
else if (ch == '')
{
opóźnienie (dotDelay * 7);
}
i = i + 1;
j = j + 1;
}
opóźnienie (dotDelay * 7);
// toggle =! toggle; // przełącz kolor każdego słowa (niepotrzebne)
j oznacza 0;
}
void wait_for_enter ()
{
int buttonValue = digitalRead (przycisk);
while (buttonValue == 0)
{
buttonValue = digitalRead (przycisk);
}
}
void flashSequence (sekwencja char *)
{
int k = 0;
while (sekwencja [k]! = '\ 0')
{
flashDotOrDash (sekwencja [k]);
k = k + 1;
}
//Serial.print ("");
opóźnienie (dotDelay * 3);
toggle =! toggle; // przełącza kolor między literami
}
void flashDotOrDash (char dotOrDash)
{
if (dotOrDash == '.')
{
if (flag == 1)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinRed, HIGH);
}
else if (flag == 2)
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinBlue, HIGH);
}
else if (flag == 3)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinGreen, HIGH);
}
else if (flag == 4)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinGreen, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
else if (flag == 5)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
else if (flag == 6)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
else if (flag == 7)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
else if (flag == 8)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinRed, HIGH);
}
else if (flag == 9)
{
if (przełącznik! = 0)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinRed, HIGH);
}
jeszcze
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinBlue, HIGH);
}
}
}
jeszcze
{
if (flag == 1)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay * 3);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinRed, HIGH);
}
else if (flag == 2)
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay * 3);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinBlue, HIGH);
}
else if (flag == 3)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay * 3);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinGreen, HIGH);
}
else if (flag == 4)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay * 3);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinGreen, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
else if (flag == 5)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay * 3);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
else if (flag == 6)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay * 3);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
else if (flag == 7)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay * 3);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
else if (flag == 8)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay * 3);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinGreen, HIGH);
}
else if (flag == 9)
{
if (przełącznik! = 0)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay * 3);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinRed, HIGH);
}
jeszcze
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (brzęczyk, WYSOKI);
opóźnienie (dotDelay * 3);
digitalWrite (brzęczyk, LOW);
digitalWrite (ledPinBlue, HIGH);
}
}
}
opóźnienie (dotDelay); // między literami
// toggle =! toggle; // przełączanie między caractors
}
void selectorSwitch1 (int AI)
{
if ((AI> (oldAI + 10)) || (AI <(oldAI - 10))) // sprawdź, czy wartość się zmieniła?
{
if (AI> 11 * splitBits) // musi wynosić 7,8,9,10,11,12.
{
if (AI> 17 * splitBits) // musi wynosić 10,11,12.
{
if (AI> 21 * splitBits) // musi wynosić 12.
{
flaga = 12;
}
w przeciwnym razie // musi mieć wartość 10.11.
{
if (AI> 19 * splitBits) // musi wynosić 11.
{
flaga = 11;
}
w przeciwnym razie // musi mieć 10.
{
flaga = 10;
}
}
}
w przeciwnym razie // musi wynosić 7,8,9.
{
if (AI> 15 * splitBits) // musi wynosić 9.
{
flaga = 9;
}
w przeciwnym razie // musi mieć 7,8.
{
if (AI> 13 * splitBits) // musi wynosić 8.
{
flaga = 8;
}
w przeciwnym razie // musi być 7.
{
flaga = 7;
}
}
}
}
w przeciwnym razie // musi wynosić 1,2,3,4,5,6.
{
if (AI> 5 * splitBits) // musi wynosić 4,5,6.
{
if (AI> 9 * splitBits) // musi być 6.
{
flaga = 6;
}
w przeciwnym razie // musi wynosić 4,5.
{
if (AI> 7 * dzielone bity) // musi wynosić 5
{
flaga = 5;
}
w przeciwnym razie // musi być 4.
{
flaga = 4;
}
}
}
w przeciwnym razie // musi wynosić 1,2,3.
{
if (AI> 3 * splitBits) // musi wynosić 3.
{
flaga = 3;
}
w przeciwnym razie // musi wynosić 1,2.
{
if (AI> splitBits) // musi wynosić 2.
{
flaga = 2;
}
w przeciwnym razie // musi wynosić 1.
{
flaga = 1;
}
}
}
}
}
oldAI = AI;
// opóźnienie (500);
//Serial.println ();
}
void selectorSwitch (int AI)
{
if ((AI> (oldAI + 10)) || (AI <(oldAI - 10))) // sprawdź, czy wartość się zmieniła?
{
if (AI> 11 * splitBits) // musi wynosić 7,8,9,10,11,12.
{
if (AI> 17 * splitBits) // musi wynosić 10,11,12.
{
if (AI> 21 * splitBits) // musi wynosić 12.
{
zwierzę = 12;
}
w przeciwnym razie // musi mieć wartość 10.11.
{
if (AI> 19 * splitBits) // musi wynosić 11.
{
zwierzę = 11;
}
w przeciwnym razie // musi mieć 10.
{
zwierzę = 10;
}
}
}
w przeciwnym razie // musi wynosić 7,8,9.
{
if (AI> 15 * splitBits) // musi wynosić 9.
{
zwierzę = 9;
}
w przeciwnym razie // musi mieć 7,8.
{
if (AI> 13 * splitBits) // musi wynosić 8.
{
zwierzę = 8;
}
w przeciwnym razie // musi być 7.
{
zwierzę = 7;
}
}
}
}
w przeciwnym razie // musi wynosić 1,2,3,4,5,6.
{
if (AI> 5 * splitBits) // musi wynosić 4,5,6.
{
if (AI> 9 * splitBits) // musi być 6.
{
zwierzę = 6;
}
w przeciwnym razie // musi wynosić 4,5.
{
if (AI> 7 * dzielone bity) // musi wynosić 5
{
zwierzę = 5;
}
w przeciwnym razie // musi być 4.
{
zwierzę = 4;
}
}
}
w przeciwnym razie // musi wynosić 1,2,3.
{
if (AI> 3 * splitBits) // musi wynosić 3.
{
zwierzę = 3;
}
w przeciwnym razie // musi wynosić 1,2.
{
if (AI> splitBits) // musi wynosić 2.
{
zwierzę = 2;
}
w przeciwnym razie // musi wynosić 1.
{
zwierzę = 1;
}
}
}
}
}
oldAI = AI;
// opóźnienie (500);
//Serial.println ();
}
Jeśli powtórzyłeś za mistrzem, teraz w twoich rękach jest ta sama zabawka, którą możesz zainteresować swoje dzieci kodem Morse'a. A kiedy dorosną, po prostej zmianie oprogramowania, możesz uzyskać podstawę standardowego automatycznego „lisa”, przesyłając wybór MOE, MOI, MOS, MOH lub MO5, włączając się na jedną minutę co cztery minuty.
P.S. szczególnie dla nudnych ludzi, którzy znajdują błędy w nagłówkach: zwierzęta to zbiorowa nazwa zwierząt, ptaków i owadów.