ROS小车底盘3-电机控制
来源:互联网 发布:echart 引入json地图 编辑:程序博客网 时间:2024/04/28 23:07
编码器:
我们把JGA25-371中编码器1的HoutA(黄线)和HoutB(白线) 接 Arduino mega2560的pin2和pin3。
当轮子转动,pin2和pin3引脚就会产生0号和1号中断,每次产生中断,根据轮子转动的方向计数器+1或-1。
我们把JGA25-371中编码器2的HoutA(黄线)和HoutB(白线) 接 Arduino mega2560的pin19和pin18。
对应的中断号是4和5(当然也可节pin21和pin20, 对应的中断2和3)。
代码如下:
encoder_driver.h
long readEncoder(int i);//编码器数值反馈void resetEncoder(int i);//复位编码器,编码器数据清零void resetEncoders();//复位编码器,编码器数据清零void initEncoders();//初始化编码器void encoderRightISR();//编码器中断服务void encoderLeftISR();//编码器中断服务encoder_driver.ino
#include "motor_driver.h"//包含上面的头文件#include "commands.h";//这个头文件目前不清楚/* 编码*/volatile long left_enc_pos = 0L;volatile long right_enc_pos = 0L;int left_rotate = 0;int right_rotate = 0;
//初始化编码器void initEncoders(){ pinMode(2, INPUT); pinMode(3, INPUT); pinMode(19, INPUT); pinMode(18, INPUT); attachInterrupt(0, encoderLeftISR, CHANGE); attachInterrupt(1, encoderLeftISR, CHANGE); attachInterrupt(4, encoderRightISR, CHANGE); attachInterrupt(5, encoderRightISR, CHANGE);}void encoderLeftISR(){ if(direction(LEFT) == BACKWARDS){
left_enc_pos--; }
else{ left_enc_pos++; }}void encoderRightISR(){ if(direction(RIGHT) == BACKWARDS){ right_enc_pos--; }else{ right_enc_pos++; }} long readEncoder(int i) { long encVal = 0L; if (i == LEFT) { noInterrupts(); encVal = left_enc_pos; interrupts(); } else { noInterrupts(); encVal = right_enc_pos; interrupts(); } return encVal; }
电机:
电机通过L298N控制具体接线方式如下:
L298N的ENA接Arduino mega 2560的pin5
L298N的ENB接Arduino mega 2560的pin6
IN1(或A1)和IN2(或A2) 接Arduino mega 2560的pin7和pin8
IN3(或B1)和IN4(或B2) 接Arduino mega 2560的pin9和pin10
通过IN1和IN2控制电机1转动方向(正转或反转), 通过ENA控制其的转速;
通过IN3和IN4控制电机2转动方向(正转或反转), 通过ENB控制其的转速。
代码如下:
motor_driver.c
void initMotorController();//电机控制函数void setMotorSpeed(int i, int spd);//电机速度设置函数void setMotorSpeeds(int leftSpeed, int rightSpeed);//暂定motor_driver.ino
#include "commands.h";// motor oneint enA = 5;int in1 = 7;int in2 = 8;// motor twoint enB = 6;int in3 = 9;int in4 = 10;boolean directionLeft = false;boolean directionRight = false;boolean direction(int i){ if(i == LEFT){ return directionLeft; }else{ return directionRight; }} void initMotorController() { // 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 setMotorSpeed(int i, int spd) { if(spd>MAX_PWM){ spd=MAX_PWM; } if(spd<-MAX_PWM){ spd=-1*MAX_PWM; } if (i == LEFT){ if(spd>=0){ directionLeft = FORWARDS; digitalWrite(in2, HIGH); digitalWrite(in1, LOW); analogWrite(enA, spd); }else if(spd < 0){ directionLeft = BACKWARDS; digitalWrite(in1, HIGH); digitalWrite(in2, LOW); analogWrite(enA, -spd); } } else { if(spd>=0){ directionRight = FORWARDS; digitalWrite(in3, HIGH); digitalWrite(in4, LOW); analogWrite(enB, spd); }else if(spd<0){ directionRight = BACKWARDS; digitalWrite(in4, HIGH); digitalWrite(in3, LOW); analogWrite(enB, -spd); } } } void setMotorSpeeds(int leftSpeed, int rightSpeed) { setMotorSpeed(LEFT, leftSpeed); setMotorSpeed(RIGHT, rightSpeed); }
阅读全文
0 0
- ROS小车底盘3-电机控制
- 基于ROS平台的移动机器人-2-小车底盘控制
- ROS小车底盘5-底层主程序
- 基于ROS平台的移动机器人-3-小车底盘与ROS的通信
- pwm 控制 步进电机 小车
- 电动小车的电机驱动及控制
- 基于ROS平台的移动机器人-1-小车底盘的搭建
- ROS仿真小车python键盘控制测试
- Ubuntu16.04虚拟机+ROS+树莓派控制小车
- ROS中用摇杆控制电机(四个电机转动)
- STM32——小车2个步进电机运动控制
- ROS(11):莓派Raspberry Pi 小车组装,安装电机和超声波
- 控制kobuki底盘(一)
- 控制kobuki底盘(二)
- arduino uno测试小车底盘的简易程序
- 基于ROS平台的移动机器人-4-通过ROS利用键盘控制小车移动
- 寻迹小车 FOLLOWME—— 电机测速及转速控制
- 步进电机作小车驱动
- Macbook pro下面安装Apcahe Tomcat
- 火车票购票系统模拟
- 设计模式C++实现(1)——工厂模式
- springboot系列(二):Apache Shiro安全框架的简单使用
- display:block、inline、inline-block
- ROS小车底盘3-电机控制
- 171115-数组【连续第二十三天】
- 数据的异常处理
- spring入门(一)
- 树莓派玩法入门
- python爬虫环境安装-IDE-pycharm
- MongoDB复制集了解
- 2017ccpc哈尔滨站题解合集
- java常见类(二)String,StringBuffer,StringBuilder