हम SPI इंटरफ़ेस का अध्ययन करते हैं और एक शिफ्ट रजिस्टर को Arduino से जोड़ते हैं, जिसे हम LED को नियंत्रित करने के लिए इस प्रोटोकॉल का उपयोग करके एक्सेस करेंगे।
ज़रूरी
- - अरुडिनो;
- - शिफ्ट रजिस्टर 74HC595;
- - 8 एलईडी;
- - 220 ओम के 8 प्रतिरोधक।
निर्देश
चरण 1
एसपीआई - सीरियल पेरिफेरल इंटरफेस या "सीरियल पेरिफेरल इंटरफेस" एक मास्टर डिवाइस को पेरिफेरल डिवाइस (स्लेव) के साथ इंटरफेस करने के लिए एक सिंक्रोनस डेटा ट्रांसफर प्रोटोकॉल है। मास्टर अक्सर एक माइक्रोकंट्रोलर होता है। उपकरणों के बीच संचार चार तारों पर किया जाता है, यही वजह है कि एसपीआई को कभी-कभी "चार-तार इंटरफ़ेस" कहा जाता है। ये टायर हैं:
MOSI (मास्टर आउट स्लेव इन) - मास्टर से स्लेव डिवाइस तक डेटा ट्रांसमिशन लाइन;
MISO (मास्टर इन स्लेव आउट) - दास से स्वामी तक संचरण लाइन;
SCLK (सीरियल क्लॉक) - मास्टर द्वारा उत्पन्न सिंक्रोनाइज़ेशन क्लॉक पल्स;
एसएस (स्लेव सेलेक्ट) - स्लेव डिवाइस सिलेक्शन लाइन; जब लाइन "0" पर, दास "समझता है" कि इसे एक्सेस किया जा रहा है।
डेटा ट्रांसफर के चार तरीके हैं (SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), क्लॉक पल्स पोलरिटी (हम उच्च या निम्न स्तर पर काम करते हैं), क्लॉक पोलारिटी, CPOL और क्लॉक पल्स के चरण (सिंक्रनाइज़ेशन) के संयोजन के कारण क्लॉक पल्स के बढ़ते या गिरते किनारे पर), क्लॉक फेज़, CPHA।
आंकड़ा SPI प्रोटोकॉल का उपयोग करके उपकरणों को जोड़ने के लिए दो विकल्प दिखाता है: स्वतंत्र और कैस्केडिंग। जब स्वतंत्र रूप से SPI बस से जुड़ा होता है, तो मास्टर प्रत्येक दास के साथ व्यक्तिगत रूप से संचार करता है। एक कैस्केड के साथ - एक कैस्केड में दास उपकरणों को वैकल्पिक रूप से चालू किया जाता है।
चरण 2
Arduino में, SPI बसें विशिष्ट बंदरगाहों पर हैं। प्रत्येक बोर्ड का अपना पिन असाइनमेंट होता है। सुविधा के लिए, पिन को डुप्लिकेट किया जाता है और एक अलग ICSP (इन सर्किट सीरियल प्रोग्रामिंग) कनेक्टर पर रखा जाता है। कृपया ध्यान दें कि ICSP कनेक्टर - SS पर कोई गुलाम चयन पिन नहीं है, क्योंकि यह माना जाता है कि Arduino का उपयोग नेटवर्क पर मास्टर के रूप में किया जाएगा। लेकिन यदि आवश्यक हो, तो आप Arduino के किसी भी डिजिटल पिन को SS के रूप में असाइन कर सकते हैं।
यह आंकड़ा Arduino UNO और Nano के लिए SPI बसों को पिन के मानक असाइनमेंट को दर्शाता है।
चरण 3
Arduino के लिए एक विशेष पुस्तकालय लिखा गया है जो SPI प्रोटोकॉल को लागू करता है। यह इस तरह जुड़ा हुआ है: कार्यक्रम की शुरुआत में, #include SPI.h जोड़ें
SPI प्रोटोकॉल के साथ काम करना शुरू करने के लिए, आपको सेटिंग्स सेट करने और फिर SPI.beginTransaction () प्रक्रिया का उपयोग करके प्रोटोकॉल को इनिशियलाइज़ करने की आवश्यकता है। आप इसे एक निर्देश के साथ कर सकते हैं: SPI.beginTransaction (SPISettings (14000000, MSBFIRST, SPI_MODE0))।
इसका मतलब यह है कि हम 14 मेगाहर्ट्ज की आवृत्ति पर एसपीआई प्रोटोकॉल को प्रारंभ करते हैं, डेटा ट्रांसफर चला जाता है, एमएसबी (सबसे महत्वपूर्ण बिट) से "0" मोड में शुरू होता है।
इनिशियलाइज़ेशन के बाद, हम संबंधित SS पिन को LOW स्टेट में डालकर स्लेव डिवाइस का चयन करते हैं।
फिर हम SPI.transfer () कमांड के साथ डेटा को स्लेव डिवाइस में ट्रांसफर करते हैं।
संचरण के बाद, हम SS को उच्च अवस्था में लौटाते हैं।
प्रोटोकॉल के साथ कार्य SPI.endTransaction () कमांड के साथ समाप्त होता है। SPI.beginTransaction () और SPI.endTransaction () निर्देशों के बीच स्थानांतरण के निष्पादन समय को कम करना वांछनीय है ताकि यदि कोई अन्य डिवाइस अलग-अलग सेटिंग्स का उपयोग करके डेटा स्थानांतरण को प्रारंभ करने का प्रयास करता है तो कोई ओवरलैप न हो।
चरण 4
आइए SPI इंटरफ़ेस के व्यावहारिक अनुप्रयोग पर विचार करें। हम एसपीआई बस के माध्यम से 8-बिट शिफ्ट रजिस्टर को नियंत्रित करके एलईडी जलाएंगे। आइए 74HC595 शिफ्ट रजिस्टर को Arduino से कनेक्ट करें। हम एक एलईडी (एक सीमित रोकनेवाला के माध्यम से) के माध्यम से प्रत्येक 8 आउटपुट से जुड़ते हैं। आरेख चित्र में दिखाया गया है।
चरण 5
आइए ऐसा एक स्केच लिखें।
सबसे पहले, आइए SPI लाइब्रेरी को कनेक्ट करें और SPI इंटरफ़ेस को इनिशियलाइज़ करें। आइए पिन 8 को स्लेव सिलेक्शन पिन के रूप में परिभाषित करें। आइए इसे "0" मान भेजकर शिफ्ट रजिस्टर को साफ़ करें। हम सीरियल पोर्ट को इनिशियलाइज़ करते हैं।
एक शिफ्ट रजिस्टर का उपयोग करके एक विशिष्ट एलईडी को रोशन करने के लिए, आपको इसके इनपुट पर 8-बिट नंबर लागू करना होगा। उदाहरण के लिए, पहली एलईडी को प्रकाश में लाने के लिए, हम बाइनरी नंबर 00000001 को फीड करते हैं, दूसरे के लिए - 00000010, तीसरे के लिए - 00000100, आदि। दशमलव संकेतन में ये द्विआधारी संख्याएँ निम्नलिखित अनुक्रम बनाती हैं: 1, 2, 4, 8, 16, 32, 64, 128 और 0 से 7 तक दो की घात हैं।
तदनुसार, एल ई डी की संख्या से लूप () में, हम 0 से 7 तक पुनर्गणना करते हैं। पाउ (आधार, डिग्री) फ़ंक्शन चक्र काउंटर की शक्ति के लिए 2 बढ़ाता है। माइक्रोकंट्रोलर "डबल" प्रकार की संख्याओं के साथ बहुत सटीक रूप से काम नहीं करते हैं, इसलिए परिणाम को पूर्णांक में बदलने के लिए, हम राउंड () फ़ंक्शन का उपयोग करते हैं। और हम परिणामी संख्या को शिफ्ट रजिस्टर में स्थानांतरित करते हैं। स्पष्टता के लिए, सीरियल पोर्ट मॉनिटर इस ऑपरेशन के दौरान प्राप्त मूल्यों को प्रदर्शित करता है: एक अंक के माध्यम से चलता है - एल ई डी एक लहर में प्रकाश करता है।
चरण 6
एल ई डी बारी-बारी से प्रकाश करते हैं, और हम रोशनी की एक यात्रा "लहर" का निरीक्षण करते हैं। एल ई डी को एक शिफ्ट रजिस्टर का उपयोग करके नियंत्रित किया जाता है, जिससे हम एसपीआई इंटरफेस के माध्यम से जुड़े हुए हैं। नतीजतन, 8 एलईडी चलाने के लिए केवल 3 Arduino पिन का उपयोग किया जाता है।
हमने सबसे सरल उदाहरण का अध्ययन किया है कि कैसे एक Arduino SPI बस के साथ काम करता है। हम एक अलग लेख में शिफ्ट रजिस्टर के कनेक्शन पर अधिक विस्तार से विचार करेंगे।