תוכן עניינים:

אריחי פסנתר משחקים בזרוע רובוט: 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 - (https://charmedlabs.com/default/pixy-cmucam5/)

תוכנה - PixyMon (https://cmucam.org/projects/cmucam5/wiki/Install_PixyMon_on_Windows_Vista_7_8)

שלב 2: התקנת Arduino

התקנת ארדואינו
התקנת ארדואינו

אתה יכול לראות את ההתקנה על הלוח כאן, וזה קל מאוד.

בצד שמאל נמצא ספק הכוח.

האמצעית מיועדת לסרוו הראשון, שאחר כך מחובר לשירותים האחרים, סרוו אחר סרוו.

החלק התחתון הוא המקום בו אנו שולטים בלוח מהמחשב או מחשב נייד, שיש לו כניסת USB בקצה השני.

שלב 3: תוכנית סופית

||| תכנית |||

#לִכלוֹל

#include #include "poses.h" #include // Pixy Library #include

#define POSECOUNT 5

BioloidController bioloid = BioloidController (1000000);

const int SERVOCOUNT = 5; int id; int pos; IDCheck בוליאני; RunCheck בוליאני;

הגדרת void () {pinMode (0, OUTPUT); ax12SetRegister2 (1, 32, 50); // הגדר מספר מספר 1 של מפרק 1 למהירות 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. // לאתחל משתנים id = 1; pos = 0; IDCheck = 1; RunCheck = 0; // יציאה טורית פתוחה Serial.begin (9600); עיכוב (500); Serial.println ("###########################"); Serial.println ("התקבלה סדרתית הוקמה.");

// בדוק את מתח סוללת Lipo CheckVoltage ();

// סריקת סרוווס, מיקום החזרה MoveTest (); MoveHome (); אפשרויות תפריט(); RunCheck = 1; }

לולאת void () {// קראו את החיישן: int inByte = Serial.read ();

switch (inByte) {

מקרה '1': MovePose1 (); לשבור;

מקרה '2': MovePose2 (); לשבור; מקרה '3': MovePose3 (); לשבור;

מקרה '4': MovePose4 (); לשבור;

מקרה '5': MoveHome (); לשבור; מקרה '6': תפוס (); לשבור;

מקרה '7': LEDTest (); לשבור;

מקרה '8': RelaxServos (); לשבור; }}

void CheckVoltage () {// המתן, ולאחר מכן בדוק את מתח הציפה (LiPO safety) = (ax12GetRegister (1, AX_PRESENT_VOLTAGE, 1)) / 10.0; Serial.println ("###########################"); Serial.print ("מתח מערכת:"); Serial.print (מתח); Serial.println ("וולט"); if (מתח 10.0) {Serial.println ("רמות מתח נומינליות."); } אם (RunCheck == 1) {MenuOptions (); } Serial.println ("############################"); }

void MoveHome () {עיכוב (100); // השהייה מומלצת bioloid.loadPose (דף הבית); // טען את התנוחה מ- FLASH, לתוך bioloid.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 () {עיכוב (100); // השהייה מומלצת bioloid.loadPose (Pose1); // טען את התנוחה מ- FLASH, לתוך bioloid.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 () {עיכוב (100); // השהייה מומלצת bioloid.loadPose (Pose2); // טען את התנוחה מ- FLASH, לתוך bioloid.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 (); }} בטל MovePose3 () {עיכוב (100); // השהייה מומלצת bioloid.loadPose (Pose3); // טען את התנוחה מ- FLASH, לתוך bioloid.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 () {עיכוב (100); // מומלץ להשהות bioloid.loadPose (Pose4); // טען את התנוחה מ- FLASH, לתוך bioloid.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); id = 1; pos = 512; while (id <= SERVOCOUNT) {Serial.print ("מזהה סרוו נע:"); Serial.println (מזהה);

while (pos> = 312) {SetPosition (id, pos); pos = pos--; עיכוב (10); }

while (pos <= 512) {SetPosition (id, pos); pos = pos ++; עיכוב (10); }

// חזר על מזהה סרוו הבא id = id ++;

} אם (RunCheck == 1) {MenuOptions (); }}

void MenuOptions () {Serial.println ("###########################"); Serial.println ("אנא הזן אפשרות 1-5 כדי להפעיל שוב בדיקות בודדות."); Serial.println ("1) תפקיד ראשון"); Serial.println ("2) מיקום שני"); Serial.println ("3) מיקום שלישי"); Serial.println ("4) מיקום רביעי"); Serial.println ("5) עמדת בית"); Serial.println ("6) בדוק את מתח המערכת"); Serial.println ("7) בצע בדיקת LED"); Serial.println ("8) Relax Servos"); Serial.println ("############################"); }

void RelaxServos () {id = 1; Serial.println ("############################"); Serial.println ("Servos מרגיע."); Serial.println ("###########################"); while (id <= SERVOCOUNT) {Relax (id); id = (id ++)%SERVOCOUNT; עיכוב (50); } אם (RunCheck == 1) {MenuOptions (); }}

void LEDTest () {id = 1; Serial.println ("############################"); Serial.println ("בדיקת LED פועלת"); Serial.println ("############################"); while (id <= SERVOCOUNT) {ax12SetRegister (id, 25, 1); Serial.print ("LED ON - ID Servo:"); Serial.println (מזהה); עיכוב (3000); ax12SetRegister (מזהה, 25, 0); Serial.print ("LED כבוי - מזהה סרוו:"); Serial.println (מזהה); עיכוב (3000); id = id ++; } אם (RunCheck == 1) {MenuOptions (); }}

void Grab () {SetPosition (5, 800); // הגדר את המיקום של המפרק 1 לעיכוב '0' (100); // המתן עד שהמפרק יזוז

}

ביססנו את התוכנית שלנו על תוכנית PincherTest של היצרנים עם כמה שיפורים גדולים במקרה של מיקום. השתמשנו ב- poses.h כדי שהרובוט יהיה בעל המיקומים בזיכרון. ראשית ניסינו ליצור את זרוע המשחק שלנו עם Pixycam להיות אוטומטית, אך בגלל בעיות אור וקטנות במסך זה לא יכול היה לקרות. לרובוט יש עמדת בית בסיסית, לאחר העלאת התוכנית הוא יבדוק את כל הסרווואים שנמצאים ברובוט. הגדרנו את התנוחות לכפתורי 1-4, כך שיהיה קל לזכור. אתה מוזמן להשתמש בתוכנית.

שלב 4: מדריך וידאו

שלב 5: מסקנה

לסיכום, הרובוט הוא פרויקט קטן ומהנה עבורנו וגירוי מהנה לשחק איתו ולהתנסות בו. אני ממליץ לך לנסות ולהתאים אותו גם כן.

מוּמלָץ: