(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
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ồ
Ở 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ố
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 15short 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: