MỤC LỤC LỜI NHẬN XÉT CỦA GIẢNG VIÊN i LỜI NÓI ĐẦU ii LỜI CÁM ƠN iii CHƯƠNG 1 GIỚI THIỆU ĐỀ TÀI 1 1 1 Lí do chọn đề tài 1 1 2 Giới thiệu sơ lược các linh kiện chính 2 1 2 1 Board mạch Arduino Uno R3 2.
MỤC LỤC LỜI NHẬN XÉT CỦA GIẢNG VIÊN i LỜI NÓI ĐẦU ii LỜI CÁM ƠN iii CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI 1.1 Lí chọn đề tài 1.2 Giới thiệu sơ lược linh kiện .2 1.2.1 Board mạch Arduino Uno R3 a Thông số kỹ thuật Arduino Uno R3 .2 b Vi điều khiển Arduino Uno R3 c Các chân lượng Arduino Uno R3 d Cổng vào/ Arduino Uno R3 e Giới thiệu phần mềm Arduino IDE .6 1.2.2 IC 74HC595 1.2.3 Transistor 2N2222 CHƯƠNG 2: THIẾT KẾ, LẬP TRÌNH VÀ LẮP ĐẶT .9 2.1 Linh kiện khối LED Cube 2.2 Sơ đồ nguyên lý mạch in 10 2.2.1 Sơ đồ nguyên lý 10 2.2.2 Mạch in 11 2.4 Hình ảnh thi cơng mạch 12 2.3 Lập trình cho mạch 16 KẾT LUẬN, TÀI LIỆU THAM KHẢO 33 LỜI NHẬN XÉT CỦA GIẢNG VIÊN LỜI NÓI ĐẦU -Ngày nay, lĩnh vực chiếu sáng quảng cáo, đèn LED đóng vai trị quan trọng, đáp ứng nhu cầu cho công ty, doanh nghiệp, hàng, LED dùng để chế tạo bảng quảng cáo, đơn giản, đại bắt mắt Những bảng thơng tin, bảng chào hay bảng quảng cáo với màu sắc rực rở, gây nhiều ý hẳn khơng cịn xa lạ người nữa, thành phố Hơn hẳn bảng quảng cáo LED đơn 2D thông thường, 3D công nghệ tiên tiến Thể hiệu ứng phức tạp, phong phú vô đẹp mắt Là thử thách thật muốn làm Khơng phức tạp hiệu ứng, mà cịn linh động nó, thây đổi hiệu ứng cách linh hoạt cho phù hợp với nhu cầu khách hàng Mơ hình LED cube 8x8x8 mơ tả đầy đủ tính Qua LED đơn mà ta phát triển thành khối LED với không gian chiều Được tạo 512 LED, tùy thuộc vào ý thích khả sáng tạo người mà chọn màu sắc LED khác Trong khuôn khổ đồ án môn học lần này, em tập trung nghiên cứu tiến hành thiết kế thi cơng mạch, để hồn thành mơ hình LED CUBE 3D LỜI CÁM ƠN -Đầu tiên, em xin gữi lời cám ơn chân thành đến Ban Giám Hiệu trường AAAAAA cho em môi trường học tập tốt, để em phát huy hết khả Em xin chân thành cám ơn Thầy/Cơ thuộc khoa Điện - Điện Tử tận tình dạy truyền đạt kiến thức qúy báu để em ứng dụng vào q trình hồn thành đồ án Em xin bầy tỏ lòng biết ơn sâu sắc đến thầy AAAAAAAA người tận tình hướng dẫn bảo em suất trình làm đồ án Khi em gặp khó khăn thầy nhiệt tình phân tích dẫn hướng giải cho em Em xin trọng cám ơn thầy Để hoàn thành đồ án có đống góp khơng nhỏ bạn Tơi xin gởi lời cảm ơn chân thành đến tất bạn Cuối không nhắc đến công lao người thân xung quanh giúp đỡ vật chất tinh thần để em hoàn thành đồ án cách thuận lợi CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI 1.1 Lý Do Chọn Đề Tài - Thiết thực, có tính ứng dụng cao, áp dụng kiến thức học Trong thời đại nay, ứng dụng vi điều khiển ngày nhiều phổ biến, rộng rãi nhiều nghành, lĩnh vực khác công nghiệp, nông nghiệp, y học… Một ứng dụng mà ta dễ dàng bắt gặp ngày hình thức thơng tin quảng cáo bảng led điện tử, quang báo Với thiết kế độc đáo lạ, sản phẩm khối LED 3D chắn làm bạn thích thú LED 3D có cấu trúc dạng khối chiều với nhiều kích thước khác giúp bạn truyền tải nội dung vơ phong phú mà bạn khó nói lời - Hiển thị hiệu ứng từ đơn giản đến phức tạp với nhiều kiểu phong phú, đẹp mắt - Có khả hiển thị chữ, hình ảnh theo dạng chiều chiều sinh động khác biệt so với cách thông thường - Có phần mềm mơ hỗ trợ tối đa người dùng thiết kế ý tưởng cho riêng - Có khả thay đổi nội dung theo yêu cầu Với ưu điểm trên, khối LED 3D thiết kế để làm quà tặng, lưu niệm, trang trí, quảng cáo Thích hợp đặt cửa hàng trang trí nội thất, quán Cafe, Karaoke tạo cảm giác lạ đẹp mắt Trong khn khổ đồ án này, em xin trình bày thiết kế mạch LED 3D kích thước 8x8x8 sử dụng vi điều khiển Arduino Uno 1.2 Giới Thiệu Sơ Lược Các Linh Kiện Chính 1.2.1 Board mạch Arduino Uno R3 a Thông số kỹ thuật Arduino Uno R3 Vi điều khiển Điện áp hoạt động ATmega328 họ 8bit 5V DC (chỉ cấp qua cổng USB) Tần số hoạt động 16 MHz Dòng tiêu thụ khoảng 30mA Điện áp vào khuyên dùng 7-12V DC Điện áp vào giới hạn 6-20V DC Số chân Digital I/O 14 (6 chân hardware PWM) Số chân Analog Dòng tối đa chân I/O (độ phân giải 10bit) Dòng tối đa (5V) 500 mA Dòng tối đa (3.3V) 50 mA 32 KB (ATmega328) với 0.5KB dùng bootloader Bộ nhớ flash 30 mA SRAM KB (ATmega328) EEPROM KB (ATmega328) b Vi điều khiển Arduino Uno R3 Arduino UNO sử dụng vi điều khiển họ 8bit AVR Atmega8, Atmega168, Atmega328 Chip xử lí tác vụ đơn giản điều khiển đèn LED nhấp nháy, xử lí tín hiệu cho xe điều khiển từ xa, làm trạm đo nhiệt độ độ ẩm hiển thị lên hình LCD,… Nguồn Arduino UNO cấp nguồn qua: Thơng qua cổng USB với mức điện áp 5v, nguồn với điện áp khuyên dùng 7-12V DC giới hạn 6-20V Thơng thường bạn sử dụng pin 9v để cấp nguồn cho Arduino c Các chân lượng Arduino Uno R3 GND (Ground): Cực âm nguồn điện cấp cho Arduino UNO Khi bạn dùng thiết bị sử dụng nguồn điện riêng biệt chân phải nối với 5V: Cấp điện áp 5V đầu Dòng tối đa cho phép chân 500mA 3.3V: Cấp điện áp 3.3V đầu Dòng tối đa cho phép chân 50mA Vin (Voltage Input): Để cấp nguồn cho Arduino UNO, bạn nối cực dương nguồn với chân cực âm nguồn với chân GND IO-REF: Điện áp hoạt động vi điều khiển Arduino UNO đo chân Và dĩ nhiên ln 5V Mặc dù bạn khơng lấy nguồn 5V từ chân để sử dụng chức khơng phải cấp nguồn RESET: Việc nhấn nút Reset board để reset vi điều khiển tương đương với việc chân RESET nối với GND qua điện trở 10KΩ Lưu ý: • Arduino UNO khơng có bảo vệ cắm ngược nguồn vào: Do bạn phải cẩn thận, kiểm tra cực âm – dương nguồn trước cấp cho Arduino UNO Việc làm chập mạch nguồn vào làm Arduino không sử dụng Trong thời gian đầu tìm hiểu tốt sử dụng nguồn cấp qua cổng USB • Các chân 3.3V 5V Arduino: Là chân dùng để cấp nguồn cho thiết bị khác, chân cấp nguồn vào Việc cấp nguồn sai vị trí làm hỏng board • Cấp nguồn: Khi cấp nguồn ngồi khơng qua cổng USB cho Arduino UNO với điện áp 6V làm hỏng board • Cấp điện áp: Khi cấp 13V vào chân RESET board làm hỏng vi điều khiển ATmega328 • Cường độ dòng điện vào/ra: Ở tất chân Digital Analog Arduino UNO vượt 200mA làm hỏng vi điều khiển • Cấp điệp áp : Trên 5.5V vào chân Digital Analog Arduino UNO làm hỏng vi điều khiển • Cường độ dòng điện: Qua chân Digital Analog Arduino UNO vượt 40mA làm hỏng vi điều khiển Do khơng dùng để truyền nhận liệu, bạn phải mắc điện trở hạn dòng Vi điều khiển Atmega328 tiêu chuẩn cung cấp cho người dùng: • 32KB nhớ Flash: Những đoạn lệnh bạn lập trình lưu trữ nhớ Flash vi điều khiển Sẽ có khoảng vài KB số dùng cho bootloader thường phải sử dụng q 20kb nhớ • 2KB cho SRAM (Static Random Access Memory): Giá trị biến bạn khai báo lập trình lưu Bạn khai báo nhiều biến cần nhiều nhớ RAM Tuy vậy, thực nhớ RAM lại trở thành thứ mà bạn phải bận tâm Chú ý: điện, liệu SRAM bị • 1KB cho EEPROM (Electrically Eraseble Programmable Read Only Memory): Tương tự ổ cứng mini – nơi đọc ghi liệu vào mà lo bị mất điện giống liệu SRAM d Cổng vào/ra Arduino Uno R3 Arduino UNO có 14 chân digital dùng để đọc xuất tín hiệu Chúng có mức điện áp 0V 5V với dòng vào/ra tối đa chân 40mA Ở chân có điện trở pull-up từ cài đặt vi điều khiển ATmega328 (mặc định điện trở khơng kết nối) Một số chân digital có chức đặc biệt sau: • chân Serial: (RX) (TX) dùng để gửi (transmit – TX) nhận (receive – RX) liệu TTL Serial Arduino Uno giao tiếp với thiết bị khác thông qua chân Kết nối bluetooth thường thấy kết nối Serial khơng dây Nếu khơng cần giao tiếp Serial, bạn không nên sử dụng Chân khơng cần thiết • Chân PWM (~): 3, 5, 6, 9, 10, 11 cho phép bạn xuất xung PWM với độphân giải 8bit (giá trị từ → 28-1 tương ứng với 0V → 5V) hàm analogWrite() Nói cách đơn giản, bạn điều chỉnh điện áp chân từ mức 0V đến 5V thay cố định mức 0V 5V nhưnhững chân khác • Chân giao tiếp SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK) Ngồi chức thơng thường, chân dùng để truyền phát liệu giao thức SPI với thiết bị khác • LED 13: Trên Arduino UNO có đèn led màu cam (kí hiệu chữ L) Khi bấm nút Reset, bạn thấy đèn nhấp nháy để báo hiệu Nó nối với chân số 13 Khi chân người dùng sử dụng, LED sáng • chân analog (A0 → A5): Cung cấp độ phân giải tín hiệu 10bit (0 → 2101) để đọc giá trị điện áp khoảng 0V → 5V • Chân AREF: Để đưa vào điện áp tham chiếu sử dụng chân analog Tức bạn cấp điện áp 2.5V vào chân bạn dùng chân analog để đo điện áp khoảng từ 0V → 2.5V với độ phân giải 10bit • chân A4 (SDA) A5 (SCL): Hỗ trợ giao tiếp I2C/TWI với thiết bị khác } void rain() { if (loading) { clearCube(); loading = false; } timer++; if (timer > RAIN_TIME) { timer = 0; shift(NEG_Y); uint8_t numDrops = random(0, 5); for (uint8_t i = 0; i < numDrops; i++) { setVoxel(random(0, 8), 7, random(0, 8)); } } } uint8_t planePosition = 0; uint8_t planeDirection = 0; bool looped = false; void planeBoing() { if (loading) { clearCube(); uint8_t axis = random(0, 3); planePosition = random(0, 2) * 7; setPlane(axis, planePosition); if (axis == XAXIS) { if (planePosition == 0) { planeDirection = POS_X; } else { planeDirection = NEG_X; } } else if (axis == YAXIS) { if (planePosition == 0) { planeDirection = POS_Y; } else { planeDirection = NEG_Y; } } else if (axis == ZAXIS) { if (planePosition == 0) { planeDirection = POS_Z; } else { planeDirection = NEG_Z; } } timer = 0; looped = false; loading = false; } timer++; if (timer > PLANE_BOING_TIME) { timer = 0; shift(planeDirection); if (planeDirection % == 0) { planePosition++; if (planePosition == 7) { if (looped) { loading = true; } else { planeDirection++; looped = true; } } } else { planePosition ; if (planePosition == 0) { if (looped) { loading = true; } else { planeDirection ; looped = true; } } } } } uint8_t selX = 0; uint8_t selY = 0; uint8_t selZ = 0; uint8_t sendDirection = 0; bool sending = false; void sendVoxels() { if (loading) { clearCube(); for (uint8_t x = 0; x < 8; x++) { for (uint8_t z = 0; z < 8; z++) { setVoxel(x, random(0, 2) * 7, z); } } loading = false; } timer++; if (timer > SEND_VOXELS_TIME) { timer = 0; if (!sending) { selX = random(0, 8); selZ = random(0, 8); if (getVoxel(selX, 0, selZ)) { selY = 0; sendDirection = POS_Y; } else if (getVoxel(selX, 7, selZ)) { selY = 7; sendDirection = NEG_Y; } sending = true; } else { if (sendDirection == POS_Y) { selY++; setVoxel(selX, selY, selZ); clearVoxel(selX, selY - 1, selZ); if (selY == 7) { sending = false; } } else { selY ; setVoxel(selX, selY, selZ); clearVoxel(selX, selY + 1, selZ); if (selY == 0) { sending = false; } } } } } uint8_t cubeSize = 0; bool cubeExpanding = true; void woopWoop() { if (loading) { clearCube(); cubeSize = 2; cubeExpanding = true; loading = false; } timer++; if (timer > WOOP_WOOP_TIME) { timer = 0; if (cubeExpanding) { cubeSize += 2; if (cubeSize == 8) { cubeExpanding = false; } } else { cubeSize -= 2; if (cubeSize == 2) { cubeExpanding = true; } } clearCube(); drawCube(4 - cubeSize / 2, - cubeSize / 2, - cubeSize / 2, cubeSize); } } uint8_t xPos; uint8_t yPos; uint8_t zPos; void cubeJump() { if (loading) { clearCube(); xPos = random(0, 2) * 7; yPos = random(0, 2) * 7; zPos = random(0, 2) * 7; cubeSize = 8; cubeExpanding = false; loading = false; } timer++; if (timer > CUBE_JUMP_TIME) { timer = 0; clearCube(); if (xPos == && yPos == && zPos == 0) { drawCube(xPos, yPos, zPos, cubeSize); } else if (xPos == && yPos == && zPos == 7) { drawCube(xPos + - cubeSize, yPos + - cubeSize, zPos + - cubeSize, cubeSize); } else if (xPos == && yPos == && zPos == 0) { drawCube(xPos + - cubeSize, yPos, zPos, cubeSize); } else if (xPos == && yPos == && zPos == 0) { drawCube(xPos, yPos + - cubeSize, zPos, cubeSize); } else if (xPos == && yPos == && zPos == 7) { drawCube(xPos, yPos, zPos + - cubeSize, cubeSize); } else if (xPos == && yPos == && zPos == 0) { drawCube(xPos + - cubeSize, yPos + - cubeSize, zPos, cubeSize); } else if (xPos == && yPos == && zPos == 7) { drawCube(xPos, yPos + - cubeSize, zPos + - cubeSize, cubeSize); } else if (xPos == && yPos == && zPos == 7) { drawCube(xPos + - cubeSize, yPos, zPos + - cubeSize, cubeSize); } if (cubeExpanding) { cubeSize++; if (cubeSize == 8) { cubeExpanding = false; xPos = random(0, 2) * 7; yPos = random(0, 2) * 7; zPos = random(0, 2) * 7; } } else { cubeSize ; if (cubeSize == 1) { cubeExpanding = true; } } } } bool glowing; uint16_t glowCount = 0; void glow() { if (loading) { clearCube(); glowCount = 0; glowing = true; loading = false; } timer++; if (timer > GLOW_TIME) { timer = 0; if (glowing) { if (glowCount < 448) { { selX = random(0, 8); selY = random(0, 8); selZ = random(0, 8); } while (getVoxel(selX, selY, selZ)); setVoxel(selX, selY, selZ); glowCount++; } else if (glowCount < 512) { lightCube(); glowCount++; } else { glowing = false; glowCount = 0; } } else { if (glowCount < 448) { { selX = random(0, 8); selY = random(0, 8); selZ = random(0, 8); } while (!getVoxel(selX, selY, selZ)); clearVoxel(selX, selY, selZ); glowCount++; } else { clearCube(); glowing = true; glowCount = 0; } } } } uint8_t charCounter = 0; uint8_t charPosition = 0; void text(char string[], uint8_t len) { if (loading) { clearCube(); charPosition = -1; charCounter = 0; loading = false; } timer++; if (timer > TEXT_TIME) { timer = 0; shift(NEG_Z); charPosition++; if (charPosition == 7) { charCounter++; if (charCounter > len - 1) { charCounter = 0; } charPosition = 0; } if (charPosition == 0) { for (uint8_t i = 0; i < 8; i++) { cube[i][0] = characters[string[charCounter] - '0'][i]; } } } } void lit() { if (loading) { clearCube(); for(uint8_t i=0; i