قارب بيض مطبوع ثلاثي الأبعاد مقابل 15 دولارًا فقط. وصفة الطبخ

مرحبا بالجميع!

الصورة

ينتهي عيد الفصح ويصبح موضوع طباعة أنماط مختلفة على البيض أقل صلة بقليل ، ولكن هذا لا يجعل قارب البيض أقل حاجة ، والذي يحتاجه الجميع وهو دائمًا على مدار السنة :)

بالنسبة لأولئك الذين لا يعرفون ، فإن قارب البيض عبارة عن آلة يمكنها الرسم على أي أجسام كروية بقلم حساس عادي: البيض وكرات التنس وزينة شجرة عيد الميلاد. تم اختراع مفهوم الآلية من قبل المصمم بروس شابيرو في عام 1990 ، ومنذ وقت ليس ببعيد قامت شركة Evil Mad Scientist Laboratories الشهيرة بإصدار نسختها تحت اسم EggBot . يجب أن نشيد بمختبرات Evil Mad Scientist ، فقد تم فتح المشروع ويسمح باستخدام البرامج لبرامج الروبوت الأخرى ، حتى في المشاريع التجارية.

فيما يلي الأعمال الفنية التي تم الحصول عليها عند الإخراج:

الصورة


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

هنا مثال على مثل هذا البرنامج:
# Generate a 3200 x 800 geometrical pattern for Eggbot plotting # See http://www.egg-bot.com/ for info on the Eggbot # # Dan Newman, 2 January 2011 # dan dot newman at mtbaldy dot us # Public domain (http://creativecommons.org/licenses/publicdomain/) HEIGHT = float( 800.0 ) WIDTH = float( 3200.0 ) scale = WIDTH / ( 16.0 * 3 ) # 16 horizontal repeats epsilon = float(1.0e-5) # Relative moves for drawing the vertical elements DOWN = [[0.0, scale], [scale, 2*scale], [0.0, scale], [-scale, 2*scale]] UP = [[0.0, -scale], [scale, -2*scale], [0.0, -scale], [-scale, -2*scale]] # How to switch to going up when you stop going down after DOWN[i] DU_switch = [scale, -scale, -scale, scale] # Relative moves for drawing the horizontal elements (L2R = left-to-right) L2R = [[scale, 0.0], [2*scale, scale], [scale, 0.0], [2*scale, -scale]] R2L = [[-scale, 0.0], [-2*scale, scale], [-scale, 0.0], [-2*scale, -scale]] # How to switch to R2L after stopping in L2R at index i LR_switch = [scale, -scale, -scale, scale] # Compute the intersection of two lines # See eggbot_hatch.py for complete details def intersect( P1, P2, P3, P4 ): ''' Determine if two line segments defined by the four points P1 & P2 and P3 & P4 intersect. If they do intersect, then return the fractional point of intersection "sa" along the first line at which the intersection occurs. ''' # Precompute these values -- note that we're basically shifting from # # P = P1 + s (P2 - P1) # # to # # P = P1 + s D # # where D is a direction vector. The solution remains the same of # course. We'll just be computing D once for each line rather than # computing it a couple of times. D21x = P2[0] - P1[0] D21y = P2[1] - P1[1] D43x = P4[0] - P3[0] D43y = P4[1] - P3[1] # Denominator d = D21x * D43y - D21y * D43x # Return now if the denominator is zero if d == 0: return float( -1 ) # For our purposes, the first line segment given # by P1 & P2 is the LONG hatch line running through # the entire drawing. And, P3 & P4 describe the # usually much shorter line segment from a polygon. # As such, we compute sb first as it's more likely # to indicate "no intersection". That is, sa is # more likely to indicate an intersection with a # much a long line containing P3 & P4. nb = ( P1[1] - P3[1] ) * D21x - ( P1[0] - P3[0] ) * D21y # Could first check if abs(nb) > abs(d) or if # the signs differ. sb = float( nb ) / float( d ) if ( sb < 0 ) or ( sb > 1 ): return float( -1 ) na = ( P1[1] - P3[1] ) * D43x - ( P1[0] - P3[0] ) * D43y sa = float( na ) / float( d ) if ( sa < 0 ) or ( sa > 1 ): return float( -1 ) return sa # Determine whether a line segment needs to be clipped to # fit within the drawing page def clip( x1, y1, x2, y2 ): if ( x1 >= 0.0 ) and ( x1 <= WIDTH ) and ( x2 >= 0.0 ) and ( x2 <= WIDTH ) and \ ( y1 >= 0.0 ) and ( y1 <= HEIGHT ) and ( y2 >= 0.0 ) and ( y2 <= HEIGHT ): return float( -1.0 ) if ( x1 < 0.0 ) or ( x2 < 0.0 ): s = intersect( [x1, y1], [x2, y2], [0.0, 0.0], [0.0, HEIGHT] ) if ( s > 0.0 ): return s if ( x1 > WIDTH ) or ( x2 > WIDTH ): # We allow going an extra pixel across in case there is drawing error s = intersect( [x1, y1], [x2, y2], [WIDTH+1.0, 0.0], [WIDTH+1.0, HEIGHT] ) if ( s > 0.0 ): return s if ( y1 < 0.0 ) or ( y2 < 0.0 ): s = intersect( [x1, y1], [x2, y2], [0.0, 0.0], [WIDTH, 0.0] ) if ( s > 0.0 ): return s if ( y1 > HEIGHT ) or ( y2 > HEIGHT ): s = intersect( [x1, y1], [x2, y2], [0.0, HEIGHT], [WIDTH, HEIGHT] ) if ( s > 0.0 ): return s return float( -1.0 ) # Plot a collection of line segments def plot( points, color='black' ): # First line segment s = clip( points[0][0], points[0][1], points[1][0], points[1][1] ) if ( s < 0.0 ): p = 'M %f,%f' % ( points[0][0], points[0][1] ) else: p = 'M %f,%f' % ( points[0][0] + s * ( points[1][0] - points[0][0] ), points[0][1] + s * ( points[1][1] - points[0][1] ) ) x0 = points[1][0] y0 = points[1][1] p += ' L %f,%f' % ( x0, y0 ) # Intermediate line segments for i in range(2, len( points ) - 1): x0 = points[i][0] y0 = points[i][1] p += ' L %f,%f' % ( x0, y0 ) # Final line segment x = points[-1][0] y = points[-1][1] s = clip( x0, y0, x, y ) if ( s < 0.0 ): p += ' L %f,%f' % ( x, y ) else: p += ' L %f,%f' % ( x0 + s * ( x - x0 ), y0 + s * ( y - y0 ) ) print '<path stroke="%s" stroke-width="1" fill="none" d="%s"/>' % ( color, p ) # Draw the vertical elements def vertical( x, y, color, down, up ): if ( y > ( scale + epsilon ) ): i = len( down ) - 1 while ( y > ( scale + epsilon) ): x -= down[i][0] y -= down[i][1] i -= 1 if ( i < 0 ): i = len( down ) - 1 else: i = -1 points = [[x, y]] while ( y < ( HEIGHT - epsilon ) ): i += 1 if ( i >= len( down ) ): i = 0 x += down[i][0] y += down[i][1] points.append( [x, y] ) plot( points, color ) x += DU_switch[i] points = [[x, y]] while ( y > epsilon ): x += up[i][0] y += up[i][1] points.append( [x, y] ) i -= 1 if ( i < 0 ): i = len( up ) - 1 plot( points, color ) # Draw the horizontal elements def horizontal( x, y, color, l2r, r2l ): if ( x > ( scale + epsilon ) ): i = len( l2r ) - 1 while ( x > ( scale + epsilon ) ): x -= l2r[i][0] y -= l2r[i][1] i -= 1 if ( i < 0 ): i = len( l2r ) - 1 else: i = -1 points = [[x, y]] while ( x < ( WIDTH - epsilon ) ): i += 1 if ( i >= len( l2r ) ): i = 0 x += l2r[i][0] y += l2r[i][1] points.append( [x, y] ) plot( points, color ) y += LR_switch[i] points = [[x, y]] while ( x > epsilon ): x += r2l[i][0] y += r2l[i][1] points.append( [x, y] ) i -= 1 if ( i < 0 ): i = len( r2l ) - 1 plot( points, color ) print '<svg xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="%d" height="%d">' % ( int( WIDTH ), int( HEIGHT ) ) print '<g inkscape:groupmode="layer" inkscape:label="1 - vertical">' Color = 'green' x1 = 0.0 y1 = 0.0 x2 = 1.5 * scale y2 = 1.5 * scale while ( x1 < ( WIDTH - epsilon ) ): vertical( x1, y1, 'green', DOWN, UP ) if ( x2 < ( WIDTH - epsilon ) ): vertical( x2, y2, 'green', DOWN, UP ) x1 += 3 * scale x2 += 3 * scale print '</g>' print '<g inkscape:groupmode="layer" inkscape:label="2 - horizontal">' x1 = 0.0 y1 = 0.0 x2 = 1.5 * scale y2 = 1.5 * scale while ( y1 < ( HEIGHT - epsilon ) ): horizontal( x1, y1, 'blue', L2R, R2L) if ( y2 < ( HEIGHT - epsilon ) ): horizontal( x2, y2, 'blue', L2R, R2L) y1 += 3 * scale y2 += 3 * scale print '</g>' print '<g inkscape:groupmode="layer" inkscape:label="3 - border">' print '<path stroke="black" stroke-width="1" fill="none" d="M 0,0 l %d,0"/>' % ( int( WIDTH ) ) print '<path stroke="black" stroke-width="1" fill="none" d="M 0,%dl %d,0"/>' % ( int( HEIGHT ), int( WIDTH ) ) print '</g>' print '</svg>' 


لكن الصورة الناتجة موجودة بالفعل على البيضة:

الصورة


حتى أن المتحمسين يقومون بإنشاء صور ذات تأثير اصطرابي أثناء الدوران:



عند إنشاء زورق البيض الخاص بي ، لم أحدد لنفسي هدف لقاء 15 دولارًا ، ولكنه حدث :). للمقارنة ، يكلف Eggbot Pro الأصلي 325 دولارًا ، وهو أمر من حيث الحجم أكثر تكلفة. التكلفة الرئيسية لأي قارب بيض هي محركات السائر. لقد استخدمت أكثرها بأسعار معقولة - 28BYJ-48-12V ، وبالتالي سعرها النهائي 15 دولارًا.

لتحضير زورق البيض الخاص بي ، ستحتاج إلى:

1.110 جرام من بلاستيك ABS أو PLA. طبعت الأجزاء السوداء مع ABS ، PLA الأصفر. إن PLA مؤلم جميل عند الطباعة على الزجاج :)
2. الالكترونيات في الأوراق المالية:

  • 1 × الصينية Arduino UNO c Aliexpress مع كابل لجهاز الكمبيوتر مقابل 250 روبل.
  • 2 x 28BYJ-48-12V Stepper motor + ULN2003 Stepper motor driver لـ 100 روبل.
  • 1 × SG90 Micro Servo Motor 100 rub.
  • 1 × 12 فولت إمدادات الطاقة (لا يمكنك شراء إذا كان لديك واحد).

3. ما لا يمكننا طباعته ، ولكن يمكننا شراء أي متجر أجهزة تقريبًا:

  • الربيع.
  • براغي ، براغي ، صواميل ، غسالات.
  • حشية مطاطية (يمكنك الطباعة إذا كان لديك فليكس).
  • تحمل 608.

نضع البلاستيك في الطابعة ثلاثية الأبعاد ونطبع التفاصيل ، التي وضعت نماذجها بعناية هنا .

تفاصيل حول ما وكم يجب طباعته ، ومكان الحصول على الإلكترونيات بالضبط ، وعدد ونوع البراغي التي تحتاج إلى النظر إليها هنا .

بالنسبة لأولئك الذين لم يشتروا طابعة ثلاثية الأبعاد بعد ، ولكنهم يريدون حقًا إعداد قارب البيض الخاص بهم ، يمكنني طباعة جميع التفاصيل وإرسالها بالبريد. اتصل في PM ، كل شيء سيكون بأفضل طريقة ممكنة! أضمن ذلك!

بعد الطباعة ، يمكنك البدء في التجميع. يبدو تجميع الجهاز كالتالي:

الصورة

لكي تنجح ، قضيت الكثير من الوقت وأعدت تعليمات لتجميع وتوصيل الإلكترونيات في الصور. يمكنك تنزيل التعليمات هنا .

بعد الطباعة والتجميع ، يجب أن تحصل على مثل هذا الجهاز:

الصورة

بعد اكتمال التجميع ، تحتاج إلى وضع البرامج الثابتة في زورق البيض. بما أن دماغ الجهاز هو اردوينو عادي ، فلا يجب أن تواجه مشاكل مع هذا.

  1. قم بتنزيل وفك البرامج الثابتة من هنا .
  2. قم بتنزيل Arduino IDE وتثبيته وتشغيله.
  3. نقوم بتوصيل قارب البيض بالكمبيوتر ، حدد طراز اللوحة ومنفذ COM في Arduino IDE.
  4. افتح ملف Eggduino.ino من المجلد الذي يحتوي على البرنامج الثابت وقم بتحميله في Arduino.

يتم استخدام برنامج إنكسكيب المعروف مع مكون إضافي كتبه مختبرات Evil Mad Scientist كبرنامج تحكم. يسمح لك البرنامج المساعد بتخصيص eggbot وإدارتها يدويًا وإرسال الصور للطباعة. أضفت البرنامج المساعد بعناية إلى إنكسكيب وأضفت الأرشيف النهائي هنا .

إذا كان لديك بالفعل إنكسكيب ، ولكن لا يوجد أي مكون إضافي ، فيمكنك أخذه بشكل منفصل هنا .

قم بتحميل وتثبيت وتشغيل إنكسكيب. نذهب إلى قائمة الإضافات ، ابحث عن القائمة الفرعية EggBot هناك. افتح المكوّن الإضافي واضبط ارتفاع قلم التلميح واطبع أي شيء على البيضة.

إذا كان لديك إنكسكيب عند محاولة التحكم في البوت يعطي الخطأ "فشل الاتصال بـ EggBot" ، فلا تيأس. يمكن حل المشكلة بسهولة. ابحث في قائمة الأجهزة المتصلة ، ما اسم اللوحة الخاصة بك. بعد ذلك ، في ملف ebb_serial.py الخاص بمكون Inkscape الإضافي ، استبدل "USB-SERIAL CH340" باسمك في السطر 52.

قمت أيضًا بجمع وتحميل مجموعة صغيرة مع أمثلة. يمكنك رؤيتها هنا .

ونتيجة لذلك ، يجب أن يعمل قارب البيض على النحو التالي:


لقد نشرت مشروعي على جيثب . شوكة ، ووضع النجوم ، وتعديل ، وهلم جرا. كما أنني لم أنس أمر thingiverse.com أيضًا.

شكرا لكم على اهتمامكم!

Source: https://habr.com/ru/post/ar403293/


All Articles