Bazen bir lineer aktüatör kullanarak bir proje oluşturduğumuzda, bu mekanizmaların sunduğu avantajlar olmadan çözülemeyecek bir sorunu çözmeye çalışırız. Bazı zamanlarda ise belirli bir görevi otomatikleştirerek kolaylaştırmaya çalışırız. Ama arada bir, sadece yapabildiğimiz için de bir şeyler geliştiririz. Bu proje de onlardan biri.
Bu yazıda, bir ultrasonik sensörü kullanarak bir nesneye olan lineer aktüatör mesafesini nasıl ölçebileceğinizi ve bunu aktüatörün vuruş mesafesi konumunu otomatik olarak değiştirmek için nasıl kullanabileceğinizi ele alacağız. Aklımızda belirli bir uygulama olmadan oluşturulmuş olsa da olasılıklar sınırsız.
İhtiyacınız Olanlar
- 1 x RobotPower MegaMoto Motor Sürücü Shield’ı
- 1 x Arduino Uno
- 1 x Ultrasonik Sensör
- 1 x PA-04-12-400-HS-24 VDC (Hall etkisi geri beslemesine sahip herhangi bir aktüatör olabilir)
- 1 x PS-20-24 (veya en az 6 amper değerinde herhangi bir 24 VDC güç kaynağı)
Kontrol için bir Arduino Uno ve MegaMoto motor sürücüsü kullanıyoruz. Aktüatörümüz PA-04-12-400-HS-24 VDC. Arduino’nun konumu izleyebilmesi için aktüatörün bir tür geri beslemeye sahip olması önemlidir – lineer aktüatör geri besleme kontrolünün herhangi bir türü işe yarayabilir; örneğin potansiyometre geri beslemesi burada da etkili olacaktır. Potansiyometre daha az hassas olur, ancak güç kaybı sonrası bir referans (homing) prosedürü gerektirmemesi avantajını sağlar. Kodun da buna göre uyarlanması gerekir.
Adım 1: Kablolama

Bu proje için kablolama oldukça basittir. Burada PA-04-HS içindeki iki Hall etkisi sensöründen yalnızca birini kullanacağız – hangisi olduğu önemli değil (pin 4 veya 5). Aşağıdaki pin çıkışları, PA-04-HS ile birlikte gelen 6 pinli Molex konnektör içindir:

