جدول المحتويات:

بكرة الكرة الآلية مع Arduino و One Servo: 3 خطوات
بكرة الكرة الآلية مع Arduino و One Servo: 3 خطوات

فيديو: بكرة الكرة الآلية مع Arduino و One Servo: 3 خطوات

فيديو: بكرة الكرة الآلية مع Arduino و One Servo: 3 خطوات
فيديو: أعلى مستوى وصلتوا في البرمجة 2024, يونيو
Anonim
Image
Image

هذا مشروع بسيط من Arduino و servo يستغرق حوالي ساعتين لإكماله. إنها تستخدم مؤازرة لرفع أحد طرفي غطاء الجرة وذلك لتدوير كرة فولاذية حول المحيط الداخلي. إنه ذاتي البدء ، يمكنه تغيير السرعة ويمكنه تدوير كرتين (أو أكثر؟) في وقت واحد. متعة البناء والحصول على عمل. يمكن تشغيل معلمات التوقيت بسرعات أعلى على الأرجح. يمكن استخدام عدد قليل من مستشعرات تأثير القاعة مع كرة مغناطيسية لجعلها آلة أكثر ذكاءً يمكنها اكتشاف أفضل المعلمات.

يجب أن أذكر أن هناك شخصًا ما هنا في instructables.com لديه آلة بكرة كروية أكثر تطوراً:

المواد المطلوبة:

Arduino Uno (أو أي Arduino)

درع مؤازر (اختياري)

9g مضاعفات

غطاء جرة

الكرة الفولاذية

بعض الخشب الخردة

الخطوة 1: اصنع قاعدة وحامل غطاء مفصلي

اصنع قاعدة وحامل غطاء مفصلي
اصنع قاعدة وحامل غطاء مفصلي

القاعدة عبارة عن قطعة من الخشب لتركيب قطعة الخشب المفصلية عليها. يجب أن يكون الخشب المفصلي أكبر من غطاء البرطمان الذي ستستخدمه ولديك مساحة كافية للمفصلات ولتركيب المؤازرة.

لقد استخدمت مفصلات بلاستيكية صغيرة للطائرات RC وقمت بلصقها بالخشب المفصلي والقاعدة.

الخطوة 2: اصنع ذراع مؤازر أطول وأرفق المؤازرة

اصنع ذراع مؤازر أطول وأرفق المؤازرة
اصنع ذراع مؤازر أطول وأرفق المؤازرة
اصنع ذراع مؤازر أطول وأرفق المؤازرة
اصنع ذراع مؤازر أطول وأرفق المؤازرة

لصنع ذراع مؤازر أطول ، قمت للتو بتوصيل قطعة من الخشب 5 سنتيمترات بذراع المؤازرة بزوج من البراغي والصواميل الصغيرة. يجب أن يكون ذراع المؤازرة عند 90 درجة على المؤازرة عندما يكون أفقيًا على القاعدة.

لقد قمت للتو بلصق المؤازرة على حامل الخشب المفصلي ولكني وجدت أنه إذا تركته يعمل لمدة أطول من بضع دقائق ، فإن المؤازرة ستسخن الغراء الساخن وتترك الخشب. لذلك فإن طريقة التعلق الأفضل لها ما يبررها.

الخطوة 3: تحميل وتشغيل Sketch

تحميل وتشغيل Sketch
تحميل وتشغيل Sketch

لقد قمت بتوصيل المؤازرة الخاصة بي برقم 7 باستخدام درع لأنه مناسب تمامًا ولا يكلف سوى بضعة دولارات. إذا لم يكن لديك درع ، فقم بتوصيل سلك إشارة المؤازرة بالدبوس 7 على Arduino ، والسلك الأحمر بـ 5 فولت على Arduino والسلك الأرضي بـ GND على Arduino. يجب أن يوفر اردوينو تيارًا كافيًا لتشغيل المؤازرة. أستخدم الدرع لأنه من السهل استخدام جهد خارجي فقط من أجل المؤازرة.

هنا الرسم. لقد كتبت روتينًا للتحكم في سرعة المؤازرة لتغيير سرعة المؤازرة لأنه ربما لن يعمل بشكل جيد بأقصى سرعة.

يمكنك تعديل timeDelay للحصول على سرعات مختلفة لدحرجة الكرة. يمكنك أيضًا تغيير المعامل الثالث لوظيفة myServo () لتغيير السرعة أيضًا.

////////////////////////////////////////////////////// ////////////////////////////////////////////////////// ////////////// // // تم إنشاؤه بواسطة Jim Demello ، جامعة Shangluo ، 2017

// أنت حر في الاستخدام والتلاعب والقيام بكل ما يحلو لك باستخدام هذا الرمز ، اسمي غير مطلوب

// يسمح هذا الروتين بتحريف أي عدد من الماكينات ، فقط أضف سطورًا جديدة إذا تجاوز عدد الماكينات 4

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

#يشمل

مضاعفات myservo1 ، myservo2 ؛ // إنشاء كائن مؤازر للتحكم في المؤازرة

int servoRead (int servoNumber) {

داخل المؤازرة

إذا (servoNumber == 1) {servoCurrent = myservo1.read () ؛ }

إذا (servoNumber == 2) {servoCurrent = myservo2.read () ؛ }

عودة المؤازرة

}

servoWrite باطل (int servoNumber ، int offset) {

إذا (servoNumber == 1) {myservo1.write (offset) ؛ }

إذا (servoNumber == 2) {myservo2.write (offset) ؛ }

}

void myServo (int newAngle، int angleInc، int incDelay، int servoNum) {

انحناء كثافة العمليات

إذا (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) ؛ }

}

}

