در قسمت 49 آموزش آردوینو به راهاندازی موتور brushless (با استفاده از کنترلر سرعت )، راهاندازی vibration motor و نحوه کنترل Solenoids و رلهها پرداختیم. در این قسمت قصد داریم درباره راهاندازی یک Brushed Motor با استفاده از Transistor ، کنترل جهت یک Brushed Motor با H-Bridge و کنترل جهت و سرعت یک Brushed Motor با H-Bridge صحبت کنیم.
فرض کنید میخواهید یک motor را روشن و خاموش کنید به صورتی که فقط در یک جهت بچرخد. ممکن است بخواهید سرعت آن را هم کنترل کنید.
در این اسکچ از برنامه، با استفاده از command هایی که از پورت سریال صادر میشود، موتور روشن و خاموش و سرعت آن کنترل می شود. قطعات را همانطور که در شکل( 1 ) نشان داده شده است وصل کنید. برای خازن 0.1 میکرو فاراد میتوانید از ceramic capacitor استفاده کنید، اما اگر از electrolytic capacitor استفاده میکنید، مطمئن شوید پایه مثبت آن به +5V وصل شده باشد:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
/* * Brushed_H_Bridge_simple sketch * commands from serial port control motor direction * + or - set the direction, any other key stops the motor */ const int in1Pin = 5; // H-Bridge input pins const int in2Pin = 4; void setup() { Serial.begin(9600); pinMode(in1Pin, OUTPUT); pinMode(in2Pin, OUTPUT); Serial.println("+ - to set direction, any other key stops motor"); } void loop() { if (Serial.available()) { char ch = Serial.read(); if (ch == '+') { Serial.println("CW"); digitalWrite(in1Pin, LOW); digitalWrite(in2Pin, HIGH); } else if (ch == '-') { Serial.println("CCW"); digitalWrite(in1Pin, HIGH); digitalWrite(in2Pin, LOW); } else if (ch != '\n' && ch != '\r') // ignore CR or LF { Serial.print("Stop motor"); digitalWrite(in1Pin, LOW); digitalWrite(in2Pin, LOW); } } } |

شکل 1- راهاندازی یک brushed motor
این دستور شبیه دستوری که در قسمت 49 آموزش آردوینو گفته شد هست؛ با این تفاوت که در اینجا از analogWrite برای کنترل سرعت motor استفاده شده است. (برای اطلاعات بیشتر درباره analogWrite و Pulse Width Modulation (PWM)، به بخش «Analog Output» در قسمت 38 از آموزش آردوینو مراجعه نمائید).
فرض کنید میخواهید جهت حرکت یک brushed motor را کنترل کنید؛ برای مثال، میخواهید با commandهای serial port کاری کنید که یک motor در یک جهت یا جهت دیگر بچرخد.
در این اسکچ باید از قطعه ای به نام H-Bridge استفاده کرد. H-Bridge قطعهای است که میتواند polarity یک motor را برعکس کند یا آن را کاملاً متوقف کند. نام آن از شکل نمایش شماتیک مدار H-Bridge گرفته شده است، اما در این پروژه از یک مدار مجتمع (Integrated Circuit) از نوع H-Bridge استفاده میشود که میتواند دو موتور جاروبکی (Brushed Motors) را کنترل کند. شکل ( 2 ) نحوه اتصال آی سی L293D H-Bridge را نشان میدهد؛ همچنین میتوانید از SN754410 استفاده کنید که layout پایههای آن مشابه است. برای خازنهای 0.1 میکرو فاراد باید از ceramic capacitors استفاده کنید. sketch آن به این صورت است:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
/* * Brushed_H_Bridge_simple2 sketch * commands from serial port control motor direction * + or - set the direction, any other key stops the motors */ const int in1Pin = 5; // H-Bridge input pins const int in2Pin = 4; const int in3Pin = 3; // H-Bridge pins for second motor const int in4Pin = 2; void setup() { Serial.begin(9600); pinMode(in1Pin, OUTPUT); pinMode(in2Pin, OUTPUT); pinMode(in3Pin, OUTPUT); pinMode(in4Pin, OUTPUT); Serial.println("+ - sets direction of motors, any other key stops motors"); } void loop() { if (Serial.available()) { char ch = Serial.read(); if (ch == '+') { Serial.println("CW"); // first motor digitalWrite(in1Pin, LOW); digitalWrite(in2Pin, HIGH); // second motor digitalWrite(in3Pin, LOW); digitalWrite(in4Pin, HIGH); } else if (ch == '-') { Serial.println("CCW"); digitalWrite(in1Pin, HIGH); digitalWrite(in2Pin, LOW); digitalWrite(in3Pin, HIGH); digitalWrite(in4Pin, LOW); } else if (ch != '\n' && ch != '\r') // ignore CR or LF { Serial.print("Stop motors"); digitalWrite(in1Pin, LOW); digitalWrite(in2Pin, LOW); digitalWrite(in3Pin, LOW); digitalWrite(in4Pin, LOW); } } } |

شکل 2- اتصال دو brushed motor با استفاده از L293D H-Bridge
جدول زیر نشان میدهد که تغییر ورودی های H-Bridge چگونه روی عملکرد موتور اثر گذار خواهد بود. دستور اسکچ برای راه اندازی یک موتور و کنترل آن بوسیله pinهای IN1 و IN2 نوشته شده است؛ pin مربوط به EN بهصورت دائمی به HIGH (5V) وصل شده است.
| EN | IN1 | IN2 | Function |
|---|---|---|---|
| HIGH | LOW | HIGH | چرخش در جهت clockwise |
| HIGH | HIGH | LOW | چرخش در جهت counterclockwise |
| HIGH | LOW | LOW | توقف motor |
| HIGH | HIGH | HIGH | توقف motor |
| LOW | Ignored | Ignored | توقف motor |
جدول logic برای H-Bridge
شکل ( 2 ) نشان میدهد که چگونه میتوان موتور دوم را وصل کرد. sketch زیر برای کنترل هر دو motor را با هم پیشنهاد میشود:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
/* * Brushed_H_Bridge sketch with speed control * commands from serial port control motor speed and direction * digits '0' through '9' are valid where '0' is off, '9' is max speed * + or - set the direction */ const int enPin = 5; // H-Bridge enable pin const int in1Pin = 7; // H-Bridge input pins const int in2Pin = 4; void setup() { Serial.begin(9600); pinMode(in1Pin, OUTPUT); pinMode(in2Pin, OUTPUT); Serial.println("Speed (0-9) or + - to set direction"); } void loop() { if (Serial.available()) { char ch = Serial.read(); if (isDigit(ch)) // is ch a number? { int speed = map(ch, '0', '9', 0, 255); analogWrite(enPin, speed); Serial.println(speed); } else if (ch == '+') { Serial.println("CW"); digitalWrite(in1Pin, LOW); digitalWrite(in2Pin, HIGH); } else if (ch == '-') { Serial.println("CCW"); digitalWrite(in1Pin, HIGH); digitalWrite(in2Pin, LOW); } else if (ch != '\n' && ch != '\r') // ignore cr or lf { Serial.print("Unexpected character "); Serial.println(ch); } } } |
فرض کنید میخواهید جهت و سرعت یک brushed motor را کنترل کنید. به صورتی که هم جهت موتور و هم سرعت آن از طریق command های serial port کنترل شود.
یک brushed motor را همانطور که در شکل ( 3 ) نشان داده شده است به output pinهای H-Bridge وصل کنید. برای خازنهای 0.1 uF باید از ceramic capacitors استفاده کنید.

شکل 3- اتصال یک brushed motor با استفاده از analogWrite برای کنترل سرعت
این sketch از commandهای Serial Monitor برای کنترل سرعت و جهت موتور استفاده میکند. ارسال 0 باعث توقف موتور میشود، و رقمهای 1 تا 9 سرعت را کنترل میکنند. ارسال “+” و “-” جهت motor را تنظیم میکند:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
/* * Brushed_H_Bridge_Direction sketch * uses photo sensors to control motor direction * robot moves in the direction of a light */ int leftPins[] = {5, 7, 4}; // one pin for PWM, two pins for motor direction int rightPins[] = {6, 3, 2}; const int MIN_PWM = 64; // this can range from 0 to MAX_PWM const int MAX_PWM = 128; // this can range from around 50 to 255 const int leftSensorPin = A0; // analog pins with sensors const int rightSensorPin = A1; int sensorThreshold = 0; // must have this much light on a sensor to move void setup() { for (int i = 1; i < 3; i++) { pinMode(leftPins[i], OUTPUT); pinMode(rightPins[i], OUTPUT); } } void loop() { int leftVal = analogRead(leftSensorPin); int rightVal = analogRead(rightSensorPin); if (sensorThreshold == 0) // have the sensors been calibrated? { // if not, calibrate sensors to something above the ambient average sensorThreshold = ((leftVal + rightVal) / 2) + 100; } if (leftVal > sensorThreshold || rightVal > sensorThreshold) { // if there is adequate light to move ahead setSpeed(rightPins, map(rightVal, 0, 1023, MIN_PWM, MAX_PWM)); setSpeed(leftPins, map(leftVal, 0, 1023, MIN_PWM, MAX_PWM)); } } void setSpeed(int pins[], int speed) { if (speed < 0) { digitalWrite(pins[1], HIGH); digitalWrite(pins[2], LOW); speed = -speed; } else { digitalWrite(pins[1], LOW); digitalWrite(pins[2], HIGH); } analogWrite(pins[0], speed); } |
این دستور دقیقا شبیه دستور قبلی است؛ منتها در آن دستور جهت موتور با مقدار پین های IN1 و IN2 کنترل میشد. اما در اینجا علاوه بر آن، سرعت با مقدار analogWrite روی pin مربوط به EN کنترل میشود. نوشتن مقدار 0 باعث توقف motor و نوشتن مقدار 255 باعث میشود motor با سرعت کامل کار کند. سرعت motor متناسب با مقدارهای داخل این بازه تغییر میکند.
آموزش راهاندازی موتور Brushless، رله و Vibration Motor...
من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.