// https://forum.arduino.cc/t/motor-is-stopping-because-of-delays-from-speaker/1420515
int MOTpwm = 3; // PWM motor speed
int MOTdio = 4; // DIO motor enable
int TRIGpin = 6; // HC-SR04 trigger
int ECHOpin = 7; // HC-SR04 ECHOpin
int REDled = 8; // Red LED "danger"
int GRNled = 10; // Green LED "near"
int SPKRpin = 11; // speaker
int stopspeed = 0, minimumspeed = 75, throttle, throttleOld;
float distance, speedratio = .45;
float echotime, echospeed = 58.2;
void setup() {
Serial.begin(115200);
pinMode (ECHOpin, INPUT);
pinMode (TRIGpin, OUTPUT);
pinMode (MOTpwm, OUTPUT);
pinMode (MOTdio, OUTPUT);
pinMode (REDled, OUTPUT);
pinMode (GRNled, OUTPUT);
pinMode (SPKRpin, OUTPUT);
}
void loop() {
// measure distance to wall
digitalWrite(TRIGpin, HIGH); // start transmit
delayMicroseconds(10); // send for 10us
digitalWrite(TRIGpin, LOW); // stop transmit
echotime = pulseIn(ECHOpin, HIGH); // time "stop transmit" to "received echo" in microseconds
distance = echotime / echospeed; // distance centimeters
// calculate motor speed relative to distance
throttle = minimumspeed + (distance * speedratio); // (400 * .45) + 75 = 255
throttle = map(throttle, 75, 255, 1500, 2500);
// display throttle
if (throttle != throttleOld) {
throttleOld = throttle;
Serial.println(throttle);
}
// indicate distance is good
if (distance > 3.0) {
// update motor speed
analogWriteMillisecons(MOTpwm, throttle);
digitalWrite(MOTdio, HIGH);
// indicate "running"
digitalWrite(GRNled, HIGH); // GRN LED
digitalWrite(REDled, LOW);
digitalWrite(SPKRpin, LOW);
}
// stop and indicate distance is minimum
if (distance <= 2.0) {
digitalWrite(MOTdio, LOW); // disable motor
digitalWrite(MOTpwm, stopspeed); // set speed to zero
// indicate "stopping"
digitalWrite(GRNled, LOW);
digitalWrite(REDled, HIGH); // RED LED
digitalWrite(SPKRpin, HIGH);
}
delay(100);
}