Skocz do zawartości

Robot balansujący


rafax13

Pomocna odpowiedź

Witam

Na początku zaznaczę że jestem raczej początkującą osobą w temacie robotyki i może być to błahy błąd 🙂

Jestem w trakcie budowy robota balansującego na następujących podzespołach:

-Arduino micro

-Stepsticker A4988 x2

-Silnik krokowy STP-43D2024 1,05A 1,8/step

-MPU-6050 (GY-521)

No i zatrzymałem się w momencie próby sterowania silnikami czujnikiem MPU-6050 oczywiście przez filtr Kalmana i regulator PID. Żyroskop i akcelerometr po podłączaniu zasilania silników zaczynają podawać błędne dane i sterowanie jest niemożliwe. Nie miałem problemu z odczytem samych danych z czujnika jak i samego sterowania silników prostym programem. Podejrzewam, że problem można rozwiązać regulatorem napięcia ale nie jestem pewien czego użyć i gdzie.

Aktualnie zasilam układ napięciem 12V z zasilacza komputerowego.

Docelowo mam zamiar to zasilać baterią 9,6V i ma to wyglądać jak na schemacie poniżej który na szybko narysowałem.

Dodam że próbowałem rozdzielić już zasilanie odłączając microkontroler pinem VIN i zasilając układ za pomocą złącza USB a silniki oddzielnie baterią niestety problem nadal występował.

Spotkał się ktoś z takim problemem lub wie jak go rozwiązać?

Link do komentarza
Share on other sites

1.Jak masz układ GY-521 (MPU6050) To trzeba go zasilić z 5V bo ma on wbudowany stabilizator i 3,3V to dla niego za mało.

2. Wrzuć kod.

Link do komentarza
Share on other sites

AD1 Zmieniłem zasilanie z 3,3 V na 5 V - bez zmian.

AD2 Kod:

#include <Wire.h>
#include <MPU6050.h>                    //Biblioteka Jarzębskiego
#include <KalmanFilter.h>               //Biblioteka Jarzębskiego

MPU6050 mpu;

KalmanFilter kalmanX(0.001, 0.003, 0.03);
KalmanFilter kalmanY(0.001, 0.003, 0.03);

float accPitch = 0;
float accRoll = 0;

float kalPitch = 0;
float kalRoll = 0;

int   STD_LOOP_TIME  =     9;
int lastLoopTime = STD_LOOP_TIME;
int lastLoopUsefulTime = STD_LOOP_TIME;
unsigned long loopStartTime = 0;


// defines pins numbers for motor
const int stepPin = 5; 
const int dirPin = 6;
const int stepPin2 = 7; 
const int dirPin2 = 8; 

int setPoint = 0;
int drive = 0;

void setup() 
{
 Serial.begin(115200);

 pinMode(stepPin,OUTPUT); 
 pinMode(dirPin,OUTPUT);
 pinMode(stepPin2,OUTPUT); 
 pinMode(dirPin2,OUTPUT);

 // Initialize MPU6050
 while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
 {
   delay(500);
 }

 // Calibrate gyroscope. The calibration must be at rest.
 // If you don't want calibrate, comment this line.
 mpu.calibrateGyro();
}

void loop()
{
 Vector acc = mpu.readNormalizeAccel(); 
 Vector gyr = mpu.readNormalizeGyro();

 // Calculate Pitch & Roll from accelerometer (deg)
 accPitch = -(atan2(acc.XAxis, sqrt(acc.YAxis*acc.YAxis + acc.ZAxis*acc.ZAxis))*180.0)/M_PI;

 // Kalman filter
 kalPitch = kalmanCalculate(accPitch, gyr.YAxis, lastLoopTime);            // calculate Absolute Angle
 int y = kalPitch;

 drive = updatePid(setPoint, y);                                           // kalkulacja regulatora PID
 motors(drive);                                                            // sterowanie silinkami

 Serial.print(":");                                                        // wysyłanie danych do monitora szeregowego
 Serial.print(kalPitch);
 Serial.print(":  ");
 Serial.print(kalPitch1);
 Serial.print(":  ");
 Serial.print(accPitch);
 Serial.print(":  ");
 Serial.print(gyr.YAxis);
 Serial.print(":");
 Serial.println();

 lastLoopUsefulTime = millis()-loopStartTime;                              // obliczanie czasu pętli dla filtru kalmana
 if(lastLoopUsefulTime<STD_LOOP_TIME)         delay(STD_LOOP_TIME-lastLoopUsefulTime);
 lastLoopTime = millis() - loopStartTime;
 loopStartTime = millis();
}
Link do komentarza
Share on other sites

Dodam że próbowałem rozdzielić już zasilanie odłączając microkontroler pinem VIN i zasilając układ za pomocą złącza USB a silniki oddzielnie baterią niestety problem nadal występował.

Rozdzielałeś masy zasilania i baterii, to znaczy zasilanie Arduino z USB, zasilanie czujnika i logiki sterownika z pinów +5V, GND Arduino? Sterownik ma dedykowaną masę do podłączenia zasilania logiki. Bateria do VMOT i dedykowanej masy dla baterii?

Przy okazji, producent zaleca stosowanie dużego elektrolitu (>47 uF) na wejściu zasilania silnika, jak najbliżej płytki serownika, co ma popsuć dobroć kondensatora ceramicznego na wejściu tego zasilania i uchronić sterownik od przepięć podczas włączania/podłączania zasilania.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dodam że próbowałem rozdzielić już zasilanie odłączając microkontroler pinem VIN i zasilając układ za pomocą złącza USB a silniki oddzielnie baterią niestety problem nadal występował.

Rozdzielałeś masy zasilania i baterii, to znaczy zasilanie Arduino z USB, zasilanie czujnika i logiki sterownika z pinów +5V, GND Arduino? Sterownik ma dedykowaną masę do podłączenia zasilania logiki. Bateria do VMOT i dedykowanej masy dla baterii?

Tak próbowałem też w ten sposób, przy okazji zauważyłem że oba uziemienia na sterowniku silnika są połączone no ale to raczej normalne.

Próbowałem rożnych kondensatorów na zasilaniu Vmot niestety nic nie pomaga.

Ma ktoś jeszcze jakiś pomysł?

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.