Wa Koodu

Líloṣiṣẹ́ DC motor ní lílo L293D motor driver pẹ̀lú Arduino PWM

Líloṣiṣẹ́ DC motor ní lílo L293D motor driver pẹ̀lú Arduino PWM

Kíkọ́ robot tàbí iṣẹ́́ àdáṣe kan sábà máa ń wá sí ìpèníjà pàtàkì kan: ṣíṣàkóso DC motor pẹ̀lú ìpele gíga. O kò ní láti ṣe wíwọ́n àti pípá a nìkan, ṣùgbọ́n pẹ̀lú ṣíṣàkóso ìyára rẹ̀ àti ìtọ́sọ́nà rẹ̀. Èyí ni ibi tí L293D motor driver ti ń tàn. Ìtọ́sọ́nà yìí yóò rìn ọ́ nípa kíkọ́ ẹ̀rọ̀ ìṣàkóso motor tí ó lágbára ní lílo Arduino àti ẹ̀yà L293D tí ó gbajúmọ̀. Ní ìparí, ìwọ yóò ní agbára láti pàṣẹ fún motor láti yípo ní ìyára èyíkéyìí, ní ìtọ́sọ́nà èyíkéyìí, pẹ̀lú àwọn ìlà kóòdù díẹ̀.

L293D-Motor-Driver-IC

Iṣẹ́́ yìí jẹ́ ìpìlẹ̀ pàtàkì fún ọ̀pọ̀lọpọ̀ àwọn ohun èlò. Àwọn èrò díẹ̀ nìyí láti mú ìmísí fún ọ:

  • Kọ́ robot ẹlẹ́sẹ̀ méjì: Lo àwọn ìyípo méjì nínú àwọn ìyípo wọ̀nyí láti wakọ̀ chassis robot kan, ṣíṣàkóso kọ̀ọ̀kan ẹlẹ́sẹ̀ lọ́tọ̀ọ̀tọ̀ fún ìṣísẹ̀ àti yíyípo pípé.
  • Ṣẹ̀dá olùbomi ọ̀gbìn àdáṣe: Ṣàkóso pọ̀ǹpù omi kékeré kan láti fi omi pípé fún àwọn ọ̀gbìn rẹ̀ dá lórí àwọn ìwọ̀n sensori ọ̀rinrin ilẹ̀.
  • Ṣe àpẹ̀rẹ̀ fẹ́lìfẹ́lì ọlọ́gbọ́n: Rọ́pò bọ́tìnnì afọwọ́ṣe lórí fẹ́lìfẹ́lì tábìlì pẹ̀lú ètò tí ó ṣàtúnṣe ìyára fúnra rẹ̀ dá lórí ìwọ̀n otútù tàbí àṣẹ latọ̀nà jìnnà.
  • Ṣe slider kamẹra tí ń gbé: Wakọ̀ kamẹra kan lórí ọ̀nà kan ní ìyára rírọ̀, déédéé fún àwọn fídíò time-lapse tí ó dán.
  • Kọ́ olùtọ̀nà oòrùn: Lo motor kan láti yí pánẹ́lì oòrùn kan padà díẹ̀díẹ̀ láti tẹ̀lé oòrùn ní ojú ọ̀run, tí ó ń pọ̀ sí i ní gbígbà agbára.

Àwọn Ẹ̀yà Ohun Èlò

Kí o tó bẹ̀rẹ̀, kó àwọn ẹ̀yà wọ̀nyí jọ. L293D ni ìràwọ̀ ìwòrán náà, tí ó ń ṣiṣẹ́ gẹ́gẹ́ bí afárá láàárín àwọn àmì ìṣàkóso agbára-kekere ti Arduino rẹ àti àwọn ìbéèrè agbára-gíga ti motor náà.

  • Arduino Board (Uno, Nano, àti bẹ́ẹ̀ bẹ́ẹ̀ lọ)
  • L293D Motor Driver IC (tàbí module tí ó dá lórí rẹ̀)
  • DC Motor kan (tí ń ṣiṣẹ́ láàárín 4.5V àti 36V)
  • Ìpèsè Agbára Òde (bíi bátìrì 9V tàbí ìpèsè agbára tábìlì)
  • Àwọn Wáyà Jumper
  • Breadboard (kò pọn dandan, ṣùgbọ́n ó wúlò fún ṣíṣe àpẹẹrẹ)

