06L298N再研究

參考 http://swf.com.tw/?p=564

馬達與L298N的接法

原本以為:

將第一組馬達的A點接在OUT1、B點接在OUT2

第二組馬達的A點接在OUT3、B點接在OUT4

如此後,則

IN1 IN2 Action LOW LOW Motor Stop

LOW HIGH Motor moves forward

HIGH LOW Motor moves backward

HIGH HIGH Motor Stop

但後來發現不是!

這跟輪子接在馬達的哪一邊有關

如果輪子接在馬達銅片接頭那邊,(如上上圖,輪子在上方,與AB點同方向(都是靠上))

則馬達上方銅片的接線,接到OUT1(或OUT3)

馬達下方銅片的接線,接到OUT2(或OUT4)

如下兩圖所示

右輪

左輪

測試一個馬達動不動

// 馬達控制設定const byte LEFT1 = 10;const byte LEFT2 = 11; void forward() { // 馬達轉向:前進 ,仍然搞不懂何者正轉!是(1,0)還是(0,1)時? digitalWrite(LEFT1, HIGH); digitalWrite(LEFT2, LOW);} void setup() { pinMode(LEFT1, OUTPUT); pinMode(LEFT2, OUTPUT);} void loop() { forward();}

測試透過Serial Monitor來控制前、後、左、右、及停止,不用PWM

// OTCarTest // A simple test program for OTCar, will make the OTCar move forward, backward, // turn right and turn left for specific seconds. // http://www.osslab.com.tw/Hardware/Open_Embedded_System/MCU/AVR/Arduino/Remote_Car /* Input for motorA: IN1 IN2 Action LOW LOW Motor Stop HIGH LOW Motor moves backward

LOW HIGH Motor moves forward

HIGH HIGH Motor Stop */ const int motorIn1 = 10; const int motorIn2 = 11; const int motorIn3 = 12; const int motorIn4 = 13;

char val; // variable to receive data from the serial port(bluetooth) void setup() { Serial.begin(9600);

pinMode(motorIn1, OUTPUT); pinMode(motorIn2, OUTPUT); pinMode(motorIn3, OUTPUT); pinMode(motorIn4, OUTPUT); }

void loop()

{

if(Serial.available())

{

val = Serial.read();

switch(val)

{

case 'f': // car forward

forward();

break;

case 'b': // car backward

backward();

break;

case 'l': // car turn left

left();

break;

case 'r': // car turn right

right();

break;

case 's': // car stop

motorstop();

break;

}

}

}

void forward() { digitalWrite(motorIn1, LOW);

digitalWrite(motorIn2, HIGH);

digitalWrite(motorIn3, LOW);

digitalWrite(motorIn4, HIGH);

} void backward() { digitalWrite(motorIn1, HIGH);

digitalWrite(motorIn2, LOW);

digitalWrite(motorIn3, HIGH);

digitalWrite(motorIn4, LOW);

} // Let right motor keep running, but stop left motor void right() { digitalWrite(motorIn1, LOW);

digitalWrite(motorIn2, LOW); digitalWrite(motorIn3, LOW); digitalWrite(motorIn4, HIGH);

} // Let left motor keep running, but stop right motor void left() { digitalWrite(motorIn1, LOW); digitalWrite(motorIn2, HIGH); digitalWrite(motorIn3, LOW);

digitalWrite(motorIn4, LOW);

}

void motorstop() { digitalWrite(motorIn1, LOW); digitalWrite(motorIn2, LOW); digitalWrite(motorIn3, LOW); digitalWrite(motorIn4, LOW); } --------------------------------

測試透過Serial Monitor來控制前、後、左、右、及停止,加上PWM控制速度

利用藍牙控制

// OTCarTest // A simple test program for OTCar, will make the OTCar move forward, backward, // turn right and turn left for specific seconds. // http://www.osslab.com.tw/Hardware/Open_Embedded_System/MCU/AVR/Arduino/Remote_Car

#include <SoftwareSerial.h>

SoftwareSerial BT(0,1); // 接收腳(RX), 傳送腳(TX);接HC-06之TXD、RXD;先不要用0,1,因為USB用

/* Input for motorA: IN1 IN2 Action LOW LOW Motor Stop HIGH LOW Motor moves forward LOW HIGH Motor moves backward HIGH HIGH Motor Stop */

const int ena = 5;

const int enb = 6;

const int motorIn1 = 10; const int motorIn2 = 11; const int motorIn3 = 12; const int motorIn4 = 13;

char val; // variable to receive data from the serial port(bluetooth)

int power; void setup() { // Serial.begin(9600);

BT.begin(9600);

pinMode(ena, OUTPUT); pinMode(enb, OUTPUT);

pinMode(motorIn1, OUTPUT); pinMode(motorIn2, OUTPUT); pinMode(motorIn3, OUTPUT); pinMode(motorIn4, OUTPUT);

power=140; }

void loop()

{

if(BT.available() ) {

val=BT.read();

switch(val)

{

case 'f': // car forward

forward();

break;

case 'b': // car backward

backward();

break;

case 'l': // car turn left

left();

break;

case 'r': // car turn right

right();

break;

case 's': // car stop

motorstop();

break;

case 'x' :

lowspeed();

break;

case 'y' :

midspeed();

break;

case 'z' :

highspeed();

break;

}

}

}

void motorstop() { digitalWrite(motorIn1, LOW); digitalWrite(motorIn2, LOW); digitalWrite(motorIn3, LOW); digitalWrite(motorIn4, LOW); } void forward() { digitalWrite(motorIn1, LOW);

digitalWrite(motorIn2, HIGH);

digitalWrite(motorIn3, LOW);

digitalWrite(motorIn4, HIGH);

} void backward() { digitalWrite(motorIn1, HIGH);

digitalWrite(motorIn2, LOW);

digitalWrite(motorIn3, HIGH);

digitalWrite(motorIn4, LOW);

} // Let right motor keep running, but stop left motor void right() { digitalWrite(motorIn1, LOW);

digitalWrite(motorIn2, LOW); digitalWrite(motorIn3, LOW); digitalWrite(motorIn4, HIGH);

} // Let left motor keep running, but stop right motor void left() { digitalWrite(motorIn1, LOW); digitalWrite(motorIn2, HIGH); digitalWrite(motorIn3, LOW);

digitalWrite(motorIn4, LOW); }

void lowspeed(){ power=70;

analogWrite(ena,power);//0停止;值介於40-255 analogWrite(enb,power);//0停止;值介於40-255 } void midspeed(){ power=140;

analogWrite(ena,power);//0停止;值介於40-255 analogWrite(enb,power);//0停止;值介於40-255 } void highspeed(){ power=210;

analogWrite(ena,power);//0停止;值介於40-255 analogWrite(enb,power);//0停止;值介於40-255 }

2016/01/10測試成功

以往失敗,是因為電壓不足所致

改用18650X2來提供L298N的供電,即成功!

--------------------------------------------------------------------------

// OTCarTest // A simple test program for OTCar, will make the OTCar move forward, backward, // turn right and turn left for specific seconds. // http://www.osslab.com.tw/Hardware/Open_Embedded_System/MCU/AVR/Arduino/Remote_Car

#include <SoftwareSerial.h>

SoftwareSerial BT(0,1); // 接收腳(RX), 傳送腳(TX);接HC-06之TXD、RXD;先不要用0,1,因為USB用

/* Input for motorA: IN1 IN2 Action LOW LOW Motor Stop HIGH LOW Motor moves forward LOW HIGH Motor moves backward HIGH HIGH Motor Stop */

const int ena = 5;

const int enb = 6;

const int motorIn1 = 10; const int motorIn2 = 11; const int motorIn3 = 12; const int motorIn4 = 13;

char val; // variable to receive data from the serial port(bluetooth)

int power; void setup() { // Serial.begin(9600);

BT.begin(9600);

pinMode(ena, OUTPUT); pinMode(enb, OUTPUT);

pinMode(motorIn1, OUTPUT); pinMode(motorIn2, OUTPUT); pinMode(motorIn3, OUTPUT); pinMode(motorIn4, OUTPUT);

power=140; }

void loop()

{

if(BT.available() ) {

val=BT.read();

switch(val)

{

case 'f': // car forward

forward();

break;

case 'b': // car backward

backward();

break;

case 'l': // car turn left

left();

break;

case 'r': // car turn right

right();

break;

case 's': // car stop

motorstop();

break;

case 'x' :

lowspeed();

break;

case 'y' :

midspeed();

break;

case 'z' :

highspeed();

break;

}

}

}

void motorstop() { digitalWrite(motorIn1, LOW); digitalWrite(motorIn2, LOW); digitalWrite(motorIn3, LOW); digitalWrite(motorIn4, LOW);

analogWrite(ena,power);//0停止;值介於40-255 analogWrite(enb,power);//0停止;值介於40-255 } void forward() { digitalWrite(motorIn1, LOW);

digitalWrite(motorIn2, HIGH);

digitalWrite(motorIn3, LOW);

digitalWrite(motorIn4, HIGH);

analogWrite(ena,power);//0停止;值介於40-255 analogWrite(enb,power);//0停止;值介於40-255

} void backward() { digitalWrite(motorIn1, HIGH);

digitalWrite(motorIn2, LOW);

digitalWrite(motorIn3, HIGH);

digitalWrite(motorIn4, LOW);

analogWrite(ena,power);//0停止;值介於40-255 analogWrite(enb,power);//0停止;值介於40-255

} // Let right motor keep running, but stop left motor void right() { digitalWrite(motorIn1, LOW);

digitalWrite(motorIn2, LOW); digitalWrite(motorIn3, LOW); digitalWrite(motorIn4, HIGH);

analogWrite(ena,power);//0停止;值介於40-255 analogWrite(enb,power);//0停止;值介於40-255

} // Let left motor keep running, but stop right motor void left() { digitalWrite(motorIn1, LOW); digitalWrite(motorIn2, HIGH); digitalWrite(motorIn3, LOW);

