用了商家提供的time庫和ds3231庫但編譯不通過。我認為time庫需要改動一下,本人還不具備修改庫的能力,只會調用
//淘寶『有名稱的店鋪』更新時間 20141126
//↓↓↓↓↓↓↓ 以下參數在調試程序中調節好后復制過來 ↓↓↓↓↓↓↓
//1.先調節0、180度的位置。調節到位后,再調節90度位置
//左右懸臂舵機的 0或180度位置,,數字增加,左側舵機逆時針調整,右側舵機順時針調整
//【此數值可能需要調節】
#define SERVOLEFTNULL 2030 //數值減小,順時針旋轉,加大則逆時針旋轉
//【此數值可能需要調節】
#define SERVORIGHTNULL 1100 //數值減小,順時針旋轉,加大則逆時針旋轉
//2.調節到位0、180,再調節下面參數
//左右懸臂舵機的90度位置,,數字增加,左側舵機順時針調整,右側舵機逆時針調整
//【此數值可能需要調節】
#define SERVOFAKTORLEFT 580 //數值加大,順時針旋轉,減小則逆時針旋轉
//【此數值可能需要調節】
#define SERVOFAKTORRIGHT 610 //數值減小,順時針旋轉,加大則逆時針旋轉
//升舉舵機的3個角度
//【此數值可能需要調節】
#define LIFT0 1220 //落筆寫字 on drawing surface
#define LIFT1 1320 //寫字時抬臂動作 between numbers
#define LIFT2 1580 //高抬筆架 going towards sweeper
//【此數值可能需要調節】
//
//以上參數,請運行調試程序 plotclockadj ,調整好位置后,將數據復制過來
//
//筆擦的坐標位置,如不能對準筆擦可以微調單位毫米
int rubberx=72,rubbery=42; //【此數值可能需要調節】
//三只舵機的接口號
#define SERVOPINLIFT 2 //抬臂舵機
#define SERVOPINLEFT 3 //左臂舵機
#define SERVOPINRIGHT 4 //右臂舵機
// 速度 數字越小越慢,太快了容易抖 1000~2000
#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 <Servo.h>
#include <DS3231.h>
#include <Wire.h>
//時鐘模塊,如果沒有時鐘模塊,請用另一個程序
DS3231 Clock;
bool h12;
bool PM;
int servoLift = LIFT2;
Servo servo1; //
Servo servo2; //
Servo servo3; //
volatile double lastX = rubberx;
volatile double lastY = rubbery;
int last_min = 0;
void setup()
{
Wire.begin();
//第一次運行 請設置時間,設置成功后請刪除此行代碼,或者如下格式注釋掉
Clock.setMinute(59);//設置分鐘
Clock.setHour(11); //設置小時
//Clock.setMinute(59);
//Clock.setHour(11);
//第一次運行 請設置時間,設置成功后請刪除此行代碼
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 minute,hour;
minute=Clock.getMinute();
hour=Clock.getHour(h12, PM);//讀取時間
int i = 0;
//下面代碼任選一行,進行不同模式的書寫
if (last_min != minute()) //每分鐘書寫一次時間
//if (1) //反復不間斷的擦寫模式
// if (1) //如需修改請復制上面代碼
{
if (!servo1.attached()) servo1.attach(SERVOPINLIFT);
if (!servo2.attached()) servo2.attach(SERVOPINLEFT);
if (!servo3.attached()) servo3.attach(SERVOPINRIGHT);
lift(0);
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);
}
//cos?sin?
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);
}
void drawTo(double pX, double pY) {
double dx, dy, c;
int i;
// dx dy of new point
dx = pX - lastX;
dy = pY - lastY;
//path lenght in mm, times 4 equals 4 steps per mm
c = floor(4 * sqrt(dx * dx + dy * dy));
if (c < 1) c = 1;
for (i = 0; i <= c; i++) {
// draw line point by point
set_XY(lastX + (i * dx / c), lastY + (i * dy / c));
}
lastX = pX;
lastY = pY;
}
double return_angle(double a, double b, double c) {
// cosine rule for angle between c and a
return acos((a * a + c * c - b * b) / (2 * a * c));
}
//用各種三角函數把位置坐標換算成舵機的角度,具體咋算的,請參考
//Plotclock by joo - Thingiverse
//http://www.thingiverse.com/thing:248009/
void set_XY(double Tx, double Ty)
{
delay(1);
double dx, dy, c, a1, a2, Hx, Hy;
// calculate triangle between pen, servoLeft and arm joint
// cartesian dx/dy
dx = Tx - O1X;
dy = Ty - O1Y;
// polar lemgth (c) and angle (a1)
c = sqrt(dx * dx + dy * dy); //
a1 = atan2(dy, dx); //
a2 = return_angle(L1, L2, c);
servo2.writeMicroseconds(floor(((a2 + a1 - M_PI) * SERVOFAKTORLEFT) + SERVOLEFTNULL));
// calculate joinr arm point for triangle of the right servo arm
a2 = return_angle(L2, L1, c);
Hx = Tx + L3 * cos((a1 - a2 + 0.621) + M_PI); //36,5擄
Hy = Ty + L3 * sin((a1 - a2 + 0.621) + M_PI);
// calculate triangle between pen joint, servoRight and arm joint
dx = Hx - O2X;
dy = Hy - O2Y;
c = sqrt(dx * dx + dy * dy);
a1 = atan2(dy, dx);
a2 = return_angle(L1, (L2 - L3), c);
servo3.writeMicroseconds(floor(((a1 - a2) * SERVOFAKTORRIGHT) + SERVORIGHTNULL));
} 主要是需要修改一下time庫求指點
232216vkukluuzybxymxfn.png (7.86 KB, 下載次數: 82)
下載附件
2017-2-10 11:49 上傳
232220teew2r9ueuurss7j.png (4.78 KB, 下載次數: 93)
下載附件
2017-2-10 11:49 上傳
|