কোড অনুসন্ধান

আরডুইনো PWM ব্যবহার করে L293D মোটর ড্রাইভারের মাধ্যমে একটি DC মোটর নিয়ন্ত্রণ করা

আরডুইনো PWM ব্যবহার করে L293D মোটর ড্রাইভারের মাধ্যমে একটি DC মোটর নিয়ন্ত্রণ করা

একটি রোবট বা স্বয়ংক্রিয় প্রকল্প তৈরি করার সময় প্রায়শই একটি মৌলিক চ্যালেঞ্জের সম্মুখীন হতে হয়: একটি DC মোটরকে নির্ভুলভাবে নিয়ন্ত্রণ করা। আপনাকে কেবল এটি চালু এবং বন্ধ করতেই হবে না, বরং এর গতি এবং দিকও নিয়ন্ত্রণ করতে হবে। এখানেই L293D মোটর ড্রাইভারটি গুরুত্বপূর্ণ ভূমিকা পালন করে। এই গাইডটি আপনাকে একটি Arduino এবং জনপ্রিয় L293D চিপ ব্যবহার করে একটি শক্তিশালী মোটর কন্ট্রোলার তৈরির প্রক্রিয়ার মধ্য দিয়ে নিয়ে যাবে। শেষ পর্যন্ত, আপনি মাত্র কয়েক লাইন কোড দিয়ে যেকোনো গতিতে, যেকোনো দিকে একটি মোটর ঘোরাতে সক্ষম হবেন।

L293D-মোটর-ড্রাইভার-আইসি

এই প্রকল্পটি অসংখ্য অ্যাপ্লিকেশনের জন্য একটি ভিত্তিপ্রস্তর। এখানে কয়েকটি ধারণা দেওয়া হলো যা আপনাকে অনুপ্রাণিত করতে পারে:

  • দুই-চাকার রোবট তৈরি করুন: এই সার্কিটগুলির মধ্যে দুটি ব্যবহার করে একটি রোবট চ্যাসিস চালান, সুনির্দিষ্ট চলাচল এবং বাঁক নেওয়ার জন্য প্রতিটি চাকা স্বাধীনভাবে নিয়ন্ত্রণ করুন।
  • একটি স্বয়ংক্রিয় উদ্ভিদ জল দেওয়ার ব্যবস্থা তৈরি করুন: মাটির আর্দ্রতা সেন্সর রিডিংয়ের উপর ভিত্তি করে আপনার গাছগুলিতে সঠিক পরিমাণে জল পৌঁছে দেওয়ার জন্য একটি ছোট জল পাম্প নিয়ন্ত্রণ করুন।
  • একটি স্মার্ট ফ্যান ডিজাইন করুন: একটি ডেস্ক ফ্যানের ম্যানুয়াল সুইচটি এমন একটি সিস্টেম দিয়ে প্রতিস্থাপন করুন যা তাপমাত্রা বা একটি রিমোট কমান্ডের উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে গতি সামঞ্জস্য করে।
  • একটি মোটরচালিত ক্যামেরা স্লাইডার তৈরি করুন: মসৃণ টাইম-ল্যাপস ভিডিওর জন্য একটি ক্যামেরাকে ধীর, ধ্রুবক গতিতে একটি ট্র্যাক বরাবর চালান।
  • একটি সোলার ট্র্যাকার তৈরি করুন: আকাশ জুড়ে সূর্যকে অনুসরণ করতে একটি মোটর ব্যবহার করে একটি সোলার প্যানেলকে ধীরে ধীরে ঘোরান, যাতে সর্বাধিক শক্তি সংগ্রহ করা যায়।

হার্ডওয়্যার উপাদানসমূহ

