Bugünkü rehberde, bir lineer aktüatörün uyguladığı kuvveti, kullandığı Akım miktarını izleyerek nasıl tespit edebileceğimizi ele alacağız. Bu, daha ileri düzey rehberlerimizden biri olacak ve bazı karmaşık kodlama, kalibrasyon ve programlama gerektirecektir. Analog girişin izlenmesini ve fonksiyonlarını nasıl kullandığını kapsayacağız. Bu proje için bir MegaMoto Plus, bir lineer aktüatör (biz PA-14 mini aktüatörümüzü kullanıyoruz), bir Arduino Uno ve en az 12V'luk bir güç kaynağı kullanacağız.

Başlamak için her şeyi birbirine bağlayacak kablolamayı yapmamız gerekiyor. MegaMoto'yu Arduino'ya takarak başlayın; bunu yapmak için MegaMoto'yu Uno'nun üzerine yerleştirmeniz yeterlidir. Ardından MegaMoto üzerindeki BAT+ terminalinden Uno üzerindeki Vin pinine bir kablo bağlayın.

Şimdi lineer aktüatörlerin kablolarını MegaMoto üzerindeki A ve B terminallerine, 12V güç kaynağını da BAT+'a ve GND'yi BAT-'a bağlamamız gerekiyor. Kontrol için iki düğmeyi de, her birini kullanılmayan bir pin ile GND arasına bağlayarak kablolamamız gerekecek. Düğmeleri bir breadboard üzerine bağlamanızı öneririz.

