সুচিপত্র:

Arduino এবং এক Servo সঙ্গে স্বয়ংক্রিয় বল রোলার: 3 ধাপ
Arduino এবং এক Servo সঙ্গে স্বয়ংক্রিয় বল রোলার: 3 ধাপ

ভিডিও: Arduino এবং এক Servo সঙ্গে স্বয়ংক্রিয় বল রোলার: 3 ধাপ

ভিডিও: Arduino এবং এক Servo সঙ্গে স্বয়ংক্রিয় বল রোলার: 3 ধাপ
ভিডিও: PCA9685 এবং আরডুইনো: ভি 3 ব্যবহার করে 32 সার্ভো মোটর নিয়ন্ত্রণ করছে 2024, নভেম্বর
Anonim
Image
Image

এটি একটি সহজ ছোট Arduino এবং servo প্রকল্প যা প্রায় দুই ঘন্টা সময় নেয়। এটি একটি জার ক্যাপের এক প্রান্ত উত্তোলনের জন্য একটি সার্ভো ব্যবহার করে যাতে ভিতরের পরিধির চারপাশে একটি স্টিলের বল ঘুরাতে পারে। এটি স্ব -প্রারম্ভিক, গতি পরিবর্তন করতে পারে এবং একবারে দুটি (বা আরো?) বল স্পিন করতে পারে। নির্মাণ এবং কাজ পেতে মজা। টাইমিং প্যারামিটারগুলি সম্ভবত আরও দ্রুত গতির জন্য খেলতে পারে। একটি চৌম্বক বল সহ কয়েকটি হল ইফেক্ট সেন্সর ব্যবহার করে এটি একটি স্মার্ট মেশিন তৈরি করা যেতে পারে যা সেরা পরামিতিগুলি বের করতে পারে।

আমার উল্লেখ করা উচিত যে এখানে instructables.com- এ কারও কাছে আরও অত্যাধুনিক বল রোলার মেশিন রয়েছে:

উপকরণ প্রয়োজন:

Arduino Uno (অথবা কোন Arduino)

Servo ieldাল (alচ্ছিক)

9g servo

জার টুপি

লোহার গোলক

কিছু স্ক্র্যাপ কাঠ

ধাপ 1: বেস এবং হিংজড ক্যাপ হোল্ডার তৈরি করুন

বেস এবং হিংজড ক্যাপ হোল্ডার তৈরি করুন
বেস এবং হিংজড ক্যাপ হোল্ডার তৈরি করুন

ভিত্তিটি কেবল কাঠের একটি অংশ যা কাঠের টুকরোটি মাউন্ট করা। হিংড কাঠ একটি জারের ক্যাপের চেয়ে বড় হওয়া উচিত যা আপনি ব্যবহার করবেন এবং কব্জা এবং সার্ভো মাউন্ট করার জন্য পর্যাপ্ত জায়গা থাকবে।

আমি ছোট প্লাস্টিকের আরসি উড়োজাহাজের হিংস ব্যবহার করেছি এবং শুধু তাদের হিংগড কাঠ এবং বেসে গরম করেছি।

ধাপ 2: লম্বা সার্ভো আর্ম করুন এবং সার্ভো সংযুক্ত করুন

লম্বা Servo আর্ম করুন এবং Servo সংযুক্ত করুন
লম্বা Servo আর্ম করুন এবং Servo সংযুক্ত করুন
লম্বা সার্ভো আর্ম করুন এবং সার্ভো সংযুক্ত করুন
লম্বা সার্ভো আর্ম করুন এবং সার্ভো সংযুক্ত করুন

একটি দীর্ঘ servo আর্ম করতে আমি শুধু একটি ছোট স্ক্রু এবং বাদাম একটি জোড়া সঙ্গে servo বাহু কাঠের একটি 5 সেন্টিমিটার টুকরা সংযুক্ত। বেসের অনুভূমিক হলে সার্ভো আর্মটি 90 ডিগ্রিতে থাকা উচিত।

আমি শুধু হিংড কাঠের ধারককে গরম করে আঠালো করেছিলাম কিন্তু আমি দেখেছি যে যদি আপনি এটি কয়েক মিনিটের বেশি সময় ধরে চলতে দেন, তাহলে সার্ভো গরম আঠালো গরম করবে এবং কাঠ থেকে ছেড়ে দেবে। সুতরাং একটি ভাল সংযুক্তি পদ্ধতি সমর্থনযোগ্য।

ধাপ 3: লোড এবং রান স্কেচ

লোড এবং রান স্কেচ
লোড এবং রান স্কেচ

আমি একটি usingাল ব্যবহার করে পিন 7 এ আমার সার্ভো সংযুক্ত করেছি কারণ এটি সুবিধাজনক এবং তাদের মাত্র কয়েক টাকা খরচ হয়। যদি আপনার কোন ieldাল না থাকে তাহলে Arduino এ 7 পিন করার জন্য servo সংকেত তার, Arduino এ 5v তে লাল তার এবং Arduino এ GND এর সাথে স্থল তার সংযুক্ত করুন। Arduino servo চালানোর জন্য যথেষ্ট বর্তমান প্রদান করা উচিত। আমি useাল ব্যবহার করি কারণ শুধুমাত্র সার্ভোর জন্য একটি বাহ্যিক ভোল্টেজ ব্যবহার করা সহজ।

