Arduino Polska Forum
Silnik krokowy+fotorezystor - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Ogólna elektronika (https://forum.arduinopolska.pl/dzial-og%C3%B3lna-elektronika)
+--- Wątek: Silnik krokowy+fotorezystor (/watek-silnik-krokowy-fotorezystor)



Silnik krokowy+fotorezystor - Patrycja - 26-04-2021

Cześć wszystkim,
mam drobny problem z tworzeniem kodu, zatrzymałam się na pewnym etapie i zupełnie nie wiem jak ruszyć dalej. Mój silnik (28BYJ-48 + sterownik ULN2003 V2) wykonuje obroty zarówno w jedną jak i w drugą stronę, zależnie od wartości światła (wykorzystuje do tego fotorezystor). Chciałabym jednak aby silnik wykonywał wyznaczoną przeze mnie ilość kroków po czym czekał na zmianę wartości światła i dopiero wtedy ruszał w drugą stronę. Przy aktualnym kodzie silnik tak jak powinien reaguje na zmianę wartości światła, jednak jeśli dojdzie do wyznaczonej przeze mnie ilości kroków całkowicie wstrzymuje swoje działanie i nawet po przysłonieniu fotorezystora nie wykonuje żadnych interakcji.
KOD:

#define STEPPER_PIN_1 9
#define STEPPER_PIN_2 10
#define STEPPER_PIN_3 11
#define STEPPER_PIN_4 12


int step_number = 0;
int fotorezystor = A0;
int wartosc= 0;
int krok=0;
int stepCount = 0;
void setup() {
  Serial.begin(9600);
pinMode(STEPPER_PIN_1, OUTPUT);
pinMode(STEPPER_PIN_2, OUTPUT);
pinMode(STEPPER_PIN_3, OUTPUT);
pinMode(STEPPER_PIN_4, OUTPUT);

}

void loop() {

    int wartosc = analogRead(fotorezystor);
 
 Serial.print("krok:");
  Serial.println(krok);
if(wartosc>100){
krok++;
  OneStep(false);
    delay(4);
    do{  
    OneStop(false);
     if(wartosc>100) continue;}while (krok==500);
   
}
 
  if(wartosc<100){
  krok--;
 
  OneStep(true);
  delay(4);
do{  
  OneStop(true);
   if(wartosc>100) continue;}while (krok==200);
 
}}


void OneStep(bool dir){
    if(dir){
switch(step_number){
  case 0:
  digitalWrite(STEPPER_PIN_1, HIGH);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, LOW);
  break;
  case 1:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, HIGH);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, LOW);
  break;
  case 2:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, HIGH);
  digitalWrite(STEPPER_PIN_4, LOW);
  break;
  case 3:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, HIGH);
  break;
 
}
  }else{
    switch(step_number){
  case 0:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, HIGH);
  break;
  case 1:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, HIGH);
  digitalWrite(STEPPER_PIN_4, LOW);
  break;
  case 2:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, HIGH);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, LOW);
  break;
  case 3:
  digitalWrite(STEPPER_PIN_1, HIGH);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, LOW);
}

 }}
 
  void OneStop (bool dir){
if (dir){
    switch(step_number){
 case 0:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, LOW);
  break;  
  case 1:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, LOW);
  break;    
  case 2:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, LOW);
  break;  
  case 3:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, LOW);
  break;


}
}
 
   

step_number++;
  if(step_number > 3){
 
    step_number = 0;
       
 
 
}}


RE: Silnik krokowy+fotorezystor - Jarewa0606 - 26-04-2021

masz zle podejście albo użyj biblioteki stepper i raczej na pewno https://www.arduino.cc/en/reference/stepper

Lub sam napisać obsługę timera


RE: Silnik krokowy+fotorezystor - Patrycja - 27-04-2021

(26-04-2021, 21:27)Jarewa0606 napisał(a): masz zle podejście albo użyj biblioteki stepper i raczej na pewno  https://www.arduino.cc/en/reference/stepper

Lub sam napisać obsługę timera
właśnie używając biblioteki i przykładów które są już tam zawarte, arduino nie czyta mi polecenia kręcenia silnikiem w drugą stronę. 
Mam tu na myśli takie polecenie:


void loop() {
  // step one revolution  in one direction:
  Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
  delay(500);

  // step one revolution in the other direction:
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution);
  delay(500);

silnik kręci się w jedną stronę, a w momencie gdy powinien zmieniać swój kierunek, to po prostu się stopuje, tak jakby nie czyta "-". W czym może leżeć problem ?


RE: Silnik krokowy+fotorezystor - Robson Kerman - 27-04-2021

Wyrzuć zmienną wartość na serial i powiedz, co pokaże po zasłonięciu fotorezystora.