Балансировка маятника с использованием PID

Уважаемые друзья! Обратите внимание на видео здесь о том, как сделать балансировочный маятник PID. как показано на картинке, и автор также предоставил код Arduino в описании видео. Могу ли я спросить, можно ли использовать этот код Arduino на моем гироскопе MPU6050 без каких-либо модификаций, потому что автор в видео не указывает модель используемого гироскопа. Я также искал бесчисленное количество кода Arduino в Интернете по балансирующему маятнику с использованием пропеллерного PID с бесщеточным двигателем постоянного тока (не 3-фазным) и гироскопом MPU6050, но не смог найти ни одного, и я надеюсь, что кто-нибудь может мне показать несколько примеров кода.

Спасибо и хорошего дня!!

// Chuong trinh dieu khien cân bang thanh ngang Nguyen Duc Sang 24/05/2018
//------------------------------------------------ ---------------

//875=0
//530=90 сделать
#define SENSOR A1
#define CONTROL 6
#define dongco 7

  
   void setup() { 
       Serial.begin(9600);
       pinMode(SENSOR,INPUT);
       pinMode(CONTROL,OUTPUT);
       pinMode(dongco,OUTPUT);
   }
   double error = 0;
   double realAngle;
   double lastrealAngle;
   double
     kP = 1,
     kI = 0.005,
     kD = 0;
   double 
     P = 0, 
     I = 0,
     D = 0; 
   double PID;  
   double setPoint = 90;
   int controlPwm = 85; 
   long lastProcess = 0;
  void loop(){
     realAngle = map(analogRead(SENSOR), 1023, 0, -39.73, 229.47);
     //Serial.println(analogRead(SENSOR));
     //Serial.println('gia tri goc realAngle la');
     Serial.println(realAngle);
     Serial.println(setPoint);
    //ПИД
    error = setPoint - realAngle;
    //thoi gian lay mau
    float deltaTime = (millis() - lastProcess)/100.0;
    lastProcess = millis();
    // П
    P = error * kP;
    // я
    I += (error * kI) * deltaTime;
    // Д
    D = (lastrealAngle-realAngle) * kD * deltaTime;
    lastrealAngle = realAngle; 
   // Подпрограмма
  PID = P + I + D;
  if (PID>255){
   PID=255;}
   
  controlPwm = (PID + 80); 
 
    
    analogWrite(CONTROL,controlPwm );
  
  }

, 👍0

Обсуждение

Это **весь** ваш код?, @Nick Gammon

Это не может быть весь ваш код. Почти все важное отсутствует. Я думаю, у вас была ошибка копирования и вставки. Но я думаю, что нет. Кажется, код использует аналоговый датчик. Из видео я бы предположил, что у него есть потенциометр на оси рычага. Поэтому он не использует гироскоп. Для MPU6050 вы увидите либо соответствующую импортируемую библиотеку, либо используемую библиотеку «Wire» или «SPI» (поскольку MPU взаимодействует через I2C или SPI). Я могу написать ответ, как только вы включите полный код в свой вопрос., @chrisl

@chrisl, привет, сэр, эти коды взяты из описания видео. Могу ли я спросить, есть ли какой-либо код, который балансирует маятник с использованием ПИД-регулятора пропеллера с бесщеточным двигателем постоянного тока (не трехфазным) и гироскопом MPU6050? Хорошего дня :), @jessica smith

В любом случае вы должны включить в вопрос полный код, потому что вопросы на этом сайте должны быть автономными. Поэтому, пожалуйста, скопируйте полный код в вопрос, @chrisl

@chrisl, готово :), могу ли я спросить, есть ли какой-нибудь код, который выполняет балансировку маятника с использованием ПИД-регулятора пропеллера с бесщеточным двигателем постоянного тока (не трехфазным) и гироскопом MPU6050?, @jessica smith


1 ответ


2

Показанный код не использует MPU6050. Вместо этого он использует датчик с аналоговым выходным сигналом. Из изображения и видео я подозреваю, что этот датчик представляет собой потенциометр, прикрепленный к оси руки. Таким образом, аналоговое значение в основном дает вам меру угла.

также искал бесчисленное количество кодов Arduino в Интернете по балансировке маятника с использованием ПИД-регулятора пропеллера с бесщеточным двигателем постоянного тока (не 3-фазным) и гироскопом MPU6050, но не смог найти ни одного

Меня это не особо удивляет, поскольку это очень специфический поисковый запрос. Это предполагает, что кто-то сделал именно то, что вы хотите сделать, и описал это теми же словами. Найти готовый код таким образом крайне маловероятно, да и такого кода у меня нет.

Что теперь делать? Вам придется разработать код самостоятельно. Сначала вы должны разделить свой проект на отдельные части, такие как: получение показаний от MPU6050, вычисление стабильного значения угла из показаний (путем объединения значений гироскопа и акселерометра), управление бесщеточным двигателем постоянного тока и управление его скоростью, реализация обратной связи PID. петля.

Когда вы сможете реализовать каждую отдельную часть по отдельности, вы сможете собрать их все вместе, чтобы создать свой проект. Каждая отдельная часть может быть исследована намного проще, потому что есть много людей, которые сделали это в своих собственных проектах. Также попробуйте найти библиотеки Arduino для этих частей. Например: существуют библиотеки для использования MPU6050, которые будут обрабатывать всю связь с датчиком за вас. Хороший способ найти библиотеки — это ввести запрос «Arduino library MPU6050». (замените «MPU6050» на любую единственную вещь, которую вы хотите реализовать, например PID или аналогичную). И такие библиотеки часто размещаются на Github, поэтому часто полезно поискать что-то вроде "github arduino MPU6050". Старайтесь, чтобы поисковый запрос был коротким. Посмотрите на результаты и оцените, подходят ли найденные библиотеки для вашей ситуации.

А в качестве помощи и вдохновения можно поискать похожие проекты. Быстрый поиск "Балансирующего робота Arduino mpu6050" показал многообещающие результаты, и балансирующий робот очень похож на ваш проект.

,