শুরু করার আগে, নিম্নলিখিত উপাদানগুলি সংগ্রহ করুন। L293D এখানে প্রধান ভূমিকা পালন করে, যা আপনার Arduino-এর কম-পাওয়ার কন্ট্রোল সিগন্যাল এবং মোটরের উচ্চ-পাওয়ার চাহিদার মধ্যে সেতু হিসেবে কাজ করে।

  • Arduino বোর্ড (Uno, Nano, ইত্যাদি)
  • L293D মোটর ড্রাইভার আইসি (বা এর উপর ভিত্তি করে একটি মডিউল)
  • একটি DC মোটর (4.5V এবং 36V এর মধ্যে কাজ করে)
  • বাহ্যিক পাওয়ার সাপ্লাই (যেমন, একটি 9V ব্যাটারি বা একটি বেঞ্চ পাওয়ার সাপ্লাই)
  • জাম্পার তার
  • ব্রেডবোর্ড (ঐচ্ছিক, তবে প্রোটোটাইপিংয়ের জন্য সহায়ক)

L293D মোটর ড্রাইভার বোঝা

L293D একটি কোয়াড্রপল হাফ-এইচ ড্রাইভার, যার অর্থ এতে চারটি স্বাধীন হাফ-ব্রিজ সার্কিট রয়েছে। এই কনফিগারেশনটি এটিকে এর টার্মিনালগুলিতে প্রয়োগ করা ভোল্টেজের পোলারিটি বিপরীত করে একটি মোটরের দিক নিয়ন্ত্রণ করতে দেয়। এটি সম্পূর্ণ দিক এবং গতি নিয়ন্ত্রণ সহ দুটি DC মোটর পর্যন্ত নিয়ন্ত্রণ করতে পারে, অথবা চারটি মোটর পর্যন্ত যদি আপনাকে কেবল সেগুলি চালু এবং বন্ধ করতে হয়।

একটি দিকের জন্য মোটর এবং MCU এর মধ্যে মোটর ড্রাইভার

L293D-এর সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্যগুলির মধ্যে একটি হল এর অন্তর্নির্মিত ফ্লাইব্যাক ডায়োড। মোটরগুলি ইন্ডাকটিভ লোড, যার অর্থ তারা কারেন্টের পরিবর্তনকে প্রতিরোধ করে। যখন আপনি হঠাৎ একটি মোটরে পাওয়ার বন্ধ করেন, তখন এটি একটি উচ্চ-ভোল্টেজ স্পাইক তৈরি করে যা আপনার Arduino-কে ক্ষতি করতে পারে। L293D-এর "D" ইঙ্গিত দেয় যে এই সুরক্ষা ডায়োডগুলি ইতিমধ্যেই চিপে একীভূত করা হয়েছে, যা আপনাকে সেগুলি বাহ্যিকভাবে যুক্ত করার ঝামেলা থেকে বাঁচায়। এটি পুরানো L293 চিপ থেকে একটি গুরুত্বপূর্ণ পার্থক্য, যার নিরাপদ অপারেশনের জন্য বাহ্যিক ডায়োড প্রয়োজন।

উভয় দিকের জন্য মোটর এবং MCU এর মধ্যে দুটি মোটর ড্রাইভার

আরেকটি মূল বিবরণ হল চিপের কারেন্ট সীমাবদ্ধতা। L293D প্রতি চ্যানেলে 600 mA পর্যন্ত ক্রমাগত কারেন্ট পরিচালনা করতে পারে। যদি আপনার মোটর এর চেয়ে বেশি কারেন্ট টানে, তাহলে চিপটি অতিরিক্ত গরম হয়ে স্থায়ীভাবে ক্ষতিগ্রস্ত হতে পারে। যে মোটরগুলির জন্য আরও বেশি কারেন্ট প্রয়োজন, তাদের জন্য আপনাকে L298N-এর মতো আরও শক্তিশালী ড্রাইভার বা একটি ডেডিকেটেড মোটর শিল্ডের প্রয়োজন হবে।

ওয়্যারিং গাইড

L293d_একমুখী_ওয়্যারিং
L293D_একমুখী_ব্যাটারি_ওয়্যারিং_বিবি

এই প্রকল্পের ওয়্যারিং সহজবোধ্য। আমরা একটি একক মোটর ব্যবহার করব, যার জন্য L293D থেকে একটি সম্পূর্ণ এইচ-ব্রিজ (দুটি হাফ-ব্রিজ) প্রয়োজন। ভিডিওটি ওয়্যারিং স্পষ্টভাবে প্রদর্শন করে এবং একটি ডায়াগ্রাম নীচে দেখানো হয়েছে।

এখানে সংযোগগুলির একটি বিবরণ দেওয়া হলো:

  • পাওয়ার সংযোগ: পিন 16 (VCC1) Arduino-এর 5V পিনের সাথে সংযুক্ত করুন। এটি চিপের অভ্যন্তরীণ লজিককে শক্তি দেয়। পিন 8 (VCC2) আপনার বাহ্যিক মোটর পাওয়ার সাপ্লাইয়ের (যেমন, 9V) সাথে সংযুক্ত করুন। এটি মোটরকে নিজেই শক্তি সরবরাহ করে। পিন 4, 5, 12 এবং 13 আপনার Arduino এবং আপনার বাহ্যিক পাওয়ার সাপ্লাই উভয়ের সাধারণ গ্রাউন্ডের সাথে সংযুক্ত করুন।
  • মোটর সংযোগ: আপনার DC মোটরের দুটি টার্মিনাল L293D-এর পিন 3 এবং 6 এর সাথে সংযুক্ত করুন। এই মুহূর্তে পোলারিটি গুরুত্বপূর্ণ নয়, কারণ কোডে দিক বিপরীত করলে মোটরের ঘূর্ণন কেবল বিপরীত হবে।
  • কন্ট্রোল সংযোগ: পিন 1 (1,2EN) Arduino পিন 9 এর সাথে সংযুক্ত করুন। এটি "এনাবল" পিন, যা মোটরের জন্য একটি মাস্টার সুইচ হিসেবে কাজ করে। পিন 2 (1A) Arduino পিন 10 এর সাথে এবং পিন 7 (2A) Arduino পিন 11 এর সাথে সংযুক্ত করুন। এগুলি ইনপুট পিন যা মোটরের দিক এবং গতি নিয়ন্ত্রণ করে।

কোড ব্যাখ্যা

প্রদত্ত কোডটি সুগঠিত এবং পরিবর্তন করা সহজ। এই প্রকল্পটি কাস্টমাইজ করার চাবিকাঠি স্কেচের শীর্ষে কয়েকটি সহজ ভেরিয়েবল এবং ফাংশন কলের মধ্যে রয়েছে। (ভিডিওতে 07:05 এ)

// ডিসি মোটর নিয়ন্ত্রণ #define P1A 10 // পিন 10 কে P1A হিসেবে সংজ্ঞায়িত করুন #define P2A 11 // পিন 11 কে P2A হিসেবে সংজ্ঞায়িত করুন #define EN12 9 // পিন 9 কে 1,2EN সক্ষম হিসেবে সংজ্ঞায়িত করুন const int speedStep =15; const int speedDelay = 1000;// গতি বৃদ্ধির মধ্যে বিলম্ব
  • #define P1A, P2A, EN12: এই লাইনগুলো নির্ধারণ করে যে Arduino-এর কোন পিনগুলো L293D-এর ইনপুট পিনের সাথে সংযুক্ত। যদি আপনি আপনার ওয়্যারিংয়ে ভিন্ন পিন ব্যবহার করেন, তাহলে এখানে সংখ্যাগুলো পরিবর্তন করতে হবে। উদাহরণস্বরূপ, যদি আপনি EN12 পিন 6-এর সাথে সংযুক্ত করেন, তাহলে #define EN12 9 পরিবর্তন করে #define EN12 6 করতে হবে।
  • const int speedStep = 15;: এই ভেরিয়েবলটি প্রথম প্রদর্শন লুপে মোটরের গতি যে পরিমাণে পরিবর্তিত হয় তা নিয়ন্ত্রণ করে। একটি ছোট মান (যেমন, 5) মোটরকে আরও মসৃণভাবে ত্বরান্বিত করবে, যখন একটি বড় মান (যেমন, 50) গতিতে আরও আকস্মিক লাফ সৃষ্টি করবে।
  • const int speedDelay = 1000;: এটি প্রতিটি গতি ধাপের মধ্যে মিলিসেকেন্ডে বিলম্ব নির্ধারণ করে। speedStep-এর সাথে মিলিয়ে, এটি নির্ধারণ করে যে মোটরটি শূন্য থেকে পূর্ণ গতিতে কত দ্রুত পৌঁছায়। মান 1000 মানে প্রতিটি গতি পরিবর্তনের মধ্যে এক সেকেন্ডের বিরতি রয়েছে।

প্রকল্পের মূল অংশ হলো কাস্টম L293D() ফাংশন। এই ফাংশনটি নিয়ন্ত্রণ লজিককে সহজ করে, যা আপনাকে একটি একক লাইন কোড দিয়ে মোটরের দিক, গতি এবং চালু/বন্ধ অবস্থা নির্ধারণ করতে দেয়। এটি কীভাবে ব্যবহার করবেন তা এখানে দেওয়া হলো:

L293D('L', 255, 1);  // পূর্ণ গতিতে ঘড়ির কাঁটার বিপরীতে ঘোরান
L293D('R', 127, 1);  // অর্ধেক গতিতে ঘড়ির কাঁটার দিকে ঘোরান
L293D('L', 0, 0);    // মোটর বন্ধ করুন
  • প্রথম আর্গুমেন্ট (দিক): একটি একক অক্ষর, 'L' বা 'R', যা মোটরের দিক নির্ধারণ করে।
  • দ্বিতীয় আর্গুমেন্ট (গতি): 0 থেকে 255 পর্যন্ত একটি পূর্ণসংখ্যা যা PWM ব্যবহার করে মোটরের গতি নির্ধারণ করে। 0 মানে বন্ধ, এবং 255 মানে পূর্ণ গতি।
  • তৃতীয় আর্গুমেন্ট (সক্ষম): একটি পূর্ণসংখ্যা, 1 মোটর চালানোর জন্য বা 0 বন্ধ করার জন্য।

লাইভ প্রকল্প প্রদর্শন

ভিডিওতে, আপনি প্রকল্পটি কাজ করতে দেখতে পারেন। মোটরটি স্থির অবস্থা থেকে শুরু হয় এবং ধাপে ধাপে তার গতি বৃদ্ধি করে, যা PWM নিয়ন্ত্রণ প্রদর্শন করে। সিরিয়াল মনিটর বর্তমান অবস্থা এবং গতি প্রদর্শন করে। আপনি একটি অসিলোস্কোপে তরঙ্গরূপও দেখতে পাবেন, যা দৃশ্যত PWM সংকেতের ডিউটি চক্র বৃদ্ধি দেখায় যখন মোটর গতি বাড়ায়। এটি PWM কীভাবে কাজ করে তা বোঝার একটি দুর্দান্ত উপায়—এটি দ্রুত পাওয়ার চালু এবং বন্ধ করে, এবং "চালু" সময়ের অনুপাত (ডিউটি চক্র) গড় ভোল্টেজ এবং তাই মোটরের গতি নির্ধারণ করে। (ভিডিওতে 11:07 এ)

দ্বিতীয় কোড উদাহরণটি আরও ব্যবহারিক প্রয়োগ দেখায়। এটি মোটরটিকে এক দিকে পূর্ণ গতিতে চালায়, বন্ধ করে, অর্ধেক গতিতে চালায়, এবং তারপর বিপরীত দিকে ধীরে চালায়। এটি প্রদর্শন করে যে আপনি কীভাবে আপনার প্রকল্পগুলির জন্য জটিল গতির ক্রম তৈরি করতে L293D() ফাংশন ব্যবহার করতে পারেন।

অধ্যায়সমূহ

  • [00:00] ভূমিকা এবং প্রকল্পের ওভারভিউ
  • [00:30] L293D মোটর ড্রাইভার বোঝা
  • [01:16] L293D পিনআউট এবং স্পেসিফিকেশন
  • [04:40] Arduino এবং মোটরের সাথে L293D ওয়্যারিং
  • [07:05] কোড ব্যাখ্যা এবং কাস্টমাইজেশন
  • [11:07] গতি এবং দিক নিয়ন্ত্রণের লাইভ প্রদর্শন
  • [12:30] অসিলোস্কোপে PWM তরঙ্গরূপ দেখা

ছবি

L293D-Motor-Driver-IC
L293D-Motor-Driver-IC
two motor driver between motor and MCU for both directions
two motor driver between motor and MCU for both directions
Motor driver between motor and MCU for one direction
Motor driver between motor and MCU for one direction
L293D_unidirectional_battery_wiring_bb
L293D_unidirectional_battery_wiring_bb
L293d_unidirectional_wiring
L293d_unidirectional_wiring
144-Arduino source for L293D motor driver (loop)
ভাষা: C++
/*
 * This is the Arduino code to control the speed of a motor using an L293D DC motor driver.

Watch instructions for this video: https://youtu.be/akQoGNUzhHI

 // Written for Robojax.com video 

 * Code is available at http://robojax.com/learn/arduino

 * 
 // Written by Ahmad S. for Robojax.com on 
// August 11, 2018 at 13:23 in Ajax, Ontario, Canada
// This code is AS IS without warranty. You may share it if you keep this note with the code.
*/
// DC motor control
#define P1A 10 // define pin 10 as P1A
#define P2A 11 // define pin 11 as P2A
#define EN12 9 // define pin 9 as the 1,2EN enable

const int speedStep =15;
const int speedDelay = 1000;// delay between speed increment

void setup() {
  // L293 Motor Control Code by Robojax.com 20180811
  Serial.begin(9600);// setup Serial Monitor to display information
  pinMode(P1A, OUTPUT);// define pin as OUTPUT for P1A
  pinMode(P2A, OUTPUT);// define pin as OUTPUT for P2A
  pinMode(EN12, OUTPUT);// define pin as OUTPUT for 1,2EN

  Serial.println("Robojax");
  Serial.println("L293D Motor Speed Control");
  
  // L293 Motor Control Code by Robojax.com 20180811   
}

void loop() {
  // L293D Motor Control Code by Robojax.com 20180811

 for(int speed=0; speed<=255; speed +=speedStep)
 {
  L293D('L',speed, 0);// 
  delay(speedDelay);// delay between each step
 }

  delay(50);// 50 millisecond delay
  // L293D Motor Control Code by Robojax.com 20180810 
}//loop end




/*
 * L293D(char dir,int spd, int en)
 * dir is a character: 'L' for clockwise direction
 *  or 'R' for counter-clockwise direction
 *  en is an integer: 1 to rotate, 0 to stop
 *  spd is the speed value from 0 to 255
 */
void L293D(char dir,int spd, int en)
{
  if(dir =='L')
  {
    if(en ==0){
       Serial.println("CW Motor Stopped");
    }else{
       Serial.print("Rotating CW: "); 
       Serial.println(spd);//print actual speed value        
    }
    digitalWrite(EN12 ,en);// Enable 1A and 2A 
    analogWrite(P1A,spd);// send PWM with spd value to P1A
    digitalWrite(P2A,LOW);// LOW signal to P2A       
   
  }else{
    if(en ==0){
       Serial.println("CCW Motor Stopped");
    }else{
       Serial.print("Rotating CCW: "); 
       Serial.println(spd);//print actual speed value     
    }    
    digitalWrite(EN12 ,en);// Disable 1A and 2A    
    digitalWrite(P1A,LOW);// Keep this pin LOW
    analogWrite(P2A,spd);// send PWM with spd value to  P2A  
  }
}//L293D end
145-Source for a simple L293D motor controller using Arduino (CW, CCW, and STOP)
ভাষা: C++
++
/*

 * This is the Arduino code to control the speed of a motor using an L293D DC motor driver.
 * This code will control the motor with different directions and speed.

Watch instructions for this video: https://youtu.be/akQoGNUzhHI

 // Written for Robojax.com video 

 * Code is available at http://robojax.com/learn/arduino

 * 
 // Written by Ahmad Shamshiri for Robojax.com on 
// August 11, 2018 at 13:23 in Ajax, Ontario, Canada.
// This code is AS IS without warranty. You may share it if you keep this note with the code.
*/
// DC motor control
#define P1A 10 // define pin 10 as P1A
#define P2A 11 // define pin 11 as P2A
#define EN12 9 // define pin 9 as the 1,2EN enable

const int speedStep =15;
const int speedDelay = 1000;// delay between speed increment

void setup() {
  // L293 Motor Control Code by Robojax.com 20180811
  Serial.begin(9600);// setup Serial Monitor to display information
  pinMode(P1A, OUTPUT);// define pin as OUTPUT for P1A
  pinMode(P2A, OUTPUT);// define pin as OUTPUT for P2A
  pinMode(EN12, OUTPUT);// define pin as OUTPUT for 1,2EN

  Serial.println("Robojax");
  Serial.println("L293D Motor Speed Control");
  
  // L293 Motor Control Code by Robojax.com 20180811   
}

void loop() {
  // L293D Motor Control Code by Robojax.com 20180811


  L293D('L',255, 1);// maximum speed to the LEFT
  delay(3000);// wait for 3 seconds

  L293D('L',255, 0);// stop motor
  delay(2000);// wait for 2 seconds

  L293D('L',127, 1);// half speed to the LEFT
  delay(3000);// wait for 3 seconds  

  L293D('L',255, 0);// stop motor
  delay(2000);// wait for 2 seconds

  L293D('R',90, 1);// slow to the RIGHT
  delay(3000);// wait for 3 seconds  

  L293D('L',255, 0);// stop motor
  delay(2000);// wait for 2 seconds

  // L293D Motor Control Code by Robojax.com 20180810 
}//loop end




/*
 * L293D(char dir,int spd, int en)
 * dir is a character: 'L' for clockwise (CW) direction
 *  or 'R' for counter-clockwise (CCW) direction.
 *  en is an integer: 1 to rotate, 0 to stop.
 *  spd is the speed value from 0 to 255.
 */
void L293D(char dir,int spd, int en)
{
  if(dir =='L')
  {
    if(en ==0){
       Serial.println("CW Motor Stopped");
    }else{
       Serial.print("Rotating CW: "); 
       Serial.println(spd);//print actual speed value        
    }
    digitalWrite(EN12 ,en);// Enable 1A and 2A 
    analogWrite(P1A,spd);// send PWM with spd value to P1A
    digitalWrite(P2A,LOW);// LOW signal to P2A       
   
  }else{
    if(en ==0){
       Serial.println("CCW Motor Stopped");
    }else{
       Serial.print("Rotating CCW: "); 
       Serial.println(spd);//print actual speed value     
    }    
    digitalWrite(EN12 ,en);//enable 1A and 2A    
    digitalWrite(P1A,LOW);// Keep it LOW P1A
    analogWrite(P2A,spd);// send PWM with spd value to  P2A  
  }
}//L293D end

আপনাকে যা প্রয়োজন হতে পারে

সম্পদ ও রেফারেন্সসমূহ

ফাইলসমূহ📁

ডেটাশিট (পিডিএফ)