এখানে স্কেচ। আমি একটি সার্ভো স্পিড কন্ট্রোলার রুটিন লিখেছিলাম যাতে সার্ভোর গতি পরিবর্তন করা যায় কারণ এটি সম্ভবত পূর্ণ গতিতে ভাল কাজ করবে না।

আপনি বল ঘূর্ণায়মানের বিভিন্ন গতি পেতে টাইমিং বিলম্ব পরিবর্তন করতে পারেন। আপনি গতি পরিবর্তন করতে myServo () ফাংশনের তৃতীয় প্যারামিটার পরিবর্তন করতে পারেন।

////////////////////////////////////////////////////// ////////////////////////////////////////////////////// ////////////// // জিম ডেমেলো, শাংলুও বিশ্ববিদ্যালয়, 2017 দ্বারা তৈরি

// আপনি এই কোডটি ব্যবহার করতে পারেন, ম্যানিপুলেট করতে পারেন, যা করতে চান তা করুন, আমার নামের প্রয়োজন নেই

// এই রুটিন যেকোনো সংখ্যক সার্ভিসকে ইন্টারপোলেটেড করার অনুমতি দেয়, সার্ভসের সংখ্যা 4 ছাড়িয়ে গেলে কেবল নতুন লাইন যুক্ত করুন

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#অন্তর্ভুক্ত

Servo myservo1, myservo2; // একটি servo নিয়ন্ত্রণ করার জন্য servo অবজেক্ট তৈরি করুন

int servoRead (int servoNumber) {

int servoCurrent;

যদি (servoNumber == 1) {servoCurrent = myservo1.read (); }

যদি (servoNumber == 2) {servoCurrent = myservo2.read (); }

ফিরতি servoCurrent;

}

অকার্যকর servoWrite (int servoNumber, int offset) {

যদি (servoNumber == 1) {myservo1.write (অফসেট); }

যদি (servoNumber == 2) {myservo2.write (অফসেট); }

}

অকার্যকর myServo (int newAngle, int angleInc, int incDelay, int servoNum) {

int curAngle;

যদি (servoNum == 1) {curAngle = myservo1.read (); }

যদি (servoNum == 2) {curAngle = myservo2.read (); }

যদি (curAngle <newAngle) {

জন্য (int angle = curAngle; angle <newAngle; angle += angleInc) {

যদি (servoNum == 1) myservo1.write (কোণ);

যদি (servoNum == 2) myservo2.write (কোণ);

বিলম্ব (incDelay); }

}

অন্যথায় যদি (curAngle> newAngle) {

জন্য (int angle = curAngle; angle> newAngle; angle -= angleInc) {

যদি (servoNum == 1) myservo1.write (কোণ);

যদি (servoNum == 2) myservo2.write (কোণ);

বিলম্ব (incDelay); }

}

}

অকার্যকর interpolate2Servos (int servo1, int servo1Position, int servo2, int servo2Position, int numberSteps, int timeDelay) {

int servo1Current, servo2Current;

servo1Current = servoRead (servo1);

servo2Current = servoRead (servo2);

// সিরিয়াল.প্রিন্ট ("Servo3Pos এবং বর্তমান"); Serial.print (servo3Position); সিরিয়াল.প্রিন্ট (""); Serial.println (servo3Current);

// সিরিয়াল.প্রিন্ট ("Servo4Pos এবং বর্তমান"); Serial.print (servo4Position); সিরিয়াল.প্রিন্ট (""); Serial.println (servo4Current);

// সিরিয়াল.প্রিন্ট ("Servo5Pos এবং বর্তমান"); Serial.print (servo5Position); সিরিয়াল.প্রিন্ট (""); Serial.println (servo5Current);

// সিরিয়াল.প্রিন্ট ("Servo6Pos এবং বর্তমান"); Serial.print (servo6Position); সিরিয়াল.প্রিন্ট (""); Serial.println (servo6Current);

// Serial.println ("");

int cOffset = (servo1Position - servo1Current); cOffset = abs (cOffset)/numberSteps;

int dOffset = (servo2Position - servo2Current); dOffset = abs (dOffset)/numberSteps;

int cOffsetTotal = 0, dOffsetTotal = 0;

cOffsetTotal = servo1Current;

dOffsetTotal = servo2Current;

জন্য (int x = 0; x

যদি (servo1Position> servo1Current) {cOffsetTotal = cOffsetTotal + cOffset; }

অন্যথায় {cOffsetTotal = cOffsetTotal - cOffset; }

যদি (servo2Position> servo2Current) {dOffsetTotal = dOffsetTotal + dOffset; }

অন্যথায় {dOffsetTotal = dOffsetTotal - dOffset; }

যদি (servo1Position! = servo1Current) servoWrite (servo1, cOffsetTotal);

যদি (servo2Position! = servo2Current) servoWrite (servo2, dOffsetTotal);

// সিরিয়াল.প্রিন্ট ("a এবং b অফসেট"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); বিলম্ব (10);

বিলম্ব (সময় বিলম্ব);

} // এর জন্য শেষ

//////////////////////////////////////

// মডিউলো অবশিষ্টদের যত্ন নিন //

/////////////////////////////////////

যদি (servo1Position! = servo1Current) servoWrite (servo1, servo1Position);

যদি (servo2Position! = servo2Current) servoWrite (servo2, servo2Position);

}

int টাইমিং বিলম্ব = 100;

int servoDelay = 100;

int degGap = 10;

// এটি প্রারম্ভিক ডিগ্রী (শেষ ডিগ্রির চেয়ে কম হতে হবে)

int degStart = 0;

// এটি শেষ ডিগ্রী (শুরু ডিগ্রির চেয়ে বড় হতে হবে)

int degEnd = 360;

// এটি বৃত্ত ব্যাসার্ধ

int ব্যাসার্ধ = 8;

অকার্যকর সেটআপ()

{

Serial.begin (9600);

বিলম্ব (100);

myservo1.attach (7); // সার্ভো বস্তুর সাথে পিন 7 এ সার্ভো সংযুক্ত করে

myservo1.write (90);

myservo2.attach (8); // সার্ভো অবজেক্টে 8 পিনে সার্ভো সংযুক্ত করে

myservo2.write (90);

বিলম্ব (1000); // সেখানে পৌঁছানোর জন্য সার্ভোর জন্য অপেক্ষা করে

interpolate2Servos (1, 90, 2, 90, 10, 60); // নিরপেক্ষ

বিলম্ব (1000);

}

অকার্যকর লুপ () {

সময় বিলম্ব = 15; // 10 এ কাজ করে

servoDelay = 4;

spin4 ();

// interpolate2Servos (1, 90, 2, 90, 1, 60); // নিরপেক্ষ

// বিলম্ব (1000);

// প্রস্থান (0); // বিরতি প্রোগ্রাম - চালিয়ে যেতে রিসেট চাপুন

}

অকার্যকর স্পিন 3 () {

interpolate2 Servos (1, 90, 2, 110, 1, 60); // নিরপেক্ষ

বিলম্ব (সময় বিলম্ব);

interpolate2Servos (1, 90, 2, 80, 1, 60); // নিরপেক্ষ

বিলম্ব (সময় বিলম্ব);

}

অকার্যকর স্পিন 2 () {

// interpolate2Servos (1, 80, 2, 90, 1, 50); // নিরপেক্ষ

বিলম্ব (সময় বিলম্ব);

interpolate2Servos (1, 80, 2, 80, 1, 60); // নিরপেক্ষ

বিলম্ব (সময় বিলম্ব);

interpolate2 Servos (1, 110, 2, 80, 1, 60); // নিরপেক্ষ

বিলম্ব (সময় বিলম্ব);

// interpolate2Servos (1, 110, 2, 110, 1, 60); // নিরপেক্ষ

বিলম্ব (সময় বিলম্ব);

}

অকার্যকর স্পিন 1 () {

// int deg = (degStart / (180 / 3.14));

float deg = (degStart * 3.141592 / 180); // ডিগ্রিকে রেডিয়ানে রূপান্তর করুন

ফ্লোট xPos = 90 + (cos (deg) * ব্যাসার্ধ);

// xPos = বৃত্তাকার (xPos);

ভাসান yPos = 90 + (sin (deg) * ব্যাসার্ধ);

// yPos = বৃত্তাকার (yPos);

Serial.print ("degGap ="); Serial.print (degGap); Serial.print ("deg ="); সিরিয়াল.প্রিন্ট (deg); সিরিয়াল। সিরিয়াল.প্রিন্ট ("degStart ="); Serial.print (degStart); Serial.print ("x ="); Serial.print (xPos); println (yPos);

// interpolate2Servos (1, xPos, 2, yPos, 1, servoDelay); // নিরপেক্ষ

myservo1.write (xPos);

myservo2.write (yPos);

বিলম্ব (সময় বিলম্ব);

যদি (degStart> = degEnd) {

degStart = 0;

যদি (degGap> 180)

ডিগ্যাপ = 180;

// degGap = 0;

অন্য

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart +degGap;

}

degStart = degStart + degGap;

}

অকার্যকর স্পিন 4 () {

জন্য (int i = 0; i <= 360; i ++) {

float j = 20 * (cos ((3.14 * i)/180)) + 90;

float k = 20 * (sin ((3.14 * i)/180)) + 90;

myservo1.write (j);

myservo2.write (k);

সিরিয়াল.প্রিন্ট (জে);

সিরিয়াল.প্রিন্ট (",");

Serial.println (k);

বিলম্ব (100);

}

}

প্রস্তাবিত: