极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5288|回复: 3

Mini Telegraph电报机

[复制链接]
发表于 2018-8-30 23:56:15 | 显示全部楼层 |阅读模式
学来一个好玩的小制作。原理很简单,但是设计很巧妙。http://p.weibo.com/show/channerWbH5/1034:4278862293488537

http://p.weibo.com/show/channerWbH5/1034:4278862293488537

步进电机纵向走纸,一个舵机驱动摆臂横向扫描,另外一个舵机上下敲击负责打点。然后就可以写字了。

IMG_20180824_141141R - 副本.jpg
[kenrobot_code]#include <SoftwareSerial.h>  //蓝牙串口库 没有蓝牙模块也可以通过PC串口传输文字

#include <Servo.h>        //舵机库
#include <Stepper.h>      //步进电机库
#include "chars.h"         //点阵字符库
   
#define SERVO_PIN 2   //写字舵机接口号
#define DOT_PIN   3   //打点舵机接口号


#define DOT_UP_DELAY 120    //打点等待时间  
#define DOT_DOWN_DELAY 50   //打点等待时间   //要符合舵机动作幅度的时间,延时过小会导致无法打到

#define DOT_UP 1700     //打点舵机提升到的位置,让笔刚好贴到纸上,不能抬的幅度过高
#define DOT_DOWN 1900   //下降后的位置
//   
#define SERVO_MIN 110   //写字舵机的字顶部位置
#define SERVO_MAX 140   //底部位置   

#define SERVO_STEPS 15  //字符的高度,数值越小,字符越大,建议范围(10~30)
#define LINE_TAB 9     //字符的基线位置,过大会超出纸的高度

#define SERVO_STEP (SERVO_MAX - SERVO_MIN) / SERVO_STEPS

#define SERVO_DELAY SERVO_STEP*5

#define STEPPER_STEP 600 / SERVO_STEPS


Servo servo_arm;          //写字舵机
Servo servo_dot;          //打点舵机
Stepper stepper(100, 4, 5, 6,7);  // 步进电机  速度100, in1~4端口 4 5 6 7

SoftwareSerial Bluetooth(0, 1);   // 初始化蓝牙 [RX, TX]    不同型号主板 端口号不同,uno 是 0,1  10,11 都可以

void setup() {
  Bluetooth.begin(9600);
  Serial.begin(9600); //调试代码
  servo_dot.attach(DOT_PIN);
  servo_dot.write(DOT_DOWN);

  servo_arm.attach(SERVO_PIN);
  
  pinMode(DOT_PIN, OUTPUT);
  stepper.setSpeed(100);    //设置走纸步进电机速度,速度太快了扭矩会变小 (建议范围50~120)

//  printString("0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz ");  //测试写一些内容
// printString("HELLO GEEK WORLD!!!   I LOVE YOU!   MINI TELEGRAPH  @TAOBAO        ");  //测试写一些内容
printString("  ");  
}



int pos = 0;

void dot(int m)  //打一个点
{
  if(m) {
    pos = 1;
    servo_dot.write(DOT_UP);
    delay(DOT_UP_DELAY);
  } else {
    pos = 0;
    servo_dot.write(DOT_DOWN);
    delay(DOT_DOWN_DELAY);
  }
}


void printLine(int b) //画一连续的线
{
  servo_arm.write(SERVO_MAX - (LINE_TAB-2)*SERVO_STEP);
  if(b != 0)
  {
    servo_arm.write(SERVO_MAX - (LINE_TAB-2)*SERVO_STEP);
    delay(SERVO_DELAY*20);
    for (int j = 0; b != 0; j++)
    {
      dot(b&1);
      b >>= 1;
      servo_arm.write(SERVO_MAX - (LINE_TAB+j)*SERVO_STEP);
      delay(SERVO_DELAY);
      }   
    dot(0);
  }

  stepper.step(30); //走纸幅度 可调节,数值越大,字符越扁
}



void printChar(char c)  //打印某一字符
{
int n = 0;
  Serial.println(c);
  for (int i = 0; i < 8; i++)
  {
    if(chars[c] != 0)
    {
      printLine(chars[c]);
      n++;
    }
    else stepper.step(11 * 2);
  }
}


void printString(char* str)   //打印一字符串  
{
  while(*str != '\0') {
    printChar(*str);
    str+=1;
  }
}

int n;
void loop()
{
  Serial.println(Serial.available());   //等待串口状态,串口一次传递最多64个字符
  if(Bluetooth.available() > 0) {
    servo_dot.attach(DOT_PIN);
    servo_dot.write(DOT_DOWN);
    servo_arm.attach(SERVO_PIN);
    while(Bluetooth.available() > 2) {    //写串口接收到的字,最后2位的换行符不写。
      n =  Bluetooth.read();
      if(n >= 2) printChar((char)n);
    }
  }
  servo_dot.detach();
  servo_arm.detach(); //放松舵机,避免持续受力过热
  Bluetooth.write(1);
  delay(1500);
}

[/kenrobot_code]

字库的代码
[kenrobot_code]const byte chars[][8] ={  { 0, 0, 63, 68, 68, 68, 63, 0 },{ 0, 0, 127, 73, 73, 73, 6, 0 },
{ 0, 0, 127, 73, 73, 73, 54, 0 },
{ 0, 0, 127, 64, 64, 64, 0, 0 },
{ 0, 3, 62, 66, 66, 62, 3, 0 },
{ 0, 0, 127, 73, 73, 73, 0, 0 },
{ 0, 99, 20, 8, 127, 8, 20, 99 },
{ 0, 0, 73, 73, 73, 54, 0, 0 },
{ 0, 127, 2, 4, 8, 16, 127, 0 },
{ 0, 127, 2, 100, 72, 16, 127, 0 },
{ 0, 0, 127, 8, 8, 20, 99, 0 },
{ 0, 0, 31, 32, 64, 64, 127, 0 },
{ 0, 127, 64, 48, 8, 48, 64, 127 },
{ 0, 0, 127, 8, 8, 8, 127, 0 },
{ 0, 0, 62, 65, 65, 65, 62, 0 },
{ 0, 0, 127, 64, 64, 64, 127, 0 },
{ 0, 0, 127, 68, 68, 68, 56, 0 },
{ 0, 0, 62, 65, 65, 65, 0, 0 },
{ 0, 0, 64, 64, 127, 64, 64, 0 },
{ 0, 0, 113, 9, 9, 9, 126, 0 },
{ 0, 56, 68, 68, 127, 68, 68, 56 },
{ 0, 0, 99, 20, 8, 20, 99, 0 },
{ 0, 0, 126, 2, 2, 2, 127, 1 },
{ 0, 0, 120, 8, 8, 127, 0, 0 },
{ 0, 127, 1, 1, 31, 1, 1, 127 },
{ 0, 126, 2, 2, 62, 2, 3, 127 },
{ 0, 64, 64, 127, 9, 9, 9, 6 },
{ 0, 127, 9, 9, 9, 6, 0, 127 },
{ 0, 0, 127, 9, 9, 9, 6, 0 },
{ 0, 0, 65, 65, 73, 73, 62, 0 },
{ 0, 127, 8, 62, 65, 65, 65, 62 },
{ 0, 0, 51, 76, 72, 72, 127, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 125, 0, 0, 0, 0, 0 },       //!
{ 0, 0, 0, 48, 0, 48, 0, 0 },       //"
{ 0, 0, 18, 63, 18, 18, 63, 18 },   //#
{ 0, 0, 50, 73, 127, 73, 38, 0 },   //$
{ 0, 32, 81, 38, 8, 50, 69, 2 },    //%
{ 0, 0, 54, 85, 73, 69, 34, 5 },    //&
{ 0, 0, 0, 64, 112, 0, 0, 0 },      //'
{ 0, 0, 0, 62, 65, 0, 0, 0 },       //(
{ 0, 0, 0, 0, 65, 62, 0, 0 },       //)
{ 0, 0, 42, 28, 8, 28, 42, 0 },     //*
{ 0, 0, 8, 8, 62, 8, 8, 0 },        //+
{ 0, 0, 0, 5, 6, 0, 0, 0 },         //,
{ 0, 0, 8, 8, 8, 8, 8, 0 },         //-
{ 0, 0, 3, 3, 0, 0, 0, 0 },         //.
{ 0, 0, 1, 6, 8, 48, 64, 0 },       ///
{ 0, 0, 62, 69, 73, 81, 62, 0 },    //0  
{ 0, 0, 0, 33, 127, 1, 0, 0 },      //1
{ 0, 0, 35, 69, 73, 49, 0, 0 },     //2
{ 0, 0, 73, 73, 73, 54, 0, 0 },
{ 0, 0, 120, 8, 8, 127, 8, 0 },
{ 0, 0, 0, 121, 73, 73, 70, 0 },
{ 0, 0, 62, 73, 73, 73, 6, 0 },
{ 0, 0, 0, 67, 68, 72, 112, 0 },
{ 0, 0, 54, 73, 73, 73, 54, 0 },    //8
{ 0, 0, 48, 73, 73, 73, 62, 0 },    //9
{ 0, 0, 0, 36, 36, 0, 0, 0 },       //:
{ 0, 0, 37, 38, 0, 0, 0, 0 },       //;
{ 0, 0, 8, 20, 34, 0, 0, 0 },       //<
{ 0, 0, 18, 18, 18, 18, 18, 0 },    //=
{ 0, 0, 0, 0, 34, 20, 8, 0 },       //>
{ 0, 0, 0, 64, 77, 72, 48, 0 },     //?
{ 0, 0, 62, 65, 93, 85, 60, 0 },    //@
{ 0, 0, 63, 68, 68, 68, 63, 0 },    //A
{ 0, 0, 127, 73, 73, 73, 54, 0 },
{ 0, 0, 62, 65, 65, 65, 0, 0 },
{ 0, 0, 127, 65, 65, 65, 62, 0 },
{ 0, 0, 127, 73, 73, 73, 0, 0 },
{ 0, 0, 127, 72, 72, 72, 0, 0 },
{ 0, 0, 62, 65, 73, 73, 14, 0 },
{ 0, 0, 127, 8, 8, 8, 127, 0 },
{ 0, 0, 0, 65, 127, 65, 0, 0 },
{ 0, 0, 0, 65, 65, 126, 0, 0 },
{ 0, 0, 127, 8, 8, 20, 99, 0 },
{ 0, 0, 127, 1, 1, 1, 0, 0 },       //L
{ 0, 127, 64, 48, 8, 48, 64, 127 }, //M
{ 0, 0, 127, 32, 28, 2, 127, 0 },
{ 0, 0, 62, 65, 65, 65, 62, 0 },
{ 0, 0, 127, 68, 68, 68, 56, 0 },
{ 0, 0, 62, 65, 65, 71, 63, 1 },
{ 0, 0, 127, 72, 72, 76, 51, 0 },
{ 0, 0, 48, 73, 73, 73, 6, 0 },
{ 0, 0, 64, 64, 127, 64, 64, 0 },
{ 0, 0, 126, 1, 1, 1, 126, 0 },
{ 0, 0, 124, 2, 1, 2, 124, 0 },
{ 0, 120, 6, 1, 14, 1, 6, 120 },
{ 0, 0, 99, 20, 8, 20, 99, 0 },
{ 0, 0, 96, 16, 15, 16, 96, 0 },
{ 0, 0, 67, 69, 73, 113, 0, 0 },  //Z
{ 0, 0, 127, 65, 65, 0, 0, 0 },   //[
{ 0, 0, 0, 112, 8, 7, 0, 0 },    /* ///\*/
{ 0, 0, 0, 65, 65, 127, 0, 0 },   //]
{ 0, 0, 48, 64, 48, 0, 0, 0 },    //^
{ 0, 0, 1, 1, 1, 1, 1, 0 },       //_
{ 0, 0, 64, 48, 0, 0, 0, 0 },     //`
{ 0, 0, 6, 41, 41, 41, 31, 0 },   //a
{ 0, 0, 127, 9, 9, 9, 6, 0 },     //b
{ 0, 0, 14, 17, 17, 17, 0, 0 },
{ 0, 0, 6, 9, 9, 9, 127, 0 },
{ 0, 0, 30, 37, 37, 37, 25, 0 },
{ 0, 0, 8, 63, 72, 72, 0, 0 },
{ 0, 0, 25, 37, 37, 37, 30, 0 },
{ 0, 0, 127, 8, 8, 8, 7, 0 },
{ 0, 0, 0, 0, 47, 0, 0, 0 },
{ 0, 0, 1, 1, 94, 0, 0, 0 },
{ 0, 0, 127, 4, 4, 27, 0, 0 },
{ 0, 0, 0, 64, 127, 0, 0, 0 },
{ 0, 15, 16, 16, 15, 16, 16, 15 },
{ 0, 0, 31, 16, 16, 16, 15, 0 },
{ 0, 0, 14, 17, 17, 17, 14, 0 },
{ 0, 0, 63, 72, 72, 48, 0, 0 },
{ 0, 0, 24, 36, 36, 31, 0, 0 },
{ 0, 0, 15, 16, 16, 8, 0, 0 },
{ 0, 0, 8, 21, 21, 21, 2, 0 },
{ 0, 0, 0, 8, 31, 9, 0, 0 },
{ 0, 0, 30, 1, 1, 1, 31, 0 },
{ 0, 0, 28, 2, 1, 2, 28, 0 },
{ 0, 30, 1, 2, 4, 2, 1, 30 },
{ 0, 0, 17, 10, 4, 10, 17, 0 },
{ 0, 0, 0, 25, 5, 5, 30, 0 },     //y
{ 0, 0, 19, 21, 21, 25, 0, 0 },   //z
{ 0, 0, 8, 54, 65, 0, 0, 0 },     //{
{ 0, 0, 0, 0, 119, 0, 0, 0 },     //|
{ 0, 0, 0, 0, 65, 54, 8, 0 },     //}
{ 0, 8, 16, 16, 8, 4, 4, 8 },     //~

{ 0, 0, 0, 0, 0, 0, 0, 0 }        //
};[/kenrobot_code]
回复

使用道具 举报

发表于 2018-9-7 09:23:23 | 显示全部楼层
这个设计的可以说非常666了,赞一个
回复 支持 反对

使用道具 举报

发表于 2018-9-7 22:03:11 | 显示全部楼层
继续改进发扬光大
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-9 08:58:46 | 显示全部楼层
根据前辈的帖子 使用Arduino驱动28BYJ48电机库(Stepper28BYJ48) - Powered by Discuz!
http://www.geek-workshop.com/for ... amp;highlight=28byj
发现了步进电机力度有问题,确实是库文件的毛病,更改一下程序,超级有力,按住纸条,机器就直接被拉过来了。

程序可以直接上web版的IDE编译。
https://create.arduino.cc/editor ... a339187df4f/preview



[kenrobot_code]//淘宝『有名称的店铺』https://somebodys.taobao.com/
//更新日期 2018/09/07
//Mini Telegraph 电报机 写字程序
//本程序对应商品 https://item.taobao.com/item.htm ... amp;id=576633734176

//本程序实时更新的最新版本 https://create.arduino.cc/editor ... a339187df4f/preview
//强烈推荐使用web版编译器查看

#include <SoftwareSerial.h>  //蓝牙串口库 没有蓝牙模块也可以通过PC串口传输文字

#include <Servo.h>        //舵机库
#include <Stepper_28BYJ_48.h> //更新的步进电机库文件
#include "chars.h"         //点阵字符库
   
#define SERVO_PIN 2   //写字舵机接口号
#define DOT_PIN   3   //打点舵机接口号


#define DOT_UP_DELAY 120    //打点等待时间  
#define DOT_DOWN_DELAY 50   //打点等待时间   //要符合舵机动作幅度的时间,延时过小会导致无法打到

#define DOT_UP 1700     //打点舵机提升到的位置,让笔刚好贴到纸上,不能抬的幅度过高
#define DOT_DOWN 1900   //下降后的位置
//   
#define SERVO_MIN 90   //写字舵机的字顶部位置
#define SERVO_MAX 120   //底部位置   

#define SERVO_STEPS 15  //字符的高度,数值越小,字符越大,建议范围(10~30)
#define LINE_TAB 9     //字符的基线位置,过大会超出纸的高度

#define SERVO_STEP (SERVO_MAX - SERVO_MIN) / SERVO_STEPS

#define SERVO_DELAY SERVO_STEP*5

#define STEPPER_STEP 600 / SERVO_STEPS


Servo servo_arm;          //写字舵机
Servo servo_dot;          //打点舵机
Stepper_28BYJ_48 stepper(4,5,6,7);  // 步进电机   in1~4端口 4 5 6 7

SoftwareSerial Bluetooth(0, 1);   // 初始化蓝牙 [RX, TX]    不同型号主板 端口号不同,uno 是 0,1  10,11 都可以

void setup() {
  Bluetooth.begin(9600);
  Serial.begin(9600); //调试代码
  servo_dot.attach(DOT_PIN);
  servo_dot.write(DOT_DOWN);

  servo_arm.attach(SERVO_PIN);
  
  pinMode(DOT_PIN, OUTPUT);


//  printString("0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz ");  //测试写一些内容
// printString("HELLO GEEK WORLD!!!     MINI TELEGRAPH  @TAOBAO        ");  //测试写一些内容
printString("  HELLO WORLD.   I LOVE YOU     I A U    ");  
}



int pos = 0;

void dot(int m)  //打一个点
{
  if(m) {
    pos = 1;
    servo_dot.write(DOT_UP);
    delay(DOT_UP_DELAY);
  } else {
    pos = 0;
    servo_dot.write(DOT_DOWN);
    delay(DOT_DOWN_DELAY);
  }
}


void printLine(int b) //画一连续的线
{
  servo_arm.write(SERVO_MAX - (LINE_TAB-2)*SERVO_STEP);
  if(b != 0)
  {
    servo_arm.write(SERVO_MAX - (LINE_TAB-2)*SERVO_STEP);
    delay(SERVO_DELAY*20);
    for (int j = 0; b != 0; j++)
    {
      dot(b&1);
      b >>= 1;
      servo_arm.write(SERVO_MAX - (LINE_TAB+j)*SERVO_STEP);
      delay(SERVO_DELAY);
      }   
    dot(0);
  }

  stepper.step(7); //走纸幅度 可调节,数值越大,字符越扁
}



void printChar(char c)  //打印某一字符
{
int n = 0;
  Serial.println(c);
  for (int i = 0; i < 8; i++)
  {
    if(chars[c] != 0)
    {
      printLine(chars[c]);
      n++;
    }
    else stepper.step(7); //走纸幅度 可调节,数值越大,字符越扁
  }
}


void printString(char* str)   //打印一字符串  
{
  while(*str != '\0') {
    printChar(*str);
    str+=1;
  }
}

int n;
void loop()
{
  Serial.println(Serial.available());   //等待串口状态,串口一次传递最多64个字符
  if(Bluetooth.available() > 0) {
    servo_dot.attach(DOT_PIN);
    servo_dot.write(DOT_DOWN);
    servo_arm.attach(SERVO_PIN);
    while(Bluetooth.available() > 2) {    //写串口接收到的字,最后2位的换行符不写。
      n =  Bluetooth.read();
      if(n >= 2) printChar((char)n);
    }
  }
  servo_dot.detach();
  servo_arm.detach(); //放松舵机,避免持续受力过热
  Bluetooth.write(1);
  delay(1500);
}


[/kenrobot_code]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-7-6 14:09 , Processed in 0.053802 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表