أقحم باطل 2Servos (int servo1، int servo1Position،

int servo2 ، int servo2Position ،

عدد int ، عدد الخطوات ، int timeDelay) {

int servo1Current ، servo2Current ؛

servo1Current = servoRead (servo1) ؛

servo2Current = servoRead (servo2) ،

// Serial.print ("Servo3Pos and Current") ؛ Serial.print (servo3Position) ؛ Serial.print ("") ؛ Serial.println (servo3Current) ؛

// Serial.print ("Servo4Pos and Current") ؛ Serial.print (servo4Position) ؛ Serial.print ("") ؛ Serial.println (servo4Current) ؛

// Serial.print ("Servo5Pos and Current") ؛ Serial.print (servo5Position) ؛ Serial.print ("") ؛ Serial.println (servo5Current) ؛

// Serial.print ("Servo6Pos and Current") ؛ Serial.print (servo6Position) ؛ Serial.print ("") ؛ Serial.println (servo6Current) ؛

// Serial.println ("") ؛

int cOffset = (servo1Position - servo1Current) ؛ cOffset = القيمة المطلقة (cOffset) / numberSteps ؛

int dOffset = (servo2Position - servo2Current) ؛ dOffset = القيمة المطلقة (dOffset) / numberSteps ؛

int cOffsetTotal = 0 ، dOffsetTotal = 0 ؛

cOffsetTotal = servo1Current ؛

dOffsetTotal = servo2Current ؛

لـ (int x = 0 ؛ x

إذا (servo1Position> servo1Current) {cOffsetTotal = cOffsetTotal + cOffset ؛ }

else {cOffsetTotal = cOffsetTotal - cOffset؛ }

إذا (servo2Position> servo2Current) {dOffsetTotal = dOffsetTotal + dOffset ؛ }

آخر {dOffsetTotal = dOffsetTotal - dOffset ؛ }

if (servo1Position! = servo1Current) servoWrite (servo1 ، cOffsetTotal) ؛

إذا (servo2Position! = servo2Current) servoWrite (servo2 ، dOffsetTotal) ؛

// Serial.print ("a and b Offset") ؛ Serial.print (aOffsetTotal) ؛ Serial.print ("") ؛ Serial.println (bOffsetTotal) ؛ تأخير (10) ؛

تأخير (timeDelay) ؛

} // نهاية لـ

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

// اعتني ببقايا modulo //

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

إذا (servo1Position! = servo1Current) servoWrite (servo1 ، servo1Position) ؛

إذا (servo2Position! = servo2Current) servoWrite (servo2 ، servo2Position) ؛

}

int timeDelay = 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 ؛

تدور 4 () ؛

// interpolate2Servos (1 ، 90 ، 2 ، 90 ، 1 ، 60) ؛ // حيادي

// تأخير (1000) ؛

// خروج (0) ؛ // إيقاف البرنامج - اضغط على إعادة التعيين للمتابعة

}

spin3 باطل () {

interpolate2Servos (1 ، 90 ، 2 ، 110 ، 1 ، 60) ؛ // حيادي

تأخير (timeDelay) ؛

interpolate2Servos (1 ، 90 ، 2 ، 80 ، 1 ، 60) ؛ // حيادي

تأخير (timeDelay) ؛

}

spin2 باطل () {

// interpolate2Servos (1، 80، 2، 90، 1، 50) ؛ // حيادي

تأخير (timeDelay) ؛

interpolate2Servos (1، 80، 2، 80، 1، 60) ؛ // حيادي

تأخير (timeDelay) ؛

interpolate2Servos (1 ، 110 ، 2 ، 80 ، 1 ، 60) ؛ // حيادي

تأخير (timeDelay) ؛

// interpolate2Servos (1 ، 110 ، 2 ، 110 ، 1 ، 60) ؛ // حيادي

تأخير (timeDelay) ؛

}

تدوير باطل 1 () {

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

درجة تعويم = (degStart * 3.141592/180) ؛ // تحويل الدرجات إلى راديان

تعويم xPos = 90 + (cos (deg) * radius) ؛

// xPos = round (xPos) ؛

تعويم yPos = 90 + (sin (deg) * radius) ؛

// yPos = round (yPos) ؛

Serial.print ("degGap =") ؛ Serial.print (degGap) ؛ Serial.print ("deg =") ؛ Serial.print (deg) ؛ Serial.print ("cos =") ؛ Serial.print (cos (deg)) ؛ Serial.print ("degStart =") ؛ Serial.print (degStart) ؛ Serial.print ("x =") ؛ Serial.print (xPos) ؛ Serial.print ("y =") ؛ مسلسل. println (yPos) ؛

// interpolate2Servos (1، xPos، 2، yPos، 1، servoDelay) ؛ // حيادي

myservo1.write (xPos) ؛

myservo2.write (yPos) ،

تأخير (timeDelay) ؛

إذا (degStart> = degEnd) {

degStart = 0 ؛

إذا (degGap> 180)

degGap = 180 ؛

// degGap = 0 ؛

آخر

degGap = degGap + 2 ؛

degGap = degGap - 2 ؛

// degStart = degStart + degGap ؛

}

degStart = degStart + degGap ؛

}

spin4 باطل () {

لـ (int i = 0 ؛ i <= 360 ؛ i ++) {

تعويم j = 20 * (cos ((3.14 * i) / 180)) + 90 ؛

تعويم k = 20 * (sin ((3.14 * i) / 180)) + 90 ؛

myservo1.write (j) ؛

myservo2.write (k) ؛

Serial.print (ي) ؛

Serial.print ("،") ؛

Serial.println (ك) ؛

تأخير (100) ؛

}

}

موصى به: