اس مثال میں ہم یہ ظاہر کریں گے کہ فرجیلی کے فیڈبیک راڈ ایکٹیو ایٹر کے سگنل کو پڑھنے کے لئے کس طرح ارڈینو کا استعمال کیا جائے اور اسے دوری کی پیمائش میں تبدیل کیا جائے کہ چھڑی کو کس حد تک بڑھایا گیا ہے۔ اس ٹیوٹوریل ٹیوٹوریل میں زیربحث اصولوں پر روشنی ڈالتی ہے۔ایک ارڈینو کے ساتھ موٹر ڈرائیور اسپیڈ کنٹرول"، ہم جاری رکھنے سے پہلے اس ٹیوٹوریل کا جائزہ لینے کا مشورہ دیتے ہیں۔
نوٹ: یہ ٹیوٹوریل بنیادی الیکٹرانک اصولوں ، ارڈینوو ہارڈویئر اور سافٹ وئیر کے ساتھ پہلے جانکاری حاصل کرتا ہے۔ اگر یہ آپ کا پہلی بار ارڈینو کا استعمال کرتے ہوئے ہے تو ہم تجویز کرتے ہیں کہ گوگل اور یوٹیوب کی تلاش کے ذریعہ دستیاب بہت سارے بہترین ابتدائی سبق میں سے ایک سے بنیادی باتیں سیکھیں۔ براہ کرم آگاہ رہیں کہ ہمارے پاس کسٹم ایپلی کیشنز کے لئے تکنیکی معاونت فراہم کرنے کے وسائل نہیں ہیں اور عوامی سطح پر دستیاب ٹیوٹوریلز کے باہر ڈیبگ ، ترمیم ، کوڈ یا وائرنگ آریگرام نہیں کریں گے۔
اجزاء
- تاثرات راڈ لکیری ایکٹیویٹر
- 12V بجلی کی فراہمی
- اردوینو
- موٹر ڈرائیور
- بیرونی پوٹینومیٹر (اس سبق کے دوسرے حصے کے لئے)
- کنیکشن بنانے اور آلے کو نچوڑنے یا سولڈرنگ لوہے کے ل Electric بجلی کے تاروں
وائرنگ
پڑھنے کی پوزیشن کے لئے ہارڈ ویئر اور سافٹ ویئر کا جائزہ
سرکٹ کو اوپر کی طرح جمع کریں اور نیچے کوڈ اپ لوڈ کریں۔ آپ کو اپنے مخصوص اسٹروک کی لمبائی کے مطابق کوڈ کی لائن 16 میں ترمیم کرنے کی ضرورت ہوگی ، فی الحال یہ 6 انچ کی رائے راڈ ایکٹیو ایٹر کے لئے مقرر ہے۔
اس پروگرام میں ابتدائی طور پر ایکٹیو ایٹر کو بڑھایا جائے گا اور پوٹینومیٹر (کوڈ کی لائن 27 اور 28) سے کم سے کم اور زیادہ سے زیادہ ینالاگ سینسر پڑھنے کے ل fully ایکٹوچ کو مکمل طور پر واپس لے لیا جائے گا۔ یہ ضروری ہے کیونکہ پوٹینومیٹر ریڈنگ کی حد [0 ، 1023] ہونے کے باوجود ، عملی طور پر اس حد کو کم کیا جاسکتا ہے کیونکہ ایکٹیو ایٹر کے اندر گیئر تناسب کی وجہ سے پوٹینومیٹر مکمل طور پر اپنی حد تک گھومنے سے روکتا ہے۔
اس ابتدائی انشانکن ترتیب کے بعد ، مشغولہ لکیری ایکچوایٹر کی موجودہ توسیع لمبائی (انچوں کی اکائیوں میں) کو ظاہر کرنے والے اعداد و شمار کے ایک دھارے کو مستقل طور پر بڑھا اور واپس لے گا۔
کوڈ
https://gist.github.com/Will-Firgelli/8c78092ca850aa8a50ae36842b97150f/* Firgelli Automations
* Limited or no support: we do not have the resources for Arduino code support
*
* Program enables momentary direction control of actuator using push button
*/
#include <elapsedMillis.h>
elapsedMillis timeElapsed;
int RPWM = 10;
int LPWM = 11;
int sensorPin = A0;
int sensorVal;
int Speed=255;
float strokeLength = 6.0; //customize to your specific stroke length
float extensionLength;
int maxAnalogReading;
int minAnalogReading;
void setup() {
pinMode(RPWM, OUTPUT);
pinMode(LPWM, OUTPUT);
pinMode(sensorPin, INPUT);
Serial.begin(9600);
maxAnalogReading = moveToLimit(1);
minAnalogReading = moveToLimit(-1);
}
void loop(){
Serial.println("Extending...");
sensorVal = analogRead(sensorPin);
while(sensorVal < maxAnalogReading){
driveActuator(1, Speed);
displayOutput();
delay(20);
}
driveActuator(0, Speed);
delay(1000);
Serial.println("Retracting...");
sensorVal = analogRead(sensorPin);
while(sensorVal > minAnalogReading){
driveActuator(-1, Speed);
displayOutput();
delay(20);
}
driveActuator(0, Speed);
delay(1000);
}
int moveToLimit(int Direction){
int prevReading=0;
int currReading=0;
do{
prevReading = currReading;
driveActuator(Direction, Speed);
timeElapsed = 0;
while(timeElapsed < 200){ delay(1);} //keep moving until analog reading remains the same for 200ms
currReading = analogRead(sensorPin);
}while(prevReading != currReading);
return currReading;
}
float mapfloat(float x, float inputMin, float inputMax, float outputMin, float outputMax){
return (x-inputMin)*(outputMax - outputMin)/(inputMax - inputMin)+outputMin;
}
void displayOutput(){
sensorVal = analogRead(sensorPin);
extensionLength = mapfloat(sensorVal, float(minAnalogReading), float(maxAnalogReading), 0.0, strokeLength);
Serial.print("Analog Reading: ");
Serial.print(sensorVal);
Serial.print("\tActuator extension length: ");
Serial.print(extensionLength);
Serial.println(" inches");
}
void driveActuator(int Direction, int Speed){
switch(Direction){
case 1: //extension
analogWrite(RPWM, Speed);
analogWrite(LPWM, 0);
break;
case 0: //stopping
analogWrite(RPWM, 0);
analogWrite(LPWM, 0);
break;
case -1: //retraction
analogWrite(RPWM, 0);
analogWrite(LPWM, Speed);
break;
}
}
پوزیشن کو کنٹرول کرنے کے لئے بیرونی پوٹینومیٹر کا استعمال کرنا
مذکورہ بالا مثال نے یہ ظاہر کیا ہے کہ کس طرح تاثرات راڈ ایکٹیو ایٹر سے ریڈنگ لی جاسکتی ہے ، لیکن کہتے ہیں کہ ہم اداکار کو کسی خاص مقام پر منتقل کرنا چاہتے ہیں ، ہم یہ کیسے کریں؟ ایکیکیوٹر کی مطلوبہ سیٹ پوزیشن کے ل input صارف ان پٹ کے طور پر بیرونی پوٹینومیٹر کا استعمال کرکے مندرجہ ذیل سیکشن اس طرح کی صورتحال پر گامزن ہے۔ عملی طور پر آپ اس شکل میں ترمیم کرسکتے ہیں تاکہ جو بھی شکل آپ چاہیں صارف سے ان پٹ لیں۔
وائرنگ
پوزیشن پر قابو پانے کے لئے ہارڈ ویئر اور سافٹ ویئر کا جائزہ
وائرنگ اس ٹیوٹوریل کے پہلے حصے کی طرح عین سی ہے ، صرف اب ایک بیرونی پوٹینومیٹر ینالاگ پن A1 سے منسلک کیا گیا ہے۔
پروگرام ، ذیل میں ، بیرونی پوٹینومیٹر کے ذریعہ صارف کی مرتب کردہ پوزیشن پر منتقل ہوتا ہے۔ کوڈ کی لائن 18 میں ، بفر متغیر مرتب کیا گیا ہے ، اس کو بعد میں لائنوں 36 اور 39 میں استعمال کیا جاتا ہے۔ بفر متغیر مطلوبہ سیٹ پوزیشن کے ارد گرد ایک حد پیش کرتا ہے جہاں ایکچوایٹر حرکت پذیر ہوجائے گا ، اس کی ضرورت ہے جیسا کہ ان دونوں صلاحیتوں میں سے ایک ہے +/- 2 یونٹوں کے ذریعہ فلوٹائٹ ہونے کا رجحان۔ اس طرح کے طور پر اگر بفر کو شامل نہ کیا گیا ہو تو ایکچیوٹرز تشدد کے ساتھ سیٹ پوزیشن پوزیشن کے گرد کمپن کریں گے۔ اس کو عملی شکل میں دیکھنے کے ل line لائن کو 18 سے صفر میں بفر لگا دیں (ایکٹیوٹرز کو زیادہ دیر تک کمپن نہیں ہونے دیں گے کیونکہ اس سے نقصان ہوسکتا ہے)۔
کوڈ
https://gist.github.com/Will-Firgelli/41ec87433f0aaa1abc33e79168076b3b/* Firgelli Automations
* Limited or no support: we do not have the resources for Arduino code support
*
* Program enables momentary direction control of actuator using push button
*/
#include <elapsedMillis.h>
elapsedMillis timeElapsed;
int RPWM = 10;
int LPWM = 11;
int sensorPin = A0;
int potPin = A1;
int potVal;
int sensorVal;
int Speed = 255;
int Buffer = 4;
int maxAnalogReading;
int minAnalogReading;
void setup() {
pinMode(RPWM, OUTPUT);
pinMode(LPWM, OUTPUT);
pinMode(sensorPin, INPUT);
pinMode(potPin, INPUT);
Serial.begin(9600);
maxAnalogReading = moveToLimit(1);
minAnalogReading = moveToLimit(-1);
}
void loop(){
potVal = map(analogRead(potPin), 0, 1023, minAnalogReading, maxAnalogReading);
sensorVal = analogRead(sensorPin);
if(potVal > (sensorVal+Buffer)){ //addition gives buffer to prevent actuator from rapidly vibrating due to noisy data inputs
driveActuator(1, Speed);
}
else if(potVal < (sensorVal-Buffer)){
driveActuator(-1, Speed);
}
else{
driveActuator(0, Speed);
}
Serial.print("Potentiometer Reading: ");
Serial.print(potVal);
Serial.print("\tActuator reading: ");
Serial.println(sensorVal);
delay(10);
}
int moveToLimit(int Direction){
int prevReading=0;
int currReading=0;
do{
prevReading = currReading;
driveActuator(Direction, Speed);
timeElapsed = 0;
while(timeElapsed < 200){ delay(1);} //keep moving until analog reading remains the same for 200ms
currReading = analogRead(sensorPin);
}while(prevReading != currReading);
return currReading;
}
void driveActuator(int Direction, int Speed){
switch(Direction){
case 1: //extension
analogWrite(RPWM, Speed);
analogWrite(LPWM, 0);
break;
case 0: //stopping
analogWrite(RPWM, 0);
analogWrite(LPWM, 0);
break;
case -1: //retraction
analogWrite(RPWM, 0);
analogWrite(LPWM, Speed);
break;
}
}