datetime:2023/11/01 10:06
author:nzb
该项目来源于大佬的动手学ROS2
3.电机控制之正反转实验
前面说到通过控制对应的IO电平变换即可完成对电机正反转的控制,本节我们尝试编写代码,进行实验。
一、新建工程
新建example21_motor_direction_control
二、编写代码
根据第前面硬件控制章节学到的内容可知,控制IO电平只需要使用pinMode
和digitalWrite
相关函数即可。
/**
* @file main.cpp
* @author fishros@foxmail.com
* @brief 电机正反转控制
* @version 0.1
* @date 2022-12-19
*
* @copyright Copyright (c) 2022
*
*/
#include <Arduino.h>
#define AIN1 23 // 电机驱动模块AIN1引脚
#define AIN2 22 // 电机驱动模块AIN2引脚
#define KEY 0 // 按键引脚
int motorStatus = 0; // 电机状态变量,0-3循环变化
void setup()
{
Serial.begin(115200); // 初始化串口通信
pinMode(KEY, INPUT); // 设置按键引脚为输入模式
pinMode(AIN1, OUTPUT); // 设置AIN1引脚为输出模式
pinMode(AIN2, OUTPUT); // 设置AIN2引脚为输出模式
}
void loop()
{
if (digitalRead(KEY) == LOW) // 检测按键是否按下
{
delay(50); // 延迟50ms,以防止误触
if (digitalRead(KEY) == LOW)
{
while (digitalRead(0) == LOW) // 等待按键松开,避免连续按下
;
motorStatus++; // 切换电机状态
motorStatus = motorStatus % 4; // 保持该变量值在0-4之间
}
}
// 根据电机状态切换IO电平
switch (motorStatus)
{
case 0:
Serial.println("AIN1: HIGH, AIN2: LOW"); // 调试信息:AIN1为高电平,AIN2为低电平
digitalWrite(AIN1, HIGH);
digitalWrite(AIN2, LOW);
break;
case 1:
Serial.println("AIN1: LOW, AIN2: HIGH"); // 调试信息:AIN1为低电平,AIN2为高电平
digitalWrite(AIN1, LOW);
digitalWrite(AIN2, HIGH);
break;
case 2:
Serial.println("AIN1: HIGH, AIN2: HIGH"); // 调试信息:AIN1和AIN2均为高电平
digitalWrite(AIN1, HIGH);
digitalWrite(AIN2, HIGH);
break;
case 3:
Serial.println("AIN1: LOW, AIN2: LOW"); // 调试信息:AIN1和AIN2均为低电平
digitalWrite(AIN1, LOW);
digitalWrite(AIN2, LOW);
break;
default:
break;
}
}
代码解释
在setup函数中,通过pinMode函数将KEY、AIN1和AIN2引脚设置为对应的输入输出模式。
在loop函数中,首先通过digitalRead函数检测按键是否按下,如果检测到按键按下,则会将电机状态变量motorStatus加1,然后通过switch语句根据电机状态改变AIN1和AIN2引脚的电平状态。同时,还会通过Serial.println函数将AIN1和AIN2引脚的电平状态输出到串口,方便调试。
三、测试
将代码下载到FishBot主控板上,点击按键,查看轮子转动效果。
你可以发现,当AIN1和AIN2同时为高电平或者同时为低时,电机并不会转动,符合上一节中对H桥的介绍。
四、总结
本节我们成功通过代码验证了上一节电机控制理论,下一节我们尝试通过PWM的占空比控制电机的转速。