Остановка мотора с помощью фотодатчика

Kilevra
Offline
Зарегистрирован: 04.05.2016
 
Помогите с кодом, в программировании С полный ноль... 
 
Есть шаговый 28BYJ-48, 1 кнопка, 3 led, 1 потенциометрб, 1 оптический датчик
Нашел в сети код для мотора и немного исправил под себя...
Алгаритм работы проекта: мотор крутился с заданной скоростью по часовой и горит 1-й led, затем при нажатии кнопки и отпускании мотор крутится против часовой стрелки и загорается 2-й led 1-й гаснет, если фотодатчик перекрывается то двигатель должен останавливаться + загораться led и ждать нажатия кнопки
не могу понять куда надо функцию вставлять и какую для остановки двигателя... 
сделал только индикацию перекрытия фотодатчика((( а остановку мотора так и не понял как...
 
 
[code]
/*
Arduino Шаговый двигатель 28BYJ-48 – 5V Stepper Motor
*/
// красный +5V не использовал.
// declare variables for the motor pins
int motorPin1 = 8; // Blue / Синий - 28BYJ48 pin 1
int motorPin2 = 9; // Pink / Розовый - 28BYJ48 pin 2
int motorPin3 = 10; // Yellow / Желтый - 28BYJ48 pin 3
int motorPin4 = 11; // Orange / Оранжевый - 28BYJ48 pin 4
int buttonPin = 3; // кнопку подключаем к Pin 3.
boolean q; // фиксируем нажатие на кнопку.
 
// установить скорость шагового двигателя.
// variable to set stepper speed.
const int led_G = 2;
const int led_R = 4;
 
int motorSpeed = 1200;
int lookup[8] = {
  B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001
};
 
/////////////////////////////////////////////////////////////////
 
void setup() {
  pinMode(6, OUTPUT);//LED
  pinMode(5, INPUT_PULLUP); //ОПТОПАРА
 
  // declare the motor pins as outputs.
 
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
 
  pinMode(led_G, OUTPUT);
  pinMode(led_R, OUTPUT);
 
  // Одна нога кнопки подключается к GND, другая к Pin № 12
  // (никаких внешних резисторов не нужно).
 
  pinMode(buttonPin, INPUT);
  digitalWrite(buttonPin, HIGH);
  Serial.begin(9600);
 
}
void loop() {
 
  // переменный резистор, крутим резистор меняем скорость вращения.
  // раскомментируйте две строки.
  int VariableResistor = analogRead(A0);
  motorSpeed = map(VariableResistor, 0, 1023, 10000, 1200);
 
  if (digitalRead(buttonPin) == HIGH) // если кнопка нажата.
  {
    q = !q; // меняем значение q на противоположное 0 на 1 или 1 на 0.
    delay(500); // защита от дребезга кнопки.
    digitalWrite(led_R, q); //загарается светодиод
 
  }
  if (q == 1)anticlockwise(); // крутим влево.
  else clockwise(); // крутим вправо.
  digitalWrite(led_G, !q); //загарается другой светодиод
 
  //датчик - оптопара
  if (digitalRead(5) == HIGH) digitalWrite(6, HIGH);
  else digitalWrite(6, LOW);
 
}
 
// --------------------------------
//set pins to ULN2003 high in sequence from 1 to 4
//delay "motorSpeed" between each pin setting (to determine speed)
// функция поворачивает мотор против часовой стрелки.
void anticlockwise()
{
  for (int i = 0; i < 8; i++)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}
 
// функция поворачивает мотор по часовой стрелке.
void clockwise()
{
  for (int i = 7; i >= 0; i--)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}
void setOutput(int out)
{
  digitalWrite(motorPin1, bitRead(lookup[out], 0));
  digitalWrite(motorPin2, bitRead(lookup[out], 1));
  digitalWrite(motorPin3, bitRead(lookup[out], 2));
  digitalWrite(motorPin4, bitRead(lookup[out], 3));
}
[/code]
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Прочитайте и перепостите код - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

Kilevra
Offline
Зарегистрирован: 04.05.2016
Помогите с кодом, в программировании С полный ноль... 
 
Есть шаговый 28BYJ-48, 1 кнопка, 3 led, 1 потенциометрб, 1 оптический датчик
Нашел в сети код для мотора и немного исправил под себя...
Алгаритм работы проекта: мотор крутился с заданной скоростью по часовой и горит 1-й led, затем при нажатии кнопки и отпускании мотор крутится против часовой стрелки и загорается 2-й led 1-й гаснет, если фотодатчик перекрывается то двигатель должен останавливаться + загораться led и ждать нажатия кнопки
не могу понять куда надо функцию вставлять и какую для остановки двигателя... 
сделал только индикацию перекрытия фотодатчика((( а остановку мотора так и не понял как...
 
 

/*
Arduino Шаговый двигатель 28BYJ-48 – 5V Stepper Motor
*/
// красный +5V не использовал.
// declare variables for the motor pins
int motorPin1 = 8; // Blue / Синий - 28BYJ48 pin 1
int motorPin2 = 9; // Pink / Розовый - 28BYJ48 pin 2
int motorPin3 = 10; // Yellow / Желтый - 28BYJ48 pin 3
int motorPin4 = 11; // Orange / Оранжевый - 28BYJ48 pin 4
int buttonPin = 3; // кнопку подключаем к Pin 3.
boolean q; // фиксируем нажатие на кнопку.

// установить скорость шагового двигателя.
// variable to set stepper speed.
const int led_G = 2;
const int led_R = 4;

int motorSpeed = 1200;
int lookup[8] = {
  B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001
};

/////////////////////////////////////////////////////////////////

void setup() {
  pinMode(6, OUTPUT);//LED
  pinMode(5, INPUT_PULLUP); //ОПТОПАРА

  // declare the motor pins as outputs.

  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);

  pinMode(led_G, OUTPUT);
  pinMode(led_R, OUTPUT);

  // Одна нога кнопки подключается к GND, другая к Pin № 12
  // (никаких внешних резисторов не нужно).

  pinMode(buttonPin, INPUT);
  digitalWrite(buttonPin, HIGH);
  Serial.begin(9600);

}
void loop() {

  // переменный резистор, крутим резистор меняем скорость вращения.
  // раскомментируйте две строки.
  int VariableResistor = analogRead(A0);
  motorSpeed = map(VariableResistor, 0, 1023, 10000, 1200);

  if (digitalRead(buttonPin) == HIGH) // если кнопка нажата.
  {
    q = !q; // меняем значение q на противоположное 0 на 1 или 1 на 0.
    delay(500); // защита от дребезга кнопки.
    digitalWrite(led_R, q); //загарается светодиод

  }
  if (q == 1)anticlockwise(); // крутим влево.
  else clockwise(); // крутим вправо.
  digitalWrite(led_G, !q); //загарается другой светодиод

  //датчик - оптопара
  if (digitalRead(5) == HIGH) digitalWrite(6, HIGH);
  else digitalWrite(6, LOW);

}

// --------------------------------
//set pins to ULN2003 high in sequence from 1 to 4
//delay "motorSpeed" between each pin setting (to determine speed)
// функция поворачивает мотор против часовой стрелки.
void anticlockwise()
{
  for (int i = 0; i < 8; i++)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}

// функция поворачивает мотор по часовой стрелке.
void clockwise()
{
  for (int i = 7; i >= 0; i--)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}
void setOutput(int out)
{
  digitalWrite(motorPin1, bitRead(lookup[out], 0));
  digitalWrite(motorPin2, bitRead(lookup[out], 1));
  digitalWrite(motorPin3, bitRead(lookup[out], 2));
  digitalWrite(motorPin4, bitRead(lookup[out], 3));
}

 

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
/*
  Arduino Шаговый двигатель 28BYJ-48 – 5V Stepper Motor
*/
// красный +5V не использовал.
// declare variables for the motor pins
const byte motorPin1 = 8; // Blue / Синий - 28BYJ48 pin 1
const byte  motorPin2 = 9; // Pink / Розовый - 28BYJ48 pin 2
const byte  motorPin3 = 10; // Yellow / Желтый - 28BYJ48 pin 3
const byte  motorPin4 = 11; // Orange / Оранжевый - 28BYJ48 pin 4
const byte  buttonPin = 3;  // кнопку подключаем к Pin 3.
const byte  sensorPin = 5;  // выход фотодатчика подключаем к Pin 5.
const byte  PotPin = A0;    // выход переменного резистора подключаем к Pin A0.const byte led_G = 2;
const byte led_R = 4;
const byte led_Stop = 6;
// установить скорость шагового двигателя.
int motorSpeed = 1200;
boolean q; // фиксируем нажатие на кнопку.
const byte lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

/////////////////////////////////////////////////////////////////

void setup()
{
  pinMode(led_Stop, OUTPUT);//LED
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  pinMode(led_G, OUTPUT);
  pinMode(led_R, OUTPUT);
  // Одна нога кнопки подключается к GND, другая к Pin № 12
  // (никаких внешних резисторов не нужно).
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(sensorPin, INPUT_PULLUP); //ОПТОПАРА
  Serial.begin(9600);
}

void loop()
{
  // переменный резистор, крутим резистор меняем скорость вращения.
  int VariableResistor = analogRead(PotPin);
  motorSpeed = map(VariableResistor, 0, 1023, 10000, 1200);

  if (motorEnable()) // проверяем фотодатчик. Если он возвращает "запрещено", то остальное игнорим
  {
    if (digitalRead(buttonPin) == HIGH) // если кнопка нажата.
    {
      q = !q; // меняем значение q на противоположное 0 на 1 или 1 на 0.
      delay(250); // защита от дребезга кнопки.
      digitalWrite(led_R, q); //загарается светодиод

    }
    if (q == 1)anticlockwise(); // крутим влево.
    else clockwise(); // крутим вправо.
    digitalWrite(led_G, !q); //загарается другой светодиод
  }
}

// --------------------------------
//set pins to ULN2003 high in sequence from 1 to 4
//delay "motorSpeed" between each pin setting (to determine speed)
// функция поворачивает мотор против часовой стрелки.
void anticlockwise()
{
  for (int i = 0; i < 8; i++)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}

// функция поворачивает мотор по часовой стрелке.
void clockwise()
{
  for (int i = 7; i >= 0; i--)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}
void setOutput(int out)
{
  digitalWrite(motorPin1, bitRead(lookup[out], 0));
  digitalWrite(motorPin2, bitRead(lookup[out], 1));
  digitalWrite(motorPin3, bitRead(lookup[out], 2));
  digitalWrite(motorPin4, bitRead(lookup[out], 3));
}

// функция чтения фотодатчика. Возвращает "true" (разрешено) или "false" (запрещено)
boolean motorEnable()
{
  if (digitalRead(sensorPin) == HIGH) // датчик сработал (есть препятствие)
  {
    digitalWrite(led_Stop, HIGH);     // включаем LED "авария"
    setOutput(B00000);                // принудительно тормозим движок
    digitalWrite(led_R, LOW);         // принудительно гасим остальную индикацию
    digitalWrite(led_G, LOW);
    return false;                     // ставим флаг "запрещено"
  }
  else
  {
    digitalWrite(led_Stop, LOW);
    return true;                      // ставим флаг "разрешено"
  }
}

 

Kilevra
Offline
Зарегистрирован: 04.05.2016

Спасибо большое! 
Сейчас не могу проверить, все эксперименты на работе делаю. Завтра проверю с самого утра и отпишусь)))

 

 

Kilevra
Offline
Зарегистрирован: 04.05.2016

Код рабочий, все работает как я хотел!
1 момент, при работе мотора "влево" после перекрытия фотодатчика мотор останавливается, а когда щелевой датчик освобождается - мотор крутится, но led не загорается. Сделал так:

{
    digitalWrite(led_Stop, LOW);
    digitalWrite(led_R, q); //загарается другой светодиод
    return true;                      // ставим флаг "разрешено"
  }

Спосибо за помощь.

 

Kilevra
Offline
Зарегистрирован: 04.05.2016

Решил немного усложнить задачу. Кнопка которая меняла направление вращения мотора должна ещё и вкл/ вык мотор.
Сдается мне что кнопка с режимами то что надо, вот только запутался, из-за переменной "boolean q" не могу функцию построить для режимов.
От "boolean motorEnable()" надо отказаться я так понимаю, и функций  должно быть уже 3? 

1-я функция- ничего не работает 
2-я функцияработает в право
3-я функцияработает в лево

Поправте если вообще не туда смотрю.
Последний код не рабочий (я извращался), нужны советы по изменению текущего кода.
 

З.ы.: Интересно, но сложно мне пока, функции, переменные, параметры, вместо параметров др. функции, операторы, и т.д. ... Сложно, стараюсь читать по мере возможности в справочнике, но пока туманно, всё запутанно)  но интересно!
С уважением, Kilevra. 
Спасибо.

/*
  Arduino Шаговый двигатель 28BYJ-48 – 5V Stepper Motor
*/
// красный +5V не использовал.
// declare variables for the motor pins
const byte motorPin1 = 8; // Blue / Синий - 28BYJ48 pin 1
const byte  motorPin2 = 9; // Pink / Розовый - 28BYJ48 pin 2
const byte  motorPin3 = 10; // Yellow / Желтый - 28BYJ48 pin 3
const byte  motorPin4 = 11; // Orange / Оранжевый - 28BYJ48 pin 4
const byte  buttonPin = 3;  // кнопку подключаем к Pin 3.
const byte  sensorPin = 5;  // выход фотодатчика подключаем к Pin 5.
const byte  PotPin = A0;    // выход переменного резистора подключаем к Pin A0.const byte led_G = 2;
const byte led_R = 4;
const byte led_G = 2;
const byte led_Stop = 6;

int flag = 0; // флаг состояния
int regim = 0; // переключение режимов

// установить скорость шагового двигателя.
int motorSpeed = 1200;
boolean q; // фиксируем нажатие на кнопку.
const byte lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

/////////////////////////////////////////////////////////////////

void setup()
{
  pinMode(led_Stop, OUTPUT);//LED
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  pinMode(led_G, OUTPUT);
  pinMode(led_R, OUTPUT);
  
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(sensorPin, INPUT_PULLUP); //ОПТОПАРА
  Serial.begin(9600);
}

void loop()
{
  // переменный резистор, крутим резистор меняем скорость вращения.
  int VariableResistor = analogRead(PotPin);
  motorSpeed = map(VariableResistor, 0, 1023, 10000, 1200);

  if (motorEnable()) // проверяем фотодатчик. Если он возвращает "запрещено", то остальное игнорим
  {
    if (digitalRead(buttonPin) == HIGH && flag == 0) // если кнопка нажата.
    {
      regim ++;
      flag = 1;
        if(regim > 2) // Если номер режима превышает требуемого
          { // то отсчет начинается с нуля
          regim = 0;}
      
      
      q = !q; // меняем значение q на противоположное 0 на 1 или 1 на 0.
      delay(250); // защита от дребезга кнопки.
      digitalWrite(led_R, q); //загарается светодиод

    }
    if (q == 1)anticlockwise(); // крутим влево.
    else clockwise(); // крутим вправо.
    digitalWrite(led_G, !q); //загарается другой светодиод
  }
  // РЕЖИМ 0
  if(regim == 0)
  {      
  if(digitalRead(buttonPin) == LOW && flag == 1)
  {
  flag = 0;
  }  
  } 
  // РЕЖИМ 1
  if(regim == 1)
  {
  anticlockwise(); // крутим влево.
  digitalWrite(led_R, q); //загарается светодиод
  }
  // РЕЖИМ 2
  if(regim == 2)
  {
  clockwise(); // крутим вправо.
  digitalWrite(led_G, !q); //загарается другой светодиод
  }
}

// --------------------------------
//set pins to ULN2003 high in sequence from 1 to 4
//delay "motorSpeed" between each pin setting (to determine speed)
// функция поворачивает мотор против часовой стрелки.
void anticlockwise()
{
  for (int i = 0; i < 8; i++)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}

// функция поворачивает мотор по часовой стрелке.
void clockwise()
{
  for (int i = 7; i >= 0; i--)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}
void setOutput(int out)
{
  digitalWrite(motorPin1, bitRead(lookup[out], 0));
  digitalWrite(motorPin2, bitRead(lookup[out], 1));
  digitalWrite(motorPin3, bitRead(lookup[out], 2));
  digitalWrite(motorPin4, bitRead(lookup[out], 3));
}

// функция чтения фотодатчика. Возвращает "true" (разрешено) или "false" (запрещено)
boolean motorEnable()
{
  if (digitalRead(sensorPin) == HIGH) // датчик сработал (есть препятствие)
  {
    digitalWrite(led_Stop, HIGH);     // включаем LED "авария"
    setOutput(B00000);                // принудительно тормозим движок
    digitalWrite(led_R, LOW);         // принудительно гасим остальную индикацию
    digitalWrite(led_G, LOW);
    return false;                     // ставим флаг "запрещено"
  }
  else
  {
    digitalWrite(led_Stop, LOW);
    digitalWrite(led_R, q); //загарается другой светодиод
    return true;                      // ставим флаг "разрешено"
  }
}

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Kilevra пишет:
От "boolean motorEnable()" надо отказаться я так понимаю, и функций  должно быть уже 3? 

неважно сколько функций, важно сколько всего возможных состояний у системы, дальше легко расписать по функциям.

От motorEnable() не надо отказываться, ведь это основное в данной системе - блокировка вращения мотора.

Kilevra
Offline
Зарегистрирован: 04.05.2016

Решил отказаться от "boolean q"

Режимы кнопки работают:
1-й мотор остановлен
2-й мотор крутит по часовой
3-й мотор крутит против часовой
Но перестал работать фото -датчик  (точнее - перестал останавливать мотор), а LED при перекрытии датчика загорается, почемуто функция "motorEnable()"не срабатывает правильно.
LED, кстати последний горит - не зависимо куда вращается мотор или выключен, но если перекрыть датчик, LED снова сбрасывает значение на defolt

 Прошу совета, и работы над ошибками как победить, сенсор очень нужен)

 

/*
  Arduino Шаговый двигатель 28BYJ-48 – 5V Stepper Motor
*/
// красный +5V не использовал.
// declare variables for the motor pins
const byte motorPin1 = 8; // Blue / Синий - 28BYJ48 pin 1
const byte  motorPin2 = 9; // Pink / Розовый - 28BYJ48 pin 2
const byte  motorPin3 = 10; // Yellow / Желтый - 28BYJ48 pin 3
const byte  motorPin4 = 11; // Orange / Оранжевый - 28BYJ48 pin 4
const byte  buttonPin = 3;  // кнопку подключаем к Pin 3.
const byte  sensorPin = 5;  // выход фотодатчика подключаем к Pin 5.
const byte  PotPin = A0;    // выход переменного резистора подключаем к Pin A0.const byte led_G = 2;
const byte led_R = 4;
const byte led_Stop = 6;
const byte led_G = 2;
// установить скорость шагового двигателя.
int motorSpeed = 1200;

int flag = 0; // флаг состояния
int regim = 0; // Переключалка

const byte lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

/////////////////////////////////////////////////////////////////

void setup()
{
  pinMode(led_Stop, OUTPUT);//LED
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  pinMode(led_G, OUTPUT);
  pinMode(led_R, OUTPUT);
  // Одна нога кнопки подключается к GND, другая к Pin № 3
  // (никаких внешних резисторов не нужно).
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(sensorPin, INPUT_PULLUP); //ОПТОПАРА
  Serial.begin(9600);
}

void loop()
{
  // переменный резистор, крутим резистор меняем скорость вращения.
  int VariableResistor = analogRead(PotPin);
  motorSpeed = map(VariableResistor, 0, 1023, 10000, 1200);

  if (motorEnable()) // проверяем фотодатчик. Если он возвращает "запрещено", то остальное игнорим
  {
    if (digitalRead(buttonPin) == HIGH && flag == 0) 
    {
      regim ++;
      flag = 1;
      delay(350); // защита от дребезга кнопки.
        if(regim > 2) // Если номер режима превышает требуемого
          { // то отсчет начинается с нуля
          regim = 0;
          }
    }

    if (digitalRead(buttonPin) == LOW && flag == 1)
    {
    flag = 0;
    } 
   }
   
   // ======= Вполняем задачу при выборе режима =======
        // РЕЖИМ 0: OFF
        if(regim == 0)
        {
        setOutput(B00000); // принудительно тормозим движок
        }
        
        // РЕЖИМ 1: по часовой
        if(regim == 1)
        {
        clockwise();
        digitalWrite(led_G, HIGH);
        }
        
        // РЕЖИМ 2: против часовой 
        if(regim == 2)
        {
        anticlockwise();
        digitalWrite(led_R, HIGH);
        }
}

// --------------------------------
//set pins to ULN2003 high in sequence from 1 to 4
//delay "motorSpeed" between each pin setting (to determine speed)
// функция поворачивает мотор против часовой стрелки.
void anticlockwise()
{
  for (int i = 0; i < 8; i++)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}

// функция поворачивает мотор по часовой стрелке.
void clockwise()
{
  for (int i = 7; i >= 0; i--)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}
void setOutput(int out)
{
  digitalWrite(motorPin1, bitRead(lookup[out], 0));
  digitalWrite(motorPin2, bitRead(lookup[out], 1));
  digitalWrite(motorPin3, bitRead(lookup[out], 2));
  digitalWrite(motorPin4, bitRead(lookup[out], 3));
}

// функция чтения фотодатчика. Возвращает "true" (разрешено) или "false" (запрещено)
boolean motorEnable()
{
  if (digitalRead(sensorPin) == HIGH) // датчик сработал (есть препятствие)
  {
    digitalWrite(led_Stop, HIGH);     // включаем LED "авария"
    setOutput(B00000);                // принудительно тормозим движок
    digitalWrite(led_R, LOW);         // принудительно гасим остальную индикацию
    digitalWrite(led_G, LOW);
    return false;                     // ставим флаг "запрещено"
  }
  else
  {
    digitalWrite(led_Stop, LOW);
    return true;                      // ставим флаг "разрешено"
  }
}

 

 

 

 

Kilevra
Offline
Зарегистрирован: 04.05.2016

Нашел причину почему датчик не срабатывал ...
Нужно было функции с режимами кнопки вложить в функцию "motorEnable()", до этого они в "void loop()" были.
Только проблема с LED осталась, последний LED так и продолжает постоянно гореть пока датчик его не сбросит, я так понимаю потому что явно указан пин. Через переменную надо както-то сделать включение LED, -помаракую на досуге :)

 

 

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

/*
  Arduino Шаговый двигатель 28BYJ-48 – 5V Stepper Motor
*/
// красный +5V не использовал.
// declare variables for the motor pins
const byte motorPin1 = 8;   // Blue / Синий - 28BYJ48 pin 1
const byte motorPin2 = 9;   // Pink / Розовый - 28BYJ48 pin 2
const byte motorPin3 = 10;  // Yellow / Желтый - 28BYJ48 pin 3
const byte motorPin4 = 11;  // Orange / Оранжевый - 28BYJ48 pin 4
const byte buttonPin = 3;   // кнопку подключаем к Pin 3.
const byte sensorPin = 5;   // выход фотодатчика подключаем к Pin 5.
const byte PotPin = A0;     // выход переменного резистора подключаем к Pin A0.const byte led_G = 2;
const byte led_R = 4;
const byte led_Stop = 6;
const byte led_G = 2;
int motorSpeed = 1200;      // установить скорость шагового двигателя.
enum {STOP, LEFT, RIGHT};   // возможные состояния системы
byte regim[4] = {STOP, LEFT, STOP, RIGHT}; // последовательность переключения режимов работы
byte currentMode;           // переменная для хранения текущего режима работы

const byte lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

/////////////////////////////////////////////////////////////////

void setup()
{
  pinMode(led_Stop, OUTPUT);//LED
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  pinMode(led_G, OUTPUT);
  pinMode(led_R, OUTPUT);
  // Одна нога кнопки подключается к GND, другая к Pin № 3
  // (никаких внешних резисторов не нужно).
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(sensorPin, INPUT_PULLUP); //ОПТОПАРА
  Serial.begin(9600);
}


void loop()
{
  setMotorSpeed();                    // задаем скорость мотора с переменного резистора
  checkButton();                      // читаем состояние кнопки
  switch (regim[currentMode])         // смотрим текущий режим работы
  {
    case STOP:
      {
        setOutput(B00000);            // тормозим движок
        digitalWrite(led_R, LOW);     // гасим индикаторы направления
        digitalWrite(led_G, LOW);
      }
      break;

    case LEFT:
      {
        digitalWrite(led_G, HIGH);
        if (checkSensor() == true) clockwise(); // если разрешено, то крутим по часовой
      }
      break;

    case RIGHT:
      {
        digitalWrite(led_R, HIGH);
        if (checkSensor() == true) anticlockwise(); // если разрешено, то крутим против часовой
      }
      break;
  }
} // конец loop


// Обработчик кнопки. При нажатии перевключает режим по алгоритму: Stop --> Left --> Stop --> Right
void checkButton()
{
  if (digitalRead(buttonPin) == HIGH) // если кнопка нажата
  {
    if (currentMode < RIGHT) currentMode++; // переключаемся на следующий режим
    else currentMode = STOP;
    delay(100); // защита от дребезга кнопки.
  }
}


// функция чтения фотодатчика. При перекрытии останавливает движок, НЕ МЕНЯЯ текущего направления движения
boolean checkSensor()
{
  if (digitalRead(sensorPin) == HIGH) // датчик сработал (есть препятствие)
  {
    digitalWrite(led_Stop, HIGH);     // включаем LED "авария"
    setOutput(B00000);                // принудительно тормозим движок
    return false;                     // ставим флаг "запрещено"
  }
  else
  {
    digitalWrite(led_Stop, LOW);
    return true;                      // ставим флаг "разрешено"
  }
}


// задаем скорость вращения мотора с переменного резистора
void setMotorSpeed()
{
  int VariableResistor = analogRead(PotPin);
  motorSpeed = map(VariableResistor, 0, 1023, 10000, 1200);
}


// функция поворачивает мотор против часовой стрелки.
void anticlockwise()
{
  for (int i = 0; i < 8; i++)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}


// функция поворачивает мотор по часовой стрелке.
void clockwise()
{
  for (int i = 7; i >= 0; i--)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}


void setOutput(int out)
{
  digitalWrite(motorPin1, bitRead(lookup[out], 0));
  digitalWrite(motorPin2, bitRead(lookup[out], 1));
  digitalWrite(motorPin3, bitRead(lookup[out], 2));
  digitalWrite(motorPin4, bitRead(lookup[out], 3));
}
Kilevra
Offline
Зарегистрирован: 04.05.2016

Tomasina,

Завтра обязательно проверю Ваш код. Я так понял, вариантов реализации проекта очень много, нужно только знать язык программирования))) Спасибо, что пишете коментарии к коду который переделали, очень помогает.

Буду вникать на праздниках.
Спасибо за помощь и подсказки. С наступающим праздником ПОБЕДЫ!