ذراع روبوتية بست درجات حرية يمكنك صنعها بنفسك - الطباعة ثلاثية الأبعاد، والتوصيل، والبرمجة خطوة بخطوة

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

يستخدم هذا الذراع الروبوتي ذو الست درجات حرية الذي يمكنك صنعه بنفسك ثلاثة محركات سيرفو عالية العزم MG996R بالنسبة لمفاصل القاعدة والكتف والمرفق التي تتحمل الرفع الثقيل، وثلاثة محركات سيرفو صغيرة SG90 للمعصم الخفيف والقبضة المحكمة. على سبيل المثال، للاطلاع على شرح مبسط لكيفية عمل هذه المحركات، راجع قسمنا دليل التحكم في محرك المؤازرة. وبدورها، يتم التحكم في كل محرك مؤازر في الوقت الفعلي بواسطة مقياس جهد مخصص بقيمة 10 كيلو أوم، ويتم التعامل مع جميع إشارات تعديل عرض النبضة الست بواسطة لوحة تشغيل محرك سيرفو PCA9685 عبر بروتوكول I²C - مما يحافظ على نظافة الأسلاك ويحرر منافذ Arduino للترقيات المستقبلية.

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

نظرة عامة على المشروع

بشكل عام، يتم تنظيم عملية البناء في أربع مراحل رئيسية: التصميم بمساعدة الحاسوب (CAD), الطباعة ثلاثية الأبعاد, التجميع الميكانيكي, ، و توصيلات إلكترونية مع برمجة. علاوة على ذلك، يتم تصميم كل ملف STL قابل للطباعة ثلاثية الأبعاد في برنامج Autodesk Inventor بتفاوتات دقيقة لحوامل المؤازرة ومقاعد المحامل، بحيث تتناسب الأجزاء معًا دون تعديل.

على صعيد الإلكترونيات، يقوم أردوينو أونو بقراءة القيم التناظرية من ستة مقاومات متغيرة بقيمة 10 كيلو أوم، ويرسل أوامر I²C إلى مُشغّل PWM ذي 16 قناة من نوع PCA9685. بدوره، يُخرج المُشغّل عرض النبضات المناسب لكل محرك سيرفو. ونتيجةً لذلك، يحافظ هذا التصميم على تيار السيرفو العالي منفصلاً تماماً عن الأردوينو، مما يتيح إضافة مستشعرات أو وحدات لاسلكية لاحقاً.

قائمة المواد الكاملة

قبل البدء، اجمع جميع المكونات المذكورة في الجدول أدناه. سيضمن وجود جميع الأجزاء في متناول يدك تجنب التوقفات المحبطة أثناء عملية البناء.

أجزاء ومكونات ذراع روبوتية بست درجات حرية

غرضكميةجزءوصف
11الأساس_1باختصار، المنصة الأساسية
21base_link_upper1وبالمثل، القسم السفلي العلوي
31arm_link_1وبالتحديد، وصلة الذراع الأولى
41arm_link_2وبالمثل، وصلة الذراع الثانية
51arm_link_3وبالمثل، وصلة الذراع الثالثة
61قاعدة المقبضباختصار، قاعدة ماسكة
71Gripper_2وبالمثل، إصبع القابض
81جير_رايتمعدات التثبيت (يمين)
91الترس الأيسرمعدات التثبيت (يسار)
101ماسكمجموعة الماسك
114وصلةأجزاء وصلة الماسك
122فاصلفواصل مفصل الماسك
133محرك سيرفو MG996Rباختصار، محرك سيرفو عالي العزم (القاعدة، الكتف، الكوع)
143محرك سيرفو صغير SG90وبالمثل، محرك سيرفو صغير (معصم، ماسك)
1514ANSI B18.6.4 رقم 2-32 3/8 بوصةوبالتحديد، برغي رأس العارضة، رقم 2-32
162ANSI B18.6.4 رقم 2-32 1/4 بوصةمسمار رأس دعامة، رقم 2-32
173DIN 7985 M1.6×2-Zبرغي متقاطع M1.6×2
187ISO 4762 M3x16 (AS 1420)باختصار، برغي ذو رأس سداسي M3×16
1912ISO 4032 M3 (AS 1112)وبالمثل، صامولة سداسية M3
202ANSI B18.6.4 رقم 2-32 1/2 بوصةمسمار رأس دعامة، رقم 2-32
213بوق MG955بوق لبندقية MG996R
223DIN 7985 M3x6-Zبرغي متقاطع M3×6
233ذراع سيرفو SG90بوق لـ SG90
242ANSI B18.6.4 رقم 2-32 3/8 بوصةمسمار رأس دعامة، رقم 2-32
2512ANSI B18.6.4 رقم 3-28 1/2 بوصةمسمار رأس دعامة، رقم 3-28
261محمل كروي 6806ZZ (30x42x7)على وجه التحديد، محمل ذو أخدود عميق (30×42×7)
271أردوينو أونو أو ميجاباختصار، وحدة التحكم الرئيسية
281لوحة تشغيل المؤازرة PCA9685وبالتحديد، مشغل PWM ذو 16 قناة (I²C)
296مقياس جهد 10 كيلو أوموبالمثل، مقبض تحكم تناظري لكل محرك سيرفو
301لوح التجاربباختصار، قاعدة توصيل لمقاييس الجهد
311مزود طاقة 5 فولت 10 أمبيروالأهم من ذلك، مصدر طاقة المؤازرة
321أسلاك توصيل (ذكر-ذكر)على وجه التحديد، وصلات أردوينو ↔ PCA9685
331أسلاك توصيل (ذكر-أنثى)وبالمثل، توصيلات مقياس الجهد الكهربائي مع أردوينو
341لوح خشبيبشكل أساسي، منصة تثبيت الذراع

تصميم الأجزاء في برنامج Autodesk Inventor

المرحلة الأولى هي تصميم كل مكون في برنامج Autodesk Inventor. يتيح لك هذا البرنامج، المصمم بتقنية CAD البارامترية، تحديد الأبعاد بدقة، وتنعيم الحواف لزيادة المتانة، والتحقق من التوافق قبل طباعة أي غرام من خيوط الطباعة ثلاثية الأبعاد. إذا كنت جديدًا على برنامج Inventor أو الطباعة ثلاثية الأبعاد، فراجع دليلنا. مقدمة في الطباعة ثلاثية الأبعاد والتصميم ثلاثي الأبعاد باستخدام برنامج Inventor قبل البدء.

بشكل أساسي، هناك نوعان من المحركات المؤازرة يحددان قيود التصميم. محركات سيرفو صغيرة SG90 تتميز هذه الأجزاء بخفة وزنها، مما يسمح لها بالتعامل مع المفاصل العلوية والمقبض بفضل حجمها الصغير، بينما محركات سيرفو MG996R تُزوّد هذه الآلية قاعدة الدوران ومفصلي الكتف والمرفق الثقيلين بالطاقة اللازمة لتحريك الذراع بالكامل. يوضح الرسم الفني أدناه جميع أبعاد الأجزاء، والمقاطع العرضية، وعلاقات التجميع - استخدمه كمرجع عند التحقق من دقة الطباعة.

Technical drawing of a DIY 6-DOF robotic arm showing all mechanical parts, servos, and assembly dimensions

طباعة مكونات الذراع الروبوتية ذات الست درجات حرية بتقنية الطباعة ثلاثية الأبعاد

بعد تصدير ملفات STL من برنامج Inventor، حان وقت تشغيل الطابعة ثلاثية الأبعاد. بالنسبة لهذا المشروع،, خيوط PLA يُنصح باستخدامه لسهولة طباعته وجودة إعادة إنتاج التفاصيل. وللحصول على أفضل النتائج، استخدم ارتفاع طبقة يبلغ 0.2 مم وعلى الأقل حشوة 40% للأجزاء الهيكلية مثل القاعدة ووصلات الذراع.

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

3D printed PLA components of the 6-DOF robotic arm laid out before assembly
Overview of all 3D printed robotic arm parts ready for assembly

تجميع ذراعك الروبوتية ذات الست درجات حرية بنفسك

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

Installing the MG996R servo motor into the 3D printed base mount

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

قبل كل شيء، القاعدة هي أساس الذراع بأكملها، لذا فإن الدقة هنا أمر بالغ الأهمية.

  • تأمين محرك المؤازرة — قم بتركيب محرك MG996R الأول في قاعدة التثبيت باستخدام البراغي المرفقة (أو براغي ذاتية التثبيت برأس متقاطع M3×12). يوفر هذا المحرك الحركة الدورانية الأساسية للذراع.
  • إضافة محمل الكرات (6806ZZ، 30×42×7 مم) — قم بتركيب محمل الكرات ذي الأخدود العميق في مكانه على القاعدة. وبالتحديد، يقع المحمل بين لوحة القاعدة الثابتة والمنصة العلوية الدوارة، مما يقلل الاحتكاك ويطيل عمر المفصل.
  • توصيل ذراع المؤازرة — ثبّت ذراع المؤازرة على المنصة العلوية الدوارة باستخدام براغي ذاتية التثبيت M2×12. والأهم من ذلك، تأكد من إحكام التثبيت، حيث ينقل هذا الذراع كامل قوة الدوران من المؤازرة إلى باقي الذراع فوقه.
Installing ball bearing 6806ZZ into the robotic arm base for smooth rotation
Attaching the servo horn to the rotating upper section of the robotic arm base

الخطوة الثانية: تركيب أذرع المؤازرة على وصلات الذراع

بعد ذلك، قم بمحاذاة كل ذراع من أذرع المؤازرة مع نقطة تثبيت وصلة الذراع المقابلة له، ثم ثبّته بمسمارين لكل ذراع. تأكد تحديدًا من محاذاة الثقوب بدقة تامة، لأن عدم محاذاة الذراع سيؤدي إلى احتكاك وحركة غير منتظمة، لذا تحقق جيدًا من كل وصلة قبل إحكام ربطها بالكامل.

Mounting servo horns to the robot arm links using alignment screws

الخطوة 3: تركيب محركات المؤازرة على وصلات الذراع

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

Servo motors mounted securely to the 3D printed arm links

الخطوة الرابعة: توصيل وصلات الذراع

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

Connecting the robot arm links together to form the articulated joint structure

الخطوة 5: تجميع الماسك

بعد ذلك، قم بتثبيت مجموعة الماسك الفرعية على وصلة نهاية الذراع. يستخدم الماسك محرك سيرفو صغير SG90 مزودًا بترسين مطبوعين بتقنية الطباعة ثلاثية الأبعاد لفتح وإغلاق الأصابع. استخدم براغي M3×20 لمفاصل الماسك وتأكد من أن الأصابع تتحرك بحرية تامة دون أي احتكاك.

Assembling the gripper mechanism with gears and SG90 micro servo

الخطوة السادسة: تثبيت الذراع على قاعدة خشبية

أخيرًا، قم بتثبيت الذراع المُجمّع بالكامل على لوح خشبي مسطح باستخدام براغي ذاتية الثقب M3×12. وبذلك، تمنع القاعدة الصلبة الذراع من الانقلاب أثناء الحركات السريعة، وتوفر منصة ملائمة لتركيب لوحة التجارب ومصدر الطاقة لاحقًا.

Fully assembled 6-DOF robotic arm mounted on a wooden base platform
Securing the robotic arm to the wooden base with mounting screws

توصيل ذراع الروبوت ذي الست درجات حرية: أردوينو ومحرك المؤازرة

بمجرد الانتهاء من بناء الأجزاء الميكانيكية لذراع الروبوت ذي الست درجات حرية الذي تصنعه بنفسك، يحين وقت توصيل الإلكترونيات. يتكون نظام التحكم أساسًا من ثلاثة عناصر رئيسية: أردوينو أونو (أو ميجا) كوحدة تحكم دقيقة، لوحة تشغيل محرك سيرفو PCA9685 لتوليد إشارات تعديل عرض النبضة (PWM)، وستة مقاومات متغيرة 10 كيلو أوم لإدخال المستخدم.

دليل المكونات والأسلاك

  • Arduino Uno / Mega — Essentially, the main controller. Essentially, it reads potentiometer values and sends I²C commands to the PCA9685.
  • لوحة تشغيل المؤازرة PCA9685 — An I²C-controlled, 16-channel PWM driver. Furthermore, it handles all six servo signals, leaving room for expansion later.
  • 5 V 10 A Power Supply — Importantly, provides dedicated power to the servos through the PCA9685 V+ terminal. Importantly, never power six servos from the Arduino’s 5 V pin — it cannot supply enough current.
  • 6 × 10 kΩ Potentiometers — Correspondingly, connected to Arduino analog pins A0–A5. Essentially, turning a knob changes the voltage, which the Arduino reads as a value from 0 to 1023.
  • Breadboard and Jumper Wires — Essentially, used to organize potentiometer connections cleanly.

Wiring Steps

  1. PCA9685 → Arduino: First, connect VCC to 5 V, GND to GND, SDA to A4, and SCL to A5. Similarly, on the Mega, SDA and SCL use pins 20 and 21 respectively.
  2. Servos → PCA9685: Next, plug each servo’s 3-pin connector into channels 0–5 on the PCA9685. Also, make sure the ground wire (brown or black) aligns with the bottom row of headers.
  3. Potentiometers → Arduino: Then, wire the outer legs of each pot to 5 V and GND on the breadboard, and connect the center (wiper) pin to A0 through A5.
  4. Servo Power Supply: Finally, connect the 5 V 10 A supply to the PCA9685 V+ and GND screw terminals. As a result, this keeps high servo current completely separate from the Arduino.
Complete wiring diagram for the 6-DOF robotic arm with Arduino and PCA9685 servo driver

لماذا يحتاج الذراع الروبوتي ذو 6 درجات حرية إلى محرك سيرفو PCA9685

So, why not just drive servos straight from the Arduino? You can — however, it quickly becomes limiting. After all, the Arduino Uno has only six PWM-capable pins, and the built-in Servo library can conflict with other timer-dependent features like tone() or certain communication protocols.

Instead, the PCA9685 solves this by offloading all PWM generation to a dedicated chip. Specifically, it communicates over the I²C bus using just two wires (SDA and SCL) regardless of how many servos you control. Moreover, a single board handles 16 channels, and you can daisy-chain up to 62 boards for a theoretical maximum of 992 servos.

مرجع توصيلات PCA9685

  • أرضي — Essentially, common ground shared with the Arduino.
  • OE (Output Enable) — By default, active low. Therefore, leave unconnected to keep all outputs enabled by default.
  • SCL — Specifically, I²C clock line for synchronization.
  • السبتيين — Similarly, I²C data line for communication.
  • VCC — Specifically, logic power at 3.3–5 V. Notably, powers only the PCA9685 chip, not the servos.
  • V+ — Importantly, servo power rail (up to 6 V). Then, connect your external supply here via the polarized screw terminal.

Consequently, each channel on the board has a 3-pin header that accepts a standard servo connector directly, making wiring quick and error-proof.

PCA9685 servo driver board pinout and connection diagram for Arduino

برمجة الذراع الروبوتية ذات 6 درجات حرية للتحكم المؤازر

Ultimately, the Arduino sketch ties everything together. Essentially, it reads the voltage on each analog pin, converts it into a servo pulse width, and sends the result to the PCA9685. Below is how the key logic works, step by step.

How the Code Works

  1. Library Initialization — First, the sketch includes Wire.h for I²C and Adafruit_PWMServoDriver.h for the PCA9685. In setup(), it calls pwm.begin() and sets the PWM frequency to 60 Hz — the standard refresh rate for hobby servos.
  2. Reading the Potentiometers — Inside حلقة(), Next, analogRead(A0) through analogRead(A5) returns a value between 0 and 1023, corresponding to the knob position.
  3. Subsequently, mapping to Servo Pulse - ال رسم خريطة() function converts the 0–1023 range into a 125–575 tick range. These tick values represent the minimum and maximum pulse widths the PCA9685 outputs at 60 Hz (roughly 1 ms to 2.3 ms), which correspond to the servo’s full rotation range.
  4. Then, setting the PWM Outputpwm.setPWM(channel, 0, ticks) In turn, sends the computed pulse to the correct PCA9685 channel. The second parameter (0) is the “on” tick, and the third is the “off” tick within the 4096-step PWM cycle.
  5. Loop Delay — Finally, a 20 ms delay at the end of each loop keeps the refresh rate smooth and prevents flooding the I²C bus.

Finally, upload the following sketch to your Arduino Uno (or Mega). Make sure the مكتبة برامج تشغيل محركات سيرفو PWM من Adafruit is installed via the Arduino Library Manager before compiling.

Arduino Sketch: Full Source Code

/**
 * Author: Omar Draidrya
 * Date: 2024/05/05
 * Controls 6 servos via PCA9685 with potentiometer input.
 */
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); // Default address 0x40
void setup() {
    Serial.begin(9600);           // First, init serial.
    pwm.begin();                  // Then, init PCA9685.
    pwm.setPWMFreq(60);           // Specifically, 60 Hz for servos.
}
void loop() {
    // Servo 0
    int potValue0 = analogRead(A0);           // First, read A0
    int servoPos0 = map(potValue0, 0, 1023, 125, 575); // Map to pulse range
    pwm.setPWM(0, 0, servoPos0);              // Set servo 0
    // Servo 1
    int potValue1 = analogRead(A1);           // Then, read A1
    int servoPos1 = map(potValue1, 0, 1023, 125, 575); // Map to pulse range
    pwm.setPWM(1, 0, servoPos1);              // Set servo 1
    // Servo 2
    int potValue2 = analogRead(A2);           // Similarly, read A2
    int servoPos2 = map(potValue2, 0, 1023, 125, 575); // Map to pulse range
    pwm.setPWM(2, 0, servoPos2);              // Set servo 2
    // Servo 3
    int potValue3 = analogRead(A3);           // Next, read A3
    int servoPos3 = map(potValue3, 0, 1023, 125, 575); // Map to pulse range
    pwm.setPWM(3, 0, servoPos3);              // Set servo 3
    // Servo 4
    int potValue4 = analogRead(A4);           // Likewise, read A4
    int servoPos4 = map(potValue4, 0, 1023, 125, 575); // Map to pulse range
    pwm.setPWM(4, 0, servoPos4);              // Set servo 4
    // Servo 5
    int potValue5 = analogRead(A5);           // Finally, read A5
    int servoPos5 = map(potValue5, 0, 1023, 125, 575); // Map to pulse range
    pwm.setPWM(5, 0, servoPos5);              // Set servo 5
    delay(20);   // Finally, loop delay
}

Required Libraries

Before compiling, first install the following libraries through the Arduino IDE Library Manager: مكتبة برامج تشغيل محركات سيرفو PWM من Adafruit و سلك (included by default). After that, then select your board (Arduino Uno or Mega), choose the correct COM port, and click Upload.

معايرة واختبار ذراعك الروبوتية ذات 6 درجات حرية

Once your DIY 6-DOF robotic arm is fully wired, power on the servo supply and slowly turn each potentiometer. As a result, you should see the corresponding joint move in real time. If a joint moves in the wrong direction, swap the outer wires on that potentiometer to reverse it.

Fine-tune the رسم خريطة() range values (125 and 575) for each servo individually. For example, some servos may need slightly different minimum and maximum tick values to avoid mechanical end-stop buzzing. Lastly, test the arm under load by picking up small objects with the gripper to confirm torque and stability.

ذراع روبوتية بست درجات حرية: الخلاصة والخطوات التالية

Congratulations — you now have, indeed, a fully functional DIY 6-DOF robotic arm built entirely from scratch. Indeed, this project covers every core discipline of mechatronics: CAD design, additive manufacturing, electronic wiring, and embedded programming.

From here, consequently, the possibilities are wide open. You could add inverse kinematics for automated positioning, integrate a Bluetooth module for wireless control (we did exactly that in our Bluetooth-controlled robotic arm upgrade), or train the arm to record and replay movement sequences. Regardless of which direction you take, this six-axis platform gives you a solid foundation for deeper exploration into robotics and automation.

قم بتنزيل ملفات الطباعة ثلاثية الأبعاد (STL)

جميع ملفات STL القابلة للطباعة ثلاثية الأبعاد لهذا المشروع متاحة للتنزيل. يمكنك الحصول عليها من متجرنا أو تصفحها على موقع Cults3D.

  • متجر أومارترونيكس: قم بتنزيل ملف المشروع من OmArTronics — احصل على حزمة المشروع الكاملة بما في ذلك ملفات STL ومخططات الأسلاك وشفرة المصدر التي يتم تسليمها إلى بريدك الإلكتروني.
  • Cults3D: شاهد على موقع Cults3D — تصفح وقم بتنزيل ملفات النماذج ثلاثية الأبعاد على موقع Cults3D.

7 رأي حول “DIY 6-DOF Robotic Arm – 3D Print, Wire & Program Step by Step”

  1. I am building an AI Robot and want to use your robotic arm in the build. I want to mount it on the front side vertically. I noticed on past photos there was a tension spring attached to the rotating base to the first arm piece but not listed in the parts list or build instructions. I wish to implement the spring back into the build because of its vertical placement on my robot. Can you provide me with the specifications for the spring? This robotic arm is in my opinion is one of the better designed and documented arms of its type out on the web.

    رد
    • Thanks a lot! I’m glad you liked the design
      Yes, that tension spring connects the rotating base to the first arm segment to help support the shoulder joint, especially when the arm is mounted vertically.
      The spring is about 2 cm long (at rest) and 9 mm in diameter.
      I actually reused it from an old desk lamp stand, but you can find similar extension springs easily online or in hardware stores.
      It’s optional but really helps balance the arm and reduce servo stress.

      Spring

      رد
  2. Hello! I wanted to ask the function of the atachment points on the base and the first link, are they for a spring? it is modelled but the pictures of the assembly don’t have this feature, nor is it referenced on the post. Thank you! this is a nice design

    رد
    • Yes, those points are for a spring. The spring is optional — it helps the shoulder joint carry part of the arm’s weight.
      This feature was added in a later version of the design.
      You can also use a rubber band, but I personally prefer a spring.
      The one I used is about 2 cm long (at rest) and 9 mm in diameter.
      I actually took it from an old desk lamp stand, but you can easily find similar springs online or in hardware stores.
      Spring

      رد

أضف تعليق