نقوم بطباعة الصور باستخدام اردوينو



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

ماذا نحتاج


  • اردوينو أونو. لهذا المشروع ، استخدمت لوحة Arduino Uno الإيطالية الأصلية. لا يمكنني ضمان العمل في مجالس أخرى.
  • sg-90 — 3 . .
  • . 5 ,
  • . 3 : , - , . - «».
  • . , — .
  • (). — , , . . 1- .
  • .
  • . «» ,
  • 4 . -. , , , .
  • المخططات. سأرسلها مجانًا وعند الطلب ، إذا كتبت هنا.


في الواقع التنفيذ


تصنيع قطع غيار


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



بالنسبة لأولئك الذين يخططون للقيام بكل شيء يدويًا
, , : ( ), ( ), , .

— - .

. , . . , , ( ) . , / , . , — .

, :






نجمع الجدران الجانبية


حتى الآن ، كل شيء بسيط: خذ الأجزاء وقم بلصقها. احرص على عدم ترك أي غراء زائد على الأجزاء.


الصق الساقين على القاعدة


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


وضع القضية معًا


يمكن تغيير النص على الألواح الأمامية والخلفية حسب ذوقك.





صنع وسادة للورق


تتطلب هذه المرحلة دقة وشمولية خاصة للعمل. من الصعوبات الخاصة القضبان ذات الشكل "G" التي ستُعقد عليها هذه المنصة بأكملها.

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





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

يجب ألا تكون هناك مشاكل مع رفوف التروس اللاصقة. تأكد من أنها تلتصق بشكل عمودي.



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



بعض الصور الأخرى لتوضيح كيفية جمع كل هذا:



إذا تم كل شيء بشكل صحيح ، فيجب أن تبدو طابعتك على النحو التالي:



آلية التطرق


لذا وصلنا أخيرًا إلى التروس ... كل ما تحتاجه هو وضعها على قضيب معدة مسبقًا بطول 110 مم تقريبًا كما هو موضح في الصورة أدناه ولصقها بالغراء الفائق (يجب تطبيقه بالتساوي على جدران الفتحة المركزية للتروس). تأكد من أن أسنان التروس تناسب الرف المسنن.



بعد أن يجف الغراء ، حاول تمرير القضيب برفق - يجب أن تتحرك المنصة.

تثبيت المؤازرة الأولى


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



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



والآن يمكنك التحقق مما إذا كان كل شيء يعمل لصالحنا. للقيام بذلك ، قم بتوصيل المؤازرة بـ Arduino عبر pin9 وتحميل الرسم من الأنماط: Servo> Sweep. فقط في حالة ، أعطي رمزه أدناه.

اكتساح المؤازرة
#include <Servo.h>

#define MIN_ANGLE 0
#define MAX_ANGLE 180

Servo servo;

void setup() { 
  servo.attach(9);
} 
 
void loop() { 
  for(int i=MIN_ANGLE; i<=MAX_ANGLE; ++i) {
    servo.write(i); 
    delay(15);
  } 
  for(int i=MAX_ANGLE; i>=MIN_ANGLE; --i) {                                
    servo.write(i);
    delay(15);
  } 
} 


إذا كان كل شيء يعمل ، عظيم. إذا لم يكن الأمر كذلك ، فحاول تغيير موضع محرك الأقراص أو قيم MIN_ANGLE و MAX_ANGLE في التعليمات البرمجية.

تثبيت الماكينة الثانية


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



نضع عربة الطباعة


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



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

مضاعفات الماضي


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



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



أول تشغيل وتصحيح


بادئ ذي بدء ، نقوم بتوصيل الماكينة بـ Arduino Uno الخاص بنا ، ليس من الضروري وضعه داخل الطابعة في هذه المرحلة ، سيكون من غير المناسب العمل. نقوم بتوصيل المحرك الأول بـ pin2 ، والثاني إلى pin4 ، والثالث إلى pin6. بعد ذلك ، قم بتنزيل هذا الرسم. انتباه! لا يعمل هذا الرمز على IDE ، الأحدث 1.6.4 (حاولت التعليق بالتفصيل وكل الشفرة بوضوح ، لن أخوض في الكثير منها):

اقلبني
#include <Servo.h>

/*
*  MiniPrinter
*  Designed in May 2015
*  By Alexandrow Yegor
*/

// ,        Servo
struct Motor {
  int min_angle, max_angle;
  Servo servo;
};

#define IMG_W 64 // 
#define IMG_H 64 // 
int STEP = 2;    //    1 
#define IDLING_MS 4 // ,     1 
#define WRITING_MS 8

struct Motor motor_x, motor_y, motor_p;
byte img[IMG_W/8]; //  
                   //  =  

struct Motor newMotor(int pin, int a1, int a2) { // 
  struct Motor m;

  m.servo.attach(pin);
  m.min_angle = a1;
  m.max_angle = a2;

  return m;
}


void gotoStart() {
   motor_p.servo.write(motor_p.max_angle); // 
   delay(15);
   
   //   (0; 0)
   motor_x.servo.write(motor_x.min_angle);
   motor_y.servo.write(motor_y.min_angle); 
   delay(IDLING_MS * STEP * IMG_W + 150);
}

void finish() { // 
    motor_p.servo.write(motor_p.max_angle); 
    delay(15);
    motor_x.servo.write(motor_x.min_angle);
    motor_y.servo.write(motor_y.max_angle);
    delay(IDLING_MS * STEP * IMG_W + 150);
}

void setup() { //
  Serial.begin(9600);
  motor_y = newMotor(2, 50, 180);
  motor_x = newMotor(4, 30, 160);
  motor_p = newMotor(6, 90, 99);
  gotoStart();
}

//,      ,     
boolean nextWayIsEmpty(int i) {
  for(; i<IMG_W; ++i) {
    if(!(img[i/8] & (1 << 7-(i%8)))) continue;
    else return false;
  }
  
  return true;
}

void printImg() {
  gotoStart();
  int x = 0;
  for(int y=0; y<IMG_H; ++y) {
      for(int i=0; i<IMG_W/8; ++i) img[i] = Serial.read();
      Serial.write(61);//  ,          
      
      for(int i=0; i<STEP; ++i) { //       ,  STEP
          motor_x.servo.write(motor_x.min_angle); //   
          motor_y.servo.write(motor_y.min_angle + y*STEP + i); 
          delay(IDLING_MS * STEP * x + 30);
          
          for(x=0; x<IMG_W; ++x) {
            
            if(nextWayIsEmpty(x)) {
              motor_p.servo.write(motor_p.max_angle); delay(IDLING_MS * (motor_p.max_angle-motor_p.min_angle));
              break;
            }
            
            //  (/),    
            motor_p.servo.write((img[x/8] & (1 << 7-(x%8))) ? motor_p.min_angle : motor_p.max_angle);
            delay(IDLING_MS * (motor_p.max_angle-motor_p.min_angle));
            
            //     X
            motor_x.servo.write(motor_x.min_angle + x*STEP);
            delay(((img[x/8] & (1 << 7-(x%8))) ? WRITING_MS : IDLING_MS) * STEP); 
        }
        
        // 
        motor_p.servo.write(motor_p.max_angle); delay(IDLING_MS * (motor_p.max_angle-motor_p.min_angle));
      }
    
    // 
    motor_p.servo.write(motor_p.max_angle); delay(IDLING_MS * (motor_p.max_angle-motor_p.min_angle));
  }
    
  gotoStart();
  Serial.flush();
}

//  
//     ,    
//    

void checkMessage() {
    if(Serial.available()) {
      delay(10);
      byte msg[] = {Serial.read(), Serial.read()};
      
      if(msg[0] == 'P' && msg[1] == 'R') printImg(); //
      if(msg[0] == 'S' && msg[1] == 'T') gotoStart(); //   (0; 0)
      if(msg[0] == 'C' && msg[1] == 'L') finish(); //" "
      if(msg[0] == 'S' && msg[1] == 'Z') STEP = Serial.read(); //    
      if(msg[0] == 'P' && msg[1] == 'T') { //     (PT+1 -   , PT-2  2  )
        if(Serial.read() == '+') {
          byte b = Serial.read();
          motor_p.min_angle += b-'0';
          motor_p.max_angle += b-'0';
        } else {
          byte b = Serial.read();
          motor_p.min_angle -= b-'0';
          motor_p.max_angle -= b-'0';
        }
      }  
    }
}

void loop() {
  checkMessage();
}



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

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

بعد ذلك ، نقوم بتوصيل طابعتنا بالكمبيوتر وتشغيل هذا البرنامج (نحتاج إلى تثبيت جافا).

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



إذا تمكنا من التعامل مع هذه ، فاستمر - قم بتثبيت الذراع بقلم حبر. أولاً ، قم بإصلاح القلم ذي الطرف الملبس على الذراع. يجب أن تكون المسافة من طرفه إلى الحافة السفلية للرافعة حوالي 25 مم. ثم تحتاج إلى برغي المسمار بحيث يتم إصلاح قلم الحافة ولم يزول. الآن فقط ضع هذا الذراع على محور الماكينة - يجب أن تكون المسافة من طرف قلم اللباد إلى الورق حوالي 7 مم. بتعبير أدق ، يمكن تعديل الارتفاع باستخدام أوامر PT + 1 و PT-1. إنهم يضبطون زاوية العلامة ، بدلاً من 1 يمكن أن يكون هناك أي رقم من 0 إلى 9.

والآن حان الوقت الأكثر أهمية - طباعة الصورة الأولى. الصور 64x64 الصغيرة هي الأنسب. أوصي باستخدام Mario:


Download

First تحتاج إلى فتح الصورة:



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



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

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

بمجرد أن تكون راضيًا عن جودة الصورة الناتجة ، يمكنك وضع Arduino بأمان في علبة الطابعة عن طريق شدها بمسامير - يمكن اعتبار هذا مشروعك ، يمكنك إظهاره لجميع أصدقائك!

استنتاج


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

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


All Articles