digitalWrite(motorIn4, LOW);

analogWrite(ena,power);//0停止;值介於40-255 analogWrite(enb,power);//0停止;值介於40-255 }

void lowspeed(){ power=70;

// analogWrite(ena,power);//0停止;值介於40-255 // analogWrite(enb,power);//0停止;值介於40-255 } void midspeed(){ power=140;

// analogWrite(ena,power);//0停止;值介於40-255 // analogWrite(enb,power);//0停止;值介於40-255 } void highspeed(){ power=210;

// analogWrite(ena,power);//0停止;值介於40-255 // analogWrite(enb,power);//0停止;值介於40-255 }

上面也測試成功

以往失敗,是因為電壓不足所致

改用18650X2來提供L298N的供電,即成功!

----------------------------------

http://tronixlabs.com/news/tutorial-l298n-dual-motor-controller-module-2a-and-arduino/

// connect motor controller pins to Arduino digital pins // motor one int enA = 10; int in1 = 9; int in2 = 8; // motor two int enB = 5; int in3 = 7; int in4 = 6; void setup() { // set all the motor control pins to outputs pinMode(enA, OUTPUT); pinMode(enB, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); } void demoOne() { // this function will run the motors in both directions at a fixed speed // turn on motor A digitalWrite(in1, HIGH); digitalWrite(in2, LOW); // set speed to 200 out of possible range 0~255 analogWrite(enA, 200); // turn on motor B digitalWrite(in3, HIGH); digitalWrite(in4, LOW); // set speed to 200 out of possible range 0~255 analogWrite(enB, 200); delay(2000); // now change motor directions digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); delay(2000); // now turn off motors digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); } void demoTwo() { // this function will run the motors across the range of possible speeds // note that maximum speed is determined by the motor itself and the operating voltage // the PWM values sent by analogWrite() are fractions of the maximum speed possible // by your hardware // turn on motors digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); // accelerate from zero to maximum speed for (int i = 0; i < 256; i++) { analogWrite(enA, i); analogWrite(enB, i); delay(20); } // decelerate from maximum speed to zero for (int i = 255; i >= 0; --i) { analogWrite(enA, i); analogWrite(enB, i); delay(20); } // now turn off motors digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); } void loop() { demoOne(); delay(1000); demoTwo(); delay(1000); }