Beheer van 'n GS-motor met 'n IR-afstandbeheerder met behulp van Arduino en L293D
Inleiding
Hierdie tutoriaal demonstreer hoe om 'n GS-motor se rigting en stopfunksie te beheer met behulp van 'n IR-afstandbeheerder, 'n infrarooi-ontvanger en 'n Arduino-bord. Die L293D-motorbestuurderskyfie dien as die tussenganger, wat die Arduino se lae-stroom seine veilig toelaat om die motor te dryf. Hierdie projek is 'n praktiese inleiding tot die kombinasie van afstandbeheer met motorbestuur, wat moontlikhede vir verskeie robotika- en outomatiseringsprojekte oopmaak.
Hier is 'n paar praktiese idees vir wat jy met hierdie opstelling kan bou:
- Beheer van die beweging van 'n klein robotmotor of rover.
- Bou van 'n afstandbeheerde kameraskuif- of pan-tilt-meganisme.
- Skep van 'n draadlose aan/af-skakelaar vir 'n selfdoen-ventilator of ander klein toestel.
- Ontwikkel van 'n afstandbeheerde hek- of sluitmeganisme vir 'n model of klein projek.
Hardware Benodig
- Arduino-bord (bv. Uno)
- L293D-motorbestuurder-IC
- GS-motor (klein, 3-9V)
- IR-afstandbeheerder (swart of silwer/wit)
- IR-ontvangermodule (met of sonder PCB)
- Eksterne kragtoevoer vir die motor (bv. 9V-battery)
- Springdrade en broodbord
Bedradingsgids
Vir hierdie projek word die L293D-skyfie gebruik om die motor te beheer op grond van seine van die Arduino. Die verbindings is soos volg:
- Krag en Grond: Pen 16 van die L293D verbind met die Arduino se 5V. Penne 4, 5, 12 en 13 word saam verbind en aan die gemeenskaplike grond. Die eksterne motorkragtoevoer (bv. 9V) word aan pen 8 (VCC2) verbind.
- Motorverbindings: Die twee drade van die GS-motor word aan penne 3 en 6 van die L293D verbind. Die rigting van rotasie kan omgeruil word deur hierdie verbindings om te keer indien nodig. Die terugvloeidiodes op die skyfie beskerm dit teen spanningspulse wat deur die motor gegenereer word.
- Beheerpenne: Pen 1 (Enable 1,2) word aan Arduino-pen 8 verbind. Pen 2 (Inset 1A) word aan Arduino-pen 2 verbind, en Pen 7 (Inset 2A) word aan Arduino-pen 7 verbind. Hierdie Arduino-penne beheer die motor se rigting en spoed.
- IR-ontvanger: Die seinpen van die IR-ontvanger verbind aan Arduino-pen 11. Die VCC- en GND-penne word onderskeidelik aan die Arduino se 5V en GND verbind. As jy 'n kaal ontvangermodule gebruik, is die penuitleg VCC, GND en die seinuitset.
'n Gedetailleerde bedradingsdiagram word hieronder verskaf.

Die motor se kragtoevoer is apart van die Arduino se logika-toevoer, wat noodsaaklik is om genoeg stroom aan die motor te verskaf sonder om die Arduino se spanningsreguleerder te oorlaai.
Kodeverduideliking
Hierdie tutoriaal bevat twee aparte programme. Die eerste is die hoofprojekkode wat IR-afstandbeheer met die L293D-bestuurder kombineer. Die tweede is 'n eenvoudiger program om die L293D-motorbestuurder onafhanklik te toets.
Bron vir die beheer van 'n servomotor met 'n IR-afstandbeheerder met behulp van Arduino
Dit is die volledige program vir die projek. Dit integreer die IR-ontvangerbiblioteek en die L293D-motorbestuurlogika. Die kode is gestruktureer sodat jy dit maklik vir jou spesifieke afstandbeheerder en ontvangertipe kan konfigureer.
Die gebruikerskonfigureerbare afdeling is aan die bokant van die kode. Hier is wat jy moet stel:
Eerstens moet jy jou IR-afstandbeheertipe en ontvangermodule spesifiseer. Die veranderlike type moet op 'B' gestel word vir die swart afstandbeheerder of 'W' vir die wit/silwer afstandbeheerder. Die boolese veranderlike PCB moet op 1 gestel word as jy 'n ontvangermodule met 'n PCB gebruik, of 0 as jy die kaal ontvanger gebruik.
const char type ='B';// W vir wit, B vir swart. Moet enkelaanhalingstekens soos 'B' of 'W' behou
const boolean PCB = 0;// as ontvanger PCB is, stel op 1, indien nie, stel op 0. Sien video vir besonderhede
Vervolgens kan jy definieer watter sleutels op jou afstandbeheerder die motor sal beheer. Die stringe RIGHT, LEFT en STOP word gestel op die etikette van die sleutels wat jy wil gebruik. Byvoorbeeld, met die swart afstandbeheerder is die verstek die regterpyl (>), linkerpyl (<) en die OK-knoppie. Dit moet ooreenstem met die sleuteletikette wat in die skikkings soos blackRemoteKey[] gedefinieer word.
Jy kan ook die Arduino-penne wat vir die motor en ontvanger gebruik word, aanpas. Die kode definieer P1A, P2A, en EN12 vir die L293D, en RECV_PIN vir die IR-ontvanger. As jy verskillende penne wil gebruik, kan jy hierdie definisies verander.
#define P1A 2 // definieer pen 2 as vir P1A
#define P2A 7 // definieer pen 7 as vir P2A
#define EN12 8 // definieer pen 8 as vir 1,2EN enable
Die hoof logika word hanteer deur die motorAction()-funksie. Wanneer 'n sleutel gedruk word, dekodeer die robojaxValidateCode()-funksie dit en roep motorAction() aan met die sleutel se naam. Hierdie funksie vergelyk die naam met jou RIGHT, LEFT, en STOP-veranderlikes en roep die L293D()-funksie dienooreenkomstig aan om die motor in die korrekte rigting te draai of dit te stop.
Bron vir 'n eenvoudige L293-motorbeheerder met Arduino
Dit is 'n basiese toetsprogram vir die L293D-skyfie. Dit vereis nie 'n IR-afstandbeheer nie. In plaas daarvan, laat dit die motor outomaties deur 'n reeks aksies sirkuleer om te verifieer dat jou bedrading korrek is.
Die enigste gebruikerskonfigureerbare deel in hierdie skets is die pen-definisie, wat met jou bedrading moet ooreenstem:
#define P1A 2 // definieer pen 2 as vir P1A
#define P2A 7 // definieer pen 7 as vir P2A
#define EN12 8 // definieer pen 8 as vir 1,2EN enable
In die loop(), roep die kode die L293D_con()-funksie aan met verskillende parameters. Die eerste parameter is 'n karakter: 'L' vir een rigting en 'R' vir die ander. Die tweede parameter is 'n heelgetal: 1 om die motor te laat loop en 0 om dit te stop. Hierdie funksie is 'n eenvoudige manier om die motorbestuurder te toets voordat dit met die IR-beheerlogika geïntegreer word.
Lewende Projekdemonstrasie
In die video word die projek gedemonstreer met beide die swart en die silwer afstandbeheerders. Eerstens gebruik die aanbieder die swart afstandbeheer met 'n PCB-ontvangermodule. Nadat die kode met die korrekte instellings (type='B', PCB=1) opgelaai is, veroorsaak die druk van die regterpyltjie-sleutel dat die motor in een rigting draai, die linkerpyltjie-sleutel draai dit in die teenoorgestelde rigting, en die OK-knoppie stop dit.
Die demonstrasie skakel dan oor na die silwer afstandbeheer. Die kode word opgedateer om die silwer afstandbeheer se sleutel-etikette, soos CH+ en CH-, vir beheer te gebruik. Die aanbieder wys dat die motor korrek op hierdie verskillende knoppies reageer.
Laastens verwyder die aanbieder die PCB-module en gebruik die kaal IR-ontvanger. Die enigste verandering wat in die kode nodig is, is om PCB=0 te stel. Die demonstrasie bevestig dat die motor steeds suksesvol beheer word, wat bewys dat die kode beide ontvangertipes korrek hanteer.
Hoofstukke
- [00:00] Inleiding en projekdemonstrasie
- [00:53] Voorvereistes en aanbevole video's
- [02:14] L293D-skyfie bedrading verduideliking
- [07:30] Kode verduideliking en konfigurasie
- [14:15] Demonstrasie met die swart afstandbeheer en PCB
- [16:04] Demonstrasie met die silwer afstandbeheer en PCB
- [17:42] Demonstrasie met die silwer afstandbeheer sonder PCB
- [18:23] Demonstrasie met die swart afstandbeheer sonder PCB
Beelde
/*
* Original Infrared library from - http://arcfn.com
*
* This is Arduino code for the L293D DC motor driver.
* It uses an IR remote control to rotate the DC motor clockwise (CW), counter-clockwise (CCW), and stop it.
* Watch instructions for this video: https://youtu.be/e0pvfJbdw_o
* To get the library and files related to this code, visit http://robojax.com/learn/arduino
// Written for Robojax.com video
* Code is available at http://robojax.com/learn/arduino
*
// Written by Ahmad S. for Robojax.com on
// August 10, 2018 at 22:03 in Ajax, Ontario, Canada
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
// DC motor control
#define P1A 2 // define pin 2 as for P1A
#define P2A 7 // define pin 7 as for P2A
#define EN12 8 // define pin 8 as for 1,2EN enable
// remote settings start
#include <IRremote.h>
int RECV_PIN = 11;
const char type ='B';// W for white, B for black. Must keep single quotes like 'B' or 'W'
const boolean PCB = 0;// if receiver is PCB set to 1, if not set to 0. See video for details
boolean displayCode = false;// to display remote code. if not, set to false
// IR remote settings
const String RIGHT=">";// move motor to the right (CW) with this key on remote
const String LEFT ="<";// move motor to the left (CCW) with this key on remote
const String STOP ="OK";// stop motor with this key on remote
// remote settings end
IRrecv irrecv(RECV_PIN);
// this is array holding codes for White Remote when used with PCB version of receiver
unsigned int whiteRemotePCB[] ={
0xE318261B, // CH-
0x511DBB, // CH
0xEE886D7F, // CH+
0x52A3D41F, // |<<
0xD7E84B1B, // >>|
0x20FE4DBB, // >||
0xF076C13B, // -
0xA3C8EDDB, // +
0x12CEA6E6, // EQ
0xC101E57B, // 0
0x97483BFB, // 100+
0xF0C41643, // 200+
0x9716BE3F, // 1
0x3D9AE3F7, // 2
0x6182021B, // 3
0x8C22657B, // 4
0x488F3CBB, // 5
0x449E79F, // 6
0x32C6FDF7, // 7
0x1BC0157B, // 8
0x3EC3FC1B // 9
};
// this is array holding codes for White Remote when used with non-PCB version of receiver
unsigned int whiteRemote[] ={
0xFFA25D, // CH-
0xFF629D, // CH
0xFFE21D, // CH+
0xFF22DD, // |<<
0xFF02FD, // >>|
0xFFC23D, // >||
0xFFE01F, // -
0xFFA857, // +
0xFF906F, // EQ
0xFF6897, // 0
0xFF9867, // 100+
0xFFB04F, // 200+
0xFF30CF, // 1
0xFF18E7, // 2
0xFF7A85, // 3
0xFF10EF, // 4
0xFF38C7, // 5
0xFF5AA5, // 6
0xFF42BD, // 7
0xFF4AB5, // 8
0xFF52AD // 9
};
// key lables of white remote
String whiteRemoteKey[] ={
"CH-",
"CH",
"CH+",
"|<<",
">>|",
">||",
"-",
"+",
"EQ",
"0",
"100+",
"200+",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9"
};
// this is array holding codes for Black Remote when used with non-PCB version of receiver
unsigned int blackRemote[] ={
0xFF629D, // ^
0xFF22DD, // <
0xFF02FD, // OK
0xFFC23D, // >
0xFFA857, // v
0xFF6897, // 1
0xFF9867, // 2
0xF0C41643, // 3
0xFF30CF, // 4
0xFF18E7, // 5
0xFF7A85, // 6
0xFF10EF, // 7
0xFF38C7, // 8
0xFF5AA5, // 9
0xFF42BD, // *
0xFF4AB5, // 0
0xFF52AD // #
};
// this is array holding codes for Black Remote when used with PCB version of receiver
unsigned int blackRemotePCB[] ={
0x511DBB, // ^
0x52A3D41F, // <
0xD7E84B1B, // OK
0x20FE4DBB, // >
0xA3C8EDDB, // v
0xC101E57B, // 1
0x97483BFB, // 2
0xF0C41643, // 3
0x9716BE3F, // 4
0x3D9AE3F7, // 5
0x6182021B, // 6
0x8C22657B, // 7
0x488F3CBB, // 8
0x449E79F, // 9
0x32C6FDF7, // *
0x1BC0157B, // 0
0x3EC3FC1B // #
};
// Black remote key names
String blackRemoteKey[] ={
"^",
"<",
"OK",
">",
"v",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"*",
"0",
"#"
};
decode_results results;
/*
* Permission granted to share this code given that this
* note is kept with the code.
* Disclaimer: this code is "AS IS" and for educational purposes only.
*
*/
void setup() {
// L293 Motor Control Code by Robojax.com 2018025
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 IR Decode");
Serial.println("Motor Control with Remote");
irrecv.enableIRIn(); // Start the receiver
// L293 Motor Control Code by Robojax.com 20180810
}
void loop() {
// L293d Motor Control Code with IR by Robojax.com 20180810
if (irrecv.decode(&results)) {
if(displayCode)Serial.println(results.value, HEX);
robojaxValidateCode(results.value);// used the "robojaxValidateCode" bellow
irrecv.resume(); // Receive the next value
}
delay(50);// 50 millisecond delay
// L293d Motor Control Code with IR by Robojax.com 20180810
}//loop end
/*
* function: robojaxValidateCode
* validates the remote code and prints the correct key name
* cd is the code passed from the loop
* Written by A. S. for Robojax
*/
void robojaxValidateCode(int cd)
{
// Robojax IR Remote decoder
int found=0;
if(type =='W' && !PCB)
{
// Robojax IR White Remote decoder
// if type is set to 'W' (white remote) and PCB=0 then check White remote code
for(int i=0; i< sizeof(whiteRemote)/sizeof(int); i++)
{
if(whiteRemote[i] ==cd)
{
Serial.print("Key pressed:");
Serial.println(whiteRemoteKey[i]);
motorAction(whiteRemoteKey[i]);// take action
found=1;
}// if matched
}// for
}else if(type =='W' && PCB){
// Robojax IR White Remote decoder
// if type is set to 'W' (white remote) and PCB=1 then check White remote code
for(int i=0; i< sizeof(whiteRemotePCB)/sizeof(int); i++)
{
if(whiteRemotePCB[i] ==cd)
{
Serial.print("Key pressed:");
Serial.println(whiteRemoteKey[i]);
motorAction(whiteRemoteKey[i]);// take action
found=1;
}// if matched
}// for
}else if(type =='B' && PCB){
// Robojax IR Black Remote decoder
// if type is set to 'B' (black remote) and PCB=1 then check Black remote code
for(int i=0; i< sizeof(blackRemotePCB)/sizeof(int); i++)
{
// Robojax IR black Remote decoder
if(blackRemotePCB[i] ==cd)
{
Serial.print("Key pressed:");
Serial.println(blackRemoteKey[i]);
motorAction(blackRemoteKey[i]);// take action
found=1;
}// if matched
}// for
}else{
// if type is set to 'B' (black remote) and PCB =0 then check Black remote code
for(int i=0; i< sizeof(blackRemote)/sizeof(int); i++)
{
// Robojax IR black Remote decoder
if(blackRemote[i] ==cd)
{
Serial.print("Key pressed:");
Serial.println(blackRemoteKey[i]);
motorAction(blackRemoteKey[i]);// take action
found=1;
}// if matched
}// for
}// else
if(!found){
if(cd !=0xFFFFFFFF)
{
Serial.println("Key unknown");
}
}// found
}// robojaxValidateCode end
/*
*
* motorAction()
* receives string "value" as input and based on the settings,
* turns motor CW, CCW or STOP
*/
void motorAction(String value)
{
// Robojax IR motor control
if(value == RIGHT)
{
L293D('R',1);// rotate motor to the right (CCW)
}
if(value == LEFT)
{
L293D('L',1);// rotate motor to the left (CW)
}
if(value == STOP)
{
L293D('R',0);// stop motor
}
}//motorAction end
/*
* L293D(char dir, int en)
* dir is character either L for CW direction
* or R for CCW direction
* en is integer 1 to rotate, 0 for stop
*/
void L293D(char dir, int en)
{
if(dir =='L')
{
if(en ==0){
Serial.println("CW Motor Stopped");
}else{
Serial.println("Rotating CW");
}
digitalWrite(EN12 ,en);// Enable 1A and 2A
digitalWrite(P1A,HIGH);// send + or HIGH signal to P1A
digitalWrite(P2A,LOW);// send - or LOW signal to P2A
}else{
if(en ==0){
Serial.println("CCW Motor Stopped");
}else{
Serial.println("Rotating CCW");
}
digitalWrite(EN12 ,en);// Disable 1A and 2A
digitalWrite(P1A,LOW);// send + or HIGH signal to P1A
digitalWrite(P2A,HIGH);// send - or LOW signal to P2A
}
}//L293D end
++
/*
* This is the Arduino code for L293d DC motor Driver
* watch LE18-D80NK video for details https://youtu.be/MrYsmAwzfrM
* Code is available at http://robojax.com/learn/arduino
*
* Written by Ahmad S. for Robojax.com on
* August 9, 2018 at 22:03 in Ajax, Ontario, Canada
*/
// DC motor 1 control
#define P1A 2 // define pin 2 as for P1A
#define P2A 7 // define pin 7 as for P2A
#define EN12 8 // define pin 8 as for 1,2EN enable
/*
* Permission granted to share this code given that this
* note is kept with the code.
* Disclaimer: this code is "AS IS" and for educational purposes only.
*
*/
void setup() {
// L293 Motor Control Code by Robojax.com 2018025
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
// L293 Motor Control Code by Robojax.com 2018025
}
void loop() {
// L293 Motor Control Code by Robojax.com 2018025
L293D_con('L',1);
delay(4000);
L293D_con('L',0);
delay(2000);
L293D_con('R',1);
delay(4000);
L293D_con('R',0);
delay(2000);
Serial.println("=========== Loop done");
delay(500);
// L293 Motor Control Code by Robojax.com 2018025
}
void L293D_con(char dir, int en)
{
if(dir =='L')
{
if(en ==0){
Serial.println(" CW Motor Stopped");
}else{
Serial.println(" Rotating CW");
}
digitalWrite(EN12 ,en);// Enable 1A and 2A
digitalWrite(P1A,HIGH);// send + or HIGH signal to P1A
digitalWrite(P2A,LOW);// send - or LOW signal to P2A
}else{
if(en ==0){
Serial.println(" CCW Motor Stopped");
}else{
Serial.println(" Rotating CCW");
}
digitalWrite(EN12 ,en);// Disable 1A and 2A
digitalWrite(P1A,LOW);// send + or HIGH signal to P1A
digitalWrite(P2A,HIGH);// send - or LOW signal to P2A
}
}//L293D_con end
Hulpbronne en verwysings
-
BuitenburgDownload Library for Arduino (GitHub)github.com
Lêers📁
Datasheet (pdf)
-
robojax_L293D_motor_shield_manual.pdf
robojax_L293D_motor_shield_manual.pdf0.16 MB -
L293d datasheet
L293d_datasheet.pdf0.34 MB