На этом уроке мы используем для управления двигателем микросхему-драйвер L293D.
На этом уроке мы используем для управления двигателем микросхему-драйвер L293D.
Будем использовать выводы платы Uno следующим образом: вывод A0 для считывания положения потенциометра; D9 и D10 для контроля направления вращения двигателя; D11 для генерации ШИМ сигнала, который будет изменять скорость вращения двигателя.
Теперь напишем код для управления частотой вращения и направлением вращения двигателя с помощью роторного потенциометра. Когда потенциометр находится в среднем положении, скорость двигателя будет минимальной, а при изменении его положения, скорость будет увеличиваться. Кроме того, если потенциометр отклоняется от среднего положения по часовой стрелке или против часовой стрелки, направление вращения двигателя будет изменяться.
int in1Pin = 10; int in2Pin = 9; int enable1Pin = 11; boolean rotationDir; int rotationSpeed; void setup() { pinMode(in1Pin, OUTPUT); pinMode(in2Pin, OUTPUT); pinMode(enable1Pin, OUTPUT); } void loop() { int potenVal = analogRead(A0); rotationSpeed = potenVal - 512; if (potenVal > 512) { rotationDir = true; } else { rotationDir = false; } rotationSpeed = abs(potenVal - 512); driveMotor(rotationDir,map(rotationSpeed, 0, 512, 0, 255)); } void driveMotor(boolean dir, int spd) { // Control motor rotation direction if (rotationDir) { digitalWrite(in1Pin, HIGH); digitalWrite(in2Pin, LOW); } else { digitalWrite(in1Pin, LOW); digitalWrite(in2Pin, HIGH); } // Control motor rotation speed analogWrite(enable1Pin, constrain(spd, 0, 255)); }
Функция driveMotor() контролирует направление вращения двигателя и его скорость.
void driveMotor(boolean dir, int spd) { // Control motor rotation direction if (rotationDir) { digitalWrite(in1Pin, HIGH); digitalWrite(in2Pin, LOW); } else { digitalWrite(in1Pin, LOW); digitalWrite(in2Pin, HIGH); } // Control motor rotation speed analogWrite(enable1Pin, constrain(spd, 0, 255)); }
В функции loop() мы отслеживаем положение роторного потенциометра и меняем скорость вращения двигателя в зависимости от его положения.
void loop() { int potenVal = analogRead(A0); rotationSpeed = potenVal - 512; if (potenVal > 512) { rotationDir = true; } else { rotationDir = false; } rotationSpeed = abs(potenVal - 512); driveMotor(rotationDir, map(rotationSpeed, 0, 512, 0, 255)); }
Функция abs() вычисляет абсолютное значение числа.
Скомпилируйте и загрузите скетч на плату. Далее, меняя положение потенциометра, вы сможете регулировать скорость вращения двигателя.