Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino - servo motor
#41
Jel skodi ako ostane slobodan?

Ovako mi odgovara ,ukocen je motor dok ne pritisnem taster.
Struju sam nastelovao a motor je mlak ,celo vece radi tako...
Reply
#42
Treba da ga povežeš.
Reply
#43
(10-06-2016, 11:30 PM)gorankg Wrote: Treba da ga povežeš.

OK povezacu sutra.

ovaj zadnji kod ne reaguje .

dodao sam zatvorenu zagradu i  ;  .               while (i++); 
vrti dok drzim i nekako secka .
Reply
#44
(10-06-2016, 11:38 PM)uki122 Wrote: ovaj zadnji kod ne reaguje .
dodao sam zatvorenu zagradu i  ;  .               while (i++); 
vrti dok drzim i nekako secka .

Code:
void loop()
{
  
  
   setup();   // OVO IZBACI



 if(digitalRead(buttonPin) == LOW) //functions based off of button pulling input pin LOW
 {
    Vrti(200, DESNO);
 }

}
Reply
#45
@ YuMERA

Izbacio sam kao sto si rekao ,sad radi bez problema. Smile
Reply
#46
Uočio si, verovatno, razliku. Kod je pregledniji a funkciju Vrti() možeš pozivati kad ti zatreba. Treba još da realizuješ debounce za taj taster koji koristiš.
Reply
#47
Taj debounce je da ne radi kad ne treba?
Primetio sam kad palim gasim svetlo u sobi da se pali motor.
Reply
#48
Debounce je postupak kojim se otklanjaju lažna očitavanja stanja ulaza nastala usled treperenja prilikom preklapanja kontakata kod mehaničkih komponenti (tastera, prekidača, relea...). To bi značilo da ti na ulazu u MCU nemaš validnu informaciju što za posledicu može imati svašta. Evo ti link za info:

https://www.arduino.cc/en/Tutorial/Debounce
Reply
#49
Ok procitacu to dobro.

Planiram da uzmem 8 komada step motora.


23LM-C355-P2H  MINEBEA 

2 Ampera
2,4 V po fazi
1,8 stepeni/korak

Ovi podaci su ispisani na nalepnici.
Nisam mogao da nadjem konkretno specifikaciju za te motore.
Koliko vidim na slikama imaju 4 zice.
Detaljnije informacije cu dobiti sutra.
Cena je mnogo povoljna.
Sta vi mislite ?
Reply
#50
Nasao sam kod za servo motor , ubacio na arduino radi kako treba.
Ali kod je pravljen tako da arduino prima signal od nekog glavnog  kontrolera (step dir).
Planiram da kupim jos jedan arduino nano ,da bi mogo da upravlja ovaj prvi .


Attached Files Thumbnail(s)


.zip   servo_kontrola.zip (Size: 2,81 KB / Downloads: 5)
Reply
#51
Može i ovaj kod da se prepravi pa da ne dodaješ još jedan arduino. Pitanje je samo kako želiš da upravljaš.
Nisam detaljno pogledao kod ali mi se čini da možeš da ga upravljaš i sa serijskog porta računara.
Vidi šta kaže:
"Serial input can be used to feed a new location for the servo"
Reply
#52
Necu da komplikujem ,a i ne znam kako to sam da uradim .
Mislim da se ne isplati trositi vreme za 370 dinara koliko kosta arduino nano.

Cela masina treba da ima jedan dc servo motor , jedan step motor ,2 elektro magneta i jedan rc servo.
I treba da odradi postupak uvek kad pritisnem taster.
Do sada sam sve isprobao pojedinacno i zajedeno sem servo motora za koji treba jos jedan arduino.
Ali ovaj kod za DC servo sigurno radi ,vraca zadatu poziciju kada okrenem rukom osovinu .



Kupio sam pre par dana ovaj steper motor .


Attached Files Thumbnail(s)

Reply
#53
Drugari imam problem , ne znam kako da nastelujem PID za servo motor.
Motor radi okrece koliko mu stepa zadam ali kad stane ima ima luft oko 5 stepeni
Koliko sam razumeo treba da se nasteluju:

eeput(kp,0);
  eeput(ki,4);
  eeput(kd,8);

Smanjivao sam vrednosti do 1 i cini mi se da ima manje luft .
Ali opet ima , i na 10 ponavljanja imam odstupanja...




Code:
/* This one is not using any PinChangeInterrupt library */

/*
  This program uses an Arduino for a closed-loop control of a DC-motor.
  Motor motion is detected by a quadrature encoder.
  Two inputs named STEP and DIR allow changing the target position.
  Serial port prints current position and target position every second.
  Serial input can be used to feed a new location for the servo (no CR LF).
 
  Pins used:
  Digital inputs 2 & 8 are connected to the two encoder signals (AB).
  Digital input 3 is the STEP input.
  Analog input 0 is the DIR input.
  Digital outputs 9 & 10 control the PWM outputs for the motor (I am using half L298 here).


  Please note PID gains kp, ki, kd need to be tuned to each different setup.
*/
#include <EEPROM.h>
#include <PID_v1.h>
#define encoder0PinA  2 // PD2;
#define encoder0PinB  8  // PC0;
#define M1            9
#define M2            10  // motor's PWM outputs

byte pos[1000]; int p=0;

double kp=3,ki=0,kd=0.0;
double input=0, output=0, setpoint=0;
PID myPID(&input, &output, &setpoint,kp,ki,kd, DIRECT);
volatile long encoder0Pos = 0;
boolean auto1=false, auto2=false,counting=false;
long previousMillis = 0;        // will store last time LED was updated

long target1=0;  // destination location at any moment

//for motor control ramps 1.4
bool newStep = false;
bool oldStep = false;
bool dir = false;
byte skip=0;

// Install Pin change interrupt for a pin, can be called multiple times
void pciSetup(byte pin)
{
   *digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin));  // enable pin
   PCIFR  |= bit (digitalPinToPCICRbit(pin)); // clear any outstanding interrupt
   PCICR  |= bit (digitalPinToPCICRbit(pin)); // enable interrupt for the group
}

void setup() {
 pinMode(encoder0PinA, INPUT);
 pinMode(encoder0PinB, INPUT);  
 pciSetup(encoder0PinB);
 attachInterrupt(0, encoderInt, CHANGE);  // encoder pin on interrupt 0 - pin 2
 attachInterrupt(1, countStep      , RISING);  // step  input on interrupt 1 - pin 3
 TCCR1B = TCCR1B & 0b11111000 | 1; // set 31Kh PWM
 Serial.begin (115200);
 help();
 recoverPIDfromEEPROM();
 //Setup the pid
 myPID.SetMode(AUTOMATIC);
 myPID.SetSampleTime(1);
 myPID.SetOutputLimits(-255,255);
}

void loop(){
   input = encoder0Pos;
   setpoint=target1;
   while(!myPID.Compute()); // wait till PID is actually computed
   if(Serial.available()) process_line(); // it may induce a glitch to move motion, so use it sparingly
   pwmOut(output);
   if(auto1) if(millis() % 3000 == 0) target1=random(2000); // that was for self test with no input from main controller
   if(auto2) if(millis() % 1000 == 0) printPos();
   //if(counting && abs(input-target1)<15) counting=false;
   if(counting &&  (skip++ % 5)==0 ) {pos[p]=encoder0Pos; if(p<999) p++; else counting=false;}
}

void pwmOut(int out) {
  if(out<0) { analogWrite(M1,0); analogWrite(M2,abs(out)); }
  else { analogWrite(M2,0); analogWrite(M1,abs(out)); }
 }

const int QEM [16] = {0,-1,1,2,1,0,2,-1,-1,2,0,1,2,1,-1,0};               // Quadrature Encoder Matrix
static unsigned char New, Old;
ISR (PCINT0_vect) { // handle pin change interrupt for D8
 Old = New;
 New = (PINB & 1 )+ ((PIND & 4) >> 1); //
 encoder0Pos+= QEM [Old * 4 + New];
}

void encoderInt() { // handle pin change interrupt for D2
 Old = New;
 New = (PINB & 1 )+ ((PIND & 4) >> 1); //
 encoder0Pos+= QEM [Old * 4 + New];
}


void countStep(){ if (PINC&B0000001) target1--;else target1++; } // pin A0 represents direction

void process_line() {
char cmd = Serial.read();
if(cmd>'Z') cmd-=32;
switch(cmd) {
 case 'P': kp=Serial.parseFloat(); myPID.SetTunings(kp,ki,kd); break;
 case 'D': kd=Serial.parseFloat(); myPID.SetTunings(kp,ki,kd); break;
 case 'I': ki=Serial.parseFloat(); myPID.SetTunings(kp,ki,kd); break;
 case '?': printPos(); break;
 case 'X': target1=Serial.parseInt(); p=0; counting=true; for(int i=0; i<300; i++) pos[i]=0; break;
 case 'T': auto1 = !auto1; break;
 case 'A': auto2 = !auto2; break;
 case 'Q': Serial.print("P="); Serial.print(kp); Serial.print(" I="); Serial.print(ki); Serial.print(" D="); Serial.println(kd); break;
 case 'H': help(); break;
 case 'W': writetoEEPROM(); break;
 case 'K': eedump(); break;
 case 'R': recoverPIDfromEEPROM() ; break;
 case 'S': for(int i=0; i<p; i++) Serial.println(pos[i]); break;
}
while(Serial.read()!=10); // dump extra characters till LF is seen (you can use CRLF or just LF)
}