Şimdi Arduino Uno ile biraz kodlama zamanı. Düğmeleri, aktüatörün ne zaman uzayıp geri çekileceğini kontrol edebilecek şekilde programlamak istiyoruz. Aktüatör uzadıktan sonra Akım izlenmeye başlayacak ve bu da maksimum akım sınırını aşıp aşmadığını gözlemlememizi sağlayacak. Sınırı aşarsa, geri çekmeyi seçene kadar aktüatör otomatik olarak duracaktır. Aktüatörlerin içindeki motorların ilk enerjilendirildiğinde büyük bir akım tepesine sahip olduğunu dikkate alarak, girdiğimiz kod, Akımı izlemeye başlamadan önce kısa bir gecikme içerecektir. Bu kod, aktüatör limit anahtarlarına ulaştığında (Akımın 0'a düştüğü an) bunu okuyabilecektir.
const int EnablePin = 8;
const int PWMPinA = 11;
const int PWMPinB = 3; // pins for Megamoto
const int buttonLeft = 4;
const int buttonRight = 5;//buttons to move the motor
const int CPin1 = A5; // motor feedback
int leftlatch = LOW;
int rightlatch = LOW;//motor latches (used for code logic)
int hitLimits = 0;//start at 0
int hitLimitsmax = 10;//values to know if travel limits were reached
longlastfeedbacktime = 0; // must be long, else it overflows
int firstfeedbacktimedelay = 750; //first delay to ignore current spik
int feedbacktimedelay = 50; //delay between feedback cycles, how often you want the motor to be checked
currentTimefeedback = 0; // must be long, else it overflows unceTime = 300; //amount to debounce buttons, lower values makes the buttons more sensitivelong lastButtonpress = 0; // timer for debouncing
long currentTimedebounce = 0;
int CRaw = 0; // input value for current readings
int maxAmps = 0; // trip limit
bool dontExtend = false;
bool firstRun = true;
bool fullyRetracted = false;//program logic
void setup()
{
Serial.begin(9600);
pinMode(EnablePin, OUTPUT);
pinMode(PWMPinA, OUTPUT);
pinMode(PWMPinB, OUTPUT);//Set motor outputs
pinMode(buttonLeft, INPUT);
pinMode(buttonRight, INPUT);//buttons
digitalWrite(buttonLeft, HIGH);
digitalWrite(buttonRight, HIGH);//enable internal pullups
pinMode(CPin1, INPUT);//set feedback input
currentTimedebounce = millis();
currentTimefeedback = 0;//Set initial times
maxAmps = 15;// SET MAX CURRENT HERE
}//end setup
void loop()
{
latchButtons();//check buttons, see if we need to move
moveMotor();//check latches, move motor in or out
}//end main loop
void latchButtons()
{
if (digitalRead(buttonLeft)==LOW)//left is forwards
{
currentTimedebounce = millis() - lastButtonpress;// check time since last press
if (currentTimedebounce> debounceTime && dontExtend == false)//once you've tripped dontExtend, ignore all forwards presses
{
leftlatch = !leftlatch;// if motor is moving, stop, if stopped, start movingfirstRun = true;// set firstRun flag to ignore current spike
fullyRetracted = false; // once you move forwards, you are not fully retracted
lastButtonpress = millis();//store time of last button press
return;
}//end if
}//end btnLEFT
if (digitalRead(buttonRight)==LOW)//right is backwards
{
currentTimedebounce = millis() - lastButtonpress;// check time since last press
if (currentTimedebounce> debounceTime)
{
rightlatch = !rightlatch;// if motor is moving, stop, if stopped, start moving
firstRun = true;// set firstRun flag to ignore current spike
lastButtonpress = millis();//store time of last button press
return;
}//end if
}//end btnRIGHT
}//end latchButtons
void moveMotor()
{
if (leftlatch == HIGH) motorForward(255); //speed = 0-255
if (leftlatch == LOW) motorStop();
if (rightlatch == HIGH) motorBack(255); //speed = 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);//move motor
if (firstRun == true) delay(firstfeedbacktimedelay); // bigger delay to ignore current spike
else delay(feedbacktimedelay); //small delay to get to speed
getFeedback();
firstRun = false;
latchButtons();//check buttons again
}//end while
}//end motorForward
void motorBack (int speeed)
{
while (rightlatch == HIGH)
{
digitalWrite(EnablePin, HIGH);
analogWrite(PWMPinA, 0);
analogWrite(PWMPinB, speeed);//move motor
if (firstRun == true) delay(firstfeedbacktimedelay);// bigger delay to ignore current spike
else delay(feedbacktimedelay); //small delay to get to speed
getFeedback();
firstRun = false;
latchButtons();//check buttons again
}//end while
dontExtend = false;//allow motor to extend again, after it has been retracted
}//end motorBack
void motorStop()
{
analogWrite(PWMPinA, 0);
analogWrite(PWMPinB, 0);
digitalWrite(EnablePin, LOW);
firstRun = true;//once the motor has stopped, reenable firstRun to account for startup current spikes
}//end stopMotor
void getFeedback()
{
CRaw = analogRead(CPin1); // Read current
if (CRaw == 0 && hitLimits < hitLimitsmax) hitLimits = hitLimits + 1;
else hitLimits = 0; // check to see if the motor is at the limits and the current has stopped
if (hitLimits == hitLimitsmax && rightlatch == HIGH)
{
rightlatch = LOW; // stop motor
fullyRetracted = true;
}//end if
else if (hitLimits == hitLimitsmax && leftlatch == HIGH)
{
leftlatch = LOW;//stop motor
hitLimits = 0;
}//end if
if (CRaw> maxAmps)
{
dontExtend = true;
leftlatch = LOW; //stop if feedback is over maximum
}//end if
lastfeedbacktime = millis();//store previous time for receiving feedback
}//end getFeedback
Yeni ve geliştirilmiş PA-01 mini aktüatör (PA-14 yükseltmesi), çeşitli ek avantajlarla sunduğumuz mevcut modeldir. Karşılaştırma için aşağıdaki tablolara göz atın ve gönül rahatlığıyla yükseltin!
|
| PA-01 | PA-14 |
| Dinamik Yük seçenekleri | 16, 28, 56, 112, 169, 225 lb | 35, 50, 75, 110, 150 lb |
| En yüksek yük | 225 lb | 150 lb |
| En yüksek Hız | 3,54 inçç/s | 2,00 inçç/s |
| IP derecesi | IP65 | IP54 |
| Vuruş mesafesi seçenekleri | 1 inç to 40 inç | 1 inç to 40 inç |
| Hall etkisi geri beslemesi | İsteğe bağlı | Hayır |
Bu temel kod ile lineer aktüatörünüzün geri beslemesini başarıyla izleyeceksiniz. Bölüm II’de kodun nasıl çalıştığını ve ihtiyaçlarınıza göre nasıl düzenleyebileceğinizi daha detaylı ele alacağız. Umarız bu yazıyı faydalı bulmuşsunuzdur; önümüzdeki haftalarda gelecek Bölüm II için bizi takipte kalın. Bu örnekte kullandığımız birimlerden herhangi birini sipariş etmek veya ürünlerimiz hakkında daha fazla bilgi almak isterseniz lütfen bizimle iletişime geçin.