很常用的L298N驱动模块驱动直流电机,Arduino和OpenMV连接方式,代码都有哦,求赞!!
可以控制两个电机,控制很简单的
输出A 输出B 分别接两个直流电机。
12V供电 这个是外部电源为驱动板供电的接口,一般驱动电压实际可以接受的输入范围是7~12V,此时可以使能板载的5V逻辑供电。当使用大于12V的驱动电压时,为了避免稳压芯片损坏,首先要拔掉板载5V输出使能的跳线帽,然后在5V输出端口外部接入5V电压对L298N内部逻辑供电。
5V供电 (引出5V电压接到Arduino板,给Arduino板供电(驱动电压7~12V)连接到UNO板的5V)同时Arduino板也要引出一条GND线,连接到L298N的GND与外部电源共地。
ENA ENB通道A使能,通道B使能,当你不用PWM时不需要拔掉跳线帽,当你需要PWM时,将需要拔掉跳线帽,接到arduino上的模拟输入输出接口,我的只需要外侧接上,下面回介绍。
IN1 IN2 IN3 IN4逻辑输出口,其中IN1 IN2 控制一个电机的转动,IN3 IN4 控制另一个电机的转动,只要一个置高 一个置低,就可以让电机转动起来。
PWM就是改变占空比改变电压来改变转速
不使用PWM输入的测试代码,这时把跳线帽插上,为了方便,我引出两条线直接短接就行
下面是代码:尽量简单吧,会前进,左转后退停止动动手改改就行
//测试电机,让两个电机直走
int input1 = 2; // 定义uno的pin 2 向 input1 输出
int input2 = 4; // 定义uno的pin 4 向 input2 输出
int input3 =7; // 定义uno的pin 7 向 input3 输出
int input4 =8; // 定义uno的pin 8 向 input4 输出
void setup() {
Serial.begin (9600);
//初始化各IO,模式为OUTPUT 输出模式
pinMode(input1,OUTPUT);
pinMode(input2,OUTPUT);
pinMode(input3,OUTPUT);
pinMode(input4,OUTPUT);
}
void loop() {
//forward 前进
digitalWrite(input1,HIGH); //给高电平
digitalWrite(input2,LOW); //给低电平
digitalWrite(input3,HIGH); //给高电平
digitalWrite(input4,LOW); //给低电平
delay(3000); //延时1秒
}
以下是PWM调速的小车,速度从快到慢!接线端口是外侧那个!我的是这样!
//测试电机,让两个电机直走
int input1 = 2; // 定义uno的pin 2 向 input1 输出
int input2 = 4; // 定义uno的pin 4 向 input2 输出
int input3 =12; // 定义uno的pin 7 向 input3 输出
int input4 =13; // 定义uno的pin 8 向 input4 输出
//PWM
int ENA1=5; //电机A使能PWM输出,需要接在Arduino上有~标识的IO口,才有PWM
int ENB1=6; //电机A使能PWM输出
void setup() {
Serial.begin (9600);
//初始化各IO,模式为OUTPUT 输出模式
pinMode(input1,OUTPUT);
pinMode(input2,OUTPUT);
pinMode(input3,OUTPUT);
pinMode(input4,OUTPUT);
}
//测试函数
void text() {
//forward 前进
digitalWrite(input1,HIGH); //给高电平
digitalWrite(input2,LOW); //给低电平
digitalWrite(input3,HIGH); //给高电平
digitalWrite(input4,LOW); //给低电平
// delay(3000); //延时1秒
}
void loop()
{
text();//测试电机,给个提示
delay(2000);
while(1){
for(int PWM=255;PWM>100;PWM--)
{
Serial.println(PWM);
analogWrite(ENA1,PWM);
analogWrite(ENB1,PWM);
digitalWrite(input1,HIGH);
digitalWrite(input2,LOW);
digitalWrite(input3,HIGH);
digitalWrite(input4,LOW);
delay(50);//延时,速度变化的快慢,PWM变化速度
}
for(int PWM=100;PWM<255;PWM++)
{
Serial.println(PWM);
analogWrite(ENA1,PWM);
analogWrite(ENB1,PWM);
digitalWrite(input1,HIGH);
digitalWrite(input2,LOW);
digitalWrite(input3,HIGH);
digitalWrite(input4,LOW);
delay(50);
}
}
//delay(3000); //延时0.5秒
}
那么需要用到openMV的pwm IO口和拉高拉低操作,需要6个端口,P0-P1和P7-8(pwm) P9也行。
P0-P3连接逻辑输入口
PWM的P7-9选两个连接通道使能AB
# Untitled - By: Acer - 周日 9月 16 2018
from pyb import Pin, Timer
import time,math,random
inverse_left=False #change it to True to inverse left wheel
inverse_right=False #change it to True to inverse right wheel
ain1 = Pin('P0', Pin.OUT_PP)#a电机引脚
ain2 = Pin('P1', Pin.OUT_PP)#
bin1 = Pin('P2', Pin.OUT_PP)#电机引脚
bin2 = Pin('P3', Pin.OUT_PP)
ain1.low()#低电平初始化
ain2.low()
bin1.low()
bin2.low()
pwma = Pin('P7')#产生PWMd引脚
pwmb = Pin('P8')#产生PWM
tim = Timer(4, freq=1000)
ch1 = tim.channel(1, Timer.PWM, pin=pwma)
ch2 = tim.channel(2, Timer.PWM, pin=pwmb)
ch1.pulse_width_percent(0)#设置占空比为零
ch2.pulse_width_percent(0)
speed=50
lowspeed=30
x_range=20
h_range=50
def run(left_speed, right_speed):
if inverse_left==True:
left_speed=(-left_speed)
if inverse_right==True:
right_speed=(-right_speed)
if left_speed < 0:
ain1.low()
ain2.high()
else:
ain1.high()
ain2.low()
ch1.pulse_width_percent(abs(left_speed))
if right_speed < 0:
bin1.low()
bin2.high()
else:
bin1.high()
bin2.low()
ch2.pulse_width_percent(abs(right_speed))
while(True):
run(40,40)#测试前进,速度为40
插播一波,如果感兴趣的童鞋们可以加入技术交流群~