شیلد های مختلی برای راه اندازی موتور های DS با آردوینو وجود دارد . به طور معمول آمپر خرووجی این موتور ها تا حداکثر 3 آمپر می باشد که تنها امکان اره اندازی موتور های کوچک و آرمیچر ها را دارند . در این بین شیلد VNH2SP30 یک درایور موتور دو کانال با جریان خروجی 30 آمپر می باشد که می توانید از آن برای راه اندازی موتور های بزرگتر همچون بالابر شیشه اتوموبیل و… استفاده کنید . این شیلد شامل دو چیپ VNH2SP30 می باشد هر کدام یک درایور تمام پل موتور DC هستند . در این شیلد جای ترمینال های اتصال موتور و تغذیه موتور ها در نظر گرفته شده است . VNH2SP30 به صورت نامی می تواند تا 30 آمپر در خروجی داشته باشد اما در عمل ممکن است این مقدار 40 در صد پایین تر باشد . در راه ات=ندازی موتور های با آمپر بالاتر از 3 باید از هیتسینک مناسب برای چیپ های شیلد استفاده نمود . تغذیه این شیلد می تواند تا حداکث 16 ولت باشد .
نکته : کلیه مقادیر ولتاژ و جریان ها برای ورودی و خروجی همگی به صورت نامی بوده و بدهی است این مقادیر در عمل اندکی متفاوت ( کمتر) باشند .
ویژگی ها :
- قابلیت نصب بر روی آردوینو UNO و مدل های مشابه
- درایو کردن دو موتور به صورت جدا گانه
- حداکثر جریان نامی خروجی 30A
- حداکثر ولتاژ خروجی برای موتور ها 16 ولت
- قابلیت تشخیص جریان مصرفی از طریق پین های آنالوگ آردوینو
- حداکثر فرکانس خروجی 20KHz
- دارای محافظ جریان بحرانی
- دارای محافظ دمای بحرانی
- دارای محافظ ولتاژ بحرانی
پین های شیلد VNH2SP30 :
در تصویر زیر پین های شیلد VNH2SP30 و همچنین نحوه اتصال موتور ها نشان داده شده است .
راه اندازی شیلد VNH2SP30 :
پس از اتصال تغذیه موتور ها و همچنین خود موتور ها به شیلد ، برد آردوینو را پروگرام کنید :
#define MtrBrake 0 #define ClockWise 1 #define CClockWise 2 #define GndBreak 3 #define CounterSenseThresHold 100 /* VNH2SP30 pin definitions xxx[0] controls '1' outputs xxx[1] controls '2' outputs */ int inApin[2] = {7, 4}; // INA Clockwise Controll int inBpin[2] = {8, 9}; // INB Counter-clockwise Controll int pwmpin[2] = {5, 6}; // PWM (Pulse with modulation ) Input int cspin[2] = {2, 3}; // CS Current sense for analog input int enpin[2] = {0, 1}; // EN Status of switches output (Analog pin) int statpin = 13; void setup() { Serial.begin(9600); pinMode(statpin, OUTPUT); // Initialize digital pins as outputs for (int i=0; i<2; i++) { pinMode(inApin[i], OUTPUT); pinMode(inBpin[i], OUTPUT); pinMode(pwmpin[i], OUTPUT); } // Initialize braked for (int i=0; i<2; i++) { digitalWrite(inApin[i], LOW); digitalWrite(inBpin[i], LOW); } // motorGo(0, ClockWise, 255); // motorGo(1, CClockWise, 255); } void loop() { motorGo(0, ClockWise, 255); motorGo(1, CClockWise, 255); delay(500); motorGo(0, CClockWise, 255); motorGo(1, ClockWise, 255); delay(500); if ((analogRead(cspin[0]) < CounterSenseThresHold) && (analogRead(cspin[1]) < CounterSenseThresHold)) digitalWrite(statpin, HIGH); } void motorOff(int motor) { // Initialize the brake for (int i=0; i<2; i++) { digitalWrite(inApin[i], LOW); digitalWrite(inBpin[i], LOW); } analogWrite(pwmpin[motor], 0); } /* Monster Motor will set a motor going in a specific direction the motor will continue turns in that direction, at that speed until told to do otherwise. Motor: this should be either 0 or 1 will selet which of the two motors to be controlled Direct Should be between 0 and 3, with the following result 0 - Brake to VCC 1 - Clock wise 2 - Counter Clockwise 3 - Brake to GND PWM (Pulse with Moduleation) should be a value between 0and 1024, higher the number, the faster turns */ void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm) { if (motor <= 1) { if (direct <=4) { // Set to INA[motor] if (direct <=1) digitalWrite(inApin[motor], HIGH); else digitalWrite(inApin[motor], LOW); // Set to INB[motor] if ((direct==0)||(direct==2)) digitalWrite(inBpin[motor], HIGH); else digitalWrite(inBpin[motor], LOW); analogWrite(pwmpin[motor], pwm); } } }