Arduino自动行走车90度转弯问题

问题描述 投票:0回答:1
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。

我添加了延迟,认为也许它移动得太快了。我什至尝试在不同的楼层移动,但结果总是相同。

arduino move auto
1个回答
0
投票

除了第 32 行和第 30 行到第 32 行之间,我没有看到代码中的问题,我认为您需要 dur 函数,但我认为您可以在每次转动后检查角度并通过值纠正错误。 如果这不起作用,我认为你的陀螺仪不起作用,你可以通过将陀螺仪在桌子上移动 90 度来测试陀螺仪,然后查看陀螺仪的输出。

© www.soinside.com 2019 - 2024. All rights reserved.