ros microros 之 电机控制之正反转实验
前面说到通过控制对应的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的占空比控制电机的转速。