Òye L293D Motor Driver

L293D jẹ́ quadruple half-H driver, èyí tí ó túmọ̀ sí pé ó ní àwọn ìyípo half-bridge mẹ́rin ọ̀tọ̀ọ̀tọ̀. Ìtòlẹ́yọ yìí gbà á láàyè láti ṣàkóso ìtọ́sọ́nà motor kan nípa yíyí polarity foltiège tí a fi sí àwọn ibùdó rẹ̀ padà. Ó lè ṣàkóso àwọn DC motor méjì pẹ̀lú ìṣàkóso ìtọ́sọ́nà àti ìyára kíkún, tàbí àwọn motor mẹ́rin tí o kàn ní láti wọ́n àti pá wọn.

Motor driver láàárín motor àti MCU fún ìtọ́sọ́nà kan

Ọ̀kan nínú àwọn ẹ̀yà pàtàkì jùlọ ti L293D ni àwọn flyback diodes rẹ̀ tí a kọ́ sínú rẹ̀. Motors jẹ́ àwọn ẹrù inductive, èyí tí ó túmọ̀ sí pé wọ́n ń ṣòdì sí àwọn ìyípadà nínú current. Nígbà tí o bá gé agbára sí motor kan lójijì, ó ń ṣe inú spike foltiège gíga kan tí ó lè ba Arduino rẹ̀ jẹ́. "D" nínú L293D ń tọ́ka sí pé àwọn diodes ààbò wọ̀nyí ti wà nínú ẹ̀yà náà tẹ́lẹ̀, tí ó ń gbà ọ́ là ní àìní láti fi wọ́n kún ní òde. Èyí jẹ́ ìyàtọ̀ pàtàkì láti ọ̀dọ̀ ẹ̀yà L293 àtijọ́, èyí tí ó nílò àwọn diodes òde fún iṣẹ́́ àìléwu.

motor driver méjì láàárín motor àti MCU fún àwọn ìtọ́sọ́nà méjèèjì

Àkíyèsí pàtàkì mìíràn ni àwọn ìfaradà current ti ẹ̀yà náà. L293D lè mú current tí ń tẹ̀síwájú títí dé 600 mA fún ikanni kan. Bí motor rẹ̀ bá ń fa ju èyí lọ, ẹ̀yà náà yóò gbóná púpọ̀ àti pé a lè ba á jẹ́ pátápátá. Fún àwọn motor tí ó nílò current púpọ̀ sí i, ìwọ yóò nílò driver tí ó lágbára sí i bíi L298N tàbí motor shield kan tí a yà sọ́tọ̀.

Ìtọ́sọ́nà Wíwá

L293d_unidirectional_wiring
L293D_unidirectional_battery_wiring_bb

Wíwá fún iṣẹ́́ yìí rọrùn. A óò lo motor kan ṣoṣo, èyí tí ó nílò H-bridge kíkún kan (half-bridges méjì) láti ọ̀dọ̀ L293D. Fídíò náà ń ṣàfihàn wíwá náà kedere, àti pé a fi àwòrán kan hàn nísàlẹ̀.

