Hayalinizi gerçekleştirmenize yardımcı olabilecek çeşitli kavramlar var. Bu cevabın içinde, tam olarak ne istediğinizi nasıl uygulayacağınızı söyleyemem, ama size bunu gerçekleştirmenize yardımcı olacak kavramları gösterebilirim.
İlk önce bus master kavramı var. Bu, iletişimi örnekleyen cihaz değil - bunun yerine, veriyolunun sahibi ve denetimleri olan cihazdır.
Veri yolu yöneticisi olmayan bir cihaz veri yolu üzerinde iletişim kurmak istediğinde, ilk önce veriyolu yöneticisinden izin ister. Eski Z80 (iyi, "eski" diyorum, ama bugün hala birçok formda kullanılıyorlar) bu kavramı diğer çiplerin veriyi kullanmasına ve otobüsleri adreslemesine izin vermek için kullandı. BUSRQ ve BUSACK olmak üzere iki sinyalden oluşur. Bir aygıt, BUSRQ veya BUSACK öğelerinin herhangi birinin etkin olup olmadığına bakar ve ikisi de BUSRQ'yi etkinleştirmez. Eğer veri yolu yöneticisi, veriyolunu diğer cihaza bırakmaya istekliyse (o anda kullanmıyorsa) BUSACK'i etkinleştirir ve diğer cihaz daha sonra veriyolunu kullanabileceğini bilir. BUSRQ ve BUSACK her ikisi de serbest bırakılıncaya kadar başka hiçbir şey kullanamaz. Güzel ve sade ve zarif.
Ama mükemmel değil. İki cihaz da aynı anda otobüse sormaya karar verirse, bir çarpışma elde edersiniz. Bu, bu gibi paylaşılan veri yolu sistemleri arasında ortak bir sorundur ve düzgün bir şekilde nasıl işleneceğini bilmediğiniz sürece anlatılmamış sorunlara neden olur.
Dinle-sen-konuş kavramını girin. Bu, otobüse gönderen cihazın, ayrı bir alıcı aracılığıyla otobüse gönderilenleri dinlemesini de içerir. Daha sonra otobüse ne yolladığının otobüste gerçekten bittiği şeyi bilir. Örneğin, iki cihaz aynı anda konuşursa ve biri
10011001 'i gönderirse ve diğeri
11001100 ' i gönderirse, otobüste görünen sonuç aslında başka bir şey gibi olabilir. Veriyolu sinyallerinin nasıl oluşturulduğuna bağlı olarak
11011101 veya belki
10001000 . Yani, ne gönderdiğini biliyorsan bozuldu, şimdi bunun hakkında bir şeyler yapabilirsin.
Sonraki konsept: yedekleme . Her iki gönderenin de kısa bir süre beklemesi ve tekrar göndermesi. Her ikisi de farklı bir süreliğine geciktikleri sürece, ilk denemeyi yapacak ve iletişim kurabilecektir. Fakat ikisinin de farklı zamanlarda ertelenmesini nasıl garanti edersiniz? Cevabın basit olduğunu düşünebilirsiniz:
rand() veya
random() gibi rastgele bir sayı kullanın. Ama bu aynı zamanda sorunlu:
Another concept: The pseudo random number generator
Arduino rastgele sayılar üretmiyor. Sadece bize, rastgele görün olan bir dizi dizi oluşturmak için karmaşık bir matematiksel formül kullanır. Öyle değiller. Seriye rastgele 10 seri basmak ve birden çok kez basmak için küçük bir program yazin (reset dümesine basin). Aynı "rastgele" sayıları her seferinde aynı sırayla bulacaksınız. Başka bir Arduino üzerinde deneyin ve aynı sayıları tekrar elde edersiniz. Her zaman aynı.
Peki ne yapmalı? Cevap tohumlama rasgele sayı üreteci olarak adlandırılır.
rand() tarafından üretilen bir sonraki sayı, son olarak oluşturulan sayıya bağlıdır. Yani ilk numarasını değiştirin ve sayının kalan kısmı değişecektir. Bununla birlikte, 22 yakalama durumunuz var. Rastgele sayı üretecini, rastgele sayı üretecini tohumlamak için rastgele bir sayı üretebilmek için rasgele sayı üretecini tohumlamak için rastgele bir sayıya ihtiyacınız var ... ad infinitum. Nereye gittiğini görüyor musun? Rastgele bir kaynaktan tohumlanana kadar
rand() rastgele olmadığından
rand() 'dan tohumlayamazsınız. Bu yüzden rastgele bir kaynak bulmanız gerekiyor.
Ve bu kolay bir iş değil. Bilindiği gibi entropi için en iyi kaynak beyaz gürültü . Bu, bir dizi farklı devrelerle, bir diyot bağlantısının parçalanmasından, dirençteki termal dalgalanmaların çok yüksek kazançlı yükseltilmesine kadar bir çok yolla üretilebilir.
Tüm bunlar gerçekten istediğiniz şey için oldukça karmaşıktır, ancak daha az rastlantısal, daha basit bir yöntem vardır - bir şeye bağlı olmayan bir analog giriş okuyun. Uygun bir entropy jeneratörü kadar geniş bir aralığa sahip olmayacaktır, ancak her bir cihazın farklı bir tohum elde etme şansı vermek için yeterli rastgelelik sağlamalıdır.
Bir başka yararlı konsept, kesintidir.
Bu, tüm çarpışmalar ile çok-üslu bir otobüsün karmaşıklığını istemediğiniz bir durumda iyidir. Bir otobüste tüm işi yapan tek bir usta var ve bir köle cihazı söylemek için önemli bir şey olduğunda efendi bir kesinti ile dürtüyor. Efendi sonra "Evet? Ne istiyorsun?" Kölenin cevapladığı "Birisi düğüme bastı".
Bu şekilde, master, düğmeye basılmış olup olmadığını görmek için köleyi sürekli olarak yoklamamaktadır. Genellikle SPI gibi veri yolu düzenlemelerinde kullanılır ve IO genişletici yongaları gibi çok sayıda yonga vardır, bunlar giriş pinlerinden birinin durumu değiştiğinde bir kesinti yapabilir.
Ama eğer 20 cihazınız varsa, 20 interrupt pininiz var demektir? Şart değil. Yeni konsept: kablolu VEYA .
Aynı kesme pinini kullanarak birden fazla farklı köle elde etmek mümkün. Pim normalde bir dirençle YÜKSEK tutulur (dahili bir pullup direnç olabilir) ve her bir köle, bu pime bağlı bir açık drenaj çıkışına sahiptir. Açık bir tahliye çıkışı, "kapalı" olduğunda, herhangi bir şeye bağlı değildir - pim giriş modunda olduğu gibi (aslında giriş ve çıkış modu arasında geçiş yaparak açık tahliye olmayan talaşlar üzerinde taklit edilebilir). Çıkış "açık" olduğunda, bir düğme gibi, IO pinini aşağı çekerek, pimi toprağa bağlar.
O zaman, kimin dikkat etmesi gerektiğini görmek için bu kesintiye eklendiğini bildiği kölelere doğru ilerlemek için ustaya kalıyor. Tabii ki, her biri üzerinde farklı köle gruplarına sahip bir dizi farklı kesme pimi uygulayabilirsiniz - belki de tek bir cihazla yüksek öncelikli ve örneğin her birinde birden fazla cihazla daha düşük öncelikli olanlar.
Aynı fiziksel kabloları paylaşan birden fazla cihazın kullanımına izin vermek için aynı kablolu VEYA ve açık süzme kavramı kullanılabilir. Bu tam olarak I2C'nin nasıl çalıştığını gösterir - iki veri yolu hattı dirençler tarafından çekilir ve üzerindeki aygıtlar farklı mantık seviyelerini oluşturmak için arkaya doğru serbest bırakmak için hattı serbest bırakmak için açık tahliye çıkışları kullanır. İki cihaz birlikte alçalırsa, sadece düşük olur. Açık tahliye metodu olmadan, 1 çıkışı veren bir cihazınız varsa ve başka bir 0 çıktığında, temelde ikisinin arasında kısa bir devre alırsınız ve zarar veren talaşlara son verirsiniz.
Ve daha sonra, eşzamanlı ve eşzamansız iletişim kavramına sahipsiniz, fakat bu tamamen farklı bir su ısıtıcısıdır. Bununla birlikte, saatin üretildiği bir master'a sahip olan SPI ve I2C gibi bir saatli protokollerin senkronize olduğunu söyleyin. UART ve RS-232, RS-485, vb. Gibi protokoller eşzamansızdır - her iki uçta da verinin ne kadar hızlı gönderileceğini (baud oranı) kabul ederler, böylece sinyalleri geldikçe nasıl yorumlayacaklarını bilirler.