基于L298N驱动的麦克纳姆轮小车(二) 代码与逻辑以及上位机控制

基于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有兴趣的可以去刷刷看看(~ ̄▽ ̄)~ 。

  • 18
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值