shihaipeng04 发表于 2018-8-30 23:56:15

Mini Telegraph电报机

学来一个好玩的小制作。原理很简单,但是设计很巧妙。http://p.weibo.com/show/channerWbH5/1034:4278862293488537

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

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


#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);   // 初始化蓝牙     不同型号主板 端口号不同,uno 是 0,110,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 != 0)
    {
      printLine(chars);
      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);
}



字库的代码
const byte chars[] ={{ 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 }      //
};

shihaipeng04 发表于 2018-9-9 08:58:46

根据前辈的帖子 使用Arduino驱动28BYJ48电机库(Stepper28BYJ48) - Powered by Discuz!
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=15744&highlight=28byj
发现了步进电机力度有问题,确实是库文件的毛病,更改一下程序,超级有力,按住纸条,机器就直接被拉过来了。

程序可以直接上web版的IDE编译。
https://create.arduino.cc/editor/wjd76/68303116-0495-4580-b125-6a339187df4f/preview



//淘宝『有名称的店铺』https://somebodys.taobao.com/
//更新日期 2018/09/07
//Mini Telegraph 电报机 写字程序
//本程序对应商品 https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-1266050943.20.5eaf3c6eT6FuhE&id=576633734176

//本程序实时更新的最新版本 https://create.arduino.cc/editor/wjd76/68303116-0495-4580-b125-6a339187df4f/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);   // 初始化蓝牙     不同型号主板 端口号不同,uno 是 0,110,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 != 0)
    {
      printLine(chars);
      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);
}


Hackerpro 发表于 2018-9-7 09:23:23

这个设计的可以说非常666了,赞一个

52wh1314 发表于 2018-9-7 22:03:11

继续改进发扬光大

zzhgod1996 发表于 2020-7-15 21:17:46

强,,,
页: [1]
查看完整版本: Mini Telegraph电报机