Arduino авто движущийся автомобиль поворот на 90 градусов - PullRequest
1 голос
/ 23 декабря 2019
void setup() {  
    Serial.begin(9600);
    Wire.begin();
    mpu6050.begin();
    mpu6050.calcGyroOffsets(true);
    pinMode(ledPinBlue, OUTPUT);
    pinMode(enA, OUTPUT);
    pinMode(enB, OUTPUT);
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
    pinMode(in3, OUTPUT);
    pinMode(in4, OUTPUT);
}

void loop() {
    mpu6050.update();
    Serial.print("angleX : ");
    Serial.print(mpu6050.getAngleX());
    Serial.print("\tangleY : ");
    Serial.print(mpu6050.getAngleY());
    Serial.print("\tangleZ : ");
    Serial.println(mpu6050.getAngleZ());
    int start = (mpu6050.getAngleZ());
    int now = 0; 
    int must =0;
    route1();
    delay(10) ;
    dur();
    delay(10);
    route2();
    delay(10);
    route3;
    delay(10);
    dur();
}

void turnright () {
    digitalWrite(ledPinBlue, HIGH);
    delay(20);
    digitalWrite(ledPinBlue, LOW);
    delay(200);
    analogWrite( enA , 140);
    analogWrite( enB , 140);
    digitalWrite( in1 , LOW);
    digitalWrite( in2 , HIGH);  
    digitalWrite( in3 , HIGH);
    digitalWrite( in4, LOW);
    delay(30);
    analogWrite( enA , 90);
    analogWrite( enB , 90);
    digitalWrite( in1 , LOW);
    digitalWrite( in2 , LOW);  
    digitalWrite( in3 , LOW);
    digitalWrite( in4, LOW);
}

void forword () {
    digitalWrite(ledPinBlue, HIGH);
    delay(3);
    digitalWrite(ledPinBlue, LOW);
    delay(4);
    digitalWrite(ledPinBlue, HIGH);
    delay(2);
    digitalWrite(ledPinBlue, LOW);
    delay(4);  
    digitalWrite(ledPinBlue, HIGH);
    delay(1);
    digitalWrite(ledPinBlue, LOW);
    delay(3);      
    analogWrite( enA , 96);
    analogWrite( enB , 96);
    digitalWrite( in1 , HIGH);
    digitalWrite( in2 , LOW);  
    digitalWrite( in3 , HIGH);
    digitalWrite( in4, LOW); 
}

void turnleft(){
    digitalWrite(ledPinBlue, HIGH);
    delay(200);
    digitalWrite(ledPinBlue, LOW);
    delay(20);
    analogWrite( enA , 150);
    analogWrite( enB , 150);
    digitalWrite( in1 , HIGH);
    digitalWrite( in2 , LOW);  
    digitalWrite( in3 , LOW);
    digitalWrite( in4, HIGH);
    delay(30);
    analogWrite( enA , 90);
    analogWrite( enB , 90);
    digitalWrite( in1 , LOW);
    digitalWrite( in2 , LOW);  
    digitalWrite( in3 , LOW);
    digitalWrite( in4, LOW);
}

void dur(){
    analogWrite( enA , 0);
    analogWrite( enB , 0);  
    digitalWrite( in1 , LOW);
    digitalWrite( in2 , LOW);  
    digitalWrite( in3 , LOW);
    digitalWrite( in4, LOW); 
    digitalWrite(ledPinBlue, HIGH);
    digitalWrite(ledPinBlue, HIGH);
}

void route3(){
    int start = (mpu6050.getAngleZ());
    if (start > 180){
        turnright();
        delay(50);
    }
    if (start < 180 && start > 91){
        turnleft();
        delay(50);
    }
    if (start == 180){
        forword();
        delay(1200);
    }
}

void route2(){
    int start = (mpu6050.getAngleZ());
    if (start > 91 && start < 179){
        turnright();
        delay(50);
    }
    if (start < 89 && start > 1){
        turnleft();
        delay(50);
    }
    if (start == 90){
        forword();
        delay(1200);
    }
}

void route1 () {
    int start = (mpu6050.getAngleZ());
    if (start > 1 && start < 89){
        turnright();
        delay(40);
    }
    if (start < 0){
        turnleft();
        delay(40);
    }
    if (start == 0){
        forword();
        delay(1200);
    }
}

С помощью кода Arduino, приведенного выше, я пытаюсь переместить автомобиль и повернуть его на 90 градусов 4 раза, чтобы сделать прямоугольник, но когда я запускаю его с кнопки или сбрасываю его каждый раз, я получаю разные углы, например, сначала 91второй 60 третий 97.

Я добавил задержки, думая, что, может быть, он двигался так быстро. Я даже пытался перемещаться по разным этажам, но это всегда дает один и тот же результат.

...