Hayalinizi gerçekleştirmenize yardımcı olabilecek bir dizi kavram vardır. Bu cevabın alanında size istediğinizi tam olarak nasıl uygulayacağınızı söyleyemem, ancak bunu uygulamanıza yardımcı olacak kavramları size gösterebilirim.
Öncelikle kavramı veri yolu yöneticisi . Bu, mutlaka iletişimi başlatan cihaz değildir; bunun yerine, veri yolunun sahibi olan ve kontrol eden cihazdır.
Olmayan bir cihaz olduğunda t Bus master veri yolu üzerinde iletişim kurmak ister, önce veri yolu yöneticisinden izin ister. Eski Z80 (evet, ben "eski" diyorum, ancak bugün hala birçok biçimde kullanılıyorlar) bu konsepti, diğer yongaların verileri kullanmasına ve veri yollarını adreslemesine izin vermek için kullandı. İki sinyalden oluşur - BUSRQ ve BUSACK. Bir cihaz önce BUSRQ veya BUSACK'ten herhangi birinin aktif olup olmadığına bakar ve eğer ikisi de aktif değilse BUSRQ'yu etkinleştirir. Veri yolu yöneticisi diğer aygıta veriyolundan vazgeçmeye istekliyse (o anda kullanmıyorsa), BUSACK'i etkinleştirir ve diğer aygıt veri yolunu kullanabileceğini bilir. Hem BUSRQ hem de BUSACK serbest bırakılıncaya kadar başka hiçbir şey onu kullanamaz. Güzel, sade ve zarif.
Ama mükemmel değil. İki cihaz da aynı anda veri yolunu istemeye karar verirse, bir çarpışma yaşarsınız. Bu, bunun gibi paylaşılan veri yolu sistemleri arasında yaygın bir sorundur ve nasıl düzgün bir şekilde ele alınacağını bilmediğiniz sürece anlatılamayan sorunlara neden olur.
Konuşurken dinle kavramını girin. Bu, otobüste gönderen cihazı, ayrıca ayrı bir alıcı aracılığıyla otobüste gönderilenleri dinlemeyi içerir. Daha sonra, otobüse gönderdiği şeyin aslında otobüse ne olduğunu anlayabilir. Örneğin, iki cihaz aynı anda konuşursa ve biri 10011001
gönderir ve diğeri 11001100
gönderirse, otobüste görünen sonuç aslında başka bir şey olarak sonuçlanabilir, örneğin Veriyolu sinyallerinin nasıl oluşturulduğuna bağlı olarak 11011101
veya belki 10001000
. Dolayısıyla, gönderdiğiniz şeyin bozulduğunu biliyorsanız, şimdi bununla ilgili bir şeyler yapabilirsiniz.
Sonraki konsept: geri adım atmak . Bu, her iki göndericinin de kısa bir süre beklediği ve tekrar denediği ve gönderdiği yerdir. Her ikisi de farklı bir süre geciktikleri sürece ilk denenecek kişi otobüse binecek ve iletişim kurabilecektir. Ama ikisinin de farklı zamanlar için erteleneceğini nasıl garanti edersiniz? Cevabın basit olduğunu düşünebilirsiniz: rand ()
veya random ()
gibi rastgele bir sayı kullanın. Ancak bu da sorunludur:
Başka bir kavram: Sözde rasgele sayı üreteci
Arduino rasgele sayılar üretmez . Bize rastgele görünen bir sayı dizisi oluşturmak için karmaşık bir matematiksel formül kullanır. Gerçi değiller. 10 rastgele sayıyı seri yoluyla yazdırmak için küçük bir program yazın ve birkaç kez çalıştırın (sıfırlama düğmesine basın). Her seferinde aynı sırayla aynı "rasgele" sayıları bulacaksınız. Başka bir Arduino'da deneyin ve aynı sayıları tekrar elde edin. Her zaman aynı.
Peki ne yapmalı? Cevap, rastgele sayı oluşturucu tohumlama olarak adlandırılır. rand ()
ve diğerleri tarafından oluşturulan bir sonraki sayı, en son oluşturulan sayıya bağlıdır. Bu nedenle ilk numarayı değiştirirseniz, kalan tüm numaralar değişecektir. Ancak, bir yakalama durumunuz var. Rastgele sayı üretecini tohumlamak için rastgele bir sayı üretebilmek için rastgele sayı üretecini tohumlamak için rastgele bir sayıya ihtiyacınız var ... ad sonsuz. Bunun nereye gittiğini görüyor musun? Rastgele bir kaynaktan tohumlama yapana kadar rand ()
rastgele olmadığından rand ()
'dan tohumlama yapamazsınız. Bu yüzden rastgele bir kaynak bulmanız gerekiyor.
Bu kolay bir iş değil. Bilindiği gibi entropinin en iyi kaynağı beyaz gürültüdür . Bu, bir diyot bağlantısının bozulmasından dirençteki termal dalgalanmaların çok yüksek kazançlı amplifikasyonuna kadar bir dizi farklı devre ile çeşitli şekillerde üretilebilir.
Hepsi gerçekten istediğiniz şey için oldukça karmaşıktır, ancak biraz daha az rastgele de olsa daha basit bir yöntem vardır - hiçbir şeye bağlı olmayan bir analog girişi okuyun. Uygun bir entropi oluşturucu kadar geniş bir menzile sahip olmayacak, ancak her cihazın farklı bir tohum elde etmesi için makul bir şans vermek için yeterli rastgelelik sağlamalıdır.
Bir başka yararlı kavram da kesmedir.
Bu, tüm çarpışmalarla birlikte çok ana yollu bir veriyolunun karmaşıklığını istemediğiniz bir durumda iyidir. Tüm işi otobüste yapan tek bir ana biriminiz olduğunda ve cihaz, ana bilgisayarı bir kesinti ile dürttüğünü söyleyecek önemli bir şeye sahiptir. Usta daha sonra "Evet? Ne istiyorsun?" kölenin "Biri düğmeme bastı" yanıtını veriyor.
Bu şekilde, usta, düğmeye basılıp basılmadığını görmek için sürekli olarak köleyi sorgulamaz. Genellikle SPI gibi veri yolu düzenlemelerinde kullanılır ve giriş pinlerinden birinin durumunu değiştirdiğinde bir kesinti olduğunu iddia edebilen IO genişletici çipler gibi birçok çip vardır.
Ancak 20 cihazınız varsa bunu yapar 20 kesinti pininiz olduğu anlamına mı geliyor? Şart değil. Yeni konsept: kablolu VEYA .
Hepsi aynı kesme pinini kullanan birden fazla farklı slave'e sahip olmak tamamen mümkündür. Pim normalde bir dirençle YÜKSEK tutulur (dahili bir pullup direnci olabilir) ve her ikincil öğenin o pime bağlı bir açık boşaltma çıkışı vardır. Açık bir tahliye çıkışı, "kapalı" olduğunda hiçbir şeye bağlı değildir - pin giriş modundaymış gibidir (aslında giriş ve çıkış modu arasında geçiş yapılarak açık tahliyesi olmayan yongalarda taklit edilebilir). Çıkış "açık" olduğunda, tıpkı bir düğmenin yapacağı gibi IO pinini aşağı çekerek pimi toprağa bağlar.
Daha sonra, olduğunu bildiği köleler arasında yol almak ana kişinin sorumluluğundadır. Kimin ilgiye ihtiyacı olduğunu görmek için o kesmeye ekli. Elbette, her birinde farklı slave gruplarına sahip bir dizi farklı kesme pini uygulayabilirsiniz - örneğin, yalnızca bir cihaza sahip yüksek öncelikli ve her birinde birden fazla cihaz bulunan daha düşük öncelikli olanlar.
Aynı kablolu VEYA ve açık kanal kavramı, birden fazla cihazın aynı fiziksel kabloları paylaşmasına izin vermek için kullanılabilir. I2C tam olarak böyle çalışır - iki bara hattı dirençler tarafından yukarı çekilir ve üzerindeki cihazlar, farklı mantık seviyelerini oluşturmak için tekrar yüksek seviyeye çıkarmak için hattı aşağı çekmek için açık tahliye çıkışlarını kullanır. İki cihaz birlikte aşağı çekerse, sadece düşük olacaktır. Açık tahliye yöntemi olmasaydı, bir cihazınız 1 çıktı verirken diğeri 0 çıktıysa, temelde ikisi arasında kısa devre olur ve yongalara zarar verirsiniz.
Ve tabii ki eşzamanlı ve eşzamansız iletişim kavramına sahipsiniz, ancak bu tamamen farklı bir balık su ısıtıcısıdır. Basitçe söylemek gerekirse, SPI ve I2C gibi bir saate sahip protokoller, bu saati üreten bir ana makineye sahip, senkrondur. UART ve RS-232, RS-485 vb. Gibi protokoller eşzamansızdır - her iki uca da verinin ne kadar hızlı gönderildiği (baud hızı) konusunda hemfikir olurlar, böylece geldiklerinde sinyalleri nasıl yorumlayacaklarını bilirler.