Èyí ni ìpínlẹ̀ àwọn ìsopọ̀ náà:

  • Àwọn Ìsopọ̀ Agbára: Sopọ̀ pin 16 (VCC1) sí pin 5V ti Arduino. Èyí ń fi agbára fún ìmọ̀ inú ẹ̀yà náà. Sopọ̀ pin 8 (VCC2) sí ìpèsè agbára motor òde rẹ (bíi 9V). Èyí ń pèsè agbára fún motor fúnra rẹ̀. Sopọ̀ àwọn pin 4, 5, 12, àti 13 sí ilẹ̀ tí ó wọ́pọ̀ ti Arduino rẹ àti ìpèsè agbára òde rẹ.
  • Àwọn Ìsopọ̀ Motor: Sopọ̀ àwọn ibùdó méjì ti DC motor rẹ sí àwọn pin 3 àti 6 ti L293D. Polarity kò ṣe pàtàkì ní àkókò yìí, níwọ̀n bí yíyí ìtọ́sọ́nà padà nínú kóòdù yóò ṣe yí yíyípo motor náà padà.
  • Àwọn Ìsopọ̀ Ìṣàkóso: Sopọ̀ pin 1 (1,2EN) sí pin 9 ti Arduino. Èyí ni pin "enable", tí ó ń ṣiṣẹ́ gẹ́gẹ́ bí bọ́tìnnì pàtàkì fún motor náà. Sopọ̀ pin 2 (1A) sí pin 10 ti Arduino, àti pin 7 (2A) sí pin 11 ti Arduino. Àwọn wọ̀nyí ni àwọn pin input tí ń ṣàkóso ìtọ́sọ́nà àti ìyára motor náà.

Àlàyé Kóòdù

Kóòdù tí a pèsè náà jẹ́ èyí tí a tò dáradára àti rọrùn láti yípadà. Bọ́tìnnì sí ṣíṣe àdáṣe iṣẹ́́ yìí wà nínú àwọn oniyipada àti àwọn ìpè iṣẹ́́ díẹ̀ tí ó rọrùn ní ìbẹ̀rẹ̀ sketch náà. (nínú fídíò ní 07:05)

// Iṣakoso mọ́tọ̀ DC
#define P1A 10 // ṣàlàyé pin 10 gẹ́gẹ́ bí P1A
#define P2A 11 // ṣàlàyé pin 11 gẹ́gẹ́ bí P2A
#define EN12 9 // ṣàlàyé pin 9 gẹ́gẹ́ bí 1,2EN ṣiṣẹ́

const int speedStep =15;
const int speedDelay = 1000;// idaduro láàárín ìgbéga ìyára
  • #define P1A, P2A, EN12: Àwọn ìlà wọ̀nyí ṣàlàyé èyí tí àwọn pin Arduino ti so mọ́ àwọn pin ìfidání L293D. Bí o bá lo àwọn pin ọ̀tọ̀ọ̀tọ̀ nínú ìsopọ̀ rẹ, o yóò yí àwọn nọ́mbà yìí padà. Fún àpẹẹrẹ, bí o bá so EN12 mọ́ pin 6, o yóò yí #define EN12 9 padà sí #define EN12 6.
  • const int speedStep = 15;: Àwọn oniyipada yìí ṣàkóso ìgbéga tí ìyára mọ́tọ̀ yóò yí padà nínú ìṣàfihàn àkọ́kọ́. Iye tí ó kéré (bíi 5) yóò mú kí mọ́tọ̀ yára pọ̀ ní ọ̀nà tí ó dán, nígbà tí iye tí ó tóbi (bíi 50) yóò mú kí ó fò sókè ní ọ̀nà àìdán.
  • const int speedDelay = 1000;: Èyí ṣètò idaduro ní milliseconds láàárín ìgbésẹ̀ ìyára kọ̀ọ̀kan. Pẹ̀lú speedStep, èyí pinnu bí mọ́tọ̀ yóò ṣe yára pọ̀ láti òdo dé ìyára kíkún. Iye 1000 túmọ̀ sí pé idaduro ọ̀kan-ìṣẹ́jú-àáyá wà láàárín ìyípadà ìyára kọ̀ọ̀kan.

Ọkàn iṣẹ́ náà ni iṣẹ́ L293D() tí a ṣe. Iṣẹ́ yìí rọrùn láti lò fún ìṣàkóso, tí ó jẹ́ kí o ṣeto ìtọ́sọ́nà mọ́tọ̀, ìyára, àti ipò títan/típa pẹ̀lú ìlà kóòdù kan ṣoṣo. Èyí nìyí bí a ṣe le lò ó:

L293D('L', 255, 1);  // Yí padà ní ìtọ́sọ́nà òdì-agogo ní ìyára kíkún
L293D('R', 127, 1);  // Yí padà ní ìtọ́sọ́nà agogo ní ìdajì ìyára
L293D('L', 0, 0);    // Dúró mọ́tọ̀ náà
  • Àríyànjiyàn àkọ́kọ́ (Ìtọ́sọ́nà): Ẹ̀yà kan ṣoṣo, 'L' tàbí 'R', tí ó ṣeto ìtọ́sọ́nà mọ́tọ̀.
  • Àríyànjiyàn kejì (Ìyára): Nọ́mbà odidi láti 0 dé 255 tí ó ṣeto ìyára mọ́tọ̀ ní lílo PWM. 0 túmọ̀ sí dúró, àti 255 ni ìyára kíkún.
  • Àríyànjiyàn kẹta (Ṣiṣẹ́): Nọ́mbà odidi, 1 láti mú mọ́tọ̀ ṣiṣẹ́ tàbí 0 láti dúró.

Ìṣàfihàn Iṣẹ́ Láàyè

Nínú fídíò, o lè rí iṣẹ́ náà ní ìgbà tí ó ń ṣiṣẹ́. Mọ́tọ̀ bẹ̀rẹ̀ láti ipò dúró, ó sì ń mú ìyára rẹ̀ pọ̀ díẹ̀díẹ̀ ní àwọn ìgbésẹ̀, tí ó ń fi ìṣàkóso PWM hàn. Serial Monitor ń fi ipò àti ìyára lọ́wọ́lọ́wọ́ hàn. O yóò tún rí ìgbì onígbòórùn lórí oscilloscope, tí ó fi ìwọ̀n àkókò tí PWM ń ṣiṣẹ́ (duty cycle) hàn bí ó ti ń pọ̀ sí i bí mọ́tọ̀ ṣe ń yára. Èyí jẹ́ ọ̀nà tí ó dára láti lóye bí PWM ṣe ń ṣiṣẹ́—ó ń tan agbára ní kíkankán, àti ìwọ̀n àkókò "títan" (duty cycle) ni ó pinnu foliteji àpapọ̀ àti nítorí náà ìyára mọ́tọ̀. (nínú fídíò ní 11:07)

Àpẹẹrẹ kóòdù kejì fi ìlò tí ó wúlò púpọ̀ hàn. Ó ń mú mọ́tọ̀ ṣiṣẹ́ ní ìyára kíkún ní ìtọ́sọ́nà kan, ó dúró, ó mú un ṣiṣẹ́ ní ìdajì ìyára, àti lẹ́yìn náà ó mú un ṣiṣẹ́ díẹ̀díẹ̀ ní ìtọ́sọ́nà òdì. Èyí fi hàn bí o ṣe le lo iṣẹ́ L293D() láti ṣẹ̀dá àwọn ọ̀nà ìṣísẹ̀ tí ó díjù fún àwọn iṣẹ́ rẹ.

Àwọn orí

  • [00:00] Ìfáàrà àti Àkópọ̀ Iṣẹ́
  • [00:30] Òye L293D Motor Driver
  • [01:16] L293D Pinout àti Àwọn Ìpàtàkì
  • [04:40] Ìsopọ̀ L293D sí Arduino àti Mọ́tọ̀
  • [07:05] Àlàyé Kóòdù àti Ìmúyípadà
  • [11:07] Ìṣàfihàn Láàyè ti Ìṣàkóso Ìyára àti Ìtọ́sọ́nà
  • [12:30] Ìwò Àwọn Ìgbì PWM lórí Oscilloscope

Aworan

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)
Ede: 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)
Ede: 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

Fáìlìs📁

Fọọmu data (pdf)