Arduino L293D电机驱动模块四轮驱动程序

Arduino L293D电机驱动模块的库下载了好几个,学不会,研究了一下74HC595和L293D的连接方式,DIY了一个。PWM没写,旋转方向不对的话,调换电机两根接线。


#define RCK 12
#define SCK 4
#define DS 8
#define MR 2
#define OE 7
#define M1PWM 11
#define M2PWM 3
#define M2FORWARD 0X02
#define M2BACKWARD 0X10
#define M1FORWARD 0X04
#define M1BACKWARD 0X08
#define M3FORWARD 0X80
#define M3BACKWARD 0X20
#define M4FORWARD 0X40
#define M4BACKWARD 0X01
#define M4STOP 0XBD
#define M3STOP 0X5F
#define M2STOP 0XEC
#define M1STOP 0XE2
#define GO '1'
#define BACK '2'
#define LEFT '3'
#define RIGHT '4'
#define STOP '0'
unsigned char status;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(RCK,OUTPUT);
  pinMode(SCK,OUTPUT);
  pinMode(DS,OUTPUT);
  pinMode(MR,OUTPUT);
  pinMode(OE,OUTPUT);
  digitalWrite(SCK,LOW);
  digital
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们需要将电机驱动模块和超声波测距模块以及红外循迹模块连接到Arduino Mega2560开发板上。具体的连接方式可以参考各个模块的数据手册。 接下来,我们需要编写代码。代码的主要思路如下: 1. 初始化引脚,包括电机驱动模块的方向控制引脚和调速引脚,超声波测距模块的TrigPin和EchoPin,以及红外循迹模块的引脚。 2. 在循迹模块上使用红外传感器进行检测,判断小车所在的位置,然后根据检测结果控制电机的转向和速度。当小车检测到黑线时,电机应该向前运动,否则应该向左或向右转。 3. 在避障模块上使用超声波传感器进行检测,如果检测到前方有障碍物,则应该停止电机,向左或向右转,直到没有障碍物为止。 下面是示例代码,供您参考: ``` #include <NewPing.h> #define TRIG_PIN 14 #define ECHO_PIN 15 #define LEFT_FRONT_DIR_PIN 6 #define LEFT_FRONT_PWM_PIN 7 #define LEFT_REAR_DIR_PIN 11 #define LEFT_REAR_PWM_PIN 13 #define RIGHT_FRONT_DIR_PIN 4 #define RIGHT_FRONT_PWM_PIN 2 #define RIGHT_REAR_DIR_PIN 9 #define RIGHT_REAR_PWM_PIN 8 #define IR_SENSOR_LEFT_PIN A0 #define IR_SENSOR_LEFT_FRONT_PIN A1 #define IR_SENSOR_CENTER_PIN A2 #define IR_SENSOR_RIGHT_FRONT_PIN A3 #define IR_SENSOR_RIGHT_PIN A4 #define MAX_DISTANCE 200 NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE); void setup() { pinMode(LEFT_FRONT_DIR_PIN, OUTPUT); pinMode(LEFT_FRONT_PWM_PIN, OUTPUT); pinMode(LEFT_REAR_DIR_PIN, OUTPUT); pinMode(LEFT_REAR_PWM_PIN, OUTPUT); pinMode(RIGHT_FRONT_DIR_PIN, OUTPUT); pinMode(RIGHT_FRONT_PWM_PIN, OUTPUT); pinMode(RIGHT_REAR_DIR_PIN, OUTPUT); pinMode(RIGHT_REAR_PWM_PIN, OUTPUT); pinMode(IR_SENSOR_LEFT_PIN, INPUT); pinMode(IR_SENSOR_LEFT_FRONT_PIN, INPUT); pinMode(IR_SENSOR_CENTER_PIN, INPUT); pinMode(IR_SENSOR_RIGHT_FRONT_PIN, INPUT); pinMode(IR_SENSOR_RIGHT_PIN, INPUT); } void loop() { int distance = sonar.ping_cm(); if (distance < 10) { // 出现障碍物 stop(); if (leftClear()) { right(); } else if (rightClear()) { left(); } else { back(); delay(500); left(); } } else { // 没有障碍物 if (onTrack()) { forward(); } else { if (left()) { left(); } else if (right()) { right(); } else { back(); delay(500); left(); } } } } void forward() { digitalWrite(LEFT_FRONT_DIR_PIN, HIGH); analogWrite(LEFT_FRONT_PWM_PIN, 255); digitalWrite(LEFT_REAR_DIR_PIN, HIGH); analogWrite(LEFT_REAR_PWM_PIN, 255); digitalWrite(RIGHT_FRONT_DIR_PIN, HIGH); analogWrite(RIGHT_FRONT_PWM_PIN, 255); digitalWrite(RIGHT_REAR_DIR_PIN, HIGH); analogWrite(RIGHT_REAR_PWM_PIN, 255); } void stop() { digitalWrite(LEFT_FRONT_DIR_PIN, LOW); analogWrite(LEFT_FRONT_PWM_PIN, 0); digitalWrite(LEFT_REAR_DIR_PIN, LOW); analogWrite(LEFT_REAR_PWM_PIN, 0); digitalWrite(RIGHT_FRONT_DIR_PIN, LOW); analogWrite(RIGHT_FRONT_PWM_PIN, 0); digitalWrite(RIGHT_REAR_DIR_PIN, LOW); analogWrite(RIGHT_REAR_PWM_PIN, 0); } void left() { digitalWrite(LEFT_FRONT_DIR_PIN, LOW); analogWrite(LEFT_FRONT_PWM_PIN, 200); digitalWrite(LEFT_REAR_DIR_PIN, LOW); analogWrite(LEFT_REAR_PWM_PIN, 200); digitalWrite(RIGHT_FRONT_DIR_PIN, HIGH); analogWrite(RIGHT_FRONT_PWM_PIN, 200); digitalWrite(RIGHT_REAR_DIR_PIN, HIGH); analogWrite(RIGHT_REAR_PWM_PIN, 200); } void right() { digitalWrite(LEFT_FRONT_DIR_PIN, HIGH); analogWrite(LEFT_FRONT_PWM_PIN, 200); digitalWrite(LEFT_REAR_DIR_PIN, HIGH); analogWrite(LEFT_REAR_PWM_PIN, 200); digitalWrite(RIGHT_FRONT_DIR_PIN, LOW); analogWrite(RIGHT_FRONT_PWM_PIN, 200); digitalWrite(RIGHT_REAR_DIR_PIN, LOW); analogWrite(RIGHT_REAR_PWM_PIN, 200); } void back() { digitalWrite(LEFT_FRONT_DIR_PIN, LOW); analogWrite(LEFT_FRONT_PWM_PIN, 200); digitalWrite(LEFT_REAR_DIR_PIN, LOW); analogWrite(LEFT_REAR_PWM_PIN, 200); digitalWrite(RIGHT_FRONT_DIR_PIN, LOW); analogWrite(RIGHT_FRONT_PWM_PIN, 200); digitalWrite(RIGHT_REAR_DIR_PIN, LOW); analogWrite(RIGHT_REAR_PWM_PIN, 200); } bool onTrack() { return digitalRead(IR_SENSOR_LEFT_PIN) == LOW && digitalRead(IR_SENSOR_LEFT_FRONT_PIN) == LOW && digitalRead(IR_SENSOR_CENTER_PIN) == LOW && digitalRead(IR_SENSOR_RIGHT_FRONT_PIN) == LOW && digitalRead(IR_SENSOR_RIGHT_PIN) == LOW; } bool leftClear() { return digitalRead(IR_SENSOR_LEFT_PIN) == HIGH && digitalRead(IR_SENSOR_LEFT_FRONT_PIN) == HIGH; } bool rightClear() { return digitalRead(IR_SENSOR_RIGHT_PIN) == HIGH && digitalRead(IR_SENSOR_RIGHT_FRONT_PIN) == HIGH; } ``` 请注意,这只是示例代码,您可能需要进行一些调整才能使它适合您的具体应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值