ایردوینو کا استعمال کرتے ہوئے دو لکیری ایکچیوٹرز کو ہم آہنگی کرنے کا طریقہ

متناسب لکیری ایکچوایٹرز کے مابین ہم آہنگی کی تحریک بعض صارفین کی درخواستوں کی کامیابی کے لئے اہم ثابت ہوسکتی ہے ، ایک عام دو ٹریڈوڈر کھولنے والے دو لکیری ایککیئٹرز۔ اس مقصد کے حصول کے لئے ہم سرشار فرجیلی کو استعمال کرنے کی سفارش کرتے ہیں مطابقت پذیر کنٹرول باکس ایف اے - سنائک 2 اور ایف اے سیئنسی 4. تاہم کچھ DIYers اور ہیکر ایک مائکروقابو کنٹرولر کی آزادی کو ترجیح دیتے ہیں جیسے Ardino پیش کرتا ہے اور اس کے بجائے اپنا ہم وقت سازی کنٹرول پروگرام لکھنے کو ترجیح دیتا ہے۔ اس ٹیوٹوریل کا مقصد ایک جائزہ فراہم کرنا ہے تاکہ اس کو استعمال کرکے اس کو کیسے حاصل کیا جاسکے آپٹیکل سیریز لکیری ایکچویٹر.

پیش لفظ

یہ سبق آموزینو کے ساتھ ہم وقت سازی کنٹرول حاصل کرنے کے ل required ضروری اقدامات کا سخت سلوک نہیں ہے ، بلکہ اپنے ذاتی پروگرام کو لکھنے میں مدد کرنے کے لئے ایک وسیع جائزہ ہے۔ یہ ٹیوٹوریل اعلی درجے کی ہے اور فرض کرتا ہے کہ آپ ارڈینوو ہارڈ ویئر ، سافٹ ویئر سے پہلے ہی واقف ہیں اور مثالی طور پر نبض کی چوڑائی ماڈیولیشن (پی ڈبلیو ایم) سگنل ، رکاوٹ والی سروس روٹین (آئی ایس آر) ، سینسروں کا ڈیبوننگ ، اور موٹر انکوڈروں سے تجربہ رکھتے ہیں۔ اس ٹیوٹوریل میں فراہم کردہ مثال ایک آدم تناسب کنٹرولر ہے۔ مندرجہ ذیل مثال پر بہت ساری اصلاحات نافذ کی جاسکتی ہیں جن میں یہ شامل ہیں ، لیکن ان تک محدود نہیں: PID کنٹرول لوپ پر عمل درآمد اور دو سے زیادہ لکیری ایکچیوٹرز کو اسکیلنگ۔ براہ کرم آگاہ رہیں کہ ہمارے پاس ارڈینو ایپلی کیشنز کے لئے تکنیکی معاونت فراہم کرنے کے وسائل نہیں ہیں اور عوامی سطح پر دستیاب ٹیوٹوریلز کے باہر ڈیبگ ، ترمیم ، کوڈ یا وائرنگ ڈایاگرام فراہم نہیں کریں گے۔

جائزہ ہم وقت سازی کنٹرول

