我们使用Arduino打印图片



很长一段时间以来,我都想在Ardoino上进行某种项目,以便其中的所有内容都能正常工作。而且,经过几个月的设计,编程和组装,我们得到了这样的微型打印机,您可以用它在最普通的贴纸上打印各种图片和文本。如果看完视频后您非常想做这样的事情,我请一只猫。

我们需要什么


  • Arduino Uno。对于这个项目,我使用了原始的意大利Arduino Uno开发板。我不能保证可以在其他板上工作。
  • sg-90 — 3 . .
  • . 5 ,
  • . 3 : , - , . - «».
  • . , — .
  • (). — , , . . 1- .
  • .
  • . «» ,
  • 4 . -. , , , .
  • 蓝图。如果您在此处写信,我将免费将其发送给您


实际执行


零件制造


这个阶段取决于您的愿望和能力。您可以在机器上切割或手动切割所有零件。这里应注意的主要事情是该项目的质量和性能将直接取决于您的准确性。您还需要考虑这一点:您在照片中看到的某些细节可能与图纸中的细节有些许不同。应当立即注意,照片中显示的细节可能与附图中的细节略有不同。



对于那些打算手动完成所有操作的人
, , : ( ), ( ), , .

— - .

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

, :






我们收集侧壁


到目前为止,一切都很简单:将零件粘贴起来。注意确保零件上没有多余的胶水。


将腿粘到底座上


这些腿仅代表美学价值。如果您想节省时间,可以跳过此步骤。


放在一起


前后板上的文字可以根据您的喜好进行更改。





制作纸垫


这个阶段需要特殊的准确性和彻底性。特别困难的是整个平台将被固定在其上的“ G”形导轨。

您需要完全按照图中所示的风险小心地粘贴薄带。为了获得最佳效果,我使用了这种不寻常的“衣夹”,但是您可以放心使用它们。最主要的是去除多余的胶水,并确保条带不会移动到任何地方。在它们之上,我们将条带粘合得更宽-这里的技术是相同的。





胶干后(至少20分钟),尝试将垫子插入身体。如果她像发条一样去那里并且可以清楚地前后移动,那么您很幸运-这正是您所需要的。否则,我们会将砂纸拿在手中,并掠过其楔入的滑轨的位置。

胶合齿条应该没有问题。确保它们垂直粘贴。



我们继续进行纸张固定机构的组装。如果按此顺序收集所有内容,则不会出现问题。首先,我们粘上机架,然后将杠杆固定在机架上。然后,我们将一条胶合板粘在上面,以固定纸狐狸。然后,我们才将弹簧将要紧贴的部分粘在一起。



还有几张照片可以使您更清楚地了解如何收集所有这些信息:



如果一切都正确完成,那么您的打印机应该看起来像这样:



拉削机构


因此,我们终于可以开始使用齿轮了......只需将它们放在约110毫米长的预先准备好的杆上,如下图所示,然后粘上超级胶水(必须均匀地涂在齿轮中心孔的壁上)。确保齿轮齿适合齿条。



胶干后,尝试轻轻滚动杆-平台应移动。

安装第一个伺服器


首先,您需要准备电动机的齿轮。每个伺服器都带有多个塑料摆动器。必须如下图所示切割和旋转它们。然后将其粘在齿轮上。



现在我们继续安装驱动器。要开始使用,请将纸垫完全推入打印机,然后逆时针滚动伺服直到其停止。然后,您需要选择驱动器的最佳位置,即固定伺服系统,以使齿轮不会产生较大的间隙,而不会彼此抵靠。



现在,您可以检查一切是否对我们有用。为此,请通过pin9将伺服器连接到Arduino,然后从Patterns: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 mm长的小轴来固定两个齿轮。



我们放了一个印刷车


如果您成功地达到了这个阶段,那么您在这里应该不会有任何特殊的困难。这里最困难的事情是仔细组装托架(以免它挂出并楔住),您可能需要使用砂纸。下一个可能的问题是齿轮齿条粘合不良。它应严格平行于外壳的底部,最好在滑架位于离伺服驱动器最远的位置时粘上它。



如果一切正常,我们将使用Arduino和上述草图检查该组件,然后继续下一步。如果不是,则问题很可能是由于齿轮或齿轮齿条胶粘不正确造成的。

最后伺服


在此阶段,我们收集毡尖笔的控制杆。我们需要能够在螺钉上钻一个侧面孔,用它来拧紧螺钉。尝试确保在降低毡尖笔的状态下,伺服器的位置为90度,这样您就不必在代码中进行不必要的更正。



安装电机后,我们的打印机将准备就绪。我建议用美纹纸胶带粘贴纸垫的表面;在调试打印机期间,它可能会严重弄脏。



第一次运行和调试


首先,我们将伺服器连接到我们的Arduino Uno,在此阶段无需将其放置在打印机内,这将给工作带来不便。我们将第一个电动机连接到引脚2,将第二个电动机连接到引脚4,将第三个电动机连接到引脚6。接下来,下载此草图。注意!这段代码不适用于更新版本1.6.4的IDE(我试图详细注释掉所有代码,而我将不做过多介绍):

转过我
#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();
}



如果到目前为止,您已经对所有系统进行了测试和调试,则应该没有问题:纸张平台应略微抽动,并且打印托架应位于最左侧。如果以上任何一项都未到达边缘,或者相反,靠在墙壁上,请尝试在setup()函数中选择参数。

如果遇到更严重的问题,建议您再次仔细阅读整个教程,并检查所有操作是否正确。此外,最好使用第一个清单(伺服扫描)再次检查每个电动机。

接下来,我们将打印机连接到计算机并运行该程序(我们需要安装Java)。

首先,我们选择要连接打印机的串行端口,然后按“确定”按钮,然后打印机应稍微扭转纸垫。然后单击“日志”按钮。我们打开了一个终端窗口。接下来,输入CL命令-打印机应向内推压垫。如果输入ST,打印机将返回其原始位置。您还可以连续发送多个命令,例如:CLSTCL。最主要的是不要在团队之间使用空格和其他字符。



如果我们能够解决这些问题,请继续-用毡尖的笔安装杠杆。首先,将毡尖笔固定在手柄上。从其尖端到杠杆下边缘的距离应约为25毫米。然后,您需要拧紧螺钉,以使毡尖笔固定不动。现在,只需将此杆放在伺服器的轴上-毡尖笔的笔尖到纸张的距离应约为7毫米。更准确地说,可以使用PT +1和PT-1命令来调整高度。他们调整标记的角度,而不是1,可以是0到9之间的任何数字。

现在最关键的时刻到了-打印第一张图片。小型64x64图片最适合。我建议使用此Mario: 首先


下载,

您需要打开图像:



使用右侧的滑块,您可以根据自己的喜好调整图像的对比度。值得记住的是,黑色像素越多-图片打印时间越长。



就是这样 然后,您只需按下“打印”按钮,即可欣赏您的创作工作。在此阶段,唯一可能的问题是按下毡尖笔。他要么太用力要么根本不用力。除了通过终端控制毡尖笔的高度外,您还可以尝试手动调节高度。

此外,您需要自担风险,可以更改草图中的全局变量的值:以打印的速度和大小来玩。

一旦您对生成的图片的质量感到满意,就可以通过用螺钉将Arduino安全地放在打印机外壳中-这可以视为您的项目,可以向所有朋友炫耀!

结论


就这样,我希望您对这个项目感兴趣。当然,它具有实现功能的缺点,因此仍有改进,改进和发展的空间。我将很高兴收到评论中的任何建议,问题和建议。

Source: https://habr.com/ru/post/zh-CN383877/


All Articles