encoderli motor counter
  • Arkadaşlar elimde kare dalga oluşturan motorlar var ve ben bu tuşlar ile motorları çeviriyorum belirli bir turda kayıt edip tekrar başka bir tuşla aynı tur sayısına gelmesini istiyorum ama while içine girince sayım yapmıyor.Yardımcı olabilir misiniz?

    #include < EEPROM.h>

    volatile int IRQcount1 = 0;
    volatile int IRQcount2 = 0 ;

    boolean moto1_direction = false;
    boolean moto1_effect = true ;

    boolean motor2_direction = false ;
    boolean moto2_effect = true ;


    int pin2 = 3; //interrupt pins
    int pin1 = 2; //interrupt pins
    int motor_position[4]; //in here each array part represent each motor
    int user1_m1= 0;
    int user1_m2= 0; // motor1--> motor_position[0] ex
    // motor1--> motor_position[0] ex
    int user2_m1= 0; // motor1--> motor_position[0] ex
    int user2_m2= 0; // motor1--> motor_position[0] ex




    const int buttonPin1 = A0;
    const int buttonPin2 = A1;
    const int buttonPin5 = A4;
    const int buttonPin6 = A5;


    const int buttonPin7 = 12; //save button
    const int buttonPin8 = 13; //user1
    const int buttonPin9 = 10; //user2



    int state1 = 0; //bu stateler buttonlar için
    int state2 = 0;
    int state5 = 0;
    int state6 = 0;

    int state7 = 0;
    int state8 = 0;
    int state9 = 0;




    int relayPin1 = 11; //
    int relayPin2 = 4;
    int relayPin5 = 7;
    int relayPin6 = 8;

    void setup() {

    pinMode(buttonPin1, INPUT);
    pinMode(buttonPin2, INPUT);
    pinMode(buttonPin5, INPUT);
    pinMode(buttonPin6, INPUT);

    pinMode(buttonPin7, INPUT);
    pinMode(buttonPin8, INPUT);
    pinMode(buttonPin9, INPUT);


    pinMode(relayPin1, OUTPUT);
    pinMode(relayPin2, OUTPUT);
    pinMode(relayPin5, OUTPUT);
    pinMode(relayPin6, OUTPUT);


    Serial.begin(9600);

    attachInterrupt(digitalPinToInterrupt(pin1), IRQcounter2, CHANGE);

    attachInterrupt(digitalPinToInterrupt(pin2), IRQcounter, CHANGE);

    //bu attachinterrotun anlamı herhanggi bir voltage değişikliği anında IRQcounter a git ve ordaki işlemi yap

    }

    void loop() {

    //EEPROM.write(motor_position[0]);
    //EEPROM.write(motor_position[1]);


    motor_position[0] = IRQcount1;
    motor_position[1] = IRQcount2;



    state1 = digitalRead(buttonPin1);
    state2 = digitalRead(buttonPin2);
    state5 = digitalRead(buttonPin5);
    state6 = digitalRead(buttonPin6);


    state7 = digitalRead(buttonPin7);
    state8 = digitalRead(buttonPin8);
    state9 = digitalRead(buttonPin9);



    if (state1 == HIGH) {

    moto1_direction = false;
    moto1_effect = false ;


    digitalWrite(relayPin1, LOW);

    //button 1 e basınca ileri git

    }

    else if (state7 == HIGH && state8 == HIGH) {

    user1_m1 = motor_position[0];
    user1_m2 = motor_position[1];

    }

    else if (state7 == HIGH && state9 == HIGH) {


    user2_m1 = motor_position[0];
    user2_m2 = motor_position[1];


    }

    else if (state2 == HIGH) {

    moto1_direction = true;
    moto1_effect = true ;


    digitalWrite(relayPin2, LOW);

    }

    else if (state5 == HIGH) {

    motor2_direction = false;
    moto2_effect = false ;
    digitalWrite(relayPin5, LOW);

    }

    else if (state6 == HIGH) {

    motor2_direction = true;
    moto2_effect = true ;


    digitalWrite(relayPin6, LOW);

    }


    else if (state7 == HIGH) {


    digitalWrite(relayPin1, HIGH );
    digitalWrite(relayPin2, HIGH);
    digitalWrite(relayPin5, HIGH );
    digitalWrite(relayPin6, HIGH);


    }
    else if (state8 == HIGH) { ////////////////////////////////////////////////////////////////////////
    //bu while kısmında motor kendiliğinden dönüyor ama aşşagıdaki IRcounterın içine girmiyor
    while(IRQcount1 < user1_m1){

    moto1_direction ==false;
    moto1_effect == false;

    digitalWrite(relayPin2, HIGH);
    digitalWrite(relayPin1, LOW); //Ileri
    Serial.println("user 1 m1 front");
    // return IRQcounter();






    }
    while(IRQcount1 > user1_m1){

    moto1_direction ==true;
    moto1_effect == true;

    digitalWrite(relayPin1, HIGH);
    digitalWrite(relayPin2, LOW); //Geri
    Serial.println("user1 m1 back ");

    }

    //delay(5000);
    /*
    while(IRQcount2 < user1[1]){
    digitalWrite(relayPin5, HIGH);
    digitalWrite(relayPin6, LOW); //Ileri
    Serial.println("User ilerinin icindeyim");


    }
    while(IRQcount2 > user1[1]){
    digitalWrite(relayPin6, HIGH);
    digitalWrite(relayPin5, LOW); //Geri
    Serial.println("User gerinin icindeyim");
    }

    */
    }

    else if (state9 == HIGH) {

    }

    else {

    digitalWrite(relayPin1, HIGH );
    digitalWrite(relayPin2, HIGH);
    digitalWrite(relayPin5, HIGH );
    digitalWrite(relayPin6, HIGH);

    moto1_direction = false ;
    moto1_effect = true ;

    motor2_direction = false ;
    moto2_effect = true ;


    }



    //burada serial printleri düzenle


    Serial.print(" IR1:");
    Serial.print(IRQcount1);

    Serial.print(" motor1:");
    Serial.print(motor_position[0]);

    Serial.print(" user1-m1:");
    Serial.print(user1_m1);

    Serial.print(" IR2:");
    Serial.print(IRQcount2);

    Serial.print(" motor2:");
    Serial.print(motor_position[1]);

    Serial.print(" user1-m2:");
    Serial.println(user1_m2);

    }

    void IRQcounter() {

    if (moto1_direction ==false && moto1_effect == false)
    {
    //Serial.println("voiddeyim");

    IRQcount1++;

    }


    else if (moto1_direction== true && moto1_effect ==true)
    {

    IRQcount1--;

    }
    //Serial.println("void 1 deyim");
    }
    void IRQcounter2(){


    if (motor2_direction ==false && moto2_effect ==false)
    {

    IRQcount2++;

    }
    else if (motor2_direction == true && moto2_effect ==true)
    {

    IRQcount2--;

    }


    }
  • Kod içindeki yorum satırlarından daha iyi anlayabilirsiniz diye düşünüyorum.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook

Tagged

Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.