ہم وقت سازی کنٹرول دو لکیری ایکچیوٹرز کی لمبائی کا موازنہ کرکے اور رفتار کو متناسب ایڈجسٹ کرکے حاصل کیا جاتا ہے۔ اگر ایک ایکچیوٹر دوسرے سے زیادہ تیزی سے آگے بڑھنے لگتا ہے تو ہم اسے کم کردیں گے۔ ہم inbuilt آپٹیکل انکوڈر کے ذریعے لکیری ایکچویٹر کی پوزیشن پڑھ سکتے ہیں۔ آپٹیکل انکوڈر ایک چھوٹی پلاسٹک ڈسک ہے جس میں 10 سوراخ ہیں جو DC موٹر سے منسلک ہیں جیسے جب موٹر گھومتا ہے تو پلاسٹک کی ڈسک بھی ہوجاتی ہے۔ ایک اورکت ایل ای ڈی پلاسٹک ڈسک کی طرف ہدایت کی جاتی ہے تاکہ جب یہ روشنی گھماتا ہے تو وہ آپٹیکل ڈسک کے سوراخوں کے ذریعہ منتقل ہوتا ہے یا ڈسک کے پلاسٹک کے ذریعہ مسدود ہوجاتا ہے۔ ڈسک کے دوسری طرف ایک اورکت سینسر کا پتہ لگاتا ہے جب روشنی سوراخ کے ذریعہ منتقل ہوتی ہے اور مربع لہر سگنل کی نشاندہی کرتی ہے۔ دالوں کی تعداد گننے سے وصول کنندہ کا پتہ لگاتا ہے کہ ہم موٹر کے آر پی ایم اور لکیری ایکچوایٹر نے جس فاصلے پر سفر کیا ہے اس کا حساب لگاسکتے ہیں۔ 35lb آپٹیکل لکیری ایکچوایٹر میں 50 انچ (+/- 5) آپٹیکل دالیں فی انچ سفر ہے جبکہ 200lb اور 400lb ایکٹیو ایٹرز دونوں میں 100 (+/- 5) دالیں فی انچ ہیں۔ ہر ایک لکیری ایکچوایٹر نے کتنی دور تک توسیع کی اس کا موازنہ کرکے ، ہم دونوں ایکچیوٹرز کی رفتار متناسب طور پر ایڈجسٹ کرنے کے قابل ہیں تاکہ وہ توسیع کرتے وقت ہمیشہ ایک ہی لمبائی پر رہیں۔

مطلوبہ اجزاء

وائرنگ ڈایاگرام

ایردوینو کا استعمال کرتے ہوئے دو لکیری ایکچیوٹرز کو ہم آہنگی کرنے کا طریقہ

مندرجہ بالا وائرنگ کنکشن بنائیں۔ لکیری ایکچوایٹر سے نکلنے والے تار کے رنگوں کو ہمیشہ چیک کریں کیونکہ رنگین کنونشن مذکورہ خاکہ میں دکھائے جانے والے رنگ سے تبدیل ہوسکتا ہے۔

    فوری ٹیوٹوریل

    اگر آپ صرف اپنے دو لکیری ایکچیوٹرز کو بیک وقت حرکت پذیر کرنا چاہتے ہیں تو صرف ان مراحل پر عمل کریں:

    • کنکشن بنائیں جیسا کہ وائرنگ آریگرام میں دکھایا گیا ہے۔
    • پہلے پروگرام کو اپ لوڈ اور چلائیں۔
    • اس پروگرام کے ذریعہ دو اقدار کی پیداوار کو دوسرے پروگرام کی لائن 23 میں نیچے کاپی کریں۔
    • دوسرا پروگرام اپ لوڈ اور چلائیں۔
    • متغیر K_p (لائن 37 ، دوسرا پروگرام) کو مختلف کرکے اپنے سسٹم کو بہترین ٹیون کریں۔ یہ سب سے آسانی سے ینالاگ پن A0 پر پوٹینومیٹر سے منسلک کرکے اور پوٹینومیٹر کو پڑھنے کے لئے کوڈ میں ترمیم کرکے اور نقشہ () فنکشن کا استعمال کرتے ہوئے کیا جاتا ہے: K_p = map (ینالاگ پڑھیں (A0)، 0، 1023، 0، 20000)؛

    اس ٹیوٹوریل کا باقی حصہ پروگراموں کی کچھ اہم خصوصیات کو مزید تفصیل سے بیان کرے گا۔ ایک بار پھر ہم یہ اعادہ کرتے ہیں کہ یہ ایک مکمل ٹیوٹوریل نہیں ہے ، بلکہ اپنے پروگرام کو بناتے وقت غور کرنے والی چیزوں کا ایک جائزہ ہے۔

    انشانکن پروگرام کا جائزہ

    اس سے پہلے کہ ہم وقت سازی کنٹرول حاصل کیا جاسکے ، ہمیں پہلے سسٹم کیلیبریٹ کرنا ضروری ہے۔ اس میں فی ایکٹیوچیک سائیکل دالوں کی گنتی شامل ہے کیونکہ جیسا کہ مصنوع کی وضاحت میں بتایا گیا ہے کہ فی انچ سفر میں (+/- 5) دالیں برداشت ہیں۔ ذیل میں پروگرام اپ لوڈ اور چلائیں۔ یہ پروگرام ایککٹویٹرز (لائن 53) کو مکمل طور پر واپس لے لے گا اور آپٹیکل پلس کاؤنٹر کو متغیر صفر پر سیٹ کرے گا اور اس کے بعد یہ مکمل طور پر توسیع اور مکمل طور پر پیچھے ہٹ جائے گا (لائن بالترتیب 63 اور 74) اس عمل کے دوران دالوں کی تعداد میں خلل ڈالنے والے سروس روٹین (ISR) ، لائن 153 اور 166 کے حساب سے شمار کیا جائے گا۔

    https://gist.github.com/Will-Firgelli/89978da2585a747ef5ff988b2fa53904

    COPY
    /* Written by Firgelli Automations
     * Limited or no support: we do not have the resources for Arduino code support
     * This code exists in the public domain
     * 
     * Program requires two (or more) of our supported linear actuators:
     * FA-OS-35-12-XX
     * FA-OS-240-12-XX
     * FA-OS-400-12-XX
     * Products available for purchase at https://www.firgelliauto.com/collections/linear-actuators/products/optical-sensor-actuators
     */
    
    #include <elapsedMillis.h>
    elapsedMillis timeElapsed;
    
    #define numberOfActuators 2 
    int RPWM[numberOfActuators]={6, 11}; //PWM signal right side
    int LPWM[numberOfActuators]={5,10}; 
    int opticalPins[numberOfActuators]={2,3}; //connect optical pins to interrupt pins on Arduino. More information: https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
    volatile long lastDebounceTime_0=0; //timer for when interrupt was triggered
    volatile long lastDebounceTime_1=0;
    
    int Speed = 255; //choose any speed in the range [0, 255]
    
    #define falsepulseDelay 20 //noise pulse time, if too high, ISR will miss pulses. 
    volatile int counter[numberOfActuators]={}; 
    volatile int prevCounter[numberOfActuators]={}; 
    int Direction; //-1 = retracting
                   // 0 = stopped
                   // 1 = extending
    
    int extensionCount[numberOfActuators] = {}; 
    int retractionCount[numberOfActuators] = {}; 
    int pulseTotal[numberOfActuators]={}; //stores number of pulses in one full extension/actuation
    
    void setup(){
      for(int i=0; i<numberOfActuators; i++){
        pinMode(RPWM[i],OUTPUT);
        pinMode(LPWM[i], OUTPUT);
        pinMode(opticalPins[i], INPUT_PULLUP);
        counter[i]=0; //initialize variables as array of zeros
        prevCounter[i]=0;
        extensionCount[i] = 0;
        retractionCount[i] = 0;
        pulseTotal[i] = 0;
      }
      attachInterrupt(digitalPinToInterrupt(opticalPins[0]), count_0, RISING);
      attachInterrupt(digitalPinToInterrupt(opticalPins[1]), count_1, RISING); 
    
      Serial.begin(9600);
      Serial.println("Initializing calibration");
      Serial.println("Actuator retracting...");
      Direction = -1;
      moveTillLimit(Direction, 255); 
      Serial.println("Actuator fully retracted");
      delay(1000);
    
      for(int i=0; i<numberOfActuators; i++){
        Serial.print("\t\t\t\tActuator ");
        Serial.print(i);
      }
    
      Direction = 1;
      moveTillLimit(Direction, 255); //extend fully and count pulses
      Serial.print("\nExtension Count:");
      for(int i=0; i<numberOfActuators; i++){
      extensionCount[i]=counter[i];
      Serial.print("\t\t"); 
      Serial.print(extensionCount[i]);
      Serial.print("\t\t\t"); 
      }
      delay(1000);
    
      Direction = -1;
      moveTillLimit(Direction, 255); //retract fully and count pulses
      Serial.print("\nRetraction Count:");
      for(int i=0; i<numberOfActuators; i++){
      retractionCount[i]=counter[i];
      Serial.print("\t\t"); 
      Serial.print(abs(retractionCount[i]));
      Serial.print("\t\t\t"); 
      }
      Serial.print("\n");
    
      for(int i=0; i<numberOfActuators; i++){
        Serial.print("\nActuator ");
        Serial.print(i);
        Serial.print(" average pulses: ");
        pulseTotal[i]=(extensionCount[i]+abs(retractionCount[i]))/2; //takes the average of measurements
        Serial.print(pulseTotal[i]); 
      } 
      Serial.println("\n\nEnter these values in the synchronous control progam.");
    }
    
    void loop() { 
    }
    
    void moveTillLimit(int Direction, int Speed){
      //this function moves the actuator to one of its limits
      for(int i = 0; i < numberOfActuators; i++){
        counter[i] = 0; //reset counter variables
        prevCounter[i] = 0;
      } 
      do {
        for(int i = 0; i < numberOfActuators; i++) {
          prevCounter[i] = counter[i];
        }
        timeElapsed = 0;
        while(timeElapsed < 200){ //keep moving until counter remains the same for a short duration of time
          for(int i = 0; i < numberOfActuators; i++) {
            driveActuator(i, Direction, Speed);
          }
        }
      } while(compareCounter(prevCounter, counter)); //loop until all counts remain the same
    }
    
    bool compareCounter(volatile int prevCounter[], volatile int counter[]){
      //compares two arrays and returns false when every element of one array is the same as its corresponding indexed element in the other array
      bool areUnequal = true;
      for(int i = 0; i < numberOfActuators; i++){
        if(prevCounter[i] == counter[i]){
          areUnequal = false;
        } 
        else{ //if even one pair of elements are unequal the entire function returns true
          areUnequal = true;
          break;
        }
      }
      return areUnequal;
    }
    
    void driveActuator(int Actuator, int Direction, int Speed){
      int rightPWM=RPWM[Actuator];
      int leftPWM=LPWM[Actuator];
    
      switch(Direction){
      case 1: //extension
        analogWrite(rightPWM, Speed);
        analogWrite(leftPWM, 0);
      break;
    
      case 0: //stopping
        analogWrite(rightPWM, 0);
        analogWrite(leftPWM, 0);
      break;
    
      case -1: //retraction
        analogWrite(rightPWM, 0);
        analogWrite(leftPWM, Speed);
      break;
      }
    }
    
    void count_0(){
      //This interrupt function increments a counter corresponding to changes in the optical pin status
      if ((millis() - lastDebounceTime_0) > falsepulseDelay) { //reduce noise by debouncing IR signal 
        lastDebounceTime_0 = millis();
        if(Direction==1){
          counter[0]++;
        }
        if(Direction==-1){
          counter[0]--;
        }
      }
    }
    
    void count_1(){
      if ((millis() - lastDebounceTime_1) > falsepulseDelay) { 
        lastDebounceTime_1 = millis();
        if(Direction==1){
          counter[1]++;
        }
        if(Direction==-1){
          counter[1]--;
        }
      }
    }

    ہم وقت ساز پروگرام کا جائزہ

    ہم وقت سازی کنٹرول پروگرام اپ لوڈ کرنے سے پہلے ، آپ کو پہلے انشانکن پروگرام کے ذریعہ اقدار کی پیداوار کو لائن 23 میں کاپی کرنا ہوگا اور موجودہ صف کو تبدیل کرنا ہوگا: own 908، 906 your اپنی اقدار کے ساتھ۔ مزید برآں ، اگر آپ 35lb لکیری ایککیو ایٹر استعمال کر رہے ہیں تو آپ کو لائن 29 میں متغیر کی قدر کو 20 ملی سیکنڈ سے 8 ملی سیکنڈ میں تبدیل کرنے کی ضرورت ہوگی۔

    ایک بار مکمل طور پر پیچھے ہٹنے کے بعد (اصل کی شناخت کے ل you) آپ توسیع ، مراجعت اور روکنے کے احکامات سے متعلق تین بٹن دباکر دونوں لکیری ایکچیوٹرز کو ہم وقت سازی میں منتقل کرسکتے ہیں۔ مشغول نال کاؤنٹروں کا موازنہ کرکے اور ہم آہنگی میں رہنے کے ل them ان کے مابین رفتار کو ایڈجسٹ کرکے بھی ناہموار بوجھ کے تحت ہم وقت سازی میں رہیں گے۔ مشورہ دیا جائے کہ موجودہ پروگرام ایک آسان تناسب کنٹرولر ، لائن 93 imple کو نافذ کرتا ہے ، کیونکہ اس توازن کے آس پاس اوور شوٹ اور دوغلا پن کے تابع ہے۔ آپ لائن 37 میں بیان کردہ متغیر K_p کو مختلف کرکے اس کی تیوین کرسکتے ہیں۔ یہ سب سے آسانی سے ینالاگ پن A0 پر پوٹینومیٹر سے منسلک کرکے اور پوٹینومیٹر کو پڑھنے کے لئے کوڈ میں ترمیم کرکے اور نقشہ () فنکشن کا استعمال کرتے ہوئے کیا جاتا ہے: K_p = map (ینالاگ پڑھیں (A0)، 0، 1023، 0، 20000)؛

    بہترین نتائج کے ل we ہم تناسب سے کنٹرولر کو ہٹانے اور PID کنٹرول لوپ پر عمل درآمد کی سختی سے تجویز کرتے ہیں۔ تاہم یہ تعارفی ٹیوٹوریل کے دائرہ کار سے باہر ہے اور اسے جان بوجھ کر چھوڑ دیا گیا ہے۔

    https://gist.github.com/Will-Firgelli/44a14a4f3cac3209164efe8abe3285b6

    COPY
    /* Written by Firgelli Automations
     * Limited or no support: we do not have the resources for Arduino code support
     * This code exists in the public domain
     * 
     */
    
    #include <elapsedMillis.h>
    elapsedMillis timeElapsed;
    
    #define numberOfActuators 2       
    int downPin = 7;
    int stopPin = 8;
    int upPin = 9;        
    int RPWM[numberOfActuators]={6, 11};                                  //PWM signal right side
    int LPWM[numberOfActuators]={5,10};        
    int opticalPins[numberOfActuators]={2,3};                             //connect optical pins to interrupt pins on Arduino. More information: https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
    volatile unsigned long lastDebounceTime[numberOfActuators]={0,0};     //timer for when interrupt is triggered
    int pulseTotal[numberOfActuators]={908, 906};                         //values found experimentally by first running two-optical-actuators-sync-calibration.ino
    
    int desiredSpeed=255;                            
    int adjustedSpeed;
    int Speed[numberOfActuators]={};    
    
    #define falsepulseDelay 20                                            //noise pulse time, if too high, ISR will miss pulses. If using 35lb actuator, set to 8ms                          
    volatile int counter[numberOfActuators]={};   
    volatile int prevCounter[numberOfActuators]={};     
    volatile float normalizedPulseCount[numberOfActuators]={};
    int Direction;                                                        //-1 = retracting
                                                                          // 0 = stopped
                                                                          // 1 = extending
    float error;
    int K_p=12000;                                                        //optimized experimentally. adjust this to fine tune your system
    int laggingIndex, leadingIndex;                                       //index of the slowest/fastest actuator
    
    void setup(){ 
      pinMode(stopPin, INPUT_PULLUP);
      pinMode(downPin, INPUT_PULLUP);
      pinMode(upPin, INPUT_PULLUP);
      for(int i=0; i<numberOfActuators; i++){
        pinMode(RPWM[i],OUTPUT); 
        pinMode(LPWM[i], OUTPUT);
        pinMode(opticalPins[i], INPUT_PULLUP);
        Speed[i]=desiredSpeed;
      }
      attachInterrupt(digitalPinToInterrupt(opticalPins[0]), count_0, RISING);
      attachInterrupt(digitalPinToInterrupt(opticalPins[1]), count_1, RISING);  
      Serial.begin(9600);
      Serial.println("Calibrating the origin");
      Serial.println("Actuator retracting...");
      Direction = -1;
      moveTillLimit(Direction, 255);  
      for(int i=0; i<numberOfActuators; i++){
        counter[i]=0;                                                     //reset variables 
        prevCounter[i]=0;
        normalizedPulseCount[i] = 0;
      }
      delay(1000);
      Serial.println("Actuator fully retracted");
    } 
    
    void loop() {  
      checkButtons();
    
      if(Direction==1){                                                   //based on direction of motion identify the leading and lagging actuator by comparing pulse counts
        if(normalizedPulseCount[0] < normalizedPulseCount[1]){
          laggingIndex = 0; 
          leadingIndex = 1;
        }
        else{
          laggingIndex = 1;
          leadingIndex = 0;
        }
      }
      else if(Direction==-1){
        if(normalizedPulseCount[0] > normalizedPulseCount[1]){
          laggingIndex = 0;
          leadingIndex = 1;
        }
        else{
          laggingIndex = 1;
          leadingIndex = 0;
        }
      }
      
      error=abs(normalizedPulseCount[laggingIndex]-normalizedPulseCount[leadingIndex]);
      if(Direction!=0){       
        adjustedSpeed=desiredSpeed-int(error*K_p);                 
        Speed[leadingIndex]=constrain(adjustedSpeed, 0, 255);               //slow down fastest actuator
        Speed[laggingIndex]=desiredSpeed;
      }
      for(int i=0; i<numberOfActuators; i++){
        Serial.print("  ");
        Serial.print(Speed[i]);
        Serial.print("  ");
        Serial.print(normalizedPulseCount[i]*1000);
        driveActuator(i, Direction, Speed[i]);
      }
      Serial.println();
    }
    
    void checkButtons(){
      //latching buttons: direction remains the same when let go
      if(digitalRead(upPin)==LOW){ Direction=1; }                           //check if extension button is pressed
      if(digitalRead(downPin)==LOW){ Direction=-1; }  
      if(digitalRead(stopPin)==LOW){ Direction=0; }
    }
    
    void moveTillLimit(int Direction, int Speed){
      //function moves the actuator to one of its limits
      for(int i = 0; i < numberOfActuators; i++){
        counter[i] = 0;                                                     //reset counter variables
        prevCounter[i] = 0;
      }  
      do {
        for(int i = 0; i < numberOfActuators; i++) {
          prevCounter[i] = counter[i];
        }
        timeElapsed = 0;
        while(timeElapsed < 200){                                           //keep moving until counter remains the same for a short duration of time
          for(int i = 0; i < numberOfActuators; i++) {
            driveActuator(i, Direction, Speed);
          }
        }
      } while(compareCounter(prevCounter, counter));                        //loop until all counters remain the same
    }
    
    bool compareCounter(volatile int prevCounter[], volatile int counter[]){
      //compares two arrays and returns false when every element of one array is the same as its corresponding indexed element in the other array
      bool areUnequal = true;
      for(int i = 0; i < numberOfActuators; i++){
        if(prevCounter[i] == counter[i]){
          areUnequal = false;
        } 
        else{                                                               //if even one pair of elements are unequal the entire function returns true
          areUnequal = true;
          break;
        }
      }
      return areUnequal;
    }
    
    void driveActuator(int Actuator, int Direction, int Speed){
      int rightPWM=RPWM[Actuator];
      int leftPWM=LPWM[Actuator];
      switch(Direction){
        case 1:       //extension
          analogWrite(rightPWM, Speed);
          analogWrite(leftPWM, 0);
          break;  
        case 0:       //stopping
          analogWrite(rightPWM, 0);
          analogWrite(leftPWM, 0);
          break;
        case -1:      //retraction
          analogWrite(rightPWM, 0);
          analogWrite(leftPWM, Speed);
          break;
      }
    }
    
    void count_0(){
      //This interrupt function increments a counter corresponding to changes in the optical pin status
      if ((millis() - lastDebounceTime[0]) > falsepulseDelay) {             //reduce noise by debouncing IR signal with a delay
        lastDebounceTime[0] = millis();
        if(Direction==1){
          counter[0]++;
        }
        if(Direction==-1){
          counter[0]--;
        }
        normalizedPulseCount[0]=float(counter[0])/float(pulseTotal[0]);
      }
    }
    
    void count_1(){
      if ((millis() - lastDebounceTime[1]) > falsepulseDelay) {   
        lastDebounceTime[1] = millis();
        if(Direction==1){
          counter[1]++;
        }
        if(Direction==-1){
          counter[1]--;
        }
        normalizedPulseCount[1]=float(counter[1])/float(pulseTotal[1]);
      } 
    }

    ہم وقت سازی میں گولی 36 اور گولی 50 ایکچوایٹرز کا استعمال کرتے ہوئے

    ہمارے آپٹیکل سیریز لکیری ایکچوایٹر کے علاوہ ، ہم انبلٹ انکوڈرز کے ساتھ دو پیش کش لکیری ایکچیوٹرز بھی پیش کرتے ہیں: گولی 36 Cal۔ اور بلیٹ 50 Cal ، دونوں میں سے ایک داخلی چوکور ہال اثر اثر انکوڈر ہے۔ ہال اثر انکوڈر اسی اصول پر کام کرتا ہے جیسے آپٹیکل انکوڈر تاہم روشنی استعمال کرنے کے بجائے مقناطیسیت کو استعمال کرتا ہے۔ اس کے علاوہ چوکور انکوڈر ہونے کی وجہ سے اس کے پاس دو سگنل آؤٹ پٹس ہیں ، جن میں سے ہر ایک 90 ڈگری مرحلے سے باہر ہے۔ اس طرح آپ کو 4 یا اس سے زیادہ رکاوٹ پنوں کے ساتھ ایک ارڈینو بورڈ استعمال کرنے کی ضرورت ہے (ارڈینوو یونو کے پاس صرف دو ہی ہیں) اور فی ایکچیوٹر کے دو سگنل سے ان پٹ پر کارروائی کرنے کے لئے کوڈ میں ترمیم کریں۔ مزید یہ کہ ، ڈیبونش ٹائم متغیر ، جھوٹے پلس ڈیلے کو کے پی کے ساتھ ملنے کی ضرورت ہوگی۔

    اپنا پروگرام لکھنے کے لئے نکات

    دو سے زیادہ لکیری ایکچویٹرز

    جب دو یا دو سے زیادہ لکیری ایکچیوٹرز کا استعمال کیا جاتا ہے تو ارودوینو یونو مزید کام نہیں کرے گا کیونکہ اس میں صرف دو رکاوٹ پین دستیاب ہیں۔ آپ کو ایک اور ارڈینو بورڈ استعمال کرنے کی ضرورت ہوگی جس میں مداخلت والے پنوں کی تعداد بہت زیادہ ہے ، مزید معلومات: https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

    دوم یہ کہ کارکردگی کے مفاد میں یہ مشورہ دیا جاتا ہے کہ آپ اپنے پروگرامنگ کو صفوں کا استعمال کرتے ہوئے ویکٹرائز کریں اور ()) ہر ایکچیوٹر سے اعادہ کرنے کے لئے اس کی نمائش کریں۔

    ڈیبون کرنا

    جیسا کہ بہت سارے سینسروں کی طرح یہ بھی ضروری ہے کہ اچھالنے والے سگنلز کا شعور رکھنا۔ جیسا کہ میکانکی سوئچز کی طرح ، انکوڈر بھی اچھال سے دوچار ہو سکتے ہیں۔ مندرجہ بالا مثال میں ، ڈیبونسی عمل کو ایک سادہ تاخیر (باطل پلس ڈیلی متغیر سے بیان کردہ) کے ذریعہ سنبھال لیا گیا ہے ، یہ ضروری ہے کہ کسی بھی سوفٹویر تبدیلیوں میں یا جسمانی طور پر سرکٹری کے ذریعہ اسے اچھالنے والے شور کو فلٹر کرنے کے ل handle نمٹائیں۔

    رول کو ختم کرنا

    اگر آپ کوڈ میں ترمیم کرتے ہیں تو ملیس () فنکشن سے نمٹنے کے وقت رول اوور کے بارے میں آگاہ رہیں۔ ملیس () اور آخری ڈیبونس ٹائم سرنی دونوں کو دستخط شدہ طویل متغیر کے طور پر اعلان کیا جاتا ہے جس کا مطلب ہے کہ وہ 4،294،967،295 (32 ^ 2-1) تک کی قیمتوں کو محفوظ کرسکتے ہیں۔ اس کا ترجمہ تقریبا.7 49.7 دن کے ایک رول اوور دور میں ہوتا ہے۔ موجودہ پروگرام ISR (رکاوٹ سروس روٹین) کے افعال میں رول اوور کو ہینڈل کرنے کے لئے ڈیزائن کیا گیا ہے: count_0 & count_1 ، تاہم اگر آپ اس پروگرام میں ترمیم کرتے ہیں تو متغیر رول اوور کو صحیح طریقے سے سنبھالنا یقینی بنائیں ، ورنہ آپ کا یہ پروگرام program 49.7 دن کے مستقل استعمال کے بعد کریش ہوجائے گا۔ مزید معلومات کے لئے ملاحظہ کریں: https://www.norwegiancreations.com/2018/10/arduino-tutorial-avoiding-the-overflow-issue-when-using-millis-and-micros/

     

    Share This Article
    Tags: