کوڈ تلاش کریں

سبق 97-3: روٹری انکوڈر کا استعمال کرتے ہوئے سروو موٹر کو کنٹرول کرنا اور LCD پر زاویہ ظاہر کرنا

سبق 97-3: روٹری انکوڈر کا استعمال کرتے ہوئے سروو موٹر کو کنٹرول کرنا اور LCD پر زاویہ ظاہر کرنا

یہ پروجیکٹ ظاہر کرتا ہے کہ روٹری انکوڈر کا استعمال کرتے ہوئے ایک درست سروو موٹر پوزیشن کنٹرولر کیسے بنایا جائے، جس میں I2C LCD پر ریئل ٹائم زاویہ فیڈ بیک دکھایا جاتا ہے۔ پوٹینشیومیٹر نوب استعمال کرنے کے بجائے، جس کی جسمانی حدود ہوتی ہیں اور وقت کے ساتھ ختم ہو سکتی ہیں، یہ ڈیزائن ایک مکینیکل روٹری انکوڈر استعمال کرتا ہے جو مسلسل گھومتا ہے، زیادہ پائیداری اور زیادہ لچکدار کنٹرول فراہم کرتا ہے۔ یہ پروجیکٹ ہر اس شخص کے لیے بہترین ہے جسے اپنے Arduino پروجیکٹس میں درست، دہرائی جانے والی پوزیشننگ کی ضرورت ہو۔

یہ سیٹ اپ عملی ایپلیکیشنز کی ایک وسیع رینج کے لیے مثالی ہے:

  • ایک ریموٹ کنٹرولڈ کیمرہ پین اور ٹیلٹ ماؤنٹ بنانا جہاں آپ کو درست زاویہ کنٹرول کی ضرورت ہو۔
  • باریک پوزیشننگ کے لیے دستی اوور رائیڈ کے ساتھ روبوٹک بازو کا جوڑ بنانا۔
  • ماڈل سیل بوٹ یا ہوائی جہاز کے کنٹرول سطح کا ٹیسٹر تیار کرنا۔
  • ایک ایڈجسٹ ایبل سولر پینل ٹریکر بنانا جسے دستی طور پر پوزیشن کیا جا سکے۔
  • 3D پرنٹر یا CNC مشین کے لیے سیٹنگز ایڈجسٹ کرنے کے لیے ایک کسٹم ڈائل یا ان پٹ ڈیوائس بنانا۔

مطلوبہ ہارڈویئر

  • Arduino Uno (یا اسی طرح کا بورڈ)
  • روٹری انکوڈر ماجیول (PCB ورژن یا ریزسٹرس کے ساتھ خالی انکوڈر)
  • سروو موٹر (کوئی بھی معیاری قسم، جیسے میٹل گیئر یا چھوٹا پلاسٹک گیئر)
  • I2C LCD (16x2 کریکٹرز)
  • جمپر تار
  • بریڈ بورڈ (اختیاری، غیر PCB انکوڈر کے لیے)
  • تین 1kΩ سے 100kΩ ریزسٹرس (اگر خالی روٹری انکوڈر استعمال کر رہے ہیں)

وائرنگ گائیڈ

LCD، سروو موٹر اور روٹری انکوڈر کے بغیر PCB کے لیے وائرنگ۔ اپنے ریزسٹرس شامل کرنا
LCD، سروو موٹر اور روٹری انکوڈر کے ساتھ PCB کے لیے وائرنگ۔ 

اس پروجیکٹ میں تین اہم اجزاء کو جوڑنا ہے: روٹری انکوڈر، سروو موٹر، اور I2C LCD۔ نیچے دیا گیا وائرنگ ڈایاگرام تمام ضروری کنکشن دکھاتا ہے۔ (ویڈیو میں 05:35 پر)

روٹری انکوڈر ماجیول بنیادی ان پٹ ہے۔ اس کے CLK اور DT پن Arduino ڈیجیٹل پن 2 اور 3 سے جڑتے ہیں۔ "+" پن 3.3V سے جڑتا ہے، اور "GND" پن گراؤنڈ سے جڑتا ہے۔ اگر آپ خالی انکوڈر استعمال کر رہے ہیں، تو آپ کو انکوڈر کے دو ڈیٹا پنوں اور اس کے سوئچ پن سے 3.3V تک تین پل-اپ ریزسٹرس (1kΩ اور 100kΩ کے درمیان) شامل کرنے ہوں گے، جیسا کہ ڈایاگرام میں دکھایا گیا ہے۔ (ویڈیو میں 07:03 پر)

سروو موٹر کے تین تار ہیں۔ سگنل تار (عام طور پر پیلا یا نارنجی) PWM قابل پن سے جڑتا ہے، جو اس مثال میں پن 9 ہے۔ پاور تار (عام طور پر سرخ) 5V سے جڑتا ہے، اور گراؤنڈ تار (عام طور پر بھورا یا سیاہ) گراؤنڈ سے جڑتا ہے۔ ہائی ٹارک سرووز کے لیے، Arduino کے وولٹیج ریگولیٹر کو اوور لوڈ کرنے سے بچنے کے لیے بیرونی 5V پاور سپلائی استعمال کرنے کی سفارش کی جاتی ہے۔ (ویڈیو میں 06:03 پر)

I2C LCD کو چار کنکشن درکار ہیں۔ VCC پن 5V سے جڑتا ہے، GND گراؤنڈ سے، SDA Arduino کے A4 پن سے، اور SCL A5 پن سے۔ متبادل طور پر، آپ ICSP ہیڈر پر 5V پن سے LCD کو پاور کر سکتے ہیں۔ (ویڈیو میں 06:31 پر)

مطلوبہ لائبریریز انسٹال کرنا

کوڈ اپ لوڈ کرنے سے پہلے، آپ کو دو لائبریریز انسٹال کرنے کی ضرورت ہے۔ پہلی LiquidCrystal_I2C لائبریری ہے، جسے آپ فراہم کردہ ZIP فائل ڈاؤن لوڈ کرکے اور Sketch → Include Library → Add .ZIP Library مینو استعمال کرکے شامل کر سکتے ہیں۔ (ویڈیو میں 13:28 پر)

دوسری Paul Stoffregen کی Encoder لائبریری ہے۔ اسے Sketch → Include Library → Manage Libraries پر جا کر، "encoder" تلاش کرکے، اور انسٹال پر کلک کرکے براہ راست لائبریری مینیجر کے ذریعے انسٹال کیا جا سکتا ہے۔ (ویڈیو میں 13:59 پر)

کوڈ کی وضاحت

کوڈ کو انتہائی کنفیگر ایبل بنانے کے لیے ڈیزائن کیا گیا ہے۔ کلیدی پیرامیٹرز سبھی اسکیچ کے اوپری حصے میں بیان کیے گئے ہیں، جس سے آپ منطق میں کھودے بغیر آسانی سے رویے کو اپنا سکتے ہیں۔ (ویڈیو میں 17:52 پر)

const int SW_PIN = 4;//روٹری انکوڈر سوئچ کے لیے ایک پن کی وضاحت کریں
const int PIN_A =2;
const int PIN_B =3;
const int homePosition = 90; //ابتدائی پوزیشن
const int stepValue = 3;//نوب گھمانے پر سروو کو کتنی تیزی سے گھومنا چاہیے
const int servoPin = 9;//~ایک پن ہونا چاہیے جس پر ~ کا نشان ہو
  • SW_PIN، PIN_A، اور PIN_B: یہ مستقل انکوڈر کے سوئچ، CLK، اور DT پنوں سے جڑے Arduino پنوں کی وضاحت کرتے ہیں۔ اگر آپ مختلف پن استعمال کرتے ہیں، تو ان اقدار کو تبدیل کریں۔
  • homePosition: یہ وہ زاویہ (ڈگریوں میں) ہے جس پر سروو اس وقت جائے گا جب انکوڈر کا پش-بٹن سوئچ دبایا جائے گا۔ آپ اسے 0 اور 180 کے درمیان کسی بھی قدر میں تبدیل کر سکتے ہیں۔
  • stepValue: یہ کنٹرول کی حساسیت کو کنٹرول کرتا ہے۔ یہ طے کرتا ہے کہ انکوڈر کے ہر ڈیٹینٹ (کلک) کے لیے سروو زاویہ کتنے ڈگری تبدیل ہوتا ہے۔ زیادہ قدر سروو کو تیزی سے حرکت دیتی ہے، جبکہ کم قدر باریک کنٹرول کی اجازت دیتی ہے۔
  • servoPin: یہ PWM پن ہے جس سے سروو کا سگنل تار جڑا ہوا ہے۔ یقینی بنائیں کہ اس پن کے ساتھ آپ کے Arduino بورڈ پر "~" علامت ہو، کیونکہ صرف یہ پن مطلوبہ PWM سگنل پیدا کر سکتے ہیں۔

کوڈ میں ایک کسٹم فنکشن بھی شامل ہے، lcdAngel(int angel)۔ یہ فنکشن LCD پر زاویہ کی قدر کو اپ ڈیٹ کرنے کے لیے ذمہ دار ہے۔ یہ پہلے ڈسپلے سے پچھلا نمبر صاف کرتا ہے، پھر نیا زاویہ ڈگری کے نشان (°) کے ساتھ پرنٹ کرتا ہے۔ یہ فنکشن خود بخود کال ہوتا ہے جب بھی سروو کا زاویہ تبدیل ہوتا ہے، لہذا آپ کو اس کے ساتھ براہ راست تعامل کرنے کی ضرورت نہیں ہے۔ (ویڈیو میں 27:56 پر)

انکوڈر سے سروو چلانا سبق 97-2: روٹری انکوڈر کا استعمال کرتے ہوئے سروو موٹر کو کنٹرول کرنا میں شامل ہے۔

لائیو پروجیکٹ ڈیموسٹریشن

کوڈ اپ لوڈ ہونے کے بعد، LCD پہلے دو سیکنڈ کے لیے "Robojax Encoder" اور "Servo Test" اسپلیش اسکرین دکھائے گا، پھر صاف ہو کر موجودہ زاویہ دکھائے گا۔ (ویڈیو میں 24:10 پر)

جب آپ انکوڈر کو گھمائیں گے، سروو آسانی سے اپنی نئی پوزیشن پر منتقل ہو جائے گا، اور زاویہ LCD پر اپ ڈیٹ ہو جائے گا۔ گردش کی سمت طے کرتی ہے کہ زاویہ بڑھتا ہے یا گھٹتا ہے۔ اگر سمت الٹی محسوس ہو، تو آپ آسانی سے PIN_A اور PIN_B کنکشنز یا کوڈ میں ان کی تعریفیں تبدیل کر سکتے ہیں۔ (ویڈیو میں 17:32 پر)

سروو کی حرکت 0 سے 180 ڈگری کے درمیان محدود ہے۔ اگر آپ انکوڈر کو ان حدود سے آگے گھماتے رہیں گے، تو سروو حد پر رک جائے گا، جس سے کوئی مکینیکل نقصان نہیں ہوگا۔ (ویڈیو میں 25:54 پر)

انکوڈر کے بلٹ ان پش بٹن سوئچ کو دبانے سے سروو فوری طور پر آپ کی متعین کردہ homePosition پر واپس آ جائے گا۔ یہ ایک معروف حوالہ نقطہ یا "ہوم" پوزیشن سیٹ کرنے کے لیے مفید ہے۔ (ویڈیو میں 27:13 پر)

اس ویڈیو سے متعلقہ پروجیکٹس

ابواب

  • [00:01] روٹری انکوڈر کے ساتھ سروو کو کنٹرول کرنے کا تعارف
  • [01:46] پوٹینشیومیٹر کے بجائے روٹری انکوڈر کیوں استعمال کریں
  • [05:35] روٹری انکوڈر کے PCB ورژن کی وائرنگ
  • [07:03] ریزسٹرس کے ساتھ ننگے روٹری انکوڈر کی وائرنگ
  • [12:05] I2C LCD ڈسپلے کو جوڑنا
  • [13:28] مطلوبہ لائبریریز انسٹال کرنا
  • [14:54] بنیادی انکوڈر مثال کوڈ کو سمجھنا
  • [17:52] سروو اور سوئچ کے لیے کوڈ میں ترمیم کرنا
  • [20:20] سروو اور LCD کنٹرول کے لیے مکمل کوڈ کی وضاحت
  • [30:01] پروجیکٹ کا لائیو ڈیموسٹریشن

تصاویر

Rotary encoder PCB wiring breadboard
Rotary encoder PCB wiring breadboard
Rotary encoder wiring breadboard
Rotary encoder wiring breadboard
433-Lesson 97: Controlling a Servo Motor using a Rotary Encoder and Display Angle on an LCD
زبان: C++
/*
 * Lesson 97-3: Controlling Servo Motor using Rotary Encoder and Display Angle on LCD
 Download and resource page https://robojax.com/RJT453

 *  Watch full details video: https://youtu.be/6xVLbNlmK-g
  This video is part of Arduino Step by Step Course which starts here: https://youtu.be/-6qSrDUA5a8
 

If you found this tutorial helpful, please support me so I can continue creating 
content like this. Make a donation using PayPal by credit card https://bit.ly/donate-robojax
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *  Updated by Ahmad Shamshiri on Jan 23, 2022
 *  Encoder Library - Basic Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * This example code is in the public domain.
 */
const int SW_PIN = 4;//define a pin for rotary encode switch
const int PIN_A =2;
const int PIN_B =3;

#include <Encoder.h>

// Change these two numbers to the pins connected to your encoder.
//   Best Performance: both pins have interrupt capability
//   Good Performance: only the first pin has interrupt capability
//   Low Performance:  neither pin has interrupt capability
Encoder myEnc(PIN_A, PIN_B);
//   avoid using pins with LEDs attached

const int homePosition = 90; //initial position
const int stepValue = 3;//how fast the servo should rotate when turning the knob
const int servoPin = 9;//~must be a pin that that is labeled with ~
#include <Servo.h>

Servo myservo;  // create servo object to control a servo
int servoAngel =homePosition;


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 or 0x3F for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x3F, 16, 2);

void setup() {
  Serial.begin(9600);
  pinMode(SW_PIN, INPUT);
  Serial.println("Robojax Encoder with LCD and Servo");
   myservo.attach(servoPin);  // attaches the servo on pin
   myservo.write(servoAngel);//move servo to initial position

  lcd.begin();
  // Turn on the blacklight and print a message.
  lcd.backlight();     
  lcd.print("Robojax Encoder");
  lcd.setCursor (0,1); // go to start of 2nd line
  lcd.print("Servo Test");   
  delay(2000);   
   lcd.clear();// clear previous values from screen   
  lcd.print("Robojax Encoder");
  lcd.setCursor (0,1); // go to start of 2nd line  
  lcd.print("Angle: ");   
}

long oldPosition  = -999;

void loop() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {

    if(newPosition >  oldPosition)
    {
    int newStep = abs(newPosition - oldPosition);
      Serial.print("Angle ");
      Serial.println(servoAngel);      
      servoAngel -= stepValue;
      if(servoAngel <0)
          servoAngel =0;      
      myservo.write(servoAngel); //move servo to new angle
      lcdAngel(servoAngel);//print on LCD
    }

    if(newPosition <  oldPosition )
    {
    int newStep = abs(newPosition - oldPosition);
      Serial.print("Angle ");
      Serial.println(servoAngel);        
      servoAngel += stepValue;
      if(servoAngel >180)
          servoAngel =180;
      myservo.write(servoAngel); //move servo to new angle
      lcdAngel(servoAngel);//print on LCD
    }
   oldPosition = newPosition;//remember the new position
  }

  if( digitalRead(SW_PIN) == LOW)
  {
    Serial.print("Home: ");
    Serial.println(homePosition);
    servoAngel =homePosition;
      myservo.write(servoAngel); //move servo to new angle
      lcdAngel(servoAngel);//print on LCD
  
  }

  //delay(200);
}

/*
 * lcdAngel(int angel)
 * prints the angle on LCD
 * written by Ahmad Shamshiri
 * www.robojax.com
 * Jan 27, 2022 at 13:18
 * Watch full details video: https://youtu.be/6xVLbNlmK-g
 */
void lcdAngel(int angel)
{
  
  int startChar =7;
  for(int i=startChar; i<16; i++)
  {
   lcd.setCursor (i,1);    
    lcd.print(" ");   
  }
 
   lcd.setCursor (startChar,1); // line 1 
   lcd.print(angel); 
   lcd.print((char)223);
}

آپ کو جن چیزوں کی ضرورت ہو سکتی ہے

وسائل اور حوالہ جات

فائلیں📁

کوئی فائلیں دستیاب نہیں ہیں۔