找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4826|回復(fù): 0
收起左側(cè)

【求助】小賤鐘制作

[復(fù)制鏈接]
ID:163832 發(fā)表于 2017-2-10 11:50 | 顯示全部樓層 |閱讀模式
用了商家提供的time庫(kù)和ds3231庫(kù)但編譯不通過(guò)。我認(rèn)為time庫(kù)需要改動(dòng)一下,本人還不具備修改庫(kù)的能力,只會(huì)調(diào)用
//淘寶『有名稱(chēng)的店鋪』更新時(shí)間 20141126


//↓↓↓↓↓↓↓  以下參數(shù)在調(diào)試程序中調(diào)節(jié)好后復(fù)制過(guò)來(lái)   ↓↓↓↓↓↓↓

//1.先調(diào)節(jié)0、180度的位置。調(diào)節(jié)到位后,再調(diào)節(jié)90度位置
//左右懸臂舵機(jī)的 0或180度位置,,數(shù)字增加,左側(cè)舵機(jī)逆時(shí)針調(diào)整,右側(cè)舵機(jī)順時(shí)針調(diào)整
//【此數(shù)值可能需要調(diào)節(jié)】
#define SERVOLEFTNULL 2030  //數(shù)值減小,順時(shí)針旋轉(zhuǎn),加大則逆時(shí)針旋轉(zhuǎn)
//【此數(shù)值可能需要調(diào)節(jié)】
#define SERVORIGHTNULL 1100  //數(shù)值減小,順時(shí)針旋轉(zhuǎn),加大則逆時(shí)針旋轉(zhuǎn)

//2.調(diào)節(jié)到位0、180,再調(diào)節(jié)下面參數(shù)
//左右懸臂舵機(jī)的90度位置,,數(shù)字增加,左側(cè)舵機(jī)順時(shí)針調(diào)整,右側(cè)舵機(jī)逆時(shí)針調(diào)整
//【此數(shù)值可能需要調(diào)節(jié)】
#define SERVOFAKTORLEFT 580 //數(shù)值加大,順時(shí)針旋轉(zhuǎn),減小則逆時(shí)針旋轉(zhuǎn)
//【此數(shù)值可能需要調(diào)節(jié)】
#define SERVOFAKTORRIGHT 610  //數(shù)值減小,順時(shí)針旋轉(zhuǎn),加大則逆時(shí)針旋轉(zhuǎn)


//升舉舵機(jī)的3個(gè)角度
//【此數(shù)值可能需要調(diào)節(jié)】
#define LIFT0 1220 //落筆寫(xiě)字 on drawing surface
#define LIFT1 1320  //寫(xiě)字時(shí)抬臂動(dòng)作 between numbers
#define LIFT2 1580  //高抬筆架  going towards sweeper
//【此數(shù)值可能需要調(diào)節(jié)】

//
//以上參數(shù),請(qǐng)運(yùn)行調(diào)試程序 plotclockadj ,調(diào)整好位置后,將數(shù)據(jù)復(fù)制過(guò)來(lái)
//

//筆擦的坐標(biāo)位置,如不能對(duì)準(zhǔn)筆擦可以微調(diào)單位毫米
int  rubberx=72,rubbery=42;   //【此數(shù)值可能需要調(diào)節(jié)】

//三只舵機(jī)的接口號(hào)
#define SERVOPINLIFT  2 //抬臂舵機(jī)
#define SERVOPINLEFT  3 //左臂舵機(jī)
#define SERVOPINRIGHT 4 //右臂舵機(jī)

// 速度  數(shù)字越小越慢,太快了容易抖 1000~2000
#define LIFTSPEED 1500

// 懸臂的長(zhǎng)度,根據(jù)圖紙測(cè)量,無(wú)需改變
#define L1 35
#define L2 57.2
#define L3 14.2

// 左右舵機(jī)軸心的位置,根據(jù)圖紙測(cè)量,無(wú)需改變
#define O1X 22
#define O1Y -25
#define O2X 47
#define O2Y -25

//需要的庫(kù)函數(shù)
#include <Servo.h>
#include <DS3231.h>
#include <Wire.h>

//時(shí)鐘模塊,如果沒(méi)有時(shí)鐘模塊,請(qǐng)用另一個(gè)程序
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();
  //第一次運(yùn)行 請(qǐng)?jiān)O(shè)置時(shí)間,設(shè)置成功后請(qǐng)刪除此行代碼,或者如下格式注釋掉
  Clock.setMinute(59);//設(shè)置分鐘
  Clock.setHour(11);  //設(shè)置小時(shí)
  //Clock.setMinute(59);  
  //Clock.setHour(11);
  //第一次運(yùn)行 請(qǐng)?jiān)O(shè)置時(shí)間,設(shè)置成功后請(qǐng)刪除此行代碼
   
  servo1.attach(SERVOPINLIFT);  //初始化抬臂舵機(jī)  lifting servo
  servo2.attach(SERVOPINLEFT);  //初始化左臂舵機(jī)  left servo
  servo3.attach(SERVOPINRIGHT); //初始化右臂舵機(jī)  right servo
  lift(1); //抬筆
  drawTo(rubberx, rubbery); //停留在筆擦位置
  delay(1000);

}

void loop()
{
int minute,hour;
minute=Clock.getMinute();
hour=Clock.getHour(h12, PM);//讀取時(shí)間
   
int i = 0;
  //下面代碼任選一行,進(jìn)行不同模式的書(shū)寫(xiě)
  if (last_min != minute())  //每分鐘書(shū)寫(xiě)一次時(shí)間
  //if  (1)                  //反復(fù)不間斷的擦寫(xiě)模式
   
//  if (1)  //如需修改請(qǐng)復(fù)制上面代碼
  {

    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
//這里是寫(xiě)字的函數(shù),如果你覺(jué)得字寫(xiě)的丑,可以自行修改字體,結(jié)果可能是更丑
//還可以自行增加其他內(nèi)容,比如字母甚至是漢字
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;

  }
}


//抬臂函數(shù),不同的擺臂高度
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));
}

//用各種三角函數(shù)把位置坐標(biāo)換算成舵機(jī)的角度,具體咋算的,請(qǐng)參考
//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庫(kù)求指點(diǎn)
232216vkukluuzybxymxfn.png
232220teew2r9ueuurss7j.png

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表