Help with stepper motor triggered by HC SR 04 sensor

I am an artist creating an interactive sculpture and this is what I want to happen. When the viewer waves their hand within a specific distance range, an HC SR04 ultra sonic sensor triggers a 28byj-48 stepper motor, which turns 1.5 rotations clockwise, waits 2 seconds, then turns 1.5 rotations counter clockwise then stops. In the sketch listed below, the motor just runs continuously clockwise and when the sensor is triggered, the motor turns counter clockwise, then clockwise continuously (doesn't stop). The motor is not started by the sensor, just the direction is changed. How do I change the sketch to do what I want? Thanks for the help.

#define IN1  8
#define IN2  9
#define IN3  10
#define IN4  11
#define STEPS_PER_ROTATION 4096

const int pingPin = 12;
const int echoPin = 13;
unsigned int duration, inches;


void setup()
{
   
  pinMode(12,OUTPUT);
  pinMode(13,INPUT);
  Serial.begin(9600);
  Serial.println("File From Distance Test");
 
}

void ping()  {
  digitalWrite(pingPin, LOW);        // Ensure pin is low
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);       // Start ranging
  delayMicroseconds(5);              //   with 5 microsecond burst
  digitalWrite(pingPin, LOW);        // End ranging
 
  duration = pulseIn(echoPin, HIGH); // Read echo pulse
  inches = duration / 74 / 2;        // Convert to inches
  Serial.println(inches);            // Display result
  if ((inches>2) && (inches<18)) 
   pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  delay(100);

}



void loop() {
  delay(50);
  ping();
   if ((inches>2) && (inches<18)) 
   
   rotate(1.5);
  delay(2000);
  rotate(-1.5);
  delay(2000);
}

void rotate(float rotations) {
  rotate_steps(rotations * STEPS_PER_ROTATION);
}

int phase = 0;
byte phases[] = { 1, 3, 2, 6, 4, 12, 8, 9 };

void rotate_steps(int steps)
{
  int dir = (steps > 0) - (steps < 0);
  steps *= dir;
  long laststep;
  for (int i = 0; i < steps;) {
    long now = micros();
    if (now - laststep < 1000) continue;
    laststep = now;
    stepper_writepins(phases[phase]);
    phase = (8 + phase + dir) % 8;
    i++;
  }
  stepper_writepins(0);
}

void stepper_writepins(int bitmap) {
    digitalWrite(IN1, bitmap & 8 ? HIGH : LOW);
    digitalWrite(IN2, bitmap & 4 ? HIGH : LOW);
    digitalWrite(IN3, bitmap & 2 ? HIGH : LOW);
    digitalWrite(IN4, bitmap & 1 ? HIGH : LOW);
}

I guess it is here:

   if ((inches>2) && (inches<18))
   
   rotate(1.5);
  delay(2000);
  rotate(-1.5);
  delay(2000);
}

What you probably meant was this:

loop() 
. . .
. . .
   if ((inches>2) && (inches<18)) { 
      rotate(1.5);
      delay(2000);
      rotate(-1.5);
      delay(2000);
   }
. . .
. . .
}

In your earlier code, only the statement rotate(1.5); was conditioned by the if statement.

Thanks for catching that, 6v6 gt! The sketch totally runs now. Here is the finsihed code, for anyone who may need it in the future:

#define IN1  8
#define IN2  9
#define IN3  10
#define IN4  11
#define STEPS_PER_ROTATION 4096

const int pingPin = 12;
const int echoPin = 13;
unsigned int duration, inches;


void setup()
{

  pinMode(12,OUTPUT);
  pinMode(13,INPUT);
  Serial.begin(9600);
  Serial.println("File From Distance Test");

}

void ping()  {
  digitalWrite(pingPin, LOW);        // Ensure pin is low
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);       // Start ranging
  delayMicroseconds(5);              //   with 5 microsecond burst
  digitalWrite(pingPin, LOW);        // End ranging

  duration = pulseIn(echoPin, HIGH); // Read echo pulse
  inches = duration / 74 / 2;        // Convert to inches
  Serial.println(inches);            // Display result
  if ((inches>2) && (inches<18)) 
    pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  delay(100);

}



void loop() {
  delay(50);
  ping();
  if ((inches>2) && (inches<18)) {
    rotate(1.5);
    delay(2000);
    rotate(-1.5);
    delay(2000);
  }
}
  void rotate(float rotations) {
    rotate_steps(rotations * STEPS_PER_ROTATION);
  }

  int phase = 0;
  byte phases[] = { 
    1, 3, 2, 6, 4, 12, 8, 9   };

  void rotate_steps(int steps)
  {
    int dir = (steps > 0) - (steps < 0);
    steps *= dir;
    long laststep;
    for (int i = 0; i < steps;) {
      long now = micros();
      if (now - laststep < 1000) continue;
      laststep = now;
      stepper_writepins(phases[phase]);
      phase = (8 + phase + dir) % 8;
      i++;
    }
    stepper_writepins(0);
  }

  void stepper_writepins(int bitmap) {
    digitalWrite(IN1, bitmap & 8 ? HIGH : LOW);
    digitalWrite(IN2, bitmap & 4 ? HIGH : LOW);
    digitalWrite(IN3, bitmap & 2 ? HIGH : LOW);
    digitalWrite(IN4, bitmap & 1 ? HIGH : LOW);
  }

hi stevewhite

nice project

can you please send me the wiring diagram and items you used in this project.

i am intending of doing much similar for Halloween ghost :slight_smile:

Many Thanks

Masoud