Mini Telegraph电报机
学来一个好玩的小制作。原理很简单,但是设计很巧妙。http://p.weibo.com/show/channerWbH5/1034:4278862293488537http://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 } //
}; 根据前辈的帖子 使用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);
}
这个设计的可以说非常666了,赞一个 继续改进发扬光大 强,,,
页:
[1]