इंटरप्ट माइक्रोकंट्रोलर्स की एक शक्तिशाली विशेषता है जो आपको अतुल्यकालिक रूप से घटनाओं को संभालने की अनुमति देती है। मतदान के विपरीत, जो घटनाओं के लिए लगातार जांच करता है, एक विशिष्ट घटना होने पर तुरंत प्रतिक्रिया देता है, जैसे कि बटन प्रेस या टाइमर अतिप्रवाह। यह ट्यूटोरियल आपको Arduino के साथ अंतर को समझने और उपयोग करने के माध्यम से मार्गदर्शन करेगा।
आपको क्या चाहिए
- Arduino Uno (या एक संगत बोर्ड)
- दबाने वाला बटन
- 10K-OHM रोकनेवाला (पुल-डाउन कॉन्फ़िगरेशन के लिए)
- एलईडी और 220-ओम रोकनेवाला (वैकल्पिक)
- ब्रेडबोर्ड और जम्पर तार
- Arduino ide आपके कंप्यूटर पर स्थापित है
चरण 1: व्यवधान क्या हैं?
एक अंतर अस्थायी रूप से एक विशिष्ट घटना को संभालने के लिए मुख्य कार्यक्रम के निष्पादन को रोक देता है। एक बार घटना को संसाधित करने के बाद, कार्यक्रम फिर से शुरू हो जाता है जहां यह छोड़ दिया जाता है। विशेष कार्यों का उपयोग करके व्यवधानों को प्रबंधित किया जाता है सेवा रूटीन.
Arduino में रुकावटों के प्रकार
- बाहरी रुकावट: विशिष्ट पिंस पर घटनाओं से ट्रिगर (जैसे, Arduino Uno पर पिन 2 या 3)।
- पिन परिवर्तन व्यवधान: किसी भी डिजिटल पिन पर बदलाव से ट्रिगर किया गया।
- टाइमर इंटरप्ट्स: टाइमर ओवरफ्लो द्वारा ट्रिगर किया गया या मैचों की तुलना करें।
चरण 2: बाहरी इंटरप्ट का उपयोग करना
Arduino UNO पिन 2 और 3 पर बाहरी अंतरालों का समर्थन करता है। आप इन इंटरप्ट को ट्रिगर करने के लिए कॉन्फ़िगर कर सकते हैं:
- राइजिंग: Signal goes from LOW to HIGH.
- FALLING: Signal goes from HIGH to LOW.
- परिवर्तन: सिग्नल राज्य (निम्न से उच्च या उच्च से निम्न) को बदलता है।
- कम: सिग्नल कम रहता है।
उदाहरण कोड: एक बटन प्रेस का पता लगाना
यह उदाहरण एक एलईडी को टॉगल करता है जब पिन 2 से जुड़ा एक बटन दबाया जाता है।
#define buttonPin 2 // Interrupt pin
#define ledPin 13 // Built-in LED
volatile bool ledState = false; // Shared variable between ISR and main code
void handleInterrupt() {
ledState = !ledState; // Toggle LED state
digitalWrite(ledPin, ledState);
}
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // Enable internal pull-up resistor
pinMode(ledPin, OUTPUT);
attachInterrupt(digitalPinToInterrupt(buttonPin), handleInterrupt, FALLING); // Trigger on button press
}
void loop() {
// Main loop does nothing; interrupt handles the LED
}
स्पष्टीकरण
-
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
: रुकावट को कॉन्फ़िगर करता है।-
pin
: इंटरप्ट पिन (जैसे, Arduino Uno पर पिन 2 या 3)। -
ISR
: निष्पादित करने के लिए रुकावट सेवा दिनचर्या। -
mode
: ट्रिगर की स्थिति (RISING
,FALLING
,CHANGE
, याLOW
).
-
-
digitalPinToInterrupt(pin)
: एक पिन नंबर को उसके रुकावट संख्या में परिवर्तित करता है।
चरण 3: पिन परिवर्तन का उपयोग करना
पिन चेंज इंटरप्ट आपको किसी भी डिजिटल पिन पर परिवर्तन का पता लगाने की अनुमति देता है। इसके लिए अतिरिक्त पुस्तकालयों की आवश्यकता होती है, जैसे सक्षम.
उदाहरण कोड: पिन चेंज इंटरप्ट
#include <EnableInterrupt.h>
#define pin 4 // Pin to monitor
void handlePinChange() {
Serial.println("Pin state changed!");
}
void setup() {
Serial.begin(9600);
enableInterrupt(pin, handlePinChange, CHANGE); // Trigger on any state change
}
void loop() {
// Main loop does nothing; interrupt handles the event
}
पुस्तकालय स्थापना
पिन चेंज इंटरप्ट का उपयोग करने के लिए, स्थापित करें EnableInterrupt Arduino लाइब्रेरी मैनेजर के माध्यम से लाइब्रेरी।
चरण 4: टाइमर इंटरप्ट करता है
टाइमर इंटरप्ट सटीक अंतराल पर कार्यों को शेड्यूल करने के लिए उपयोगी हैं। का संदर्भ लें आर्ज़िनो टाइमर ट्यूटोरियल टाइमर को कॉन्फ़िगर करने के विवरण के लिए इंटरप्ट।
उदाहरण: टाइमर 1 इंटरप्ट के साथ एक एलईडी को ब्लिंकिंग
#define ledPin 13
void setup() {
pinMode(ledPin, OUTPUT);
// Configure Timer1
noInterrupts(); // Disable interrupts during setup
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 15624; // Compare match value for 1Hz (1-second interval)
TCCR1B |= (1 << WGM12); // CTC mode
TCCR1B |= (1 << CS12) | (1 << CS10); // 1024 prescaler
TIMSK1 |= (1 << OCIE1A); // Enable Timer1 compare interrupt
interrupts(); // Enable interrupts
}
ISR(TIMER1_COMPA_vect) {
digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle LED
}
void loop() {
// Main loop does nothing; Timer1 handles the LED
}
चरण 5: रुकावटों का उपयोग करने के लिए सर्वोत्तम अभ्यास
- ISRS को छोटा रखें: त्वरित प्रतिक्रिया सुनिश्चित करने के लिए ISRs में देरी या जटिल गणना से बचें।
- ISRS में सीरियल संचार से बचें: सीरियल फ़ंक्शन एक ISR के अंदर मज़बूती से काम नहीं कर सकते हैं।
-
उपयोग
volatile
साझा चर के लिए: आईएसआरएस और मुख्य कार्यक्रम के बीच साझा किए गए चरों को चिह्नित करेंvolatile
संकलक अनुकूलन मुद्दों को रोकने के लिए। - डेब्यू इनपुट: बटन प्रेस जैसे शोर संकेतों के लिए सॉफ्टवेयर या हार्डवेयर में तर्क को संभालें।
-
महत्वपूर्ण वर्गों के दौरान व्यवधान को अक्षम करें: उपयोग
noInterrupts()
औरinterrupts()
महत्वपूर्ण कोड अनुभागों की सुरक्षा के लिए।
रुकावटों के अनुप्रयोग
- हैंडलिंग बटन मतदान के बिना प्रेस करता है
- रोटरी एनकोडर पढ़ना
- समय महत्वपूर्ण घटनाएं (जैसे, सटीक मोटर नियंत्रण)
- आवधिक कार्य
- बाहरी संकेतों पर प्रतिक्रिया (जैसे, सेंसर, संचार घटनाएं)
समस्या निवारण
- इंटरप्ट ट्रिगर नहीं: सुनिश्चित करें कि सही पिन और मोड कॉन्फ़िगर किया गया है।
- अस्थिर व्यवहार: शोर के संकेतों पर बहस करें और लंबे आईएसआर से बचें।
- पुस्तकालयों के साथ संघर्ष: कुछ पुस्तकालय आंतरिक रूप से रुकावट का उपयोग करते हैं (जैसे, सर्वो, पीडब्लूएम)। अपने कोड के साथ कोई संघर्ष सुनिश्चित करें।
निष्कर्ष
इंटरप्ट्स Arduino परियोजनाओं में घटनाओं के उत्तरदायी और कुशल हैंडलिंग को सक्षम करते हैं। बाहरी, पिन परिवर्तन, और टाइमर इंटरप्ट का उपयोग करना सीखकर, आप मजबूत और सटीक अनुप्रयोग बना सकते हैं। अपनी परियोजनाओं को बढ़ाने और प्रदर्शन का अनुकूलन करने के लिए विभिन्न प्रकार के रुकावटों के साथ प्रयोग करें!