void printPos() {
 Serial.print(F("Position=")); Serial.print(encoder0Pos); Serial.print(F(" PID_output=")); Serial.print(output); Serial.print(F(" Target=")); Serial.println(setpoint);
}
void help() {
Serial.println(F("\nPID DC motor controller and stepper interface emulator"));
Serial.println(F("by misan"));
Serial.println(F("Available serial commands: (lines end with CRLF or LF)"));
Serial.println(F("P123.34 sets proportional term to 123.34"));
Serial.println(F("I123.34 sets integral term to 123.34"));
Serial.println(F("D123.34 sets derivative term to 123.34"));
Serial.println(F("? prints out current encoder, output and setpoint values"));
Serial.println(F("X123 sets the target destination for the motor to 123 encoder pulses"));
Serial.println(F("T will start a sequence of random destinations (between 0 and 2000) every 3 seconds. T again will disable that"));
Serial.println(F("Q will print out the current values of P, I and D parameters"));
Serial.println(F("W will store current values of P, I and D parameters into EEPROM"));
Serial.println(F("H will print this help message again"));
Serial.println(F("A will toggle on/off showing regulator status every second\n"));
}

void writetoEEPROM() { // keep PID set values in EEPROM so they are kept when arduino goes off
 eeput(kp,0);
 eeput(ki,4);
 eeput(kd,8);
 double cks=0;
 for(int i=0; i<12; i++) cks+=EEPROM.read(i);
 eeput(cks,12);
 Serial.println("\nPID values stored to EEPROM");
 //Serial.println(cks);
}

void recoverPIDfromEEPROM() {
 double cks=0;
 double cksEE;
 for(int i=0; i<12; i++) cks+=EEPROM.read(i);
 cksEE=eeget(12);
 //Serial.println(cks);
 if(cks==cksEE) {
   Serial.println(F("*** Found PID values on EEPROM"));
   kp=eeget(0);
   ki=eeget(4);
   kd=eeget(8);
   myPID.SetTunings(kp,ki,kd);
 }
 else Serial.println(F("*** Bad checksum"));
}

void eeput(double value, int dir) { // Snow Leopard keeps me grounded to 1.0.6 Arduino, so I have to do this :-(
 char * addr = (char * ) &value;
 for(int i=dir; i<dir+4; i++)  EEPROM.write(i,addr[i-dir]);
}

double eeget(int dir) { // Snow Leopard keeps me grounded to 1.0.6 Arduino, so I have to do this :-(
 double value;
 char * addr = (char * ) &value;
 for(int i=dir; i<dir+4; i++) addr[i-dir]=EEPROM.read(i);
 return value;
}

void eedump() {
for(int i=0; i<16; i++) { Serial.print(EEPROM.read(i),HEX); Serial.print(" "); }Serial.println();
}
Reply
#54
(10-21-2016, 04:45 PM)uki122 Wrote: Drugari imam problem , ne znam kako da nastelujem PID za servo motor.
Motor radi okrece koliko mu stepa zadam ali kad stane ima ima luft oko 5 stepeni

He He ...
samo sam čekao kad ćeš postaviti ovo pitanje ...

***
E vidiš, to je jedan od razloga zašto početnici beže od serva.
Odgovor nije NIMALO jednostavan, i trebala bi posebna tema o tome ...

:::::

Treba prvo da savladaš osnove PID regulacije
- Da tačno znaš čemu služe i šta se menja sa promenom P, I, D parametra

Pa onda tek na neku metodu za podešavanje.

Jedna od najpozantijih i najviše upotrebljavanih je :

Ziegler - Nichols metoda.

https://www.automatika.rs/baza-znanja/te...todom.html
http://www.riteh.uniri.hr/zav_katd_sluz/...RT_LV9.pdf
https://www.fer.hr/_download/repository/...anja_3.pdf
http://www.elitesecurity.org/t481393-1

I milion drugih linkova ...

=================

Moraš DEBELO ZAGREJATI STOLICU, da bi ovo savladao ...


P.S.
Sve što ću ti reći oko ovoga, je da za početak ostaviš samo P dejstvo (proporcionalno)
Integralno i Diferencijalno dejstvo isključi ( upiši nulu )
I tako si umesto PID dobio samo P regulator (proporcionalni)
Takoi se igraj, pa ćeš nešto - videti - uočiti itd ...

Za ostatak priče, - ne gine ti mnooogooo učenja ..

Pozz
Reply
#55
Proucicu to dobro imam dosta vremena.
Za pocetak sam podesio P parametar i to radi kako treba , smanjio se luft.


Da li je mnogo komplikovano da se code prepravi za PIC mikrokontrolere?
Reply
#56
Uki, dobio si KECA ko vrata !!!

Čuj njega : LUFT kod PID regulacije ...
Luft postoji ili ne postoji kada probavaš nove cipele, itd ...

***************

Kod PID regulacije postoji samo greška regulacije koja predstavlja razliku izmedju SP(set point) i PV(process variable).
Koliko pojačaš pomenutu grešku, toliki izlaz u rasponu od 0 do 100% imaš na izlazu regulatora.

To "koliko ćeš je pojačati" zavisi od tebe i to je P dejstvo ( proporcionalno )

Dalje, pošto P sam po sebi ne može napraviti na kraju grešku u regulaciji bez ikakvog ostatka, (jer ni u teoriji ne
bi funkcionisao bez te preostale greške) nastupa I (integralno dejstvo) koje u zadatom vremenu ima funkciju da
iskoriguje grešku preostalu od dejstva P regulatora. I će dejstvovati (brže ili sporije) sve dok konačno greška
u poziciji DC serva ne bude tačno nula.

D dejstvo (diferencijalno) kod DC serva služi za "kočenje", jer ako se P namesti tako da samo po sebi
nema premašaja, odnosno da D dejstvo nema funkciju ili je isključeno, onda će brzina odziva biti spora.
Zato je pojačanje nešo veće a onda D dejstvo "napravi aktivno kočenje" DC motora.

Inače D dejstvo služi za korekciju naglih promena u sistemu, jer bez njega bi odziv na naglu promenu bio spor.
Tada D naglo "cimne" na koju stranu treba a zatim POLAKO vrati početnu vrednost.
(kao kad voziš auto pa uočiš rupu, - naglo cimneš da je izbegneš a onda polako vraćaš volan ...)

****
Sve je ovo prelepo objašnjeno u tekstovima ( ima ih mnogo i na Srpskom) o Ziegler - Nichols metodi podešavanja
PID petlje ...

I još jednu stvar na kraju, a što je veoma bitno !

NIKO ne može podesiti PID parametre ako nije prisutan direktno na sistemu regulacije.

PID se podešava tek kada je motor zakačen na svu potrebnu mehaniku, jer će bilo kakva promena
u sistemu razdesiti optimalno podešenu regulaciju.

Znači posle podešavanja PID-a nema više promena na celom sistemu, počevši od napajanja drajvera
pa do mehanike(promena težine neke komponente itd..)

Ako se bilo šta menja- sledi OBAVEZNO ponovno podešavanje PID parametara !

****
Svega sam se nagledao i naslušao do sada...
Na oglasima "LIK" prodaje u kompletu DC Servo motor i drajver sa "unapred podešenim PID parametrima"
(kako on kaže: Servo je unapred "programiran", da kupac više nema nikakvih problema i samo ugradi na mašinu ...)

Pozz
Reply
#57
Jedan zanimljiv pokazni primer PID regulacije i kako se prakticno ponasa P, I i D parametar.

https://www.youtube.com/watch?v=jx_GNDAaDyg
Reply
#58
Tako je Miki,

Na snimku od 1:13 pa do 1:30 se lepo vidi kako treba biti podešen P parametar (ako se kasnije koristi D dejstvo)
- odnosno, vide se PRIGUŠENE oscilacije pri pravilno podešenim P parametrom po ZN metodi ...

Pozz
Reply
#59
PID algoritam je malkice slozen u teoriji i u analognoj izradi, u digitaliji se dosta lakse barata tim parametrima.
U sustini se podesavaju PID parametri da se dobije sto bolji pravougaoni odziv na step pobudni signal, bez oscilacija i overshot-a. Po ZN metodi se mogu dobiti neke pocetne vrednosti ali prakticno i njih treba fino ustelovati.
Zgodno je kada se jednom savlada PID regulacioni algoritam to se moze koristiti za bilo koju namenu, odrzavanja napona, struje, brzine, temperature i td.
Reply
#60
Uki,

Obrati pažnju na to da vrednosti PID parametara ne moraju biti celobrojne (double je tip ove tri promenljive). I nadam se da si za testiranje povezao taj tvoj arduino servo kontroler na PC jer ti je to brža i lakša varijanta.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)