基于L298N驱动的麦克纳姆轮小车 代码与逻辑以及上位机控制
Posted 王若依
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于L298N驱动的麦克纳姆轮小车 代码与逻辑以及上位机控制相关的知识,希望对你有一定的参考价值。
实现的功能为,通过串口发送指令,进行小车的前进,后退,左平移,右平移,左转和右转。在驱动小车的时候应该与麦克纳姆轮的物理特性紧密结合。
一、代码
int LB_IN1=2; //右上电机
int LB_IN2=4;
int LB_EN=3;
int LU_IN1=6; //右下电机
int LU_IN2=7;
int LU_EN=5;
int RU_IN1=8; //左下电机
int RU_IN2=9;
int RU_EN=10;
int RB_IN1=12; //左上电机
int RB_IN2=14;
int RB_EN=11 ;
int val;
//char msg;
void Stop(){
digitalWrite(LB_IN1,LOW);
digitalWrite(LB_IN2,LOW);
digitalWrite(LU_IN1,LOW);
digitalWrite(LU_IN2,LOW);
digitalWrite(RB_IN1,LOW);
digitalWrite(RB_IN2,LOW);
digitalWrite(RU_IN1,LOW);
digitalWrite(RU_IN2,LOW);//停止
}
void Up(){
digitalWrite(LB_IN1,LOW);
digitalWrite(LB_IN2,HIGH);
digitalWrite(LU_IN1,LOW);
digitalWrite(LU_IN2,HIGH);
digitalWrite(RB_IN1,LOW);
digitalWrite(RB_IN2,HIGH);
digitalWrite(RU_IN1,LOW);
digitalWrite(RU_IN2,HIGH);//前进
}
void Back(){
digitalWrite(LB_IN1,HIGH);
digitalWrite(LB_IN2,LOW);
digitalWrite(LU_IN1,HIGH);
digitalWrite(LU_IN2,LOW);
digitalWrite(RB_IN1,HIGH);
digitalWrite(RB_IN2,LOW);
digitalWrite(RU_IN1,HIGH);
digitalWrite(RU_IN2,LOW);//后退
}
void TurnRight(){
digitalWrite(LB_IN1,LOW);
digitalWrite(LB_IN2,HIGH);
digitalWrite(LU_IN1,LOW);
digitalWrite(LU_IN2,HIGH);
digitalWrite(RB_IN1,HIGH);
digitalWrite(RB_IN2,LOW);
digitalWrite(RU_IN1,HIGH);
digitalWrite(RU_IN2,LOW);//右转
}
void TurnLeft(){
digitalWrite(LB_IN1,HIGH);
digitalWrite(LB_IN2,LOW);
digitalWrite(LU_IN1,HIGH);
digitalWrite(LU_IN2,LOW);
digitalWrite(RB_IN1,LOW);
digitalWrite(RB_IN2,HIGH);
digitalWrite(RU_IN1,LOW);
digitalWrite(RU_IN2,HIGH);//左转
}
void RightLine(){
digitalWrite(LB_IN1,HIGH);
digitalWrite(LB_IN2,LOW);
digitalWrite(LU_IN1,LOW);
digitalWrite(LU_IN2,HIGH);
digitalWrite(RB_IN1,LOW);
digitalWrite(RB_IN2,HIGH);
digitalWrite(RU_IN1,HIGH);
digitalWrite(RU_IN2,LOW);//右平移
}
void LeftLine(){
digitalWrite(LB_IN1,LOW);
digitalWrite(LB_IN2,HIGH);
digitalWrite(LU_IN1,HIGH);
digitalWrite(LU_IN2,LOW);
digitalWrite(RB_IN1,HIGH);
digitalWrite(RB_IN2,LOW);
digitalWrite(RU_IN1,LOW);
digitalWrite(RU_IN2,HIGH);//左平移
}
void setup() {
Serial.begin(57600);
pinMode(LB_IN1,OUTPUT);
pinMode(LB_IN2,OUTPUT);
pinMode(LB_EN,OUTPUT);
pinMode(LU_IN1,OUTPUT);
pinMode(LU_IN2,OUTPUT);
pinMode(LU_EN,OUTPUT);
pinMode(RU_IN1,OUTPUT);
pinMode(RU_IN2,OUTPUT);
pinMode(RU_EN,OUTPUT);
pinMode(RB_IN1,OUTPUT);
pinMode(RB_IN2,OUTPUT);
pinMode(RB_EN,OUTPUT);
//最开始设置制动模式
Stop();
val=map(150,0,1023,0,255);//映射一下
analogWrite(LB_EN,val);
analogWrite(LU_EN,val);
analogWrite(RU_EN,val);
analogWrite(RB_EN,val);
}
void loop()
{
if(Serial.available()>0)
{
switch (Serial.read())
{
case 'U':
Up();
break;
case 'B':
Back();
break;
case 'R':
TurnRight();
break;
case 'L':
TurnLeft();
break;
case 'D':
RightLine();
break;
case 'A':
LeftLine();
break;
}
}
}
其实麦克娜姆的运动原理很简单,一张图来点清楚麦克娜姆轮的运动原理。
通过发送不同的指令,最终实现了每个字符对应的控制小车。
二、上位机部分
之前的文章中涉及到了自定义协议,有想法的小伙伴可以通过这个项目再来深入的了解一番。这其实不过是调用终端来实现小车的操控。烧录好程序以后,打开终端。(没有python的小伙伴可以看我之前的博客《python制作上位机控制Arduino下位机(自定义协议)》)
//打开python的环境
python
>>> import serial //导入串口的库
>>>ser = serial.Serial("COM3",57600) //连接串口
>>>ser.write(‘U’.encode('ascii')) //前进
>>>ser.write(‘D’.encode('ascii')) //右平移
>>>ser.write(‘A’.encode('ascii')) //左平移
>>>ser.write(‘L’.encode('ascii')) //左转
>>>ser.write(‘R’.encode('ascii')) //右转
>>>ser.write(‘B’.encode('ascii')) //后退
>>>ser.write(‘S’.encode('ascii')) //停止
下阶段
当然,完整的小车成品怎么能带有线的呢?下一阶段,进阶无线设备控制,打算采用rnf24l0模块。同时,推荐一名python的博主,袁六加。本博主刷着她的博客学到了不少东西,感觉和本博主一样,不断的踩坑,试水,最终达到实现功能的目的。同时,袁博主的博客内容确实干货,对树莓派和python有兴趣的可以去刷刷看看(~ ̄▽ ̄)~ 。
以上是关于基于L298N驱动的麦克纳姆轮小车 代码与逻辑以及上位机控制的主要内容,如果未能解决你的问题,请参考以下文章
基于L298N驱动的麦克纳姆轮小车 代码与逻辑以及上位机控制
nrf24L01的通讯控制 基于L298N驱动的麦克纳姆轮的小车