Читателите познават скаути - аналози на нашите пионери, но се оказва, че има и кубчета - аналози на нашия октомври. Приема се в тях от петгодишна възраст. Синът на автора Инструкции под псевдонима mr_fid вече е приет и той ще трябва да присъства на голямо събитие за таксита и разузнавачи, едно от които ще бъде кодът на Морс. За да заинтересува допълнително детето, майсторът му подари необичайна играчка.
Изпълнява се на
Arduino Нано и генерира 12 различни думи, извеждащи към бийпъра с вграден генератор (превключващ се с механичен превключвател) и RGB светодиод. Цикълът може да се регулира между 100 и 1100 милисекунди. За превключване на думи е осигурен превключвател на калайджия. Дизайнът се захранва от 1000 mAh литиево-полимерна батерия. Контролерът на заряда е вграден. Но тук все още не е така:
Mr_fid благодари на Simon Monk за книгата Arduino Programming, която той купи преди няколко години. При изготвянето на скицата той разчита на примери от тази книга.
Започване на работа
самоделна клонка, капитанът знаеше само за кода на Морз, че има SOS сигнал. Трябваше да науча материала и да разбера, че точката е една мярка, тирето е три, интервалът между знаците в писмото е една мярка, между буквите е три, между думите е седем.
При маркиране на пластмаса mr_fid използва лента за маскиране. Благодарение на това следата от маркера се вижда по-добре, ако пластмасата е тъмна. Освен това тази лепяща лента е матова и тренировката не се подхлъзва, когато се „прицели”.
Необходимо е предварително да се прецени кой от компонентите на конструкцията ще бъде разположен, така че всичко да пасне, а нито един от компонентите да не докосва съседните, включително стърчащите части. Mr_fid не е забравил нищо, освен ... батерията. Е, случаят е доста просторен и тогава беше намерено място за него. Междувременно ...
Въпреки че капитанът има малка бормашина, дори и с него той използва стъпка бормашина за по-голямо удобство, той също е „херинга“ или „морков“.
Когато валът на превключвателя на копчето се завърти от дръжката, самият превключвател трябва да остане неподвижен. За това, в допълнение към вала, пред него е малък щифт, който изисква допълнителен отвор на предния панел.
Следователно mr_fid първо проби дупка за вала, след това залепи лентата за маскиране на гърба, постави ключа на ключа и го натисна. Щифтът остави отпечатък върху маскиращата лента, остава да пробиете дупка там.
Схемата без да се взема предвид батерията, контролера на заряда и конвертора изглежда така:
На предния панел, където са разположени жичния превключвател и променлив резистор, капитанът комбинира онези изводи на тези компоненти, които са свързани към същите точки на веригата в случая (в случая плюс и обща жица). Това позволи да се изтеглят само четири проводника между предния панел и корпуса.
Ключът за гаечни ключове също се превръща във вид променлив резистор, само стъпка един, за който към него са споени 11 резистора на 1 kOhm, както е показано на снимките. Arduino определя позицията си чрез постепенно променящо се напрежение, за което е достатъчен един аналогов вход.
по-голям:
За да контролира RGB светодиода, mr_fid избра пиновете на Arduino с числа 9, 10 и 11. Това са PWM изходи, които в следващия фърмуер ще позволят да получите повече бита на цвят от три.
Той свърза плюс и общ проводник с обратна полярност към променлив резистор, така че минималната позиция съответства на цикъла с максимална продължителност, тоест минималната скорост.
Пример от учебника на Саймън Монк е прост и еднофункционален: той приема данни, постъпващи през сериен порт и ги превежда в код на Морс с цикъл на часовника от 200 милисекунди. Допълнителните функции, добавени от съветника, осигуряват регулиране на периода в зависимост от напрежението, идващо от двигателя на променливия резистор, както и отказът на серийния порт в полза на съхраняването на 12 фиксирани думи, избрани от превключвателя за набиране. Също така са добавени рутинни процедури за управление на бутона за превключване на режим RGB-LED и добре, и с пищялка с вграден генератор програмата може да контролира първоначално.
Когато програмира Arduino, mr_fid напълно забрави, че играчката трябва да се захранва от нещо, защото платката е захранвана от USB през цялото това време. Когато си спомни, първата мисъл беше да захранвам всичко от „Krona“ през стабилизатора. Но това не се побираше и в началото майсторът искаше да го постави навън, но след това реши да използва тънка литиево-полимерна батерия с 3,7 V и 1000 mAh.
При прясно заредена батерия напрежението достига 4,2 V, което е достатъчно за всички кристали на RGB LED, включително синьо. Но тъй като той се зарязва, той пада и въпреки че е достатъчно 3,3 V, яркостта на синята светлина може значително да намалее. Трябваше да използвам усилващ стабилизатор със стабилни пет волта на изхода. И за да не извади батерията от кутията при зареждане, авторът добави контролер за заряд и двуполюсен реверсивен превключвател, който свързва батерията с двата полюса или към Arduino, или към този контролер. Сега можете да зареждате играчката от USB.
Той свързва всичко това заедно по такъв начин, като не забравя полярността и предотвратяването на късо съединение:
Променяйки позицията на превключвателя за бисквити, можете да изберете кода на Morse за следните буквени комбинации: HHH (една точка), OOO (една тире), CAT (котка), DOG (куче), ANT (мравка), FLY (муха), RAT (плъх), OWL (бухал), PIG (прасе), HEN (пиле), FOX (лисица) и EMU (ему). Бутонът ви позволява да превключвате режимите на работа на RGB LED на пръстена: постоянни цветове - червено, синьо, зелено, синьо-зелено, жълто, малина, бяло, както и червена точка и зелено тире, промяна на цвета след всяка дума, промяна на цвета след всяка буква ,
В Arduino, mr_fid качи такава скица:int dotDelay = 200;
int ledPinRed = 11; // червен
int ledPinBlue = 10; // син
int ledPinGreen = 9; // зелено
int oldAI = 15;
int pat;
int i = 1;
int j = 0;
bool превключване = false;
бутон int = 8;
int зумер = 7;
int flag = 1;
int selectWord;
int животно = 1;
int potValue = 0;
int maxVoltageBits = 1023;
int splitBits = maxVoltageBits / 22;
const int pot = A4;
const int rotaryInput = A5;
чар ch;
char * букви [] = {
".-", "-...", "-.-.", "- ..", ".", "..-.", "-.", "....", " .. ",
".---", "-.-", ".- ..", "-", "-.", "---", ".--.", "--.-", ".-."
"...", "-", "..-", "...-", ".--", "-..-", "-.--", "- .."} ;
char * числа [] = {
"-----", ".----", "..---", "...--", "....-",
".....", "-....", "--...", "--- ..", "----."};
char * animal3 = "hhhooocatdogantflyratowlpighenfoxemu";
настройка за невалидност ()
{
pinMode (ledPinBlue, OUTPUT);
pinMode (ledPinRed, OUTPUT);
pinMode (ledPinGreen, OUTPUT);
pinMode (пот, INPUT);
pinMode (rotaryInput, INPUT);
pinMode (бутон, INPUT);
pinMode (зумер, изход);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
digitalWrite (ledPinGreen, HIGH);
digitalWrite (ledPinRed, LOW);
забавяне (500);
digitalWrite (ledPinRed, HIGH);
забавяне (100);
digitalWrite (ledPinBlue, LOW);
забавяне (500);
digitalWrite (ledPinBlue, HIGH);
забавяне (100);
digitalWrite (ledPinGreen, LOW);
забавяне (500);
digitalWrite (ledPinGreen, HIGH);
забавяне (100);
digitalWrite (зумер, HIGH);
забавяне (100);
digitalWrite (зумер, LOW);
int buttonValue = digitalRead (бутон);
ако (buttonValue == 1)
{
selectWord = analogRead (rotaryInput);
selectorSwitch1 (selectWord);
}
още
{
флаг = 1;
}
}
void loop ()
{
wait_for_enter ();
selectWord = analogRead (rotaryInput);
selectorSwitch (selectWord);
potValue = analogRead (пот);
dotDelay = potValue + 100;
i = (животно * 3) -3;
докато (j <3)
{
ch = животни3 [i];
ако (ch & gt; = 'a' && ch & lt; = 'z')
{
flashSequence (букви [ch - 'a']);
}
иначе ако (ch & gt; = '0' && ch & lt; = '9')
{
flashSequence (букви [ch - '0']);
}
иначе ако (ch == '')
{
забавяне (dotDelay * 7);
}
i = i + 1;
j = j + 1;
}
забавяне (dotDelay * 7);
// toggle =! превключване; // превключвайте цвят всяка дума (не е необходима)
j е 0;
}
void wait_for_enter ()
{
int buttonValue = digitalRead (бутон);
докато (buttonValue == 0)
{
buttonValue = digitalRead (бутон);
}
}
void flashSequence (char * последователност)
{
int k = 0;
докато (последователност [k]! = '\ 0')
{
flashDotOrDash (последователност [k]);
k = k + 1;
}
//Serial.print ("");
забавяне (dotDelay * 3);
toggle =! превключване; // превключване на цвят между букви
}
void flashDotOrDash (char dotOrDash)
{
ако (dotOrDash == '.')
{
ако (флаг == 1)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay);
digitalWrite (зумер, LOW);
digitalWrite (ledPinRed, HIGH);
}
иначе ако (flag == 2)
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay);
digitalWrite (зумер, LOW);
digitalWrite (ledPinBlue, HIGH);
}
иначе ако (flag == 3)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay);
digitalWrite (зумер, LOW);
digitalWrite (ledPinGreen, HIGH);
}
иначе ако (flag == 4)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay);
digitalWrite (зумер, LOW);
digitalWrite (ledPinGreen, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
иначе ако (flag == 5)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay);
digitalWrite (зумер, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
иначе ако (flag == 6)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay);
digitalWrite (зумер, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
иначе ако (flag == 7)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay);
digitalWrite (зумер, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
иначе ако (flag == 8)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay);
digitalWrite (зумер, LOW);
digitalWrite (ledPinRed, HIGH);
}
иначе ако (flag == 9)
{
if (превключване! = 0)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay);
digitalWrite (зумер, LOW);
digitalWrite (ledPinRed, HIGH);
}
още
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay);
digitalWrite (зумер, LOW);
digitalWrite (ledPinBlue, HIGH);
}
}
}
още
{
ако (флаг == 1)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay * 3);
digitalWrite (зумер, LOW);
digitalWrite (ledPinRed, HIGH);
}
иначе ако (flag == 2)
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay * 3);
digitalWrite (зумер, LOW);
digitalWrite (ledPinBlue, HIGH);
}
иначе ако (flag == 3)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay * 3);
digitalWrite (зумер, LOW);
digitalWrite (ledPinGreen, HIGH);
}
иначе ако (flag == 4)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay * 3);
digitalWrite (зумер, LOW);
digitalWrite (ledPinGreen, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
иначе ако (flag == 5)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay * 3);
digitalWrite (зумер, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
иначе ако (flag == 6)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay * 3);
digitalWrite (зумер, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
}
иначе ако (flag == 7)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (ledPinBlue, LOW);
digitalWrite (ledPinGreen, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay * 3);
digitalWrite (зумер, LOW);
digitalWrite (ledPinRed, HIGH);
digitalWrite (ledPinBlue, HIGH);
digitalWrite (ledPinGreen, HIGH);
}
иначе ако (flag == 8)
{
digitalWrite (ledPinGreen, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay * 3);
digitalWrite (зумер, LOW);
digitalWrite (ledPinGreen, HIGH);
}
иначе ако (flag == 9)
{
if (превключване! = 0)
{
digitalWrite (ledPinRed, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay * 3);
digitalWrite (зумер, LOW);
digitalWrite (ledPinRed, HIGH);
}
още
{
digitalWrite (ledPinBlue, LOW);
digitalWrite (зумер, HIGH);
забавяне (dotDelay * 3);
digitalWrite (зумер, LOW);
digitalWrite (ledPinBlue, HIGH);
}
}
}
забавяне (dotDelay); // между букви
// toggle =! превключване; // превключване между caractors
}
невалиден селекторSwitch1 (int AI)
{
if ((AI & gt; (oldAI + 10)) || (AI <(oldAI - 10))) // виж дали стойността се е променила?
{
ако (AI> 11 * разделени битове) // трябва да бъде 7,8,9,10,11,12.
{
ако (AI> 17 * разделени битове) // трябва да бъде 10,11,12.
{
ако (AI> 21 * разделени битове) // трябва да е 12.
{
флаг = 12;
}
друго // трябва да бъде или 10.11.
{
ако (AI> 19 * разделени битове) // трябва да е 11.
{
флаг = 11;
}
друго // трябва да е 10.
{
флаг = 10;
}
}
}
друго // трябва да е 7,8,9.
{
ако (AI> 15 * разделени битове) // трябва да бъде 9.
{
флаг = 9;
}
друго // трябва да е 7.8.
{
ако (AI> 13 * разделени битове) // трябва да е 8.
{
флаг = 8;
}
друго // трябва да е 7.
{
флаг = 7;
}
}
}
}
друго // трябва да бъде 1,2,3,4,5,6.
{
ако (AI> 5 * разделени битове) // трябва да бъде 4,5,6.
{
ако (AI> 9 * разделени битове) // трябва да бъде 6.
{
флаг = 6;
}
друго // трябва да бъде 4,5.
{
ако (AI> 7 * разделени битове) // трябва да бъде 5
{
флаг = 5;
}
друго // трябва да е 4.
{
флаг = 4;
}
}
}
друго // трябва да бъде 1,2,3.
{
ако (AI> 3 * разделени битове) // трябва да бъде 3.
{
флаг = 3;
}
друго // трябва да е 1,2.
{
ако (AI> gtBits) // трябва да бъде 2.
{
флаг = 2;
}
друго // трябва да е 1.
{
флаг = 1;
}
}
}
}
}
oldAI = AI;
// забавяне (500);
//Serial.println ();
}
невалиден селектор за превключване (int AI)
{
if ((AI & gt; (oldAI + 10)) || (AI <(oldAI - 10))) // виж дали стойността се е променила?
{
ако (AI> 11 * разделени битове) // трябва да бъде 7,8,9,10,11,12.
{
ако (AI> 17 * разделени битове) // трябва да бъде 10,11,12.
{
ако (AI> 21 * разделени битове) // трябва да е 12.
{
животно = 12;
}
друго // трябва да бъде или 10.11.
{
ако (AI> 19 * разделени битове) // трябва да е 11.
{
животно = 11;
}
друго // трябва да е 10.
{
животно = 10;
}
}
}
друго // трябва да е 7,8,9.
{
ако (AI> 15 * разделени битове) // трябва да бъде 9.
{
животно = 9;
}
друго // трябва да е 7.8.
{
ако (AI> 13 * разделени битове) // трябва да е 8.
{
животно = 8;
}
друго // трябва да е 7.
{
животно = 7;
}
}
}
}
друго // трябва да бъде 1,2,3,4,5,6.
{
ако (AI> 5 * разделени битове) // трябва да бъде 4,5,6.
{
ако (AI> 9 * разделени битове) // трябва да бъде 6.
{
животно = 6;
}
друго // трябва да бъде 4,5.
{
ако (AI> 7 * разделени битове) // трябва да бъде 5
{
животно = 5;
}
друго // трябва да е 4.
{
животно = 4;
}
}
}
друго // трябва да бъде 1,2,3.
{
ако (AI> 3 * разделени битове) // трябва да бъде 3.
{
животно = 3;
}
друго // трябва да е 1,2.
{
ако (AI> gtBits) // трябва да бъде 2.
{
животно = 2;
}
друго // трябва да е 1.
{
животно = 1;
}
}
}
}
}
oldAI = AI;
// забавяне (500);
//Serial.println ();
}
Ако сте повтаряли след господаря, сега в ръцете ви е същата играчка, с която можете да заинтересувате децата си в код на Морз. И когато пораснат, с обикновена промяна на фърмуера, можете да получите основата за стандартна автоматична „лисица“, предавайки избор на MOE, MOI, MOS, MOH или MO5, включвайки се за една минута на всеки четири минути.
Послепис особено за скучните хора, които са виновни с заглавия: животните са общо наименование на животни, птици и насекоми.