Kami mencetak foto menggunakan Arduino



Untuk waktu yang lama saya ingin membuat semacam proyek tentang Ardoino, sehingga semua yang ada di dalamnya bergerak dan bekerja. Dan, setelah beberapa bulan mendesain, memprogram dan merakit, kami mendapatkan printer mini, yang dengannya Anda dapat mencetak berbagai gambar dan teks pada stiker yang paling biasa. Jika setelah menonton video Anda memiliki keinginan besar untuk melakukan sesuatu seperti ini, saya minta kucing.

Apa yang kita butuhkan


  • Arduino Uno. Untuk proyek ini, saya menggunakan papan Arduino Uno asli Italia. Saya tidak dapat menjamin pekerjaan di papan lain.
  • sg-90 — 3 . .
  • . 5 ,
  • . 3 : , - , . - «».
  • . , — .
  • (). — , , . . 1- .
  • .
  • . «» ,
  • 4 . -. , , , .
  • Cetak Biru. Saya akan mengirimkannya gratis dan atas permintaan, jika Anda menulis di sini.


Sebenarnya implementasi


Pembuatan suku cadang


Tahap ini tergantung pada keinginan dan kemampuan Anda. Anda dapat memotongnya di mesin atau memotong semua bagian secara manual. Hal utama yang harus diperhatikan di sini adalah bahwa kualitas dan kinerja proyek ini akan langsung tergantung pada keakuratan Anda. Anda juga perlu mempertimbangkan hal ini: beberapa detail yang Anda lihat di foto mungkin sedikit berbeda dari yang ada di gambar. Harus segera dicatat bahwa detail yang diperlihatkan dalam foto mungkin sedikit berbeda dari yang melekat pada gambar.



Bagi mereka yang berencana melakukan semuanya secara manual
, , : ( ), ( ), , .

— - .

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

, :






Kami mengumpulkan dinding samping


Sejauh ini, semuanya sederhana: ambil bagian dan rekatkan. Berhati-hatilah untuk memastikan tidak ada lem yang tertinggal di bagian-bagiannya.


Tempelkan kaki ke alas


Kaki-kaki ini hanya mewakili nilai estetika. Jika Anda ingin menghemat waktu, Anda dapat melewati langkah ini.


Menyatukan case


Teks di pelat depan dan belakang dapat diubah sesuai selera Anda.





Membuat alas kertas


Tahap ini membutuhkan akurasi khusus dan ketelitian pekerjaan. Yang paling sulit adalah rel berbentuk "G" tempat seluruh platform ini akan dipegang.

Anda harus menempelkan strip tipis secara cermat sesuai dengan risiko yang ditunjukkan dalam gambar. Untuk efek terbaik, saya menggunakan "jepitan" yang tidak biasa, tetapi Anda bisa melakukannya tanpa aman. Hal utama adalah untuk menghapus lem berlebih dan pastikan strip tidak bergerak ke mana-mana. Lebih jauh di atas mereka, kami menempelkan strip lebih lebar - teknologinya sama.





Setelah lem mengering (setidaknya 20 menit), coba masukkan bantalan ke dalam tubuh. Jika dia pergi ke sana seperti jarum jam dan dapat membuat gerakan yang jelas bolak-balik, maka Anda sangat beruntung - inilah yang Anda butuhkan. Kalau tidak, kami mengambil kertas ampelas di tangan kami dan membaca sekilas tempat-tempat rel trek di mana ia menempel.

Seharusnya tidak ada masalah dengan menempelkan rak gigi. Pastikan mereka menempel secara tegak lurus.



Kami melanjutkan ke perakitan mekanisme yang memegang kertas. Masalah seharusnya tidak muncul jika Anda mengumpulkan semuanya dalam urutan ini. Pertama kita lem rak, kita perbaiki tuasnya. Kemudian kami menempelkan sepotong kayu lapis kepada mereka yang akan memegang rubah kertas. Dan baru setelah itu kami merekatkan bagian di mana mata air akan berbatasan.



Beberapa foto lagi untuk memperjelas cara mengumpulkan semua ini:



Jika semuanya dilakukan dengan benar, maka printer Anda akan terlihat seperti ini:



Mekanisme pembicaraan


Jadi kami akhirnya sampai ke persneling ... Mereka hanya perlu diletakkan di atas batang yang telah disiapkan sebelumnya sepanjang 110 mm seperti yang ditunjukkan pada foto di bawah ini dan direkatkan ke lem super (harus diaplikasikan secara merata ke dinding lubang tengah gir). Pastikan bahwa gigi persneling sesuai dengan rak bergigi.



Setelah lem mengering, coba gulir dengan lembut batang - platform harus bergerak.

Instal servo pertama


Pertama-tama, Anda perlu menyiapkan gear untuk motor. Setiap servo dilengkapi dengan beberapa ayunan plastik. Mereka harus dipotong dan diputar seperti yang ditunjukkan pada gambar di bawah ini. Dan kemudian menempelkannya di gigi.



Dan sekarang kami melanjutkan untuk menginstal drive. Untuk memulai, dorong kertas ke dalam printer dan gulirkan servo Anda berlawanan arah jarum jam sampai berhenti. Maka Anda harus memilih posisi optimal dari drive, yaitu, perbaiki servo sehingga roda gigi tidak memiliki serangan balik yang besar, tetapi mereka tidak berbatasan satu sama lain.



Dan sekarang Anda dapat memeriksa apakah semuanya bekerja untuk kami. Untuk melakukan ini, hubungkan servo ke Arduino Anda melalui pin9 dan muat sketsa dari Patterns: Servo> Sweep. Untuk jaga-jaga, saya berikan kodenya di bawah.

Sapu servo
#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);
  } 
} 


Jika semuanya bekerja, bagus. Jika tidak, coba ubah posisi drive atau nilai MIN_ANGLE dan MAX_ANGLE dalam kode.

Instal servo kedua


Di sini semuanya dilakukan sama dengan motor pertama. Satu-satunya perbedaan adalah bahwa Anda memerlukan sumbu kecil ~ 12 mm panjang untuk mengamankan dua gigi.



Kami menempatkan kereta cetak


Jika Anda berhasil mencapai tahap ini, maka Anda seharusnya tidak memiliki kesulitan khusus di sini. Hal yang paling sulit di sini adalah merakit kereta dengan hati-hati (agar tidak hangout dan mengganjal), Anda mungkin harus bekerja dengan amplas. Masalah berikutnya yang mungkin terjadi adalah rak roda gigi yang direkatkan dengan buruk. Ini harus benar-benar sejajar dengan dasar perumahan, lebih baik merekatkannya ketika carriage berada pada posisi terjauh dari servo drive.



Kami memeriksa perakitan ini menggunakan Arduino dan sketsa yang disebutkan di atas, jika semuanya berfungsi sebagaimana mestinya, kemudian lanjutkan ke langkah berikutnya. Jika tidak, maka masalahnya kemungkinan besar disebabkan oleh roda gigi atau rak roda gigi yang direkatkan dengan tidak benar.

Servo terakhir


Pada tahap ini, kami mengumpulkan tuas untuk pena felt-tip. Kita harus dapat mengebor lubang samping untuk sekrup, yang dengannya kita akan mengencangkan sekrup. Cobalah untuk memastikan bahwa dalam keadaan ketika pena felt-tip diturunkan, servo memiliki posisi 90 derajat, maka Anda tidak perlu membuat koreksi tambahan dalam kode.



Setelah memasang motor, printer kami akan hampir siap. Saya sarankan menempel permukaan kertas dengan selotip, selama proses debugging, printer bisa sangat kotor.



Jalankan dan debugging pertama kali


Untuk memulainya, kita menghubungkan servo ke Arduino Uno kita, tidak perlu menempatkannya di dalam printer pada tahap ini, itu tidak nyaman untuk bekerja. Kami menghubungkan motor pertama ke pin2, yang kedua ke pin4, yang ketiga ke pin6. Selanjutnya, unduh sketsa ini. Perhatian! Kode ini tidak berfungsi pada IDE, yang lebih baru 1.6.4 (saya mencoba mengomentari secara detail dan semua kode dengan jelas, saya tidak akan membahasnya):

Balikkan aku
#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();
}



Jika Anda telah menguji dan men-debug semua sistem hingga saat ini, maka seharusnya tidak ada masalah: kertas harus bergerak sedikit, dan kereta cetak harus menempati posisi paling kiri. Jika salah satu di atas tidak mencapai tepi, atau, sebaliknya, bersandar pada dinding, cobalah untuk memilih parameter dalam fungsi setup ().

Jika Anda mengalami masalah yang lebih serius, saya sarankan Anda membaca kembali seluruh tutorial dengan seksama dan memeriksa apakah Anda melakukan semuanya dengan benar. Selain itu, akan lebih baik untuk memeriksa setiap motor lagi menggunakan daftar pertama (Servo sweep).

Selanjutnya, kita menghubungkan printer kita ke komputer dan menjalankan program ini (kita perlu menginstal java).

Pertama, kami memilih port serial tempat printer terhubung dan tekan tombol "OK", setelah itu printer harus sedikit memutar bantalan kertas. Kemudian klik tombol "Log". Kami telah membuka jendela terminal. Selanjutnya, masukkan perintah CL - printer harus mendorong pad ke dalam. Jika Anda memasukkan ST, printer akan kembali ke posisi semula. Anda juga dapat mengirim beberapa perintah secara berurutan, misalnya: CLSTCL. Hal utama adalah tidak menggunakan spasi dan karakter lain di antara tim.



Jika kami berhasil mengatasinya, silakan - instal tuas dengan spidol. Pertama, kencangkan pena felt-tip pada tuas. jarak dari ujungnya ke tepi bawah tuas harus sekitar 25 mm. Maka Anda perlu mengencangkan sekrup sehingga pena felt-tip sudah diperbaiki dan belum hilang. Sekarang letakkan tuas ini pada sumbu servo - jarak dari ujung pena felt-tip ke kertas harus sekitar 7 mm. Lebih tepatnya, ketinggian dapat disesuaikan menggunakan perintah PT + 1 dan PT-1. Mereka menyesuaikan sudut marker, bukan 1 bisa ada angka dari 0 hingga 9.

Dan sekarang saat yang paling penting telah datang - mencetak gambar pertama. Gambar kecil berukuran 64x64 paling cocok. Saya sarankan menggunakan Mario ini:


Unduh

Pertama, Anda perlu membuka gambar:



Menggunakan bilah geser di sebelah kanan, Anda dapat menyesuaikan kontras gambar dengan selera Anda. Perlu diingat bahwa semakin banyak piksel hitam - semakin lama gambar akan dicetak.



Itu semua. Kemudian Anda cukup menekan tombol "Cetak" dan kagumi cara kerja kreasi Anda. Satu-satunya masalah yang mungkin terjadi pada tahap ini adalah menekan pena felt-tip. Dia akan mendorong terlalu keras atau tidak mendorong sama sekali. Selain mengontrol ketinggian pena felt-tip melalui terminal, Anda dapat mencoba menyesuaikan ketinggian secara manual.

Selain itu, dengan risiko Anda sendiri, Anda dapat mengubah nilai variabel global dalam sketsa: mainkan dengan kecepatan dan ukuran cetakan.

Segera setelah Anda puas dengan kualitas gambar yang dihasilkan, Anda dapat dengan aman menempatkan Arduino dalam wadah printer dengan menguncinya dengan sekrup - ini dapat dianggap sebagai proyek Anda, Anda dapat pamer ke semua teman Anda!

Kesimpulan


Itu saja, saya harap Anda tertarik pada proyek ini. Tentu saja, ini memiliki kelemahan dari fitur implementasi, sehingga masih ada ruang untuk perbaikan, peningkatan dan pengembangan. Saya akan dengan senang hati menerima saran, pertanyaan, dan saran di komentar.

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


All Articles