Okuyucular, öncülerimizin analogları olan izcileri biliyorlar, ancak Ekim'in analogları da var. Onlardan beş yaşından itibaren kabul edildi. Yazarın oğulları mr_fid takma adı altındaki Instructsbles zaten kabul edildi ve biri Morse kodu olacak olan kabin ve izciler için önemli bir etkinliğe katılmak zorunda kalacak. Çocuğa daha fazla ilgi göstermek için usta ona alışılmadık bir oyuncak verdi.
Şu tarihte yürütülür:
Arduino Nano ve dahili bir jeneratör (mekanik bir anahtarla değiştirilebilir) ve bir RGB LED ile bipleyiciye 12 farklı kelime çıkışı üretir. Çevrim 100 ve 1100 milisaniye arasında ayarlanabilir. Kelimeleri değiştirmek için bir tamircilik anahtarı sağlanır. Tasarım, 1000 mAh lityum-polimer pil ile güçlendirilmiştir. Şarj kontrolörü yerleşiktir. Ama burada henüz değil:
Mr_fid, Simon Monk'a birkaç yıl önce satın aldığı Arduino Programlama kitabı için teşekkür ediyor. Eskiz çizilirken, bu kitaptan örneklere dayanıyordu.
Üzerinde çalışmaya başlama
homebrewleri dal, usta Mors kodunu sadece bir SOS sinyali olduğunu biliyordu. Malzemeyi öğrenmek ve noktanın bir ölçü olduğunu, tire üç olduğunu, harf içindeki karakterler arasındaki aralığı bir ölçü, harfler arasında üç, kelimeler arasında yedi olduğunu öğrenmek zorundaydım.
Plastik işaretlerken mr_fid maskeleme bandı kullanır. Bu sayede plastik koyu ise işaret izi daha iyi görülür. Ayrıca, bu yapışkan bant mattır ve “nişan alırken” matkap kaymaz.
Yapının bileşenlerinden hangisinin bulunacağını önceden tahmin etmek gerekir, böylece her şey uyuyor ve bileşenlerden biri değil, çıkıntılı parçalar da dahil olmak üzere komşu olanlara dokunmuyor. Mr_fid ... bataryadan başka bir şey unutmadı. Durum oldukça geniş ve daha sonra bunun için bir yer bulundu. Bu arada ...
Ustanın küçük bir tezgah matkabı olmasına rağmen, onunla birlikte rahatlık için bir adım matkap kullandı, aynı zamanda bir “balıksırtı” veya “havuç”.
Düğme anahtarı şaftı kol tarafından döndürüldüğünde, düğmenin kendisi sabit kalmalıdır. Bunun için şafta ek olarak, önünde ön panelde ek bir delik gerektiren küçük bir pim vardır.
Bu nedenle, mr_fid önce şaft için bir delik açtı, sonra maskeleme bandını arkaya yapıştırdı, anahtar anahtarını yerine koydu ve bastırdı. Pim, maskeleme bandında bir iz bıraktı, orada bir delik açmak için kalır.
Pil, şarj kontrolörü ve dönüştürücü dikkate alınmadan şema şöyle görünür:
Bisküvi anahtarının ve değişken direncin bulunduğu ön panelde, master, bu bileşenlerin, devrenin aynı noktalarına bağlanan bu bileşenlerin sonuçlarını (bu durumda artı ve ortak kablo) birleştirdi. Bu, ön panel ile gövde arasında sadece dört telin çekilmesine izin verdi.
Anahtar anahtarı, fotoğraflarda gösterildiği gibi, 1 adımda 11 direncin lehimlendiği, sadece bir adım olan bir çeşit değişken direnç haline getirilir. Arduino konumunu, bir analog girişin yeterli olduğu kademeli olarak değişen bir voltajla belirler.
daha büyük:
RGB LED'i kontrol etmek için mr_fid, 9, 10 ve 11 numaralı Arduino pinlerini seçti. Bunlar, bir sonraki bellenimde üç renkten daha fazla bit almayı mümkün kılacak PWM çıkışlarıdır.
Değişken bir dirence ters kutuplu bir artı ve ortak bir kablo bağladı, böylece minimum konum maksimum süre, yani minimum hız döngüsüne karşılık geliyor.
Simon Monk'un ders kitabındaki örnek basit ve tek işlevlidir: seri porttan gelen verileri alır ve 200 milisaniyelik bir döngü ile Mors koduna çevirir. Sihirbaz tarafından eklenen ek fonksiyonlar, değişken direnç motorundan gelen gerilime bağlı olarak sürenin ayarlanmasını ve ayrıca anahtarın seçtiği 12 sabit kelimeyi saklamak lehine seri portun reddedilmesini sağlar. Ayrıca RGB LED modu anahtarlama düğmesini kontrol etmek için rutinler de eklendi ve yerleşik bir jeneratöre sahip bir tweeter ile program başlangıçta kontrol edebilir.
Arduino programlanırken, mr_fid oyuncağın bir şeyden beslenmesi gerektiğini tamamen unuttu, çünkü kart tüm bu süre boyunca USB'den besleniyor. Hatırladığı zaman, ilk düşünce hepsini “Krona” dan dengeleyici vasıtasıyla güçlendirmekti. Ancak uymadı ve ilk önce usta onu dışarıya koymak istedi, ancak daha sonra 3.7 V ve 1000 mAh ile ince bir lityum-polimer pil kullanmaya karar verdi.
Yeni şarj edilmiş bir pil ile voltaj, mavi de dahil olmak üzere RGB LED'in tüm kristalleri için yeterli olan 4.2 V'a ulaşır. Ancak deşarj olurken düşer ve 3,3 V yeterli olmasına rağmen mavi ışığın parlaklığı büyük ölçüde azalabilir. Çıkışta sabit beş voltluk bir destek stabilizatörü kullanmak zorunda kaldım. Ve şarj sırasında pili kasadan çıkarmamak için, yazar bir şarj kontrolörü ve pili her iki kutup ile Arduino'ya veya bu kontrolöre bağlayan iki kutuplu bir geri vites anahtarı ekledi. Şimdi oyuncağı USB'den şarj edebilirsiniz.
Bütün bunları böyle bir şekilde birbirine bağladı, polariteyi ve kısa devrenin önlenmesini unutmadı:
Bisküvi anahtarının konumunu değiştirerek, aşağıdaki harf kombinasyonları için Mors kodunu seçebilirsiniz: HHH (bir nokta), OOO (bir çizgi), CAT (kedi), DOG (köpek), ANT (karınca), FLY (sinek), RAT (sıçan), BAYKUŞ (baykuş), PIG (domuz), HEN (tavuk), FOX (tilki) ve EMU (emu). Düğme, halkadaki RGB LED'in çalışma modlarını değiştirmenize izin verir: sabit renkler - kırmızı, mavi, yeşil, mavi-yeşil, sarı, ahududu, beyaz, ayrıca kırmızı bir nokta ve yeşil bir çizgi, her kelimeden sonra renk değişimi, her harften sonra renk değişimi .
Arduino'da mr_fid böyle bir eskiz yükledi:int dotDelay = 200;
int ledPinRed = 11; // kırmızı
int ledPinBlue = 10; // mavi
int ledPinGreen = 9; // yeşil
int oldAI = 15;
int pat;
int i = 1;
int j = 0;
bool geçiş = yanlış;
int düğmesi = 8;
int zil = 7;
int bayrağı = 1;
int selectWord;
int hayvan = 1;
int potValue = 0;
int maxVoltageBits = 1023;
int dividedBits = maxVoltageBits / 22;
const int pot = A4;
const int rotaryInput = A5;
char ch;
char * mektuplar [] = {
".-", "-...", "-.-.", "- ..", ".", "..-.", "-.", "....", " .. ",
".---", "-.-", ".- ..", "-", "-.", "---", ".--.", "--.-", ".-."
"...", "-", "..-", "...-", ".--", "-..-", "-.--", "- .."} ;
char * numbers [] = {
"-----", ".----", "..---", "...--", "....-",
".....", "-....", "--...", "--- ..", "----."};
char * animals3 = "hhhooocatdogantflyratowlpighenfoxemu";
geçersiz kurulum ()
{
pinMode (ledPinBlue, OUTPUT);
pinMode (ledPinRed, OUTPUT);
pinMode (ledPinGreen, OUTPUT);
pinMode (kap, GİRİŞ);
pinMode (rotaryInput, INPUT);
pinMode (düğme, INPUT);
pinMode (buzzer, OUTPUT);
digitalWrite (ledPinRed, YÜKSEK);
digitalWrite (ledPinBlue, YÜKSEK);
digitalWrite (ledPinGreen, YÜKSEK);
digitalWrite (ledPinRed, DÜŞÜK);
gecikme (500);
digitalWrite (ledPinRed, YÜKSEK);
gecikme (100);
digitalWrite (ledPinBlue, DÜŞÜK);
gecikme (500);
digitalWrite (ledPinBlue, YÜKSEK);
gecikme (100);
digitalWrite (ledPinGreen, DÜŞÜK);
gecikme (500);
digitalWrite (ledPinGreen, YÜKSEK);
gecikme (100);
digitalWrite (zil, YÜKSEK);
gecikme (100);
digitalWrite (sesli uyarı, DÜŞÜK);
int buttonValue = digitalRead (düğme);
eğer (buttonValue == 1)
{
selectWord = analogRead (rotaryInput);
selectorSwitch1 (selectWord);
}
başka
{
bayrak = 1;
}
}
void loop ()
{
wait_for_enter ();
selectWord = analogRead (rotaryInput);
selectorSwitch (selectWord);
potValue = analogRead (pot);
dotDelay = potValue + 100;
i = (hayvan * 3) -3;
yaparken (j <3)
{
ch = hayvanlar3 [i];
eğer (ch & gt; = 'a' && ch & lt; = 'z')
{
flashSequence (harfler [ch - 'a']);
}
aksi takdirde (ch & gt; = '0' && ch <= '9')
{
flashSequence (harfler [ch - '0']);
}
else if (ch == '')
{
gecikme (dotDelay * 7);
}
i = i + 1;
j = j + l;
}
gecikme (dotDelay * 7);
// geçiş =! geçiş; // her kelimenin rengini değiştir (gerekli değildir)
j, O'dır;
}
void wait_for_enter ()
{
int buttonValue = digitalRead (düğme);
while (buttonValue == 0)
{
buttonValue = digitalRead (düğme);
}
}
void flashSequence (karakter * sırası)
{
int k = 0;
(sıra [k]! = '\ 0')
{
flashDotOrDash (dizi [k]);
k = k + l;
}
//Serial.print ("");
gecikme (dotDelay * 3);
toggle =! geçiş; // harflerin rengini değiştir
}
geçersiz flashDotOrDash (char dotOrDash)
{
eğer (dotOrDash == '.')
{
eğer (bayrak == 1)
{
digitalWrite (ledPinRed, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinRed, YÜKSEK);
}
else if (bayrak == 2)
{
digitalWrite (ledPinBlue, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinBlue, YÜKSEK);
}
else if (bayrak == 3)
{
digitalWrite (ledPinGreen, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinGreen, YÜKSEK);
}
else if (bayrak == 4)
{
digitalWrite (ledPinGreen, DÜŞÜK);
digitalWrite (ledPinBlue, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinGreen, YÜKSEK);
digitalWrite (ledPinBlue, YÜKSEK);
}
else if (bayrak == 5)
{
digitalWrite (ledPinRed, DÜŞÜK);
digitalWrite (ledPinGreen, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinRed, YÜKSEK);
digitalWrite (ledPinGreen, YÜKSEK);
}
else if (bayrak == 6)
{
digitalWrite (ledPinRed, DÜŞÜK);
digitalWrite (ledPinBlue, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinRed, YÜKSEK);
digitalWrite (ledPinBlue, YÜKSEK);
}
else if (bayrak == 7)
{
digitalWrite (ledPinRed, DÜŞÜK);
digitalWrite (ledPinBlue, DÜŞÜK);
digitalWrite (ledPinGreen, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinRed, YÜKSEK);
digitalWrite (ledPinBlue, YÜKSEK);
digitalWrite (ledPinGreen, YÜKSEK);
}
else if (bayrak == 8)
{
digitalWrite (ledPinRed, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinRed, YÜKSEK);
}
else if (bayrak == 9)
{
if (aç / kapat! = 0)
{
digitalWrite (ledPinRed, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinRed, YÜKSEK);
}
başka
{
digitalWrite (ledPinBlue, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinBlue, YÜKSEK);
}
}
}
başka
{
eğer (bayrak == 1)
{
digitalWrite (ledPinRed, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay * 3);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinRed, YÜKSEK);
}
else if (bayrak == 2)
{
digitalWrite (ledPinBlue, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay * 3);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinBlue, YÜKSEK);
}
else if (bayrak == 3)
{
digitalWrite (ledPinGreen, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay * 3);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinGreen, YÜKSEK);
}
else if (bayrak == 4)
{
digitalWrite (ledPinGreen, DÜŞÜK);
digitalWrite (ledPinBlue, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay * 3);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinGreen, YÜKSEK);
digitalWrite (ledPinBlue, YÜKSEK);
}
else if (bayrak == 5)
{
digitalWrite (ledPinRed, DÜŞÜK);
digitalWrite (ledPinGreen, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay * 3);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinRed, YÜKSEK);
digitalWrite (ledPinGreen, YÜKSEK);
}
else if (bayrak == 6)
{
digitalWrite (ledPinRed, DÜŞÜK);
digitalWrite (ledPinBlue, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay * 3);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinRed, YÜKSEK);
digitalWrite (ledPinBlue, YÜKSEK);
}
else if (bayrak == 7)
{
digitalWrite (ledPinRed, DÜŞÜK);
digitalWrite (ledPinBlue, DÜŞÜK);
digitalWrite (ledPinGreen, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay * 3);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinRed, YÜKSEK);
digitalWrite (ledPinBlue, YÜKSEK);
digitalWrite (ledPinGreen, YÜKSEK);
}
else if (bayrak == 8)
{
digitalWrite (ledPinGreen, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay * 3);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinGreen, YÜKSEK);
}
else if (bayrak == 9)
{
if (aç / kapat! = 0)
{
digitalWrite (ledPinRed, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay * 3);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinRed, YÜKSEK);
}
başka
{
digitalWrite (ledPinBlue, DÜŞÜK);
digitalWrite (zil, YÜKSEK);
gecikme (dotDelay * 3);
digitalWrite (sesli uyarı, DÜŞÜK);
digitalWrite (ledPinBlue, YÜKSEK);
}
}
}
delay (dotDelay); // harfler arasında
// geçiş =! geçiş; // traktörler arasında geçiş yapma
}
void selectorSwitch1 (int AI)
{
if ((AI & gt; (oldAI + 10)) || (AI & (oldAI - 10)))) // değerin değişip değişmediğine bakın?
{
eğer (AI> 11 * bölünmüş Bitler) // 7,8,9,10,11,12 olmalıdır.
{
eğer (AI> 17 * dividedBits) // 10,11,12 olmalıdır.
{
eğer (AI> 21 * dividedBits) // 12 olmalıdır.
{
bayrak = 12;
}
else // 10.11 olmalıdır.
{
eğer (AI> 19 * dividedBits) // 11 olmalıdır.
{
bayrak = 11;
}
else // 10 olmalı.
{
bayrak = 10;
}
}
}
yoksa // 7,8,9 olmalıdır.
{
eğer (AI> 15 * dividedBits) // 9 olmalıdır.
{
bayrak = 9;
}
aksi // 7.8 olmalıdır.
{
eğer (AI> 13 * dividedBits) // 8 olmalıdır.
{
bayrak = 8;
}
else // 7 olmalıdır.
{
bayrak = 7;
}
}
}
}
aksi takdirde // 1,2,3,4,5,6 olmalıdır.
{
eğer (AI> 5 * dividedBits) // 4,5,6 olmalıdır.
{
eğer (AI> 9 * dividedBits) // 6 olmalıdır.
{
bayrak = 6;
}
aksi // 4,5 olmalıdır.
{
eğer (AI> 7 * dividedBits) // 5 olmalı
{
bayrak = 5;
}
else // 4 olmalıdır.
{
bayrak = 4;
}
}
}
else // 1,2,3 olmalıdır.
{
eğer (AI> 3 * dividedBits) // 3 olmalıdır.
{
bayrak = 3;
}
else // 1,2 olmalıdır.
{
eğer (AI & dividedBits) // 2 olmalıdır.
{
bayrak = 2;
}
else // 1 olmalıdır.
{
bayrak = 1;
}
}
}
}
}
oldAI = AI;
// gecikme (500);
//Seri.println ();
}
void selectorSwitch (int AI)
{
if ((AI & gt; (oldAI + 10)) || (AI & (oldAI - 10)))) // değerin değişip değişmediğine bakın?
{
eğer (AI> 11 * splitBits) // 7,8,9,10,11,12 olmalıdır.
{
eğer (AI> 17 * dividedBits) // 10,11,12 olmalıdır.
{
eğer (AI> 21 * dividedBits) // 12 olmalıdır.
{
hayvan = 12;
}
else // 10.11 olmalıdır.
{
eğer (AI> 19 * dividedBits) // 11 olmalıdır.
{
hayvan = 11;
}
else // 10 olmalı.
{
hayvan = 10;
}
}
}
yoksa // 7,8,9 olmalıdır.
{
eğer (AI> 15 * dividedBits) // 9 olmalıdır.
{
hayvan = 9;
}
aksi // 7.8 olmalıdır.
{
eğer (AI> 13 * dividedBits) // 8 olmalıdır.
{
hayvan = 8;
}
else // 7 olmalıdır.
{
hayvan = 7;
}
}
}
}
aksi takdirde // 1,2,3,4,5,6 olmalıdır.
{
eğer (AI> 5 * dividedBits) // 4,5,6 olmalıdır.
{
eğer (AI> 9 * dividedBits) // 6 olmalıdır.
{
hayvan = 6;
}
aksi // 4,5 olmalıdır.
{
eğer (AI> 7 * dividedBits) // 5 olmalı
{
hayvan = 5;
}
else // 4 olmalıdır.
{
hayvan = 4;
}
}
}
else // 1,2,3 olmalıdır.
{
eğer (AI> 3 * dividedBits) // 3 olmalıdır.
{
hayvan = 3;
}
else // 1,2 olmalıdır.
{
eğer (AI & dividedBits) // 2 olmalıdır.
{
hayvan = 2;
}
else // 1 olmalıdır.
{
hayvan = 1;
}
}
}
}
}
oldAI = AI;
// gecikme (500);
//Seri.println ();
}
Ustadan sonra tekrarladıysanız, şimdi ellerinizde çocuklarınızı Mors koduyla ilgilendirebileceğiniz oyuncakla aynı. Ve büyüdüklerinde, bellenimin basit bir şekilde yeniden yapılandırılmasıyla, standart bir otomatik "tilki" için temel oluşturabilir ve her dört dakikada bir dakika boyunca bir MOE, MOI, MOS, MOH veya MO5 seçimini iletebilirsiniz.
Not; özellikle manşetlerde hata bulan sıkıcı insanlar için: hayvanlar hayvanlar, kuşlar ve böcekler için ortak bir isimdir.