Aktüatörün 6 pinli konnektöründen Arduino/MegaMoto’ya
- Pin 3 → 5V
- Pin 2 → GND
- Pin 1 → Arduino pin 2
- Pin 4 → MegaMoto üzerindeki A
- Pin 5 → MegaMoto üzerindeki B
Ultrasonik sensör → Arduino/MegaMoto
- VCC → 5V
- GND → GND
- Trig → Pin 8
- Echo → Pin 7
MegaMoto → Güç Kaynağı
- + → V+
- - → V-
Adım 2: Arduino’nun Programlanması
Bu eğitimde kullanılan kod, başka bir yazımızda kullandığımız Hall Effect Sensors 1: Position Control’ün değiştirilmiş bir sürümüdür. Konum kontrolü için Hall etkisi sensörünü nasıl kullandığımızı daha iyi anlamak için bu eğitime göz atabilirsiniz! Ultrasonik sensör, Arduino üzerindeki GPIO pinlerinden biri tarafından tetiklenen bir ultrasonik ping göndererek çalışır. Bu ultrasonik ping, bir nesneden yansıtılır ve alıcı tarafından algılanır. Alıcı pingi algıladığında Arduino’ya bir darbe gönderir. Buradan, iletim ve alım arasındaki süreyi ölçerek lineer aktüatör için mesafeyi hesaplayan bir eşitlik oluşturabilir ve bu ölçümü inçe çevirmek için bir formül kullanabiliriz.
Aktüatörün konumunu belirleme şeklimiz, Hall etkisi sensörünün ürettiği darbe sayısını saymaktır (bu, yukarıda bahsedilen yazıda daha ayrıntılı açıklanmıştır). Vuruş konumunu inç cinsinden belirlemek için, belirli aktüatörümüzün inç başına kaç darbe ürettiğini bulur ve darbe sayımızı bu sayıya böleriz. Ultrasonik sensör ile Hall etkisi sensöründen gelen okumaların her ikisinin de inçe çevrilmiş olması, kodlamayı çok daha temiz ve kolay hale getirir. Buradan, temelde Arduino’ya “nesne x inç uzaktaysa, aktüatörü x inç uzat” demiş oluruz. Aşağıdaki kodu yüklemek, bu lineer aktüatör kontrollü mesafe modelini PA-04-12-400-HS-24 VDC aktüatörlerimizden birine uygulamanızı sağlayacaktır. Bir sonraki adımda, kodda yapılabilecek değişiklikleri ele alacağız.
[code] /* The purpose of this code it to be able to measure the distance of an object and position the stroke of a linear acuator accordingly. * The required components are an Arduion Uno, a PobotPower MegaMoto Driver, and an Ultra sonic sensor. * Written by Progressive Automations 2/02/21 */ #define PWMA0 6 #define PWMB0 5 #define enable0 13 //pins for MegaMoto #define hall0 2 //interrupt pins for hall effect sensors #define echoPin 7 //echo pin on ultra sonic sensor #define trigPin 8 //output on ultra sonic sensor float duration, distance; int enable = 0; //enable pin for megaMoto int count[] = {0}; int currentPos = 0;//current position int threshold = 100;//position tolerance int destination = 0; bool forwards = false; bool backwards = false;// motor states void setup() { pinMode(PWMA0, OUTPUT); pinMode(PWMB0, OUTPUT);//set PWM outputs pinMode(enable0, OUTPUT); digitalWrite(enable0, LOW);//set enable and turn board OFF pinMode(hall0, INPUT); digitalWrite(hall0, LOW);//set hall, set low to start for rising edge attachInterrupt(0, speed0, RISING); //enable the hall effect interupts pinMode(trigPin,OUTPUT); pinMode(echoPin, INPUT); Serial.begin(9600); //homeActuator();//fully retracts actuator Serial.println("READY"); }//end setup void loop() { getDistance();//measure distance of object from ultra sonic sensor currentPos = count[0]; if(distance < 13) //ignore value if greater than stroke length { destination = distance * 275; //translate measured distance (in inches) to desired stroke position (in pulses) } if ((destination>= (currentPos - threshold)) && (destination <= (currentPos + threshold))) stopMoving();//stop acuator if it is in the desired position else if (destination> currentPos) goForwards(); else if (destination < currentPos) goBackwards(); Serial.print("Counts: "); Serial.println(count[0]); Serial.print("currentPos: "); Serial.println(currentPos); Serial.print("Destination: "); Serial.println(destination); }//end loop void speed0() { //Serial.println("Update 1 inç); if (forwards == true) count[0]++; //if moving forwards, add counts else if (backwards == true) count[0]--; //if moving back, subtract counts }//end speed0 /*void ReadInputs() { sw[0] = digitalRead(switch0), sw[1] = digitalRead(switch1);//check switches currentPos = count[0]; }//end read inputs */ void goForwards() { forwards = true; backwards = false; //Serial.println("Moving forwards"); digitalWrite(enable0, HIGH);//enable board //Serial.print(" Speeds "), Serial.print(spd[0]), Serial.print(", "), Serial.print(spd[1]); //Serial.print(" Counts "), Serial.println(count[0]); analogWrite(PWMA0, 255); analogWrite(PWMB0, 0);//apply speeds }//end goForwards void goBackwards() { forwards = false; backwards = true; //Serial.println("Moving backwards"); digitalWrite(enable0, HIGH);//enable board //Serial.print(" Speeds "), Serial.print(spd[0]), Serial.print(", "), Serial.print(spd[1]); //Serial.print(" Counts "), Serial.println(count[0]); analogWrite(PWMA0, 0); analogWrite(PWMB0, 255);//apply speeds }//end goBackwards void stopMoving() { forwards = false; backwards = false; Serial.println("Stopped"); analogWrite(PWMA0, 0); analogWrite(PWMB0, 0);//set speeds to 0 delay(10); digitalWrite(enable0, LOW);//disable board }//end stopMoving void getDistance() { digitalWrite(trigPin, LOW); delayMicroseconds(10); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration/58.2/2.5; Serial.print("Distance:"); Serial.println(distance); } void homeActuator() //fully retract actuator and set count to 0 { goBackwards(); delay(25000);//change this value to the amount of time it takes for the actuator to fully retract count[0] = {0}; } [/code] Adım 3: Kodu Değiştirme
threshold değerinin büyüklüğü, aktüatörün konumunun ultrasonik sensör okumasıyla ne kadar hassas eşleşmesi gerektiğini belirler. Bu değeri artırmak doğruluğu düşürür, azaltmak ise ters etki yapar. Bu değeri 100 olarak ayarlamak, temelde Arduino’ya, Hall etkisi ve ultrasonik sensör darbeleri birbirine 100 darbe içinde olduğu sürece aktüatörü hareket ettirmemesini söylemektir. Bu sayı çok düşük olursa, aktüatör tam doğru konuma ulaşmaya çalışırken sık ve sarsıntılı hareketler yapmasına neden olabilir.

Bu değeri aktüatörünüzün vuruş mesafesine (veya bir inç daha uzununa) değiştirin. Bu, Arduino’ya çok yüksek değerleri görmezden gelmesini söyleyecektir.

Bu değeri aktüatörünüzün darbe/inç değerine değiştirin.

Sonuç
Bu projeyi faydalı – ya da en azından ilginç – bulmanızı içtenlikle umuyoruz! Lütfen bunu dilediğiniz gibi değiştirip kendinize uyarlamaktan çekinmeyin. Her zaman olduğu gibi, bu fikri kullansanız da ürünlerimizle bambaşka bir şey oluştursanız da sahip olduğunuz ilgili projeleri görmekten mutluluk duyarız! Bize sales@progressiveautomations.com adresinden e-posta ile veya 1-800-676-6123 numaralı telefondan da ulaşabilirsiniz.