MPU6050 filter+szabályzó

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
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ásSzerző: IzLuCSi » 2018. január 25. csütörtök, 21:56

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: 9908
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: MPU6050 filter+szabályzó

HozzászólásSzerző: Robert » 2018. január 26. péntek, 5:37

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ásSzerző: IzLuCSi » 2018. január 26. péntek, 18:20

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ásSzerző: IzLuCSi » 2018. január 29. hétfő, 10:53

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: 9908
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: MPU6050 filter+szabályzó

HozzászólásSzerző: Robert » 2018. január 29. hétfő, 11:11

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ásSzerző: IzLuCSi » 2018. január 30. kedd, 13:04

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: 9908
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: MPU6050 filter+szabályzó

HozzászólásSzerző: Robert » 2018. január 31. szerda, 6:12

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ásSzerző: IzLuCSi » 2018. január 31. szerda, 12:40

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ásSzerző: IzLuCSi » 2018. január 31. szerda, 19:23

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ásSzerző: Krisz21 » 2018. február 2. péntek, 11:23

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ásSzerző: IzLuCSi » 2018. február 6. kedd, 15:19

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


Vissza: “Arduino / C-nyelvű programozás (AVR-Duino, EthDuino, Arduino, Diecimila)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég