ĐĂNG KÍ NHẬN TIN TỰ ĐỘNG

Nhập địa chỉ E-mail vào ô phía trên để nhận tin mới liên tục từ Tự Tay Làm

Làm đồng hồ số với mạch Arduino và giấy PaperCraft

Đăng lúc: Chủ nhật - 13/10/2013 09:30 - Người đăng bài viết: Ban Biên Tập
Chia sẻ lên Facebook Chia sẻ lên Twitter Chia sẻ lên Yahoo Chia sẻ lên Zing Me Chia sẻ lên Yume Chia sẻ lên Link hay Chia sẻ lên Google+
mach arduino dong ho

mach arduino dong ho

(Sản phẩm sáng tạo) – Chiếc đồng hồ số trong thiết kế này rất ấn tượng, hoạt động rất nhẹ nhàng. Thay vì sử dụng đèn LED, chiếc đồng hồ số có rất nhiều phân khúc sử dụng hệ thống gồm 28 servo (một hệ thống để kiểm soát dụng cụ cơ khí phù hợp với biến đổi vị trí hoặc tốc độ mục tiêu giá trị) và mạch Arduino điều khiển động cơ hoạt động theo thời gian hiện tại.
Các bước thực hiện:
Bước 1: Chuẩn bị các vật liệu
đồng hồ số và mạch arduino




Ngoài hai vật liệu chính cần chuẩn bị là mạch Arduino Uno và các động cơ điều khiển (có thể thay thế bằng mạch cho phép điều khiển lên đến 64 servo). Bạn cần chuẩn bị:
*Dụng cụ điện:
-Mạch Arduino Uno
-DS1307 hoặc RTC
-Điều khiển động cơ servo
-Servo quay 180 độ.
*Các dụng cụ khác:
-Cardstock
-Ống nhôm để trượt nhẹ nhàng hơn
-Keo dán hai mặt.
-Băng dính.
-Giấy PaperCraft

Bước 2: Kiểm tra các linh kiện điện tử

Kết nối SSC-32 với mạch Arduino Uno.


Mạch đã được gắn pin Lithium nhỏ hay chưa (một dạng pin dùng cho máy tính hoặc điện thoại).

Bước 3: Thiết kế đồng hồ và cắt giấy ra từng bộ phận





Các phần của đồng hồ được thiết kế trên phần mềm Adobe Illustrator, nếu sử dụng máy cắt giấy thì bạn cắt nó ra thành 6 lớp. Nếu sử dụng máy in 3D thì bạn cần sử dụng phương pháp khác đồng hồ, nhưng về cơ bản là giống nhau.
Bạn có thể tải mẫu đồng hồ đã được thiết kế sẵn tại  đây.
Bước 4: Tạo đồng hồ
tạo đồng hồ số với mạch arduino


Ở bước này, bạn tiến hành đặt các lớp chồng lên nhau và dán chúng lại với nhau bằng keo hai mặt. Lưu ý, từng khúc của ống nhôm được đưa vào đúng vị trí.

Bước 5: Chèn các kí tự số




tao đồng hồ số mạch arduino

Bước 6: Gắn hệ thống servo





Gắn các servo vào đồng hồ và đảm bảo rằng chúng được cố định, có thể sử dụng keo nếu cần.

Bước 7: Gắn dây lên mạch Arduino





*Bộ điều khiển servo:
-Có 32 chân trên SSC-32 controller, cắm 28 servo chắc chắn và theo thứ tự.
-Kết nối chân RX với chân TX trên Arduino
-Kết nối chân ground đến chân Arduino Ground
*RTC [DS1307]
-Kết nối 5V đến Arduino 5V
Kết nối GND đến Arduino GND
Kết nối SDA đến Arduino analog chân 4.
Kết nối SCL đến Arduino analog chân 5.
Bước 8: Lập trình
Thuật toán:
-Vòng chính: lấy thời gian từ module RTC. Nếu thời gian khác với Display Time thì lặp lại.
-Thời gian hiển thị (Display Time)
-Số hiển thị (Display Digit)
Ví dụ:

#include
#include "RTClib.h"

RTC_DS1307 RTC;

short segA = 0; //Display pin 14
short segB = 1; //Display pin 16
short segC = 2; //Display pin 13
short segD = 3; //Display pin 3
short segE = 4; //Display pin 5
short segF = 5; //Display pin 11
short segG = 6; //Display pin 15

short segA_OUT = 110;
short segB_OUT = 110;
short segC_OUT = 110;
short segD_OUT = 110;
short segE_OUT = 110;
short segF_OUT = 110;
short segG_OUT = 110;

short segA_IN = 90;
short segB_IN = 90;
short segC_IN = 90;
short segD_IN = 90;
short segE_IN = 90;
short segF_IN = 90;
short segG_IN = 90;

int TIME = 2000;

DateTime datePast;
DateTime dateNow;

//house keeping
void setup() {
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  RTC.adjust(DateTime(__DATE__, __TIME__));
  datePast = RTC.now();
}

//main loop
void loop() {
  dateNow = RTC.now();
  if(!(datePast.hour() == dateNow.hour() && datePast.minute() == dateNow.hour() ))
  {
    displayNumber(dateNow.hour()*100+dateNow.minute());
    datePast = dateNow;
  }
}

//Given a number, we display 10:22
//After running through the 4 numbers, the display is left turned off
void displayNumber(int toDisplay) {
  for(int digit = 4 ; digit > 0 ; digit--) {
    lightNumber(toDisplay % 10, digit);
    toDisplay /= 10;
  }

  //start movement
  Serial.print(" T");Serial.println(TIME);
}

void move(int servo, int position) {
  Serial.print("#");
  Serial.print(servo);
  Serial.print(" P");
  Serial.print(position);
}

//Given a number, turns on those segments
//If number == 10, then turn off number
void lightNumber(int numberToDisplay, int segment) {

  int offset = (segment - 1)*7;
  switch (numberToDisplay){

  case 0:
    move(segA + offset, segA_OUT);
    move(segB + offset , segB_OUT);
    move(segC + offset , segC_OUT);
    move(segD + offset , segD_OUT);
    move(segE + offset , segE_OUT);
    move(segF + offset , segF_OUT);
    move(segG + offset , segG_IN);
    break;

  case 1:
    move(segA + offset , segA_IN);
    move(segB + offset , segB_OUT);
    move(segC + offset , segC_OUT);
    move(segD + offset , segD_IN);
    move(segE + offset , segE_IN);
    move(segF + offset , segF_IN);
    move(segG + offset , segG_IN);
    break;

  case 2:
    move(segA + offset , segA_OUT);
    move(segB + offset , segB_OUT);
    move(segC + offset , segC_IN);
    move(segD + offset , segD_OUT);
    move(segE + offset , segE_OUT);
    move(segF + offset , segF_IN);
    move(segG + offset , segG_OUT);
    break;

  case 3:
    move(segA + offset , segA_OUT);
    move(segB + offset , segB_OUT);
    move(segC + offset , segC_OUT);
    move(segD + offset , segD_OUT);
    move(segE + offset , segE_IN);
    move(segF + offset , segF_IN);
    move(segG + offset , segG_OUT);
    break;

  case 4:
    move(segA + offset , segA_IN);
    move(segB + offset , segB_OUT);
    move(segC + offset , segC_OUT);
    move(segD + offset , segD_IN);
    move(segE + offset , segE_IN);
    move(segF + offset , segF_OUT);
    move(segG + offset , segG_OUT);
    break;

  case 5:
    move(segA + offset , segA_OUT);
    move(segB + offset , segB_IN);
    move(segC + offset , segC_OUT);
    move(segD + offset , segD_OUT);
    move(segE + offset , segE_IN);
    move(segF + offset , segF_OUT);
    move(segG + offset , segG_OUT);
    break;

  case 6:
    move(segA + offset , segA_OUT);
    move(segB + offset , segB_IN);
    move(segC + offset , segC_OUT);
    move(segD + offset , segD_OUT);
    move(segE + offset , segE_OUT);
    move(segF + offset , segF_OUT);
    move(segG + offset , segG_OUT);
    break;

  case 7:
    move(segA + offset , segA_OUT);
    move(segB + offset , segB_OUT);
    move(segC + offset , segC_OUT);
    move(segD + offset , segD_IN);
    move(segE + offset , segE_IN);
    move(segF + offset , segF_IN);
    move(segG + offset , segG_IN);
    break;

  case 8:
    move(segA + offset , segA_OUT);
    move(segB + offset , segB_OUT);
    move(segC + offset , segC_OUT);
    move(segD + offset , segD_OUT);
    move(segE + offset , segE_OUT);
    move(segF + offset , segF_OUT);
    move(segG + offset , segG_OUT);
    break;

  case 9:
    move(segA + offset , segA_OUT);
    move(segB + offset , segB_OUT);
    move(segC + offset , segC_OUT);
    move(segD + offset , segD_OUT);
    move(segE + offset , segE_IN);
    move(segF + offset , segF_OUT);
    move(segG + offset , segG_OUT);
    break;

  case 10:
    move(segA + offset , segA_IN);
    move(segB + offset , segB_IN);
    move(segC + offset , segC_IN);
    move(segD + offset , segD_IN);
    move(segE + offset , segE_IN);
    move(segF + offset , segF_IN);
    move(segG + offset , segG_IN);
    break;
  }
}

Bạn có thể chạy thư viện RTC từ đoạn code sau:

#include
#include "RTClib.h"

RTC_DS1307 RTC;

void setup () {
    Serial.begin(57600);

    Wire.begin();

    RTC.begin();
  
    if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    RTC.adjust(DateTime(__DATE__, __TIME__));
    }
}

Đây chính là sản phẩm:

 
Tác giả bài viết: Bùi Thanh Liêm
Nguồn tin: evntel.com
Đánh giá bài viết
Tổng số điểm của bài viết là: 9 trong 2 đánh giá
Click để đánh giá bài viết
 

Thăm dò ý kiến

Tham khảo ý kiến về website Sản phẩm tự chế

Không nên mở thêm website này.

Ý tưởng tốt, tôi thích website này.

Giao diện website đẹp, dễ tương tác.

Giao diện website màu mè, dễ bị phân tán.