يعد هذا المشروع مثاليًا إذا كنت ترغب في إنشاء آلية عين وظيفية وواقعية، ولكن ليس لديك بالضرورة إمكانية الوصول إلى أدوات مثل المخرطة أو المكونات المتخصصة. ميزة أخرى لهذا التصميم هي أنه مصمم لاستخدام عيون إضافية يمكن استبدالها واستخدامها مع مكونات مطبوعة ثلاثية الأبعاد أخرى لإلقاء قبة واقعية للغاية على العين المطلية. هذه العملية معقدة للغاية، لذا لدي تعليمات أخرى حول كيفية صنع العيون، ولكن إذا كنت تفضل استخدام عيون بسيطة مطبوعة ثلاثية الأبعاد، فيمكنك القيام بذلك أيضًا.
سيتطلب هذا المشروع بعض المعالجة اللاحقة لمطبوعاتك، بما في ذلك بعض عمليات الحفر والصنفرة (اليدوية)، ولكن بخلاف الأساسيات (الطابعة ثلاثية الأبعاد، والسكين الحرفية، ومفك البراغي، ومفاتيح ألين) لا توجد حاجة إلى أدوات خاصة. هيا بنا لنبدء العمل
قد تكون الطباعة صعبة إلى حد ما بسبب الأجزاء الصغيرة، ولكن تتم طباعة غالبية الأجزاء بسرعة وسهولة دون إستخدام support. فقط تم إستخدام PLA لجميع الأجزاء بخلاف العينين (التي كانت ABS لأنها تبدو طبيعية أكثر قليلاً). هناك بعض الأجزاء الحساسة التي يجب البحث عنها أيضًا، ولكن إذا كنت تستخدم خيوط طباعة عالية الجودة وكنت سعيدًا بإعدادات الطباعة الخاصة بك، فيجب أن تكون على ما يرام. أخيرًا، الطباعة تمت بطبقة بارتفاع 0.2 مم وكان هذا أكثر من دقيق بدرجة كافية لهذا النموذج - وأظن أنه يمكنك التخلص من 0.3 مم حتى.
يمكن صنفرة العيون وتنعيمها بقدر ما تريد، ولكن قد يكون من الضروري إجراء القليل من الصنفرة في الجزء السفلي من النموذج حيث كانت الطابعة تطبع الجزء المتدلي. هذا فقط للتأكد من أن العين يمكن أن تدور بسلاسة داخل الجفون. الأجزاء الأخرى الوحيدة التي تم صقلها هي eye adaptor، فقط لأنها ملائمة بإحكام والطبقات القليلة السفلية في المطبوعات تميل دائمًا إلى أن تكون منتفخة قليلاً.
تم تصميم الأجزاء للطباعة بحيث تكون بعض الثقوب صغيرة الحجم بدرجة كافية ليتم تثبيتها مباشرة، في حين أن بعضها الآخر كبير الحجم بدرجة كافية بحيث يمر المسمار من خلالها بشكل مريح. إذا كانت الطابعة الخاصة بك تجعل الثقوب صغيرة الحجم ليتم تثبيتها أو تدويرها بسلاسة، فيمكنك استخدام مثقاب يدوي صغير لحفر بعض الثقوب لجعلها أكثر دقة، ويعد النقر على الخيوط خيارًا أيضًا (على الرغم من أن PLA عادة ما يمسك البراغي جيد إلى حد ما على أي حال).
بمجرد طباعة جميع الأجزاء و تجهيزها، يمكنك تجميعها. توجد أيضًا جميع الصور المرجعية في الأعلى.
من خلال الرجوع إلى الرسم، قم بتحميل الكود الموجود بالأسفل على الاردوينو وقم بتوصيل كل شيء. راجع دليل Adafruit إذا كنت بحاجة إلى مساعدة في إعداد لوحة قيادة محركات السيرفو. يجب الآن تشغيل جميع المحركات وفي وضعها المحايد، لذا اغتنم هذه الفرصة لربط جميع أذرع المحركات بالمحركات مع توجيه العيون للأمام بشكل مستقيم في وضع محايد. يمكنك فقط توصيلها، ثم فصل الطاقة لتثبيتها بشكل صحيح. ذراع السيرفو ذات المحور y في وضع حرج لقبول المسمار، لكنه ثابت بدون المسمار على أي حال. إذا لم يكن الأمر كذلك، فقد يكون من المفيد إزالة إحدى معززات الجفن لتثبيتها. أوصي باختبار الحركة باستخدام عصا التحكم الخاصة بك في هذه المرحلة للتأكد من عدم وجود مشكلات.
بالنسبة للجفون، من الأفضل أن تقوم بضبط المحركات لتكون في وضع الوميض حتى تتمكن من وضعها جميعًا في المنتصف. قم بذلك إما عن طريق الضغط باستمرار على مفتاح الوميض أو إنشاء اختصار فوقه. بمجرد أن تكون جميع أذرع السيرفو في موضعها، يصبح من السهل ربطها.
// Nilheim Mechatronics Simplified Eye Mechanism Code
// Make sure you have the Adafruit servo driver library installed >>>>> https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
// X-axis joystick pin: A1
// Y-axis joystick pin: A0
// Trim potentiometer pin: A2
// Button pin: 2
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
#define SERVOMIN 140 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX 520 // this is the 'maximum' pulse length count (out of 4096)
// our servo # counter
uint8_t servonum = 0;
int xval;
int yval;
int lexpulse;
int rexpulse;
int leypulse;
int reypulse;
int uplidpulse;
int lolidpulse;
int altuplidpulse;
int altlolidpulse;
int trimval;
const int analogInPin = A0;
int sensorValue = 0;
int outputValue = 0;
int switchval = 0;
void setup() {
Serial.begin(9600);
Serial.println("8 channel Servo test!");
pinMode(analogInPin, INPUT);
pinMode(2, INPUT);
pwm.begin();
pwm.setPWMFreq(60); // Analog servos run at ~60 Hz updates
delay(10);
}
// you can use this function if you'd like to set the pulse length in seconds
// e.g. setServoPulse(0, 0.001) is a ~1 millisecond pulse width. its not precise!
void setServoPulse(uint8_t n, double pulse) {
double pulselength;
pulselength = 1000000; // 1,000,000 us per second
pulselength /= 60; // 60 Hz
Serial.print(pulselength); Serial.println(" us per period");
pulselength /= 4096; // 12 bits of resolution
Serial.print(pulselength); Serial.println(" us per bit");
pulse *= 1000000; // convert to us
pulse /= pulselength;
Serial.println(pulse);
}
void loop() {
xval = analogRead(A1);
lexpulse = map(xval, 0,1023, 220, 440);
rexpulse = lexpulse;
switchval = digitalRead(2);
yval = analogRead(A0);
leypulse = map(yval, 0,1023, 250, 500);
reypulse = map(yval, 0,1023, 400, 280);
trimval = analogRead(A2);
trimval=map(trimval, 320, 580, -40, 40);
uplidpulse = map(yval, 0, 1023, 400, 280);
uplidpulse -= (trimval-40);
uplidpulse = constrain(uplidpulse, 280, 400);
altuplidpulse = 680-uplidpulse;
lolidpulse = map(yval, 0, 1023, 410, 280);
lolidpulse += (trimval/2);
lolidpulse = constrain(lolidpulse, 280, 400);
altlolidpulse = 680-lolidpulse;
pwm.setPWM(0, 0, lexpulse);
pwm.setPWM(1, 0, leypulse);
if (switchval == HIGH) {
pwm.setPWM(2, 0, 400);
pwm.setPWM(3, 0, 240);
pwm.setPWM(4, 0, 240);
pwm.setPWM(5, 0, 400);
}
else if (switchval == LOW) {
pwm.setPWM(2, 0, uplidpulse);
pwm.setPWM(3, 0, lolidpulse);
pwm.setPWM(4, 0, altuplidpulse);
pwm.setPWM(5, 0, altlolidpulse);
}
Serial.println(trimval);
delay(5);
}
الطائــف - المملكــة العربيــة السعــوديـة
المختــرع المجنــون © جميـــع الحقــوق محفوظــة