Как управлять двигателем постоянного тока с помощью mpu6050?

Итак, я пытаюсь управлять двигателем постоянного тока с помощью драйвера двигателя cytron и использую mpu6050 для управления скоростью и направлением двигателя. Я написал код, но он не работает.

    #include <PinChangeInt.h>
    #include <PID_v1.h>
    #define M1  9    // ШИМ-выход на модуль драйвера двигателя cytron
    #define M2  10
    
    #include <Adafruit_MPU6050.h>
    #include <Adafruit_Sensor.h>  
    #include <Wire.h>
    Adafruit_MPU6050 mpu;
    
    int dir;
    int pwm_pin = 6;
    int dir_pin = 10;
    
    double kp = 5 , ki = 1 , kd = 0.01;    
    // изменить для оптимальной производительности
    double input = 0, output = 0, setpoint = 0;
    long temp;
    
    PID myPID(&input, &output, &setpoint, kp, ki, kd, DIRECT);  // если двигатель будет работать только на полной скорости, попробуйте «ОБРАТНОЕ» вместо «ПРЯМОЕ»
    
    void setup() 
    {
        Serial.begin(9600);
        while (!Serial)
            delay(10); 
    
        Serial.println("Adafruit MPU6050 test!");
        // Попробуйте инициализировать!
    
        if (!mpu.begin()) 
        {
            Serial.println("Failed to find MPU6050 chip");
            while (1) 
            {
                delay(10);
            } 
        }
    
        Serial.println("MPU6050 Found!");
    
        mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
        Serial.print("Accelerometer range set to: ");
    
        switch (mpu.getAccelerometerRange()) 
        {
            case MPU6050_RANGE_2_G:
                Serial.println("+-2G");
                break;
    
            case MPU6050_RANGE_4_G:
                Serial.println("+-4G");
                break;
    
            case MPU6050_RANGE_8_G:
                Serial.println("+-8G");
                break;
    
            case MPU6050_RANGE_16_G:
                Serial.println("+-16G");
                break;
         }
    
         mpu.setGyroRange(MPU6050_RANGE_500_DEG);
         Serial.print("Gyro range set to: ");
    
         switch (mpu.getGyroRange()) 
         {
             case MPU6050_RANGE_250_DEG:
                 Serial.println("+- 250 deg/s");
                 break;
             case MPU6050_RANGE_500_DEG:
                 Serial.println("+- 500 deg/s");
                 break;
             case MPU6050_RANGE_1000_DEG:
                 Serial.println("+- 1000 deg/s");
                 break;
    
             case MPU6050_RANGE_2000_DEG:
                 Serial.println("+- 2000 deg/s");
                 break;
    
         }
    
         mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
         Serial.print("Filter bandwidth set to: ");
         switch (mpu.getFilterBandwidth()) 
         {
             case MPU6050_BAND_260_HZ:
                Serial.println("260 Hz");
                break;
             case MPU6050_BAND_184_HZ:
                Serial.println("184 Hz");
                break;
             case MPU6050_BAND_94_HZ:
                Serial.println("94 Hz");
                break;
             case MPU6050_BAND_44_HZ:
                Serial.println("44 Hz");
                break;
             case MPU6050_BAND_21_HZ:
                Serial.println("21 Hz");
                break;
             case MPU6050_BAND_10_HZ:
                Serial.println("10 Hz");
                break;
             case MPU6050_BAND_5_HZ:
                Serial.println("5 Hz");
                break;
         }
    
         Serial.println("");
         delay(100);
         pinMode(pwm_pin,OUTPUT);
         pinMode(dir_pin,OUTPUT);
    
         // для отладки
     }
    
     void loop() 
     {
         sensors_event_t a, g, temp;
    
         mpu.getEvent( &g );
    
         /* Print out the values */
         Serial.println("");
    
         setpoint = analogRead(0) * 5; // изменить в соответствии с характеристиками двигателя и энкодера, потенциометр подключен к A0
    
         myPID.Compute();  // вычислить новый вывод
         pwmOut(output);   // привод модуля cytron
     }
    
     void pwmOut(int out) 
     {    
        // в цитрон
        if (out > 0) 
        {
            analogWrite(M1, out); // приводной двигатель по часовой стрелке
            analogWrite(M2, 0);
        }
        else 
        {
            analogWrite(M1, 0);
            analogWrite(M2, abs(out));    
                        // привод двигателя против часовой стрелки
        }
    }

, 👍0

Обсуждение

Пожалуйста, отформатируйте код. Что прямо бросается в глаза: sensors_event_t a,g,temp; Ни одна из этих переменных нигде ниже не читается. Вы получаете данные от mpu, но ничего с ними не делаете., @PMF

Я изменил код и добавил значения из mpu6050, но он все еще не работает., @Mahshida

@ПМФ void pwmOut(int out) { // в cytron если (значение <абс(g.gyro.y*15)) { аналоговая запись (M1, выход); // приводной двигатель по часовой стрелке аналоговая запись (M2, 0); } еще { аналоговая запись (M1, 0); аналоговая запись (M2, абс. (выход)); // привод двигателя против часовой стрелки } }', @Mahshida

Я отформатировал код для вас сейчас. Добавьте свои изменения, отредактировав код. Кроме того, вы должны быть более конкретными. Что вы ожидаете? Что происходит вместо этого? «Это не работает» не говорит нам ничего полезного., @PMF

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

Извините, вы вообще не обновили вопрос. Код в его нынешнем виде очень сложен для понимания, поскольку он требует множества побочных эффектов класса PID (которые вы не показываете). Начните с добавления операторов отладки, чтобы увидеть, как изменяется «вывод»., @PMF