স্টেপার মোটর কন্ট্রোল
এই পাঠে যা শিখবেন
- স্টেপার মোটর কীভাবে DC/সার্ভো মোটর থেকে ভিন্নভাবে কাজ করে
- ফুল-স্টেপ ও হাফ-স্টেপ কয়েল-এনার্জাইজেশন সিকোয়েন্স টেবিল
- কীভাবে স্টেপ সংখ্যা থেকে প্রকৃত পজিশন/অ্যাঙ্গেল গণনা করতে হয়
- সিকোয়েন্স উল্টে দিক পরিবর্তনের সফটওয়্যার কৌশল
১ · স্টেপার মোটর কীভাবে ভিন্ন
L38-এর DC ও সার্ভো মোটর উভয়ই একটি "অ্যানালগ-স্টাইল" ইনপুট (ডিউটি সাইকেল বা পালস-উইথ) নিয়ে কাজ করে। একটি স্টেপার মোটরStepper Motorএকটি মোটর যা একটি নির্দিষ্ট কয়েল-এনার্জাইজেশন সিকোয়েন্স অনুসরণ করে প্রতিবার একটি নির্ভুল, বিচ্ছিন্ন কোণ ("এক স্টেপ") করে ঘোরে। সম্পূর্ণ ভিন্ন — এর ভেতরে একাধিক কয়েল থাকে, আর মাইক্রোকন্ট্রোলার একটি নির্দিষ্ট ক্রমে (সিকোয়েন্সে) সেগুলো ON/OFF করে। প্রতিটি সিকোয়েন্স-এন্ট্রি মোটরের রোটরকে একটি নির্দিষ্ট, পূর্বনির্ধারিত কোণে ("এক স্টেপ") ঘোরায় — এই কারণেই স্টেপার মোটর দিয়ে খুবই নির্ভুল, বিচ্ছিন্ন (discrete) পজিশনিং সম্ভব (যেমন 3D প্রিন্টার, CNC মেশিন), যা DC মোটরে সরাসরি সম্ভব নয়।
২ · ফুল-স্টেপ ও হাফ-স্টেপ সিকোয়েন্স
একটি সাধারণ ৪-কয়েল (২-ফেজ) স্টেপার মোটরের জন্য প্রতিটি সিকোয়েন্স-এন্ট্রিকে একটি ৪-বিট প্যাটার্ন হিসেবে লেখা যায় (প্রতিটি বিট একটি কয়েল ON/OFF নির্দেশ করে)। ফুল-স্টেপ (দুটো কয়েল একসাথে ON, বেশি টর্ক) সিকোয়েন্সে ৪টি প্যাটার্ন একটি সাইকেল তৈরি করে:
| স্টেপ # | কয়েল প্যাটার্ন (৪-বিট) |
|---|---|
| 0 | 1100 |
| 1 | 0110 |
| 2 | 0011 |
| 3 | 1001 |
হাফ-স্টেপ সিকোয়েন্স এক-কয়েল-ON ও দুই-কয়েল-ON প্যাটার্ন পালাক্রমে ব্যবহার করে ৮টি প্যাটার্নের একটি সাইকেল তৈরি করে — ফলে প্রতি স্টেপে ঘূর্ণন কোণ অর্ধেক হয়ে যায় (দ্বিগুণ রেজোলিউশন, কিন্তু একটু কম টর্ক)। উভয় সিকোয়েন্সেই ক্রমটি উল্টে চালালে মোটর বিপরীত দিকে ঘোরে — এটি নিচের কোড সেলে সরাসরি দেখানো হয়েছে।
৩ · Python সিমুলেশন — স্টেপ সিকোয়েন্স, পজিশন ও অ্যাঙ্গেল ট্র্যাকিং
নিচের কোড সেলে ফুল-স্টেপ ও হাফ-স্টেপ উভয় সিকোয়েন্স টেবিল বাস্তবায়ন করা হয়েছে একটি Stepper
ক্লাসে। প্রতিটি step() কলে সিকোয়েন্স ইনডেক্স পরিবর্তন হয় (দিক অনুযায়ী +1 বা -1), সামগ্রিক
পজিশন (মোট স্টেপ) আপডেট হয়, এবং steps_per_rev (রিভলিউশন প্রতি মোট স্টেপ সংখ্যা) দেওয়া থাকলে
সেখান থেকে বর্তমান কোণও গণনা করা হয়। ফরওয়ার্ড ও রিভার্স দুই দিকেই স্টেপ ইস্যু করে দেখানো হয়েছে।
# ফুল-স্টেপ সিকোয়েন্স (৪ প্যাটার্ন, দুই-কয়েল-ON, বেশি টর্ক)
FULL_STEP_SEQUENCE = [0b1100, 0b0110, 0b0011, 0b1001]
# হাফ-স্টেপ সিকোয়েন্স (৮ প্যাটার্ন, এক-কয়েল-ON ও দুই-কয়েল-ON পালাক্রমে, দ্বিগুণ রেজোলিউশন)
HALF_STEP_SEQUENCE = [0b1000, 0b1100, 0b0100, 0b0110, 0b0010, 0b0011, 0b0001, 0b1001]
class Stepper:
def __init__(self, sequence, steps_per_rev):
self.sequence = sequence
self.steps_per_rev = steps_per_rev
self.seq_index = 0
self.position_steps = 0 # মোট (সাইন-সহ) স্টেপ সংখ্যা, শুরুর অবস্থান থেকে
def step(self, direction=1):
# direction=+1 মানে ফরওয়ার্ড (সিকোয়েন্সে সামনে আগানো), -1 মানে রিভার্স (পেছনে যাওয়া)
self.seq_index = (self.seq_index + direction) % len(self.sequence)
self.position_steps += direction
return self.sequence[self.seq_index]
def angle_deg(self):
return (self.position_steps % self.steps_per_rev) * (360 / self.steps_per_rev)
STEPS_PER_REV_FULL = 200 # সাধারণ ১.৮°/স্টেপ স্টেপার মোটরের ফুল-স্টেপ রেজোলিউশন
motor = Stepper(FULL_STEP_SEQUENCE, STEPS_PER_REV_FULL)
print(f"ফুল-স্টেপ মোটর -- প্রতি রিভলিউশনে {STEPS_PER_REV_FULL} স্টেপ, প্রতি স্টেপ {360/STEPS_PER_REV_FULL:.2f}°\n")
print("ফরওয়ার্ড দিকে ৬টি স্টেপ:")
for i in range(6):
pattern = motor.step(direction=1)
print(f" step {i+1}: coil = {format(pattern, '04b')}\tposition = {motor.position_steps:+d} steps"
f"\tangle = {motor.angle_deg():.2f}°")
print("\nএখন রিভার্স দিকে ৩টি স্টেপ:")
for i in range(3):
pattern = motor.step(direction=-1)
print(f" step {i+1}: coil = {format(pattern, '04b')}\tposition = {motor.position_steps:+d} steps"
f"\tangle = {motor.angle_deg():.2f}°")
# --- হাফ-স্টেপ মোটর: দ্বিগুণ রেজোলিউশন ---
STEPS_PER_REV_HALF = 400 # হাফ-স্টেপে একই মোটরের রেজোলিউশন দ্বিগুণ (৪০০ স্টেপ/রিভলিউশন)
motor2 = Stepper(HALF_STEP_SEQUENCE, STEPS_PER_REV_HALF)
print(f"\n\nহাফ-স্টেপ মোটর -- প্রতি রিভলিউশনে {STEPS_PER_REV_HALF} স্টেপ, প্রতি স্টেপ {360/STEPS_PER_REV_HALF:.2f}°\n")
print("ফরওয়ার্ড দিকে ১০টি স্টেপ:")
for i in range(10):
pattern = motor2.step(direction=1)
print(f" step {i+1}: coil = {format(pattern, '04b')}\tposition = {motor2.position_steps:+d} steps"
f"\tangle = {motor2.angle_deg():.2f}°")
+6 এবং অ্যাঙ্গেল ১০.৮০°, তারপর রিভার্স ৩ স্টেপের
পর পজিশন কমে +3 এবং অ্যাঙ্গেল ৫.৪০° — অর্থাৎ সিকোয়েন্স ঠিক তার আগের প্যাটার্নগুলোতেই ফিরে
যাচ্ছে, যা প্রমাণ করে direction=-1 সত্যিই বিপরীত দিকের ঘূর্ণন সিমুলেট করছে। হাফ-স্টেপ অংশে
একই সংখ্যক ভৌত ঘূর্ণনের জন্য দ্বিগুণ স্টেপ লাগে (এবং প্রতি স্টেপ অর্ধেক কোণ), যা রেজোলিউশন-টর্ক ট্রেড-অফের
একটি সরাসরি গণনাকৃত উদাহরণ।
স্টেপার মোটর একটি নির্দিষ্ট কয়েল-এনার্জাইজেশন সিকোয়েন্স অনুসরণ করে বিচ্ছিন্ন, নির্ভুল স্টেপে ঘোরে — ফুল-স্টেপ বেশি টর্ক দেয়, হাফ-স্টেপ দ্বিগুণ রেজোলিউশন দেয়, আর সিকোয়েন্স উল্টে দিলে (সফটওয়্যারেই) দিক উল্টে যায়, কোনো আলাদা H-ব্রিজ-স্টাইল হার্ডওয়্যারের দরকার হয় না। পরের পাঠ (L40) দেখাবে একাধিক সেন্সর রিডিং একসাথে মিলিয়ে (সেন্সর ফিউশন) কীভাবে একটি নির্ভুল অনুমান পাওয়া যায়।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১
উপরের কোড সেলে self.seq_index = (self.seq_index + direction) % len(self.sequence)
লাইনে % (মডুলো) অপারেটরটি কেন প্রয়োজনীয়?
কারণ সিকোয়েন্স টেবিল একটি বৃত্তাকার (circular) কাঠামো — শেষ প্যাটার্নের পরের প্যাটার্নটি আবার প্রথমটিতে
ফিরে যায় (এবং direction=-1-এ প্রথম প্যাটার্নের আগেরটি শেষে চলে যায়)। মডুলো অপারেটর ইনডেক্স
সবসময় 0 থেকে len(sequence)-1-এর মধ্যে রাখে, ফলে সিকোয়েন্স স্বাভাবিকভাবে
চক্রাকারে চলতে থাকে — এই কারণেই ৪-স্টেপ সাইকেলের ৫ম স্টেপ আবার প্রথম প্যাটার্নে ফিরে যায়।
প্র ০২ একটি নির্দিষ্ট মোটরের ফুল-স্টেপ রেজোলিউশন 200 স্টেপ/রিভলিউশন হলে, একই মোটরে হাফ-স্টেপ ব্যবহার করলে রেজোলিউশন কত হবে, এবং কেন?
400 স্টেপ/রিভলিউশন — দ্বিগুণ। কারণ হাফ-স্টেপ সিকোয়েন্স একই ভৌত রোটর ঘূর্ণনের মধ্যে দ্বিগুণ সংখ্যক মধ্যবর্তী কয়েল-প্যাটার্ন (এক-কয়েল ও দুই-কয়েল-ON পর্যায়ক্রমে) ব্যবহার করে, ফলে প্রতিটি প্রকৃত স্টেপের কোণ অর্ধেক হয়ে যায় — একই সংখ্যক পূর্ণ ঘূর্ণনের জন্য দ্বিগুণ সফটওয়্যার-স্টেপ লাগে।
প্র ০৩
উপরের কোড সেলে angle_deg() মেথডে self.position_steps % self.steps_per_rev
ব্যবহার করার কারণ কী, শুধু self.position_steps ব্যবহার না করে?
কারণ position_steps একাধিক পূর্ণ ঘূর্ণনের পরও বাড়তেই থাকতে পারে (যেমন ৩০০ স্টেপ = দেড়
ঘূর্ণন), কিন্তু "কোণ" ধারণাটি সবসময় একটি একক ঘূর্ণনের (0° থেকে 360°) মধ্যে অর্থবহ। মডুলো অপারেটর মোট
স্টেপ সংখ্যাকে একক-ঘূর্ণন রেঞ্জে "মুড়িয়ে" (wrap around) আনে, ফলে angle_deg() সবসময় একটি
বাস্তবসম্মত 0°-360° মান ফেরত দেয়, পূর্ণ ঘূর্ণনের সংখ্যা যত বেশিই হোক না কেন।
অনুশীলন
-
চিন্তা করুন: ফুল-স্টেপ মোটরে ৪০০টি ফরওয়ার্ড স্টেপ ইস্যু করলে (200 স্টেপ/রিভলিউশন ধরে)
angle_deg()-এর মান কত হবে বলে আপনার ধারণা?$400 \mod 200 = 0$, তাই অ্যাঙ্গেল $0°$ হবে — অর্থাৎ ৪০০ স্টেপ মানে ঠিক দুটো পূর্ণ ঘূর্ণন, তাই রোটর আবার তার শুরুর অবস্থানে ফিরে আসবে।
-
পরীক্ষা করুন: উপরের কোড সেলে
motor-এর ফরওয়ার্ড লুপ ৬-এর বদলে ৪ বার চালিয়ে Run চেপে দেখুন শেষ কয়েল প্যাটার্ন সিকোয়েন্সের কোন এন্ট্রিতে ফিরে আসে।যেহেতু
FULL_STEP_SEQUENCE-এর দৈর্ঘ্য ৪, তাই ঠিক ৪টি ফরওয়ার্ড স্টেপের পরseq_indexআবার ০-তে ফিরে আসবে এবং কয়েল প্যাটার্ন আবার প্রথম এন্ট্রি1100-তে ফিরে যাবে — position অবশ্য+4-ই থাকবে (সিকোয়েন্স চক্রাকারে ফিরলেও মোট স্টেপ গণনা রিসেট হয় না)।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ মাইক্রোপ্রসেসর আর্কিটেকচার, এমবেডেড C, GPIO, টাইমার/PWM/ADC, সিরিয়াল প্রোটোকল, RTOS, সেন্সর/অ্যাকচুয়েটর, IoT আর্কিটেকচার, ওয়্যারলেস প্রোটোকল, MQTT/CoAP ও IoT সিকিউরিটি — বাকি পাঠগুলো শীঘ্রই যুক্ত হবে।
- Computer Architecture & Digital Logic কোর্স সহোদর কোর্স বিট-প্যাটার্ন ও রেজিস্টার-স্টাইল ডেটার সাধারণ ভিত্তি সেই কোর্সের সাথে সম্পর্কিত এই কোর্সের L10-এ কভার করা হয়েছে।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps, Computer Networks, Operating Systems, Computer Architecture, Design and Analysis of Algorithms ও আরও অনেক কোর্স — সব এক জায়গায়।