تحسين 3D MC3 Master v1.1 وأتمتة الأذن

في المقالة الأولى حول الطابعة ثلاثية الأبعاد MC3 Master v1.1 ، قمت بوصف التجربة الأولى في تجميع طابعة ثلاثية الأبعاد من مجموعة جاهزة. منذ ذلك الحين ، مر الكثير من الوقت ، ابتليت بالكثير من قضيب البلاستيك ، وتعلمت تعقيدات الطباعة ثلاثية الأبعاد. لقد اكتسبت قليلاً من الخبرة الشخصية وأريد التحدث عن طرق لزيادة الدقة عند الطباعة باستخدام مثال محدد. في الجزء الثاني من المقال سوف نتحدث عن المنتج الذي I المطبوعة، وتجميعها وتحسين - آذان الحكم الذاتي، التي ذكرت هنا و هنا .



يلهون مع طباعة مكعبات القياسية ، تقرر طباعة شيء أكبر وأكثر وظيفية. أثناء التشغيل ، ظهرت مشكلة من النوع التالي: تكمن الطبقات في مشط صغير ، وأحيانًا تحول الجدول إلى الجوانب بسبب الحركة السريعة على طول محوري X و Y. هناك طريقتان لحل هذه المشكلة:
  • قم بإصلاح الجدول بإحكام في الحوامل. نظرًا لأن الزجاج أملس للغاية ، ولا يقوم البلاستيك بإصلاح الطاولة بشكل صارم ، فمن الأسهل لصق الزجاج على الساقين باستخدام مادة لاصقة تذوب الساخنة ، والتي يمكن إزالتها بسهولة لاحقًا ، أو باستخدام شريط لاصق. لذلك نتخلص من حركة الطاولة.
  • Z. . . .


الجزء نفسه كما يلي:



نتيجة لهذه التحسينات ، أصبح من الممكن طباعة هذه التفاصيل:



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



سحرها هو أنه حل كامل ، مما يعني أنه يمكنك تجنب العمل بمكواة لحام وتوصيلها بموصلات Arduino. عيب هذه الوحدة المعينة هو أن لها موقعين منطقيين: تشغيل وإيقاف. أي أنه لا يعطي قيمة إشارة. وبالتالي ، لن يكون من الممكن إرفاق حجم مكبر الصوت ، ولكن فقط لوجود الصوت.
الفكرة هي كما يلي:
1. لا يوجد صوت - تدور الأذنين لبعض الوقت ، ثم تطوى إلى "حلم" ؛
2. يظهر صوت - ترتجف الآذان وترتفع ؛
3. يستمر الصوت - تدور الأذنين وتنثني بالتناوب ؛
4. يختفي الصوت - انظر النقطة 1.

إمكانية المراجعة:
1. إذا كنت تأخذ ميكروفونًا من ميكروفون ، وليس إشارة منفصلة ذات موضعين ، ولكن واحدًا تناظريًا ، عندما يكون حجم الصوت مختلفًا ، يمكنك إضافة عدد من التأثيرات: صوت عالي - والأذنين تتدهور في الخوف.
2. أضف ميكروفونًا ثانيًا وضعه على الجانبين - يمكنك توجيه أذنيك نحو السماعة.
3. مع ميكروفونين ، يمكن لكل أذن "أن تعيش حياتها الخاصة" في هذه

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

رمز الآذان مع الميكروفون
#include <Servo.h>

Servo LeftVer;
Servo LeftAng;

Servo RightVer;
Servo RightAng;

const byte LeftVerPin = 2;
const byte LeftAngPin = 3;
const byte RightVerPin = 4;
const byte RightAngPin = 5;
const int SensorPin = 9; //
int ledPin = 13; //

const byte Button_1 = 6;
const byte Button_2 = 7;
const byte Button_3 = 8;
const byte Button_4 = 11;
const byte Button_5 = 10;

int i=0;
int pos = 0;
int SensorState = 0;
boolean BowFlag = 0;
boolean RearBowFlag = 0;

void setup()
{
pinMode(ledPin, OUTPUT); // initialize the Sensor pin as an input:
pinMode(SensorPin, INPUT); // ,

LeftVer.attach(LeftVerPin);
LeftAng.attach(LeftAngPin);

RightVer.attach(RightVerPin);
RightAng.attach(RightAngPin);

pinMode(Button_1, INPUT);
pinMode(Button_2, INPUT);
pinMode(Button_3, INPUT);
pinMode(Button_4, INPUT);
pinMode(Button_5, INPUT);

digitalWrite(Button_1, HIGH);
digitalWrite(Button_2, HIGH);
digitalWrite(Button_3, HIGH);
digitalWrite(Button_4, HIGH);
digitalWrite(Button_5, HIGH);

InitState();
delay(1000);
}

//------------------------------------------------------
void loop()
{
SensorState = digitalRead(SensorPin); // check if the Sensor is close. // if it is, the SensorState is HIGH:
if (SensorState == HIGH)
{
digitalWrite(ledPin, HIGH);
i=i++;
}

if (i==6)
{
i=1;
}

if (i=1)
{
if (!BowFlag)
{
FrontBow();
BowFlag = 1;
}

else
{
InitState();
BowFlag = 0;
delay(200);
}
}

if (i=2)
{
LeftEarBow();
InitState();
}

if (i=3)
{
RightEarBow();
InitState();
}

if (i=4)
{
TwoEarsBow();
InitState();
}

if (i=5)
{
if (!RearBowFlag)
{
RearBow();
RearBowFlag = 1;
}

else
{
InitState();
RearBowFlag = 0;
}

delay(200);
}

}
//------------------------------------------------------
void FrontBow()
{
byte Max = 90;
byte Min = 70;
unsigned int MoveDelay = 5;
unsigned int PosDelay = 500;

for(byte i=0; i <= (Max — Min) + 15; i++)
{
LeftAng.write(Min + i);
RightAng.write(Max — i);
delay(MoveDelay);
}

// delay(PosDelay);

for(byte i=0; i <= 3*(Max — Min) + 17; i++)
{
LeftAng.write(Max — i);
RightAng.write(Min + i);
delay(3*MoveDelay);
}

delay(PosDelay);
}
//------------------------------------------------------
void InitState()
{
LeftVer.write(90);
LeftAng.write(90);
RightVer.write(90);
RightAng.write(90);
}
//------------------------------------------------------
void RearBow()
{
byte Max = 90;
byte Min = 70;
unsigned int MoveDelay = 5;
unsigned int PosDelay = 500;

/*
for(byte i=0; i <= (Max — Min) + 10; i++)
{
LeftAng.write(Max — i);
RightAng.write(Min + i);
delay(MoveDelay);
}

delay(PosDelay);
*/
for(byte i=0; i <= (Max — Min) + 15; i++)
{
LeftAng.write(Min + i);
RightAng.write(Max — i);
delay(MoveDelay);
}

for(byte i=0; i <= 10; i++)
{
LeftVer.write(Max + i);
RightVer.write(Max — i);
delay(1);
}

delay(PosDelay);
}
//------------------------------------------------------
void LeftEarBow()
{
byte Max = 90;
unsigned int MoveDelay = 7;
byte AnglePos = Max;

for(byte i=0; i <= 80; i++)
{
LeftVer.write(Max + i);
delay(1);
}

for(byte i=0; i <= 75; i++)
{
LeftAng.write(AnglePos);
AnglePos = Max — i;
delay(MoveDelay);
}

for(byte i=0; i <= 10; i++)
{
LeftAng.write(AnglePos);
AnglePos += i;
delay(MoveDelay);
}

for(byte j=0; j<5; j++)
{
for(byte i=0; i <= 10; i++)
{
LeftAng.write(AnglePos);
AnglePos -= i;
delay(MoveDelay);
}

for(byte i=0; i <= 10; i++)
{
LeftAng.write(AnglePos);
AnglePos += i;
delay(MoveDelay);
}
}
}
//------------------------------------------------------
void RightEarBow()
{
byte Max = 90;
unsigned int MoveDelay = 7;
byte AnglePos = Max;

for(byte i=0; i <= 80; i++)
{
RightVer.write(Max — i);
delay(1);
}

for(byte i=0; i <= 75; i++)
{
RightAng.write(AnglePos);
AnglePos = Max + i;
delay(MoveDelay);
}

for(byte i=0; i <= 10; i++)
{
RightAng.write(AnglePos);
AnglePos -= i;
delay(MoveDelay);
}

for(byte j=0; j<5; j++)
{
for(byte i=0; i <= 10; i++)
{
RightAng.write(AnglePos);
AnglePos += i;
delay(MoveDelay);
}

for(byte i=0; i <= 10; i++)
{
RightAng.write(AnglePos);
AnglePos -= i;
delay(MoveDelay);
}
}
}
//------------------------------------------------------
void TwoEarsBow()
{
byte Max = 90;
unsigned int MoveDelay = 7;
byte AnglePosLeft = Max;
byte AnglePosRight = Max;

for(byte i=0; i <= 80; i++)
{
LeftVer.write(Max + i);
RightVer.write(Max — i);
delay(1);
}

for(byte i=0; i <= 75; i++)
{
LeftAng.write(AnglePosLeft);
RightAng.write(AnglePosRight);
AnglePosLeft = Max — i;
AnglePosRight = Max + i;
delay(MoveDelay);
}

for(byte i=0; i <= 10; i++)
{
LeftAng.write(AnglePosLeft);
RightAng.write(AnglePosRight);
AnglePosLeft += i;
AnglePosRight -= i;
delay(MoveDelay);
}

for(byte j=0; j<5; j++)
{
for(byte i=0; i <= 10; i++)
{
LeftAng.write(AnglePosLeft);
RightAng.write(AnglePosRight);
AnglePosLeft -= i;
AnglePosRight += i;
delay(MoveDelay);
}

for(byte i=0; i <= 10; i++)
{
LeftAng.write(AnglePosLeft);
RightAng.write(AnglePosRight);
AnglePosLeft += i;
AnglePosRight -= i;
delay(MoveDelay);
}
}
}


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



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

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


All Articles