MPU6050 filter+szabályzó
MPU6050 filter+szabályzó
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?
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?
Re: MPU6050 filter+szabályzó
Eddig mit találtál és az miért nem jó? Vagy mi az amit pluszban kell tudnia?
http://www.tavir.hu - a gazda
Re: MPU6050 filter+szabályzó
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.
Re: MPU6050 filter+szabályzó
Az arduino oldalán a PID Basic program hibát jelez az összes myPID es sorban (3db).
Ez miért lehet?
Ez miért lehet?
Re: MPU6050 filter+szabályzó
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:
- 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
Re: MPU6050 filter+szabályzó
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.
Itt is ez a myPID miatt jelez hibát
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
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.
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);
}
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
}
Re: MPU6050 filter+szabályzó
Régebbi arduino keretrendszert próbálj (1.0.5).
Vagy az újabban a library managerrel (2 félét is kiad).
Vagy az újabban a library managerrel (2 félét is kiad).
http://www.tavir.hu - a gazda
Re: MPU6050 filter+szabályzó
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.
Most felraktam az 1.0.5 -t is és nem jelzet hibár a kódban.
Köszönöm a segítséget.
Re: MPU6050 filter+szabályzó
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?
Ezzel próbáltam kiíratni az értékeket
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)
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);
}
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);
}
-¹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
Re: MPU6050 filter+szabályzó
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.
2. Ha még mindig lefagy, akkor a loop-ba tegyél delay-t.
Re: MPU6050 filter+szabályzó
Át írtam a setupba és müködöt.
Köszönöm a segítséget .
Köszönöm a segítséget .