MPU6050 filter+szabályzó

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
IzLuCSi
DrótVégénSzéndarab
Hozzászólások: 47
Csatlakozott: 2017. szeptember 26. kedd, 14:34

MPU6050 filter+szabályzó

Hozzászólás Szerző: IzLuCSi »

Sziasztok.
Van egy MPU6050 es girom és szeretnék hozzá nanora egy filter és egy szabályzó programot. Kálmán vagy komplementer szürőre és PID szabályzóra
gondoltam. Tudna ebben valaki segíteni? Valamilyen példa programmal vagy hasonlóval?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: MPU6050 filter+szabályzó

Hozzászólás Szerző: Robert »

Eddig mit találtál és az miért nem jó? Vagy mi az amit pluszban kell tudnia?
http://www.tavir.hu - a gazda :)
IzLuCSi
DrótVégénSzéndarab
Hozzászólások: 47
Csatlakozott: 2017. szeptember 26. kedd, 14:34

Re: MPU6050 filter+szabályzó

Hozzászólás Szerző: IzLuCSi »

Több félét is találtam. Az volt elsődlegesen a baj hogy nem egészen sikerült meg értenem a müködését a programnak hogy át tudjam alakítani úgy hogy nekem meg felelő legyen és be tudjam építeni másik programba.
IzLuCSi
DrótVégénSzéndarab
Hozzászólások: 47
Csatlakozott: 2017. szeptember 26. kedd, 14:34

Re: MPU6050 filter+szabályzó

Hozzászólás Szerző: IzLuCSi »

Az arduino oldalán a PID Basic program hibát jelez az összes myPID es sorban (3db).
Ez miért lehet?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: MPU6050 filter+szabályzó

Hozzászólás Szerző: Robert »

Pl.
- myPID nincs telepítve (library)
- Arduino verziód nem stimmel a mintáéval
- van más MyPID telepítve
- ékezetes állomány/elérés...


Javasolt olvasmány:
viewtopic.php?f=23&t=828

Különös tekintettel kiemelve:
Ha programozási kérdés merül fel, akkor programkód nélkül nagyon nagy a kihívás. Bár ötletbörzét is lehet tartani :) .
Ugyancsak nem informatív, sem címben, sem leírásban a "Print nem működik".
TE ülsz az áramkör előtt, TE látod mi zajlik, mi van ott. Mi csak a leírásodat látjuk....
Szóval inkább legyen terjengős, mint nem követhető.
Soha ne kérj úgy segítséget, hogy : ez a feladat és valaki oldja meg. Ha nem írsz javaslatot, nem írod le, hogy utánanéztél és az a megoldás tetszik, mert... ez nem, mert és különben is a kódban itt és itt nem jutok előre és ebben kéne segítség...
Nos, ha ezek hiányoznak, akkor NEM TETTÉL SEMMIT a cél érdekében. A sültgalambok itt nem fognak repkedni. Tenni is kell érte!

Kérlek, hogy a fórum jól működjön, segíts benne - Rajtad is múlik!
http://www.tavir.hu - a gazda :)
IzLuCSi
DrótVégénSzéndarab
Hozzászólások: 47
Csatlakozott: 2017. szeptember 26. kedd, 14:34

Re: MPU6050 filter+szabályzó

Hozzászólás Szerző: IzLuCSi »

Köszönöm
Nem vártam a sült galambot én is kerestem programokat próbáltam meg fejteni őket.
Filterekből találtam párat amit talán tudok használni.

PID-eknél akadtam inkább el. A fent emlitett PID pl.: a PID_v1.h könyvtár példái között van.
myPID könyvtárat nem találtam se azt hogy ez most miért nem látja.
Próbáltam úgy is hogy kitörlöm a kódból hátha be áll valami alapértelmezett értékre és tudom azért valamilyen szinten használni de nem jártam sikerrel.

Kód: Egész kijelölése

/********************************************************
 * PID Basic Example
 * Reading analog input 0 to control analog PWM output 3
 ********************************************************/

#include <PID_v1.h>

//Define Variables we'll be connecting to
double Setpoint, Input, Output;

//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT);

void setup()
{
  //initialize the variables we're linked to
  Input = analogRead(0);
  Setpoint = 100;

  //turn the PID on
  myPID.SetMode(AUTOMATIC);
}

void loop()
{
  Input = analogRead(0);
  myPID.Compute();
  analogWrite(3,Output);
}

Itt is ez a myPID miatt jelez hibát

Kód: Egész kijelölése

#include <PID_v1.h> 
const int
photores = A0;
// Photo resistor input 
const int
pot = A1;
// Potentiometer input 
const int
led = 9;
// LED output 
double
lightLevel;
// variable that stores the incoming light level  
// Tuning parameters 
float Kp=0;
//Initial Proportional Gain 
float Ki=10;
//Initial Integral Gain 
float Kd=0;
//Initial Differential Gain  
double Setpoint, Input, Output;
//These are just variables for storingvalues 
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
// This sets up our PDID Loop 
//Input is our PV 
//Output is our u(t) 
//Setpoint is our SP 
const int sampleRate = 1; // Variable that determines how fast our PID loop runs  
// Communication setup 
const long serialPing = 500;
//This determines how often we ping our loop 
// Serial pingback interval in milliseconds 
unsigned long now = 0;
//This variable is used to keep track of time 
// placehodler for current timestamp 
unsigned long lastMessage = 0;
//This keeps track of when our loop last spoke to serial 
// last message timestamp.  
void setup(){
lightLevel = analogRead(photores);
//Read in light level 
Input = map(lightLevel, 0, 1024, 0, 255);
//Change read scale to analog out scale 
Setpoint = map(analogRead(pot), 0, 1024, 0, 255);
//get our setpoint from our pot 
Serial.begin(9600);
//Start a serial session 
myPID.SetMode(AUTOMATIC);
//Turn on the PID loop 
myPID.SetSampleTime(sampleRate);
//Sets the sample rate  
Serial.println("Begin");
// Hello World! 
lastMessage = millis();
// timestamp 
} 
void loop(){
Setpoint = map(analogRead(pot), 0, 1024, 0, 255); //Read our setpoint
 
 
lightLevel = analogRead(photores);
//Get the light level 
Input = map(lightLevel, 0, 900, 0, 255);
//Map it to the right scale 
myPID.Compute();
//Run the PID loop 
analogWrite(led, Output);
//Write out the output from the 
PID loop to our LED pin  
now = millis();
//Keep track of time 
if(now - lastMessage > serialPing) {
//If it has been long enough give us 
some info on serial 
// this should execute less frequently 
// send a message back to the mother ship 
Serial.print("Setpoint = ");
Serial.print(Setpoint);
Serial.print(" Input = ");
Serial.print(Input);
Serial.print(" Output = ");
Serial.print(Output);
Serial.print("\n");
if (Serial.available() > 0) { //If we sent the program a command deal 
with it 
for (int x = 0; x < 4; x++) {
switch (x) {
case 0:
Kp = Serial.parseFloat();
break;
case 1:
Ki = Serial.parseFloat();
break;
case 2:
Kd = Serial.parseFloat();
break;
case 3:
for (int y = Serial.available(); y == 0; y--) {
Serial.read();
//Clear out any residual junk 
}
break;
}
}
Serial.print(" Kp,Ki,Kd = ");
Serial.print(Kp);
Serial.print(",");
Serial.print(Ki);
Serial.print(",");
Serial.println(Kd);
//Let us know what we just received 
myPID.SetTunings(Kp, Ki, Kd); //Set the PID gain constants and start 
running 
} 
lastMessage = now;
//update the time stamp. 
} 
}
 

Ez volt amelyiknél legalább nem jelzett hibát de még nem sikerült rájönnöm hogy hogyan is müködik

Kód: Egész kijelölése

/*
  Firstbot PID code:  Implements a PID controller using
  analog inputs for actual and desired positions.

 The circuit: 
 * RX is digital pin 2 (connect to TX of other device)
 * TX is digital pin 3 (connect to RX of other device)

 */
#include <SoftwareSerial.h>

// define some constants
int ActPos = A0;    // select the input pin for feedback signal
int DesPos = A1;    // select the input pin for control signal

byte PWMOutput;
long Error[10];
long Accumulator;
long PID;
int PTerm;
int ITerm;
int DTerm;
byte Divider;

/* 
The FIRSTBOT has a PIC16F1829 controller that controls the 
two MC33926 H-bridges on the board.  A oftware serial interface
is used to control that part.
*/
SoftwareSerial mySerial(2, 3); // Receive data on 2, send data on 3
byte SerialTXBuffer[5];
byte SerialRXBuffer[5];

void setup()  
{

 // Open serial communications and wait for port to open:
  Serial.begin(9600);
  mySerial.begin(9600);
}

/* GetError():
Read the analog values, shift the Error array down 
one spot, and load the new error value into the
top of array.
*/
void GetError(void)
{
  byte i = 0;
  // read analogs
  word ActualPosition = analogRead(ActPos);  
// comment out to speed up PID loop
//  Serial.print("ActPos= ");
//  Serial.println(ActualPosition,DEC);

  word DesiredPosition = analogRead(DesPos);
// comment out to speed up PID loop
//  Serial.print("DesPos= ");
//  Serial.println(DesiredPosition,DEC);

  // shift error values
  for(i=9;i>0;i--)
    Error[i] = Error[i-1];
  // load new error into top array spot  
  Error[0] = (long)DesiredPosition-(long)ActualPosition;
// comment out to speed up PID loop
//  Serial.print("Error= ");
//  Serial.println(Error[0],DEC);

}

/* CalculatePID():
Error[0] is used for latest error, Error[9] with the DTERM
*/
void CalculatePID(void)
{
// Set constants here
  PTerm = 2000;
  ITerm = 25;
  DTerm = 0;
  Divider = 10;

// Calculate the PID  
  PID = Error[0]*PTerm;     // start with proportional gain
  Accumulator += Error[0];  // accumulator is sum of errors
  PID += ITerm*Accumulator; // add integral gain and error accumulation
  PID += DTerm*(Error[0]-Error[9]); // differential gain comes next
  PID = PID>>Divider; // scale PID down with divider

// comment out to speed up PID loop  
//Serial.print("PID= ");
//  Serial.println(PID,DEC);

// limit the PID to the resolution we have for the PWM variable

  if(PID>=127)
    PID = 127;
  if(PID<=-126)
    PID = -126;

//PWM output should be between 1 and 254 so we add to the PID    
  PWMOutput = PID + 127;

// comment out to speed up PID loop
//  Serial.print("PWMOutput= ");
//  Serial.println(PWMOutput,DEC);

}

/* WriteRegister():
Writes a single byte to the PIC16F1829, 
"Value" to the register pointed at by "Index".  
Returns the response 
*/
byte WriteRegister(byte Index, byte Value)
{
byte i = 0;
byte checksum = 0;
byte ack = 0;

SerialTXBuffer[0] = 210;
SerialTXBuffer[1] = 1;
SerialTXBuffer[2] = 3;
SerialTXBuffer[3] = Index;
SerialTXBuffer[4] = Value;

for (i=0;i<6;i++)
  {
  if (i!=5)
    {
    mySerial.write(SerialTXBuffer[i]);
    checksum += SerialTXBuffer[i];    
    }
  else
    mySerial.write(checksum);     
  }
  delay(5);

  if (mySerial.available())
    ack = mySerial.read();

  return ack;
} 

void loop() // run over and over
{
     GetError();       // Get position error
     CalculatePID();   // Calculate the PID output from the error
     WriteRegister(9,PWMOutput);  // Set motor speed
}
Most ahogy át néztem a gépemet csak ezeket a PID eset találtam (jó pár filter mellett) és olyanokat amik Nanohoz nem jók.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: MPU6050 filter+szabályzó

Hozzászólás Szerző: Robert »

Régebbi arduino keretrendszert próbálj (1.0.5).
Vagy az újabban a library managerrel (2 félét is kiad).
http://www.tavir.hu - a gazda :)
IzLuCSi
DrótVégénSzéndarab
Hozzászólások: 47
Csatlakozott: 2017. szeptember 26. kedd, 14:34

Re: MPU6050 filter+szabályzó

Hozzászólás Szerző: IzLuCSi »

Pár hete töltöttem le az újabb verziót (1.8.5) és ott csak egy félét adott ki a library manager.
Most felraktam az 1.0.5 -t is és nem jelzet hibár a kódban.
Köszönöm a segítséget. :D
IzLuCSi
DrótVégénSzéndarab
Hozzászólások: 47
Csatlakozott: 2017. szeptember 26. kedd, 14:34

Re: MPU6050 filter+szabályzó

Hozzászólás Szerző: IzLuCSi »

Sziasztok
Ezt a programot égettem a nanora és valamiért amikor ki akarom olvastatni az adatokat akkor be akad a program. A bemenetre egy potit kötöttem a kimenetre pedig egy ledet. Amikor el tekertem a potit a ledfénye egy kis ideig változott majd be állt. Ebből azt szürtem le hogy valószinüleg müködik a PID. Azonban amikor ki akartam íratni a kimenetett és a bemenetett a soros monitorra akkor be akadt a program és zagyvaságot írt ki. Ez miért lehet? Miért akad be?

Kód: Egész kijelölése

/********************************************************
 * PID Basic Example
 * Reading analog input 0 to control analog PWM output 3
 ********************************************************/

#include <PID_v1.h>

//Define Variables we'll be connecting to
double Setpoint, Input, Output;
pinMode(3,OUTPUT);
//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT);

void setup()
{
  //initialize the variables we're linked to
  Input = analogRead(0);
  Setpoint = 100;

  //turn the PID on
  myPID.SetMode(AUTOMATIC);
}

void loop()
{
  Input = analogRead(A0);
  myPID.Compute();
  analogWrite(3,Output);
}

Ezzel próbáltam kiíratni az értékeket

Kód: Egész kijelölése

/********************************************************
 * PID Basic Example
 * Reading analog input 0 to control analog PWM output 3
 ********************************************************/

#include <PID_v1.h>


double Setpoint, Input, Output;


PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT);

void setup()
{

  Input = analogRead(0);
  Setpoint = 100;


  myPID.SetMode(AUTOMATIC);
}

void loop()
{
  Serial.begin(9600);
  Input = analogRead(A0);
  myPID.Compute();
  analogWrite(3,Output);
  Serial.println(Output);
  Serial.println(Input);
}

Legutóbb ezt írta ki
’-¹00
A soros monitor 9600 ra volt állítva ahogy a programban is.

Azonban mikor át raktam a soros monitort 115200-ra akkor eltüntek az adatok és utána mikor vissza raktam 9600-ra akkor már normális adatokat írt ki. Úgy hogy ha nem akadna be akkor valószinüleg a többi érték is normális lenne.
0.00
1023.0

Amikor át írtam a programot 115200-re akkor több adatott írt ki de ugyan úgy be akadt.
Miért akadt be?
(állítottam közben a potin és ezzeket írta ki 115200-nél)

Kód: Egész kijelölése

0.00
740.00
0.00
740.00
0.00
740.00
0.00
740.0Ã
0.00
740.00
0.00
740.00
0.00
740.00
0.00
740.00
0.00
740.00
0.00
740.00
0.00
740.00
0.00
740.00
0.00
—ó0.00
0.00
740.00
0.00
740.00
0.00
740.00
0.00
7
Krisz21
Újonc
Újonc
Hozzászólások: 11
Csatlakozott: 2014. július 4. péntek, 12:10

Re: MPU6050 filter+szabályzó

Hozzászólás Szerző: Krisz21 »

1. A Serial.begin(9600); sort tedd át a loop-ból a sertup-ba.
2. Ha még mindig lefagy, akkor a loop-ba tegyél delay-t.
IzLuCSi
DrótVégénSzéndarab
Hozzászólások: 47
Csatlakozott: 2017. szeptember 26. kedd, 14:34

Re: MPU6050 filter+szabályzó

Hozzászólás Szerző: IzLuCSi »

Át írtam a setupba és müködöt.
Köszönöm a segítséget :D .
Válasz küldése