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

גלגלת כדור אוטומטית עם ארדואינו וסרוו אחד: 3 שלבים
גלגלת כדור אוטומטית עם ארדואינו וסרוו אחד: 3 שלבים

וִידֵאוֹ: גלגלת כדור אוטומטית עם ארדואינו וסרוו אחד: 3 שלבים

וִידֵאוֹ: גלגלת כדור אוטומטית עם ארדואינו וסרוו אחד: 3 שלבים
וִידֵאוֹ: גלגלת אוטומטית 25 מטר Gardena 18620 2024, נוֹבֶמבֶּר
Anonim
Image
Image

זהו פרויקט קטן של ארדואינו וסרוו שאורך כשעתיים. הוא משתמש בסרוו כדי להרים קצה אחד של מכסה צנצנת כדי לסובב כדור פלדה סביב ההיקף הפנימי. הוא מתחיל בעצמו, יכול לשנות מהירות ויכול לסובב שני כדורים (או יותר?) בבת אחת. כיף לבנות ולעבוד. אפשר לשחק איתו את פרמטרי התזמון למהירויות גבוהות יותר כנראה. ניתן להשתמש בכמה חיישני אפקט אולם עם כדור מגנטי כדי להפוך אותו למכונה חכמה יותר שיכולה להבין את הפרמטרים הטובים ביותר.

עלי לציין שלמישהו כאן ב- instructables.com יש מכונת רולר כדורים מתוחכמת יותר:

חומרים דרושים:

Arduino Uno (או כל Arduino)

מגן סרוו (אופציונלי)

סרוו 9 גרם

כובע צנצנת

כדור פלדה

קצת גרוטאות עץ

שלב 1: צור בסיס ומחזיק כובע ציר

צור בסיס ומחזיק כובע ציר
צור בסיס ומחזיק כובע ציר

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

השתמשתי בצירי מטוסי rc קטנים מפלסטיק ופשוט זיגגתי אותם לעץ הציר ולבסיס.

שלב 2: צור זרוע סרוו ארוכה יותר והצמד סרוו

יוצרים זרוע סרוו ארוכה יותר ומחברים סרוו
יוצרים זרוע סרוו ארוכה יותר ומחברים סרוו
יוצרים זרוע סרוו ארוכה יותר ומחברים סרוו
יוצרים זרוע סרוו ארוכה יותר ומחברים סרוו

כדי ליצור זרוע סרוו ארוכה יותר, הצמדתי רק חתיכת עץ של 5 סנטימטר לזרוע הסרוו עם כמה ברגים ואומים קטנים. זרוע הסרוו צריכה להיות ב 90 מעלות על הסרוו כשהיא אופקית לבסיס.

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

שלב 3: טען והפעל סקיצה

טען והפעל סקיצה
טען והפעל סקיצה

חיברתי את הסרוו שלי לסיכה 7 באמצעות מגן כי זה פשוט נוח והם עולים רק כמה דולרים. אם אין לך מגן אז חבר את חוט האות של סרוו לפין 7 בארדואינו, החוט האדום ל -5 וולט על הארדואינו וחוט הארקה ל- GND בארדואינו. הארדואינו אמור לספק מספיק זרם להפעלת הסרוו. אני משתמש במגן מכיוון שקל להשתמש במתח חיצוני רק עבור הסרוו.

הנה הסקיצה. כתבתי שגרת בקר מהירות סרוו כדי לשנות את מהירות הסרוו כי זה כנראה לא יעבוד טוב במלוא המהירות.

אתה יכול לשנות את timingDay כדי לקבל מהירויות שונות של גלגול הכדור. תוכל גם לשנות את הפרמטר השלישי של הפונקציה myServo () כדי לשנות גם את המהירות.

////////////////////////////////////////// ////////////////////////////////////////// //////////////// // נוצר על ידי ג'ים דמלו, אוניברסיטת שאנגלו, 2017

// אתה חופשי להשתמש, לעשות מניפולציות, לעשות מה שאתה רוצה עם הקוד הזה, שמי אינו נדרש

// שגרה זו מאפשרת לבצע אינטרפולציה של כל מספר סרוו, פשוט הוסיפו שורות חדשות אם מספר השרווקים עולה על 4

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

#לִכלוֹל

סרוו myservo1, myservo2; // צור אובייקט סרוו לשליטה בסרוו

int servoRead (int servoNumber) {

int servoCurrent;

if (servoNumber == 1) {servoCurrent = myservo1.read (); }

if (servoNumber == 2) {servoCurrent = myservo2.read (); }

החזר servoCurrent;

}

servoWrite void (int servoNumber, int offset) {

if (servoNumber == 1) {myservo1.write (קיזוז); }

if (servoNumber == 2) {myservo2.write (קיזוז); }

}

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

int curAngle;

if (servoNum == 1) {curAngle = myservo1.read (); }

if (servoNum == 2) {curAngle = myservo2.read (); }

if (curAngle <newAngle) {

for (int angle = curAngle; angle <newAngle; angle += angleInc) {

אם (servoNum == 1) myservo1.write (זווית);

if (servoNum == 2) myservo2.write (זווית);

עיכוב (incDelay); }

}

else if (curAngle> newAngle) {

for (int angle = curAngle; angle> newAngle; angle -= angleInc) {

אם (servoNum == 1) myservo1.write (זווית);

אם (servoNum == 2) myservo2.write (זווית);

עיכוב (incDelay); }

}

}

void interpolate2Servos (int servo1, int servo1Position, int servo2, int servo2 מיקום, int numberSteps, int timeDelay) {

int servo1Current, servo2Current;

servo1Current = servoRead (servo1);

servo2Current = servoRead (servo2);

// Serial.print ("Servo3Pos וזרם"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos וזרם"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos וזרם"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

// Serial.print ("Servo6Pos וזרם"); Serial.print (servo6Position); Serial.print (""); 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

if (servo1Position> servo1Current) {cOffsetTotal = cOffsetTotal + cOffset; }

אחרת {cOffsetTotal = cOffsetTotal - cOffset; }

if (servo2Position> servo2Current) {dOffsetTotal = dOffsetTotal + dOffset; }

אחרת {dOffsetTotal = dOffsetTotal - dOffset; }

if (servo1Position! = servo1Current) servoWrite (servo1, cOffsetTotal);

if (servo2Position! = servo2Current) servoWrite (servo2, dOffsetTotal);

// Serial.print ("קיזוז a ו- b"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); עיכוב (10);

עיכוב (timeDelay);

} // סוף עבור

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

// לטפל בשאריות מודולו //

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

if (servo1Position! = servo1Current) servoWrite (servo1, servo1Position);

if (servo2Position! = servo2Current) servoWrite (servo2, servo2Position);

}

int timingDelay = 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);

}

לולאת חלל () {

timingDelay = 15; // עובד בשעה 10

servoDelay = 4;

spin4 ();

// interpolate2Servos (1, 90, 2, 90, 1, 60); // ניטראלי

// עיכוב (1000);

// יציאה (0); // השהה תוכנית - לחץ על איפוס כדי להמשיך

}

void spin3 () {

interpolate2Servos (1, 90, 2, 110, 1, 60); // ניטראלי

עיכוב (timingDelay);

interpolate2Servos (1, 90, 2, 80, 1, 60); // ניטראלי

עיכוב (timingDelay);

}

spin2 חלל () {

// interpolate2Servos (1, 80, 2, 90, 1, 50); // ניטראלי

עיכוב (timingDelay);

interpolate2Servos (1, 80, 2, 80, 1, 60); // ניטראלי

עיכוב (timingDelay);

interpolate2Servos (1, 110, 2, 80, 1, 60); // ניטראלי

עיכוב (timingDelay);

// interpolate2Servos (1, 110, 2, 110, 1, 60); // ניטראלי

עיכוב (timingDelay);

}

spin spin 1 () {

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

צף deg = (degStart * 3.141592 / 180); // להמיר מעלות לרדיאנים

צף xPos = 90 + (cos (deg) * radius);

// xPos = עגול (xPos);

צף yPos = 90 + (sin (deg) * רדיוס);

// yPos = עגול (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);

עיכוב (timingDelay);

if (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 (j);

Serial.print (",");

Serial.println (k);

עיכוב (100);

}

}

מוּמלָץ: