//左右悬臂舵机的90度位置,,数字增加,左侧舵机顺时针调整,右侧舵机逆时针调整
#define SERVOFAKTORLEFT 620
#define SERVOFAKTORRIGHT 580
//左右悬臂舵机的 0或180度位置,,数字增加,左侧舵机顺时针调整,右侧舵机逆时针调整
#define SERVOLEFTNULL 2060
#define SERVORIGHTNULL 1090
//升举舵机的3个角度
#define LIFT0 1140 // on drawing surface
#define LIFT1 925 // between numbers
#define LIFT2 725 // going towards sweeper
//
//以上参数,请运行调试程序 plotclockadj ,调整好位置后,将数据复制过来
//
//三只舵机的接口
#define SERVOPINLIFT 2
#define SERVOPINLEFT 3
#define SERVOPINRIGHT 4
// 速度
#define LIFTSPEED 1500
// 悬臂的长度,根据图纸测量,无需改变
#define L1 35
#define L2 57.2
#define L3 14.2
// 左右舵机轴心的位置
#define O1X 22
#define O1Y -25
#define O2X 47
#define O2Y -25
#include <Time.h> // see
http://playground.arduino.cc/Code/time//这里报错请把压缩包内的time.h复制到C:\Program Files\Arduino\libraries下
#include <Servo.h>
int rubberx=72,rubbery=42; //笔擦的坐标位置,如不能对准笔擦可以微调单位毫米
int servoLift = 1500;
Servo servo1; //
Servo servo2; //
Servo servo3; //
volatile double lastX = 70;
volatile double lastY = 42;
int last_min = 0;
void setup()
{
// 在这里设置一个初始时间
setTime(06,41,0,0,0,0);
servo1.attach(SERVOPINLIFT); // lifting servo
servo2.attach(SERVOPINLEFT); // left servo
servo3.attach(SERVOPINRIGHT); // right servo
lift(1); //抬笔
drawTo(rubberx, rubbery); //停留在笔擦位置
delay(1000);
}
void loop()
{
int i = 0;
if ( last_min != minute()) //现在是不停的书写,如果每分钟写一次就改成 if (1 || last_min != minute())
{
if (!servo1.attached()) servo1.attach(SERVOPINLIFT);
if (!servo2.attached()) servo2.attach(SERVOPINLEFT);
if (!servo3.attached()) servo3.attach(SERVOPINRIGHT);
lift(0);
hour();
while ((i+1)*10 <= hour())
{
i++;
}
number(3, 3, 111, 1);
number(5, 25, i, 0.9);
number(19, 25, (hour()-i*10), 0.9);
number(28, 25, 11, 0.9);
i=0;
while ((i+1)*10 <= minute())
{
i++;
}
number(34, 25, i, 0.9);
number(48, 25, (minute()-i*10), 0.9);
lift(2);
drawTo(rubberx, rubbery); //回到笔擦位置
lift(1);
last_min = minute();
servo1.detach();
servo2.detach();
servo3.detach();
}
}
// Writing numeral with bx by being the bottom left originpoint. Scale 1 equals a 20 mm high font.
// The structure follows this principle: move to first startpoint of the numeral, lift down, draw numeral, lift up
void number(float bx, float by, int num, float scale) {
switch (num) {
case 0:
drawTo(bx + 12 * scale, by + 6 * scale);
lift(0);
bogenGZS(bx + 7 * scale, by + 10 * scale, 10 * scale, -0.8, 6.7, 0.5);
lift(1);
break;
case 1:
drawTo(bx + 3 * scale, by + 15 * scale);
lift(0);
drawTo(bx + 10 * scale, by + 20 * scale);
drawTo(bx + 10 * scale, by + 0 * scale);
lift(1);
break;
case 2:
drawTo(bx + 2 * scale, by + 12 * scale);
lift(0);
bogenUZS(bx + 8 * scale, by + 14 * scale, 6 * scale, 3, -0.8, 1);
drawTo(bx + 1 * scale, by + 0 * scale);
drawTo(bx + 12 * scale, by + 0 * scale);
lift(1);
break;
case 3:
drawTo(bx + 2 * scale, by + 17 * scale);
lift(0);
bogenUZS(bx + 5 * scale, by + 15 * scale, 5 * scale, 3, -2, 1);
bogenUZS(bx + 5 * scale, by + 5 * scale, 5 * scale, 1.57, -3, 1);
lift(1);
break;
case 4:
drawTo(bx + 10 * scale, by + 0 * scale);
lift(0);
drawTo(bx + 10 * scale, by + 20 * scale);
drawTo(bx + 2 * scale, by + 6 * scale);
drawTo(bx + 12 * scale, by + 6 * scale);
lift(1);
break;
case 5:
drawTo(bx + 2 * scale, by + 5 * scale);
lift(0);
bogenGZS(bx + 5 * scale, by + 6 * scale, 6 * scale, -2.5, 2, 1);
drawTo(bx + 5 * scale, by + 20 * scale);
drawTo(bx + 12 * scale, by + 20 * scale);
lift(1);
break;
case 6:
drawTo(bx + 2 * scale, by + 10 * scale);
lift(0);
bogenUZS(bx + 7 * scale, by + 6 * scale, 6 * scale, 2, -4.4, 1);
drawTo(bx + 11 * scale, by + 20 * scale);
lift(1);
break;
case 7:
drawTo(bx + 2 * scale, by + 20 * scale);
lift(0);
drawTo(bx + 12 * scale, by + 20 * scale);
drawTo(bx + 2 * scale, by + 0);
lift(1);
break;
case 8:
drawTo(bx + 5 * scale, by + 10 * scale);
lift(0);
bogenUZS(bx + 5 * scale, by + 15 * scale, 5 * scale, 4.7, -1.6, 1);
bogenGZS(bx + 5 * scale, by + 5 * scale, 5 * scale, -4.7, 2, 1);
lift(1);
break;
case 9:
drawTo(bx + 9 * scale, by + 11 * scale);
lift(0);
bogenUZS(bx + 7 * scale, by + 15 * scale, 5 * scale, 4, -0.5, 1);
drawTo(bx + 5 * scale, by + 0);
lift(1);
break;
case 111://擦除面板的动作
lift(0);
drawTo(rubberx, rubbery);
drawTo(58, 42);
drawTo(58, 45);
drawTo(2, 45);
drawTo(2, 41);
drawTo(58, 41);
drawTo(60, 37);
drawTo(2, 37);
drawTo(2, 33);
drawTo(60, 33);
drawTo(60, 29);
drawTo(2, 29);
drawTo(2, 25);
drawTo(60, 25);
drawTo(60, 20);
drawTo(2, 20);
drawTo(60, rubbery);
drawTo(rubberx + 3 , rubbery); //向左侧多推一些,让笔擦能够进入笔架
lift(2);
break;
case 11:
drawTo(bx + 5 * scale, by + 15 * scale);
lift(0);
bogenGZS(bx + 5 * scale, by + 15 * scale, 0.1 * scale, 1, -1, 1);
lift(1);
drawTo(bx + 5 * scale, by + 5 * scale);
lift(0);
bogenGZS(bx + 5 * scale, by + 5 * scale, 0.1 * scale, 1, -1, 1);
lift(1);
break;
}
}
void lift(char lift) {
switch (lift) {
// room to optimize !
case 0: //850
if (servoLift >= LIFT0) {
while (servoLift >= LIFT0)
{
servoLift--;
servo1.writeMicroseconds(servoLift);
delayMicroseconds(LIFTSPEED);
}
}
else {
while (servoLift <= LIFT0) {
servoLift++;
servo1.writeMicroseconds(servoLift);
delayMicroseconds(LIFTSPEED);
}
}
break;
case 1: //150
if (servoLift >= LIFT1) {
while (servoLift >= LIFT1) {
servoLift--;
servo1.writeMicroseconds(servoLift);
delayMicroseconds(LIFTSPEED);
}
}
else {
while (servoLift <= LIFT1) {
servoLift++;
servo1.writeMicroseconds(servoLift);
delayMicroseconds(LIFTSPEED);
}
}
break;
case 2:
if (servoLift >= LIFT2) {
while (servoLift >= LIFT2) {
servoLift--;
servo1.writeMicroseconds(servoLift);
delayMicroseconds(LIFTSPEED);
}
}
else {
while (servoLift <= LIFT2) {
servoLift++;
servo1.writeMicroseconds(servoLift);
delayMicroseconds(LIFTSPEED);
}
}
break;
}
}
void bogenUZS(float bx, float by, float radius, int start, int ende, float sqee) {
float inkr = -0.05;
float count = 0;
do {
drawTo(sqee * radius * cos(start + count) + bx,
radius * sin(start + count) + by);
count += inkr;
}
while ((start + count) > ende);
}
void bogenGZS(float bx, float by, float radius, int start, int ende, float sqee) {
float inkr = 0.05;
float count = 0;
do {
drawTo(sqee * radius * cos(start + count) + bx,
radius * sin(start + count) + by);
count += inkr;
}
while ((start + count) <= ende);
}