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

بلاط البيانو لعب ذراع الروبوت: 5 خطوات
بلاط البيانو لعب ذراع الروبوت: 5 خطوات

فيديو: بلاط البيانو لعب ذراع الروبوت: 5 خطوات

فيديو: بلاط البيانو لعب ذراع الروبوت: 5 خطوات
فيديو: مش عاوز تتعرف عليا خالص؟ (الأصلي ) 2024, شهر نوفمبر
Anonim
بلاط البيانو يلعب ذراع الروبوت
بلاط البيانو يلعب ذراع الروبوت

تتكون المجموعة من اثنين من مهندسي التشغيل الآلي من UCN ، الذين توصلوا إلى فكرة رائعة ولدينا الحافز للقيام بها وتطويرها. تعتمد الفكرة على لوحة Arduino تتحكم في ذراع آلية. لوحة Arduino هي العقل المدبر للعملية ، وبعد ذلك سيقوم مشغل العملية ، الذراع الروبوتية ، بما يحتاج إليه. سيأتي الشرح الأكثر عمقًا لاحقًا.

الخطوة 1: المعدات

ادوات
ادوات

ذراع الروبوت:

طقم ذراع الروبوت Phantomx Pincher Maek II (https://learn.trossenrobotics.com/38-interbotix-ro…)

برنامج للروبوت- https://www.arduino.cc/en/Main/OldSoftwareRelease… كاميرا الكشف عن الألوان:

كاميرا CMUcam5 Pixy - (https://charmedlabs.com/default/pixy-cmucam5/)

البرمجيات - PixyMon (https://cmucam.org/projects/cmucam5/wiki/Install_PixyMon_on_Windows_Vista_7_8)

الخطوة 2: إعداد اردوينو

إعداد اردوينو
إعداد اردوينو

يمكنك رؤية الإعداد على السبورة هنا ، وهو أمر سهل للغاية.

على اليسار هو مصدر الطاقة.

الوسط هو من أجل المؤازرة الأولى ، والتي يتم توصيلها لاحقًا بالمضاعفات الأخرى ، المؤازرة بواسطة المؤازرة.

الجزء السفلي هو المكان الذي نتحكم فيه في اللوحة من جهاز كمبيوتر شخصي أو كمبيوتر محمول ، يحتوي على مدخل USB على الطرف الآخر.

الخطوة الثالثة: البرنامج النهائي

||| البرنامج |||

#يشمل

# تضمين # تضمين "poses.h" # تضمين // Pixy Library #include

#define POSECOUNT 5

BioloidController bioloid = BioloidController (1000000) ؛

const int SERVOCOUNT = 5 ؛ معرف int نقاط البيع int معرف منطقي ؛ منطقية RunCheck ؛

إعداد باطل () {pinMode (0 ، الإخراج) ؛ ax12SetRegister2 (1 ، 32 ، 50) ؛ // تعيين رقم المفصل 1 سجل 32 إلى السرعة 50. ax12SetRegister2 (2 ، 32 ، 50) ؛ // تعيين رقم المفصل 2 سجل 32 إلى السرعة 50. ax12SetRegister2 (3 ، 32 ، 50) ؛ // تعيين رقم المفصل 3 سجل 32 إلى السرعة 50. ax12SetRegister2 (4 ، 32 ، 50) ؛ // تعيين رقم المفصل 4 سجل 32 إلى السرعة 50. ax12SetRegister2 (5 ، 32 ، 100) ؛ // تعيين رقم مشترك 5 سجل 32 لتسريع 100. // تهيئة المتغيرات معرف = 1 ؛ نقاط البيع = 0 ؛ IDCheck = 1 ؛ RunCheck = 0 ؛ // فتح المنفذ التسلسلي Serial.begin (9600) ؛ تأخير (500) ؛ Serial.println ("############################")؛ Serial.println ("تم إنشاء الاتصال التسلسلي") ؛

// تحقق من فحص الجهد الكهربائي لبطارية يبو () ؛

// مسح الماكينات ، إرجاع موضع MoveTest () ؛ غير منزله()؛ خيارات القائمة()؛ RunCheck = 1 ؛ }

حلقة فارغة () {// قراءة المستشعر: int inByte = Serial.read () ؛

التبديل (inByte) {

الحالة '1': MovePose1 () ؛ استراحة؛

الحالة '2': MovePose2 () ؛ استراحة؛ الحالة '3': MovePose3 () ؛ استراحة؛

الحالة '4': MovePose4 () ؛ استراحة؛

الحالة '5': MoveHome () ؛ استراحة؛ الحالة "6": انتزاع () ؛ استراحة؛

الحالة '7': LEDTest () ؛ استراحة؛

الحالة "8": RelaxServos () ؛ استراحة؛ }}

باطل CheckVoltage () {// انتظر ، ثم تحقق من الجهد العائم (سلامة LiPO) = (ax12GetRegister (1، AX_PRESENT_VOLTAGE، 1)) / 10.0 ؛ Serial.println ("############################")؛ Serial.print ("جهد النظام:") ؛ Serial.print (الجهد) ؛ Serial.println ("فولت") ؛ إذا (الجهد 10.0) {Serial.println ("مستويات الجهد الاسمي.") ؛ } إذا (RunCheck == 1) {MenuOptions () ؛ } Serial.println ("#############################")؛ }

باطل MoveHome () {delay (100) ؛ // موصى به وقفة bioloid.loadPose (الصفحة الرئيسية) ؛ // قم بتحميل الوضع من FLASH ، إلى bioloid المخزن المؤقت التاليPose.readPose () ؛ // قراءة في مواضع المؤازرة الحالية إلى المخزن المؤقت curPose Serial.println ("############################") ؛ Serial.println ("نقل الماكينات إلى موضع المنزل") ؛ Serial.println ("############################")؛ تأخير (1000) ؛ bioloid.interpolateSetup (1000) ؛ // إعداد الاستيفاء من التيار-> التالي أكثر من 1/2 ثانية بينما (bioloid.interpolating> 0) {// افعل هذا بينما لم نصل إلى وضعنا الجديد bioloid.interpolateStep () ؛ // نقل الماكينات ، إذا لزم الأمر. تأخير (3) ؛ } إذا (RunCheck == 1) {MenuOptions () ؛ }}

void MovePose1 () {delay (100) ؛ // يوصى بإيقاف bioloid.loadPose (Pose1) ؛ // قم بتحميل الوضع من FLASH ، إلى bioloid المخزن المؤقت التاليPose.readPose () ؛ // قراءة في مواضع المؤازرة الحالية إلى المخزن المؤقت curPose Serial.println ("############################") ؛ Serial.println ("نقل الماكينات إلى المركز الأول") ؛ Serial.println ("############################")؛ تأخير (1000) ؛ bioloid.interpolateSetup (1000) ؛ // إعداد الاستيفاء من التيار-> التالي أكثر من 1/2 ثانية بينما (bioloid.interpolating> 0) {// افعل هذا بينما لم نصل إلى وضعنا الجديد bioloid.interpolateStep () ؛ // نقل الماكينات ، إذا لزم الأمر. تأخير (3) ؛ } SetPosition (3 ، 291) ؛ // اضبط موضع المفصل 3 على "0" تأخير (100) ؛ // انتظر حتى يتحرك المفصل إذا (RunCheck == 1) {MenuOptions () ؛ }}

void MovePose2 () {delay (100) ؛ // يوصى بإيقاف bioloid.loadPose (Pose2) ؛ // قم بتحميل الوضع من FLASH ، إلى bioloid المخزن المؤقت التاليPose.readPose () ؛ // قراءة في مواضع المؤازرة الحالية إلى المخزن المؤقت curPose Serial.println ("############################") ؛ Serial.println ("نقل الماكينات إلى الموضع الثاني") ؛ Serial.println ("############################")؛ تأخير (1000) ؛ bioloid.interpolateSetup (1000) ؛ // إعداد الاستيفاء من التيار-> التالي أكثر من 1/2 ثانية بينما (bioloid.interpolating> 0) {// افعل هذا بينما لم نصل إلى وضعنا الجديد bioloid.interpolateStep () ؛ // نقل الماكينات ، إذا لزم الأمر. تأخير (3) ؛ } SetPosition (3 ، 291) ؛ // اضبط موضع المفصل 3 على "0" تأخير (100) ؛ // انتظر حتى يتحرك المفصل إذا (RunCheck == 1) {MenuOptions () ؛ }} void MovePose3 () {delay (100)؛ // يوصى بإيقاف bioloid.loadPose (Pose3) ؛ // قم بتحميل الوضع من FLASH ، إلى bioloid المخزن المؤقت التاليPose.readPose () ؛ // قراءة في مواضع المؤازرة الحالية إلى المخزن المؤقت curPose Serial.println ("############################") ؛ Serial.println ("نقل الماكينات إلى الموضع الثالث") ؛ Serial.println ("############################")؛ تأخير (1000) ؛ bioloid.interpolateSetup (1000) ؛ // إعداد الاستيفاء من التيار-> التالي أكثر من 1/2 ثانية بينما (bioloid.interpolating> 0) {// افعل هذا بينما لم نصل إلى وضعنا الجديد bioloid.interpolateStep () ؛ // نقل الماكينات ، إذا لزم الأمر. تأخير (3) ؛ } SetPosition (3 ، 291) ؛ // اضبط موضع المفصل 3 على "0" تأخير (100) ؛ // انتظر حتى يتحرك المفصل إذا (RunCheck == 1) {MenuOptions () ؛ }}

void MovePose4 () {delay (100) ؛ // يوصى بإيقاف bioloid.loadPose (Pose4) ؛ // قم بتحميل الوضع من FLASH ، إلى bioloid المخزن المؤقت التاليPose.readPose () ؛ // قراءة في مواضع المؤازرة الحالية إلى المخزن المؤقت curPose Serial.println ("############################") ؛ Serial.println ("نقل الماكينات إلى الموضع الرابع") ؛ Serial.println ("############################")؛ تأخير (1000) ؛ bioloid.interpolateSetup (1000) ؛ // إعداد الاستيفاء من التيار-> التالي أكثر من 1/2 ثانية بينما (bioloid.interpolating> 0) {// افعل هذا بينما لم نصل إلى وضعنا الجديد bioloid.interpolateStep () ؛ // نقل الماكينات ، إذا لزم الأمر. تأخير (3) ؛ } SetPosition (3 ، 291) ؛ // اضبط موضع المفصل 3 على "0" تأخير (100) ؛ // انتظر حتى يتحرك المفصل إذا (RunCheck == 1) {MenuOptions () ؛ }}

void MoveTest () {Serial.println ("############################") ؛ Serial.println ("اختبار تهيئة علامة الحركة") ؛ Serial.println ("############################")؛ تأخير (500) ؛ معرف = 1 ؛ نقاط البيع = 512 ؛ while (id <= SERVOCOUNT) {Serial.print ("Moving Servo ID:") ؛ Serial.println (معرف) ؛

while (pos> = 312) {SetPosition (id، pos) ؛ نقاط البيع = نقاط البيع-- ؛ تأخير (10) ؛ }

while (pos <= 512) {SetPosition (id، pos) ؛ نقاط البيع = نقاط البيع ++ ؛ تأخير (10) ؛ }

// كرر إلى معرف المؤازرة التالي id = id ++ ؛

} إذا (RunCheck == 1) {MenuOptions () ؛ }}

باطل MenuOptions () {Serial.println ("###########################")؛ Serial.println ("الرجاء إدخال الخيار 1-5 لتشغيل الاختبارات الفردية مرة أخرى.") ؛ Serial.println ("1) المركز الأول") ؛ Serial.println ("2) المركز الثاني") ؛ Serial.println ("3) المركز الثالث") ؛ Serial.println ("4) المركز الرابع") ؛ Serial.println ("5) Home Position") ؛ Serial.println ("6) فحص جهد النظام") ؛ Serial.println ("7) أداء اختبار LED") ؛ Serial.println ("8) Relax Servos") ؛ Serial.println ("############################")؛ }

RelaxServos باطل () {id = 1 ؛ Serial.println ("############################")؛ Serial.println ("الاسترخاء الماكينات.") ؛ Serial.println ("############################")؛ بينما (المعرف <= SERVOCOUNT) {Relax (id) ؛ معرف = (معرف ++)٪ SERVOCOUNT ؛ تأخير (50) ؛ } إذا (RunCheck == 1) {MenuOptions () ؛ }}

LEDTest باطل () {معرف = 1 ؛ Serial.println ("############################")؛ Serial.println ("اختبار LED قيد التشغيل") ؛ Serial.println ("############################")؛ بينما (المعرف <= SERVOCOUNT) {ax12SetRegister (المعرف ، 25 ، 1) ؛ Serial.print ("LED ON - معرّف أجهزة:") ؛ Serial.println (معرف) ؛ تأخير (3000) ؛ ax12SetRegister (معرف ، 25 ، 0) ؛ Serial.print ("LED OFF - معرّف أجهزة:") ؛ Serial.println (معرف) ؛ تأخير (3000) ؛ معرف = معرف ++ ؛ } إذا (RunCheck == 1) {MenuOptions () ؛ }}

انتزاع باطل () {SetPosition (5 ، 800) ؛ // اضبط موضع المفصل 1 على تأخير '0' (100) ؛ // انتظر حتى يتحرك المفصل

}

لقد اعتمدنا برنامجنا على برنامج PincherTest الخاص بالمصنعين مع بعض التعديلات الرئيسية في حالة تحديد المواقع. استخدمنا الوضعيات (poses.h) لكي يكون للروبوت مواضع في الذاكرة. أولاً ، حاولنا إنشاء ذراع اللعب الخاص بنا باستخدام Pixycam ليكون تلقائيًا ، ولكن بسبب مشاكل الشاشة الخفيفة والصغيرة ، لم يحدث ذلك. يتمتع الروبوت بموقع رئيسي أساسي ، بعد تحميل البرنامج ، سيختبر جميع الماكينات الموجودة في الروبوت. لقد قمنا بتعيين الأوضاع للأزرار من 1 إلى 4 ، لذلك سيكون من السهل تذكرها. لا تتردد في استخدام البرنامج.

الخطوة 4: دليل الفيديو

الخطوة 5: الخاتمة

في الختام ، يعتبر الروبوت مشروعًا صغيرًا ممتعًا لنا ، وهو شيء ممتع نلعبه ونجربه. أنا أشجعك على تجربته وتخصيصه أيضًا.

موصى به: