Усовершенствование 3D MC3 Мастер v1.1 и автоматизация ушек
1. Жестко зафиксировать стол в креплениях. Так как стекло очень гладкое, а пластик не фиксирует стол жестко, то проще всего стекло приклеить к ножкам термоклеем, который легко снимается впоследствии, или скотчем. Так мы избавимся от движения стола.
2. Также заметные искажения может вносить небольшой люфт оси Z. В официальной поставке двигатель этой оси со шпилькой объединен пластиковой деталью и она не всегда идеально отцентрирована по центрам осей. Поэтому я перешел к надежной металлической втулке с фиксацией болтами и гарантированной центровкой. Небольшой люфт пропал и качество печати заметно улучшилось.
Сама деталь выглядит следующим образом:Результатом таких улучшений стало возможным напечатать такие детали:Тут можно переходить ко второй части улучшений. Мне давно нравились движущиеся ушки и я прочел пару материалов, как они создавались и как их усовершенствовали. Но каждый раз словно спотыкался обо что-то. В конце концов, я понял, чего лично мне не хватает в этом проекте и что заставляет задуматься: необходимость в действиях человека для активации движения. Выход прост: надо автоматизировать работу аниматроники. Самое простое - это написать цикл, в котором рандомно будут запускаться те или иные процедуры шевеления ушами, но это ведь не наш метод!
Решение пришло быстро: все дело в звуке. В закромах сайта masterkit.ru обнаружился вот такой модуль:Прелесть его в том, что он является законченным решением, а значит можно избежать работы с паяльником и просто подключить к разъемам Arduino. Минус конкретно этого модуля - он имеет два логических положения: вкл и выкл. То есть он не выдает величину сигнала. Таким образом, не удастся привязаться к громкости говорящего, а только к наличию звука.
Идея заключается в следующем:
1. Звука нет - уши вращаются какое-то время, а после складываются в 'сон';
2. Звук появляется - уши дрожат и поднимаются;
3. Звук продолжается - уши крутятся и попеременно складываются;
4. Звук исчезает - см пункт 1.
Возможность доработки:
1. Если с микрофона снимать не дискретный сигнал с двумя положениями, а аналоговый, когда громкость звука разная, то можно добавить количество эффектов: громкий хлопок - и уши складываются в испуге.
2. Добавить второй микрофон и расположить их по сторонам - можно поворачивать уши в сторону говорящего.
3. С двумя микрофонами каждое ухо может 'жить своей жизнью'
Далее модифицируем имеющийся код и поучаем уши, работающие по звуку. Самым длительным в этой истории стала подстройка громкости звука резистором, при котором блок микрофона будет выдавать сигнал на микроконтроллер - тут все устанавливается только опытным путем.
#includeИтогом этой работы стали уши без проводов, которые работают автономно и реагируют на окружающие звуки. Таким образом, мы приблизились к оригинальному варианту, который придумали японцы:
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);
}
}
}
Еще больше интересных статей
Замена сопла 0,4 на 0,8 на 3D-принтере Creality K1 Max
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Надеюсь кому-нибудь пригодит...
В ТЕХНО 3D создали копию Республики Адыгея
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Постобработки пост. Делаем из ABS грунт-порозаполнитель.
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Если эксперимент удался, значит что-то здесь не...
Комментарии и вопросы
Доброго дня. в первую очередь....
Для истории - выше я дал ссылк...
ХЗ, был Анет А6, печатал сносн...
Подскажите где купить плату уп...
Можно ли сделать 3d принтер за...
Всем доброго времени суток!&nb...
POWER_LOSS_RECOVERY (НЕ РАБОТА...