V današnjem vodniku bomo razložili, kako ugotoviti, kolikšno silo linearni aktuator izvaja, tako da spremljamo količino toka, ki ga porablja. To bo eden naših zahtevnejših vodnikov in zahteval bo nekaj kompleksnega kodiranja, kalibriranja in programiranja. Obravnavali bomo nadzor analognega vhoda in kako uporablja svoje funkcije. Za ta projekt bomo uporabili MegaMoto Plus, linearni aktuator (uporabljamo naš PA-14 mini aktuator), Arduino Uno in napajalnik z vsaj 12 V.

Najprej moramo opraviti ožičenje in vse povezati. Začnite tako, da MegaMoto priključite na Arduino – enostavno postavite MegaMoto na vrh ploščice Uno. Nato povežite vodnik s priključka BAT+ na MegaMoto na pin Vin na Uno.

Zdaj moramo povezati vodnika linearnega aktuatorja na priključka A in B na MegaMoto ter priključiti 12V napajalnik na BAT+ in GND na BAT-. Povezati moramo tudi dve tipki za upravljanje, vsako med neuporabljen pin in GND. Priporočamo, da tipki povežete na brezspajkalno ploščico (breadboard).

Zdaj je čas za nekaj kodiranja z Arduino Uno. Tipke želimo programirati tako, da nadzirajo, kdaj se bo aktuator iztegnil in uvlekel. Tok se začne spremljati, ko se aktuator iztegne, kar nam omogoči opazovati, ali preseže največjo mejo toka ali ne. Če mejo preseže, se bo aktuator samodejno ustavil, dokler ne izberete uvleka. Ker imajo motorji v aktuatorjih ob prvem vklopu veliko konico toka, bo koda, ki jo vnesemo, imela kratko zakasnitev, preden začne spremljati tok. Ta koda zna prebrati, kdaj je aktuator dosegel svoja končna stikala – to je takrat, ko tok pade na 0.
const int EnablePin = 8;
const int PWMPinA = 11;
const int PWMPinB = 3; // pini za Megamoto
const int buttonLeft = 4;
const int buttonRight = 5;// tipki za premikanje motorja
const int CPin1 = A5; // povratna zveza motorja
int leftlatch = LOW;
int rightlatch = LOW;// zapahi motorja (za logiko kode)
int hitLimits = 0;// začni pri 0
int hitLimitsmax = 10;// vrednosti za prepoznavo, ali so meje hoda dosežene
longlastfeedbacktime = 0; // mora biti tipa long, sicer pride do prekoračitve
int firstfeedbacktimedelay = 750; // prva zakasnitev za ignoriranje konice toka
int feedbacktimedelay = 50; // zamik med cikli povratne zveze; kako pogosto naj se preverja motor
currentTimefeedback = 0; // mora biti tipa long, sicer pride do prekoračitve unceTime = 300; // količina za odpravljanje drhtenja tipk (debounce); nižje vrednosti naredijo tipke občutljivejšelong lastButtonpress = 0; // časovnik za odpravljanje drhtenja
long currentTimedebounce = 0;
int CRaw = 0; // vhodna vrednost za meritve toka
int maxAmps = 0; // mejna vrednost za izklop
bool dontExtend = false;
bool firstRun = true;
bool fullyRetracted = false;// programska logika
void setup()
{
Serial.begin(9600);
pinMode(EnablePin, OUTPUT);
pinMode(PWMPinA, OUTPUT);
pinMode(PWMPinB, OUTPUT);// Nastavi izhode motorja
pinMode(buttonLeft, INPUT);
pinMode(buttonRight, INPUT);// tipke
digitalWrite(buttonLeft, HIGH);
digitalWrite(buttonRight, HIGH);// omogoči notranje pullupe
pinMode(CPin1, INPUT);// nastavi vhod povratne zveze
currentTimedebounce = millis();
currentTimefeedback = 0;// nastavi začetne čase
maxAmps = 15;// NASTAVITE MAKSIMALNI TOK TUKAJ
}//end setup
void loop()
{
latchButtons();// preveri tipke, ali se moramo premakniti
moveMotor();// preveri zapaha, premakni motor navzven ali navznoter
}//end main loop
void latchButtons()
{
if (digitalRead(buttonLeft)==LOW)// levo je naprej
{
currentTimedebounce = millis() - lastButtonpress;// preveri čas od zadnjega pritiska
if (currentTimedebounce > debounceTime && dontExtend == false)// ko se sproži dontExtend, ignoriraj vse pritiske za naprej
{
leftlatch = !leftlatch;// če se motor premika, ustavi; če stoji, začni premikfirstRun = true;// nastavi zastavico firstRun, da ignoriraš konico toka
fullyRetracted = false; // ko se premakneš naprej, nisi več popolnoma uvlečen
lastButtonpress = millis();// shrani čas zadnjega pritiska tipke
return;
}//end if
}//end btnLEFT
if (digitalRead(buttonRight)==LOW)// desno je nazaj
{
currentTimedebounce = millis() - lastButtonpress;// preveri čas od zadnjega pritiska
if (currentTimedebounce > debounceTime)
{
rightlatch = !rightlatch;// če se motor premika, ustavi; če stoji, začni premik
firstRun = true;// nastavi zastavico firstRun, da ignoriraš konico toka
lastButtonpress = millis();// shrani čas zadnjega pritiska tipke
return;
}//end if
}//end btnRIGHT
}//end latchButtons
void moveMotor()
{
if (leftlatch == HIGH) motorForward(255); // hitrost = 0–255
if (leftlatch == LOW) motorStop();
if (rightlatch == HIGH) motorBack(255); // hitrost = 0–255
if (rightlatch == LOW) motorStop();
}//end moveMotor
void motorForward(int speeed)
{
while (dontExtend == false && leftlatch == HIGH)
{
digitalWrite(EnablePin, HIGH);
analogWrite(PWMPinA, speeed);
analogWrite(PWMPinB, 0);// premakni motor
if (firstRun == true) delay(firstfeedbacktimedelay); // večja zakasnitev za ignoriranje konice toka
else delay(feedbacktimedelay); // kratka zamuda za doseganje hitrosti
getFeedback();
firstRun = false;
latchButtons();// ponovno preveri tipke
}//end while
}//end motorForward
void motorBack (int speeed)
{
while (rightlatch == HIGH)
{
digitalWrite(EnablePin, HIGH);
analogWrite(PWMPinA, 0);
analogWrite(PWMPinB, speeed);// premakni motor
if (firstRun == true) delay(firstfeedbacktimedelay);// večja zakasnitev za ignoriranje konice toka
else delay(feedbacktimedelay); // kratka zamuda za doseganje hitrosti
getFeedback();
firstRun = false;
latchButtons();// ponovno preveri tipke
}//end while
dontExtend = false;// dovoli, da se motor ponovno iztegne, potem ko je bil uvlečen
}//end motorBack
void motorStop()
{
analogWrite(PWMPinA, 0);
analogWrite(PWMPinB, 0);
digitalWrite(EnablePin, LOW);
firstRun = true;// ko se motor ustavi, ponovno omogoči firstRun, da upošteva zagonske konice toka
}//end stopMotor
void getFeedback()
{
CRaw = analogRead(CPin1); // Preberi tok
if (CRaw == 0 && hitLimits < hitLimitsmax) hitLimits = hitLimits + 1;
else hitLimits = 0; // preveri, ali je motor na mejah in ali se je tok ustavil
if (hitLimits == hitLimitsmax && rightlatch == HIGH)
{
rightlatch = LOW; // ustavi motor
fullyRetracted = true;
}//end if
else if (hitLimits == hitLimitsmax && leftlatch == HIGH)
{
leftlatch = LOW;// ustavi motor
hitLimits = 0;
}//end if
if (CRaw > maxAmps)
{
dontExtend = true;
leftlatch = LOW; // ustavi, če je povratna zveza nad maksimumom
}//end if
lastfeedbacktime = millis();// shrani prejšnji čas za prejem povratne zveze
}//end getFeedback
Novi in izboljšani PA-01 mini aktuator (nadgradnja PA-14) je naš trenutni model z vrsto dodatnih prednosti. Za primerjavo si oglejte spodnje tabele in nadgradite brez skrbi!
|
|
PA-01 |
PA-14 |
|
Možnosti dinamične obremenitve |
16, 28, 56, 112, 169, 225 lbs |
35, 50, 75, 110, 150 lbs |
|
Največja obremenitev |
225 lbs |
150 lbs |
|
Največja hitrost |
3.54 "/sec |
2.00"/sec |
|
Razred zaščite IP |
IP65 |
IP54 |
|
Možnosti hoda |
1" to 40" |
1" to 40" |
|
Povratna zveza Hallovega učinka |
Neobvezno |
Ne |
S to osnovno kodo boste uspešno spremljali povratno zvezo svojega linearnega aktuatorja. V 2. delu bomo podrobneje razložili, kako koda deluje in kako jo prilagoditi po svojih željah. Upamo, da vam je bil prispevek v pomoč – v naslednjih tednih ostanite z nami za 2. del. Če želite naročiti katerega od sklopov, uporabljenih v tem primeru, ali želite izvedeti več o naših izdelkih, nas prosimo kontaktirajte.