الكود
m190printer.h
كود:
#ifndef M190PRINTER_H
#define M190PRINTER_H
// Copyright 2013 Steven Pearson
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#include <Arduino.h>
namespace m190{
const int PIN_MOTOR = 4;
const int PIN_RESET = 2;
const int PIN_TIMING = A0;
const int PIN_SOLA = 5;
const int PIN_SOLB = 6;
const int PIN_SOLC = 7;
const int PIN_SOLD = 8;
const int PIN_SOLE = 9;
const int PIN_SOLF = 10;
const int PIN_SOLG = 11;
const int PIN_SOLH = 12;
typedef boolean (*pixelsource)(void *ctx,int x,int y);
void initialize();
void formfeed(int rows);
void print(pixelsource s,void *ctx,int rows,boolean overlap);
void print(char *x);
void print(const __FlashStringHelper *msg);
void printP(const byte *bitmap,int w,int h);
}
#endif
الكود للاردوينو
كود:
// Copyright 2013 Steven Pearson
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#include <m190printer.h>
#include <avr/pgmspace.h>
static const byte ASCII[] PROGMEM =
{
0x00, 0x00, 0x00, 0x00, 0x00 // 20
,0x00, 0x00, 0x5f, 0x00, 0x00 // 21 !
,0x00, 0x07, 0x00, 0x07, 0x00 // 22 "
,0x14, 0x7f, 0x14, 0x7f, 0x14 // 23 #
,0x24, 0x2a, 0x7f, 0x2a, 0x12 // 24 $
,0x23, 0x13, 0x08, 0x64, 0x62 // 25 %
,0x36, 0x49, 0x55, 0x22, 0x50 // 26 &
,0x00, 0x05, 0x03, 0x00, 0x00 // 27 '
,0x00, 0x1c, 0x22, 0x41, 0x00 // 28 (
,0x00, 0x41, 0x22, 0x1c, 0x00 // 29 )
,0x14, 0x08, 0x3e, 0x08, 0x14 // 2a *
,0x08, 0x08, 0x3e, 0x08, 0x08 // 2b +
,0x00, 0x50, 0x30, 0x00, 0x00 // 2c ,
,0x08, 0x08, 0x08, 0x08, 0x08 // 2d -
,0x00, 0x60, 0x60, 0x00, 0x00 // 2e .
,0x20, 0x10, 0x08, 0x04, 0x02 // 2f /
,0x3e, 0x51, 0x49, 0x45, 0x3e // 30 0
,0x00, 0x42, 0x7f, 0x40, 0x00 // 31 1
,0x42, 0x61, 0x51, 0x49, 0x46 // 32 2
,0x21, 0x41, 0x45, 0x4b, 0x31 // 33 3
,0x18, 0x14, 0x12, 0x7f, 0x10 // 34 4
,0x27, 0x45, 0x45, 0x45, 0x39 // 35 5
,0x3c, 0x4a, 0x49, 0x49, 0x30 // 36 6
,0x01, 0x71, 0x09, 0x05, 0x03 // 37 7
,0x36, 0x49, 0x49, 0x49, 0x36 // 38 8
,0x06, 0x49, 0x49, 0x29, 0x1e // 39 9
,0x00, 0x36, 0x36, 0x00, 0x00 // 3a :
,0x00, 0x56, 0x36, 0x00, 0x00 // 3b ;
,0x08, 0x14, 0x22, 0x41, 0x00 // 3c <
,0x14, 0x14, 0x14, 0x14, 0x14 // 3d =
,0x00, 0x41, 0x22, 0x14, 0x08 // 3e >
,0x02, 0x01, 0x51, 0x09, 0x06 // 3f ?
,0x32, 0x49, 0x79, 0x41, 0x3e // 40 *
,0x7e, 0x11, 0x11, 0x11, 0x7e // 41 A
,0x7f, 0x49, 0x49, 0x49, 0x36 // 42 B
,0x3e, 0x41, 0x41, 0x41, 0x22 // 43 C
,0x7f, 0x41, 0x41, 0x22, 0x1c // 44 D
,0x7f, 0x49, 0x49, 0x49, 0x41 // 45 E
,0x7f, 0x09, 0x09, 0x09, 0x01 // 46 F
,0x3e, 0x41, 0x49, 0x49, 0x7a // 47 G
,0x7f, 0x08, 0x08, 0x08, 0x7f // 48 H
,0x00, 0x41, 0x7f, 0x41, 0x00 // 49 I
,0x20, 0x40, 0x41, 0x3f, 0x01 // 4a J
,0x7f, 0x08, 0x14, 0x22, 0x41 // 4b K
,0x7f, 0x40, 0x40, 0x40, 0x40 // 4c L
,0x7f, 0x02, 0x0c, 0x02, 0x7f // 4d M
,0x7f, 0x04, 0x08, 0x10, 0x7f // 4e N
,0x3e, 0x41, 0x41, 0x41, 0x3e // 4f O
,0x7f, 0x09, 0x09, 0x09, 0x06 // 50 P
,0x3e, 0x41, 0x51, 0x21, 0x5e // 51 Q
,0x7f, 0x09, 0x19, 0x29, 0x46 // 52 R
,0x46, 0x49, 0x49, 0x49, 0x31 // 53 S
,0x01, 0x01, 0x7f, 0x01, 0x01 // 54 T
,0x3f, 0x40, 0x40, 0x40, 0x3f // 55 U
,0x1f, 0x20, 0x40, 0x20, 0x1f // 56 V
,0x3f, 0x40, 0x38, 0x40, 0x3f // 57 W
,0x63, 0x14, 0x08, 0x14, 0x63 // 58 X
,0x07, 0x08, 0x70, 0x08, 0x07 // 59 Y
,0x61, 0x51, 0x49, 0x45, 0x43 // 5a Z
,0x00, 0x7f, 0x41, 0x41, 0x00 // 5b [
,0x02, 0x04, 0x08, 0x10, 0x20 // 5c ¥
,0x00, 0x41, 0x41, 0x7f, 0x00 // 5d ]
,0x04, 0x02, 0x01, 0x02, 0x04 // 5e ^
,0x40, 0x40, 0x40, 0x40, 0x40 // 5f _
,0x00, 0x01, 0x02, 0x04, 0x00 // 60 `
,0x20, 0x54, 0x54, 0x54, 0x78 // 61 a
,0x7f, 0x48, 0x44, 0x44, 0x38 // 62 b
,0x38, 0x44, 0x44, 0x44, 0x20 // 63 c
,0x38, 0x44, 0x44, 0x48, 0x7f // 64 d
,0x38, 0x54, 0x54, 0x54, 0x18 // 65 e
,0x08, 0x7e, 0x09, 0x01, 0x02 // 66 f
,0x0c, 0x52, 0x52, 0x52, 0x3e // 67 g
,0x7f, 0x08, 0x04, 0x04, 0x78 // 68 h
,0x00, 0x44, 0x7d, 0x40, 0x00 // 69 i
,0x20, 0x40, 0x44, 0x3d, 0x00 // 6a j
,0x7f, 0x10, 0x28, 0x44, 0x00 // 6b k
,0x00, 0x41, 0x7f, 0x40, 0x00 // 6c l
,0x7c, 0x04, 0x18, 0x04, 0x78 // 6d m
,0x7c, 0x08, 0x04, 0x04, 0x78 // 6e n
,0x38, 0x44, 0x44, 0x44, 0x38 // 6f o
,0x7c, 0x14, 0x14, 0x14, 0x08 // 70 p
,0x08, 0x14, 0x14, 0x18, 0x7c // 71 q
,0x7c, 0x08, 0x04, 0x04, 0x08 // 72 r
,0x48, 0x54, 0x54, 0x54, 0x20 // 73 s
,0x04, 0x3f, 0x44, 0x40, 0x20 // 74 t
,0x3c, 0x40, 0x40, 0x20, 0x7c // 75 u
,0x1c, 0x20, 0x40, 0x20, 0x1c // 76 v
,0x3c, 0x40, 0x30, 0x40, 0x3c // 77 w
,0x44, 0x28, 0x10, 0x28, 0x44 // 78 x
,0x0c, 0x50, 0x50, 0x50, 0x3c // 79 y
,0x44, 0x64, 0x54, 0x4c, 0x44 // 7a z
,0x00, 0x08, 0x36, 0x41, 0x00 // 7b {
,0x00, 0x00, 0x7f, 0x00, 0x00 // 7c |
,0x00, 0x41, 0x36, 0x08, 0x00 // 7d }
,0x10, 0x08, 0x08, 0x10, 0x08 // 7e ?
,0x78, 0x46, 0x41, 0x46, 0x78 // 7f ?
};
boolean isTick(){
static int flipflop=0;
static int lastval=0;
int val=analogRead(m190::PIN_TIMING);
boolean tickfound=false;
if(flipflop==0){
if( val < lastval ){
flipflop=1;
tickfound=true;
}
} else {
if( val > lastval ){
flipflop=0;
tickfound=true;
}
}
lastval=val;
return tickfound;
}
boolean isReset(){
static int armed=0;
static unsigned long armedTime=0;
int val = digitalRead(m190::PIN_RESET);
unsigned long now=micros();
if( val == HIGH ){
switch( armed ){
case 0:
armedTime=now;
armed=1;
break;
case 1:
if(now-armedTime >= 54ul ){
armed=2;
return true;
}
break;
case 2:
//We already fired
break;
}
}
else {
armed=0;
}
return false;
}
void m190::initialize(){
pinMode(PIN_MOTOR,OUTPUT);
pinMode(PIN_RESET,INPUT);
pinMode(PIN_SOLA,OUTPUT);
pinMode(PIN_SOLB,OUTPUT);
pinMode(PIN_SOLC,OUTPUT);
pinMode(PIN_SOLD,OUTPUT);
pinMode(PIN_SOLE,OUTPUT);
pinMode(PIN_SOLF,OUTPUT);
pinMode(PIN_SOLG,OUTPUT);
pinMode(PIN_SOLH,OUTPUT);
}
boolean formfeedsource(void *ctx,int x,int y){
return 0;
}
void m190::print(pixelsource source,void *ctx,int rows,boolean overlap){
digitalWrite(PIN_MOTOR,HIGH);
//TODO: validate we get 90 ticks
int spinup=2;
while(spinup>0){
if( isReset() ){
spinup--;
}
}
int firsttick=3;
int maxticks=overlap?60:54;
int y=0;
int ticks=0;
while(y<rows){
if( isTick() ){
ticks++;
}
if( isReset() ){
ticks=0;
y++;
}
//We are in the printing range
if( ticks >=firsttick && ticks <=maxticks ){
int pos = ticks-firsttick;
int x=pos/3;
int solgroup = pos%3;
//Only power 3 solenoids max at a time
digitalWrite(PIN_SOLA,solgroup==0&&source(ctx,x,y));
digitalWrite(PIN_SOLB,solgroup==1&&source(ctx,x+18,y));
digitalWrite(PIN_SOLC,solgroup==2&&source(ctx,x+36,y));
digitalWrite(PIN_SOLD,solgroup==0&&source(ctx,x+54,y));
digitalWrite(PIN_SOLE,solgroup==1&&source(ctx,x+72,y));
digitalWrite(PIN_SOLF,solgroup==2&&source(ctx,x+90,y));
digitalWrite(PIN_SOLG,solgroup==1&&source(ctx,x+108,y));
digitalWrite(PIN_SOLH,solgroup==2&&source(ctx,x+126,y));
} else {
digitalWrite(PIN_SOLA,LOW);
digitalWrite(PIN_SOLB,LOW);
digitalWrite(PIN_SOLC,LOW);
digitalWrite(PIN_SOLD,LOW);
digitalWrite(PIN_SOLD,LOW);
digitalWrite(PIN_SOLE,LOW);
digitalWrite(PIN_SOLF,LOW);
digitalWrite(PIN_SOLG,LOW);
digitalWrite(PIN_SOLH,LOW);
}
}
//Turn off all solenoids
digitalWrite(PIN_SOLA,LOW);
digitalWrite(PIN_SOLB,LOW);
digitalWrite(PIN_SOLC,LOW);
digitalWrite(PIN_SOLD,LOW);
digitalWrite(PIN_SOLD,LOW);
digitalWrite(PIN_SOLE,LOW);
digitalWrite(PIN_SOLF,LOW);
digitalWrite(PIN_SOLG,LOW);
digitalWrite(PIN_SOLH,LOW);
//stop the motor
digitalWrite(PIN_MOTOR,LOW);
}
void m190::formfeed(int rows){
m190::print(formfeedsource,NULL,rows,false);
}
struct stringcontext{
const char *str;
int len;
};
unsigned char getCharPixel(char c,int x,int y){
//character and line spaces
if( x>=5 || y >=7){
return 0;
}
byte b = pgm_read_byte(ASCII+((c - 0x20)*5)+x);
return b&(1<<y);
}
unsigned char getStringPixel(const char *c,int l,int x,int y){
//What character does this x and y coord relate to
int lpos = y/8;
int ypos = y%8;
int cpos = (lpos*24)+(x/6);
if( cpos >= l ){
return 0;
}
int ppos = x%6;
return getCharPixel(c[cpos],ppos,ypos);
}
boolean stringsource(void *ctx,int x,int y){
stringcontext *sctx = (stringcontext *)ctx;
return getStringPixel(sctx->str,sctx->len,x,y);
}
void m190::print(char *str){
stringcontext ctx;
ctx.str=str;
ctx.len=strlen(str);
int reqrows = ((ctx.len/24)+1)*8;
print(stringsource,&ctx,reqrows,false);
}
unsigned char getStringPixelP(const char *c,int l,int x,int y){
//What character does this x and y coord relate to
int lpos = y/8;
int ypos = y%8;
int cpos = (lpos*24)+(x/6);
if( cpos >= l ){
return 0;
}
int ppos = x%6;
return getCharPixel(pgm_read_byte(c+cpos),ppos,ypos);
}
boolean stringsourceP(void *ctx,int x,int y){
stringcontext *sctx = (stringcontext *)ctx;
return getStringPixelP(sctx->str,sctx->len,x,y);
}
void m190::print(const __FlashStringHelper *msg){
stringcontext ctx;
ctx.str=(const char PROGMEM *)msg;
ctx.len=strlen_P(ctx.str);
int reqrows = ((ctx.len/24)+1)*8;
print(stringsourceP,&ctx,reqrows,false);
}
struct bitmapcontext{
const byte *bitmap;
int w;
int h;
};
boolean bitmapsource(void *ctx,int x,int y){
bitmapcontext *bctx=(bitmapcontext *)ctx;
int xbyte = x/8;
int xbit = x%8;
int pos = (bctx->w*y)+xbyte;
int val = pgm_read_byte(bctx->bitmap+pos);
return val & 1<<xbit;
}
void m190::printP(const byte *bitmap,int w,int h){
bitmapcontext ctx;
ctx.bitmap=bitmap;
ctx.w=w;
ctx.h=h;
print(bitmapsource,&ctx,h,true);
}
|