এই উদাহরণে আমরা ফিরগেলির ফিডব্যাক রড অ্যাকুয়েটরের কাছ থেকে সংকেতটি পড়তে আরডুইনো কীভাবে ব্যবহার করব এবং রডটি কতদূর বাড়ানো হয়েছে তার দূরত্ব পরিমাপে রূপান্তর করব example এই টিউটোরিয়াল টিউটোরিয়ালে আলোচিত নীতিগুলির উপর ভিত্তি করে "একটি আরডুইনো সহ মোটর চালকের গতি নিয়ন্ত্রণ”, আমরা চালিয়ে যাওয়ার আগে এই টিউটোরিয়ালটি পর্যালোচনা করার পরামর্শ দিই।
দ্রষ্টব্য: এই টিউটোরিয়ালটি প্রাথমিক বৈদ্যুতিন নীতিগুলি, আরডুইনো হার্ডওয়্যার এবং সফ্টওয়্যার সহ পূর্ববর্তী জ্ঞান ধারণ করে। যদি এটি আপনার প্রথমবারের মতো আরডুইনো ব্যবহার করে থাকে তবে আমরা গুগল এবং ইউটিউব অনুসন্ধানের মাধ্যমে উপলব্ধ অনেক দুর্দান্ত প্রাথমিক টিউটোরিয়ালগুলির মধ্যে একটি থেকে বেসিকগুলি শিখার পরামর্শ দিই। দয়া করে সচেতন হন যে আমাদের কাছে কাস্টম অ্যাপ্লিকেশনগুলির জন্য প্রযুক্তিগত সহায়তা দেওয়ার সংস্থান নেই এবং এই সর্বজনীনভাবে উপলব্ধ টিউটোরিয়ালের বাইরে ডিবাগ, সম্পাদনা, কোড বা তারের ডায়াগ্রামগুলি করব না।
উপাদান
- প্রতিক্রিয়া রড লিনিয়ার অ্যাক্টিভেটর
- 12 ভি বিদ্যুৎ সরবরাহ
- আরডুইনো
- মোটর ড্রাইভার
- বাহ্যিক সম্ভাবনাময়কারী (এই টিউটোরিয়ালের দ্বিতীয় অংশের জন্য)
- সংযোগ তৈরির জন্য বৈদ্যুতিক তারগুলি এবং সরঞ্জাম বা সোল্ডারিং লোহা ক্রিম্পিংয়ের জন্য
তারের
পড়ার অবস্থানের জন্য হার্ডওয়্যার ও সফ্টওয়্যার ওভারভিউ
উপরের মতো সার্কিটটি সংগ্রহ করুন এবং নীচের কোডটি আপলোড করুন। কোডের 16 টি লাইনটি আপনার নির্দিষ্ট স্ট্রোকের দৈর্ঘ্যে পরিবর্তন করতে হবে, এটি বর্তমানে 6 ইঞ্চির প্রতিক্রিয়া রড অ্যাকুয়েটরের জন্য সেট করা আছে।
এই প্রোগ্রামটি প্রোটিনোমিটার (কোডের ২ 27 এবং ২৮ লাইন) থেকে সর্বনিম্ন এবং সর্বাধিক এনালগ সেন্সর পঠন সন্ধানকারীকে প্রারম্ভিকভাবে প্রসারিত এবং সম্পূর্ণরূপে প্রত্যাহার করবে। এটি প্রয়োজনীয় কারণ পেন্টিওমিটার রিডিংগুলির পরিসীমা [0, 1023] হওয়া সত্ত্বেও বাস্তবে পেন্টিওমিটারকে তার সীমাতে পুরোপুরি ঘোরানো থেকে বিরত রাখার জন্য অ্যাক্টুয়েটারের অভ্যন্তরে গিয়ার অনুপাতের কারণে এই পরিসরটি হ্রাস হতে পারে।
এই প্রাথমিক ক্রমাঙ্কন ক্রম অনুসরণ করে ক্রিয়াকলাপর ধারাবাহিকভাবে লিনিয়ার অ্যাকিউউটারের বর্তমান বর্ধিত দৈর্ঘ্য (ইঞ্চি ইউনিটগুলিতে) প্রদর্শিত ডেটার স্ট্রিমটিকে আউটপুট এবং প্রসারিত করবে continuously
কোড
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;
}
}
অবস্থান নিয়ন্ত্রণ করতে একটি বাহ্যিক পোটিনোমিটার ব্যবহার করা
উপরোক্ত উদাহরণটি প্রমাণ করেছে যে কীভাবে প্রতিক্রিয়া রড অ্যাকুয়েটরের কাছ থেকে পাঠানো যেতে পারে, কিন্তু বলে যে আমরা ভারপ্রাপ্তকে একটি নির্দিষ্ট অবস্থানে নিয়ে যেতে চাই, আমরা এটি কীভাবে করব? নিম্নলিখিত বিভাগটি এক্সিকিউটারের পছন্দসই সেটপয়েন্ট পজিশনের জন্য ব্যবহারকারী ইনপুট হিসাবে একটি বহিরাগত পোটেনিওমিটার ব্যবহার করে এমন পরিস্থিতি অতিক্রম করে। অনুশীলনে আপনি যেকোন ফর্ম থেকে ব্যবহারকারী ইনপুট নিতে এই উদাহরণটি সংশোধন করতে পারেন।
তারের
অবস্থান নিয়ন্ত্রণের জন্য হার্ডওয়্যার এবং সফ্টওয়্যার ওভারভিউ
ওয়্যারিংগুলি এই টিউটোরিয়ালের প্রথম অংশের মতো প্রায় হুবহু, কেবল এখন একটি বহিরাগত পেন্টিয়োমিটার এনালগ পিন এ 1 এর সাথে সংযুক্ত করা হয়েছে।
নীচে, প্রোগ্রামটি বাহ্যিক পেন্টিওমিটারের মাধ্যমে কোনও ব্যবহারকারী দ্বারা নির্ধারিত অবস্থানে চলে যায় moves কোডের 18 লাইনে একটি বাফার ভেরিয়েবল সেট করা আছে, এটি পরে 36 এবং 39 লাইনে ব্যবহার করা হয় The বাফার অযোগ্যটি কাঙ্ক্ষিত সেটপয়েন্ট পজিশনের চারপাশে একটি পরিসর দেয় যেখানে অ্যাক্টিভেটরটি চলাচল বন্ধ করে দেবে, এটি দুটি পোটেনোমিটারের একটি হিসাবে প্রয়োজনীয় +/- 2 ইউনিট থেকে সাবলীলভাবে প্রবাহিত হওয়ার প্রবণতা। যেমন যদি বাফারটি অন্তর্ভুক্ত না করা হত তবে ভারপ্রাপ্তরা সেটপয়েন্ট পজিশনের চারপাশে হিংস্রভাবে কম্পন করবে। এটিকে ক্রিয়াতে দেখতে বাফারটিকে 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;
}
}