Hoodloader2 - Sức mạnh của 2 vi điều khiển trên một board mạch Arduino - USB Host với Arduino UNO / Mega2560

I. Giới thiệu

Đề nghị các bạn nhìn vào tên mình trước khi đọc bài nhé... đọc rồi đúng không nào? Mình nói trước, bài này là một bài hack não, và bạn nên có một người bạn cùng đam mê Arduino ở sát bên cạnh nhé. Mình sẽ không chịu trách nhiệm nếu bạn hành động như avatar của mình nhé devil.

Trước đây, bạn đã từng đặt câu hỏi, cái con Atmega16U2 trên mạch Arduino Uno / Mega2560 của mình làm nhiệm vụ gì chưa? Nếu bạn đã từng đọc bài giới thiệu về Arduino Uno hay Arduino Mega 2560 thì có thể sẽ biết con Atmega16U2 đó sẽ làm nhiệm vụ USB-to-Serial, hay nói cách khác là tạo cổng COM ảo từ đó lập trình cho con vi điều khiển Atmega328p (UNO) hoặc Atmega2560 (Mega 2560). Nhưng khi mình tra datasheet con Atmega16U2 thì thấy rằng, chúng ta đang có một sự lãng phí lớn (12KB flash, 512byte ram) nhưng chỉ nạp bootloader DFU để biến nó thành một mạch USB-to-Serial. Đem vấn đề này đi hỏi ksp, thì mình đã được khai sáng bằng một bootloader với cho con Atmega16U2 này, nó có tên là Hoodloader2 và nó sẽ giúp ta biến con Atmega16U2 này thành một mạch Arduino hoàn chỉnh! Nói cách khác, với Hoodloader2, ta có thể làm việc với 2 con vi điều khiển trên mạch Arduino Uno / Mega2560. HACK NÃO chưa nào?

Giải thích hình trên:

  • Atmega328 có firmware là Optiboot được kết nối với các phần như: 14 chân digital, 6 chân analog, 1 nút reset, led 13 và cổng SPI hardware ở cuối bord
  • Atmega16u2 có firmware là Hoodloader2 (tương thích với môi trường Arduino), đảm nhận giao tiếp với PC qua cổng USB, đảm nhận giao tiếp với Atmega328 qua cổng Serial hardware, có 7 chân digital với 3 chân được nối trong khối SPI hardware bên góc trên.

II. Hoodloader2 là gì?

Hoodloader2 là một bootloader với khả năng cho lập trình chính bản thân mình và hỗ trợ chức năng USB-to-Serial siêu nhanh (mức baudrate có thể lên tới 2 triệu). Với Hoodloader2, bạn có thể tái lập trình con Atmega16U2 của mình trên các mạch Arduino Uno R3 / Arduino Mega 2560 với một sketch Arduino bình thường heart. Bạn có thể sử dụng 7 chân digitlal của Atmega16U2 (trong đó có 1 chân hỗ trợ PWM) để lập trình với bộ nhớ flash lên tới 12KB và RAM tới 512 byte.

Với mình, như vậy là quá tuyệt vời. Với 12KB, 512 byte ram, là một môi trường rộng rãi để lập trình nhúng.

HACK NÃO

Với việc hỗ trợ chức năng USB-to-Serial, thì bạn có thể lập trình cho con này như là một mạch Arduino Leonardo. Nghĩa là bạn có thẻ biến con Arduino Mega 2560 / Uno R3 trở thành một con chuột, bàn phím hy tay cầm game play station với thư viện HID!

Điều đặc biệt nhất là từ nay bạn có thể lập trình cho 2 con vi điều khiển trên Arduino Mega 2560 hay con Arduino Uno R3 của mình. Thật tuyệt vời!

III. Burn hoodloader2 cho Atmega16U2

1. Yêu cầu trước khi bắt đầu

  • Bạn cần cài đặt bản Arduino IDE mới nhất, đó là bản Arduino IDE 1.6.7, có thể tìm và tải về tại mục Tải về ở góc trên màn hình. Vì sao phải cài như vậy? Theo như trang wiki thông cáo là Arduino IDE 1.6.6 trở lên hỗ trợ cập nhập các dòng ic có đuôi là u2 (atmega16u2).
  • Chuẩn bị 1 con Arduino Uno R3 hoặc Arduino Mega2560 Rút hết các dây cắm trên Arduino Uno R3 hoặc Mega 2560 của bạn.
  • Kiểm tra kỹ con vi điều khiển trên mạch Arduino của bạn là con nào? ATmega16U2 hay ATmega8U2 hay ATmega32u4 hay at90usb82 hay at90usb162. Bài viết phía dưới mình chỉ hướng dẫn cho ATmega16u2, các bạn dùng loại khác, vui lòng bình luận phía dưới mình sẽ cập nhập / hướng dẫn thêm, vì mình thấy ở Việt Nam chỉ dùng ATmega16U2 mà thôi, vì vậy mình không muốn HACK NÃO các bạn.
  • Cài Teensy Driver để nhận driver sau này.
  • Mua một chai nước để bình tĩnh và cảm nhận sự thú vị với 2 con vi điều khiển.

Cài đặt định nghĩa board Hoodloader cho Arduino IDE 1.6.4+

Bước 1

Mở Preferences của Arduino IDE lên.

Bước 2

Thêm đường dẫn sau vào mục Additional Boards Manager URLs rồi nhấn OK như hình.

https://raw.githubusercontent.com/NicoHood/HoodLoader2/master/package_NicoHood_HoodLoader2_index.json

Bước 3

Mở Boards Manager

Bước 4

Cài HoodLoader2

2. Đối với Arduino Uno R3

a. Nạp code để nạp bootloader cho ATmega16U2 từ Atmega328p

LƯU Ý

Khi nạp xong, nó báo Done uploading, các bạn gỡ dây USB nối với Arduino ra khỏi máy tính nhé.

b. Burn Bootloader2 cho Atmega16U2

Bạn phải rút dây USB nối với Arduino ra nhé!

Nối dây như hình

Con tụ 100nF có thể thay thế bởi các loại tụ cao có điện dung cao hơn (Có thể là tụ hóa hoặc tụ gốm), nó dùng để ngăn chặn việc tự động reset của board!

Chân 7, 8 các bạn không cần nối dây

Điện trở 100nF:
328/2560 RESET - GND

Pin connections:
328/2560 - 16u2
MOSI     - MOSI
MISO     - MISO
SCK      - SCK
PIN 10   - 16u2 RESET

Sau khi nối dây xong, Atmega328 sẽ tự động nạp Bootloader cho Atmega16u2 (tác giả NicoHood đã thiết kế như vậy).

Khi gắn dây USB vào Arduino, đèn 13 sẽ blink trong 10 giây với tốc độ chậm (delay 1000ms). Sau đó, atmega328 sẽ tiến hành nạp bootloader cho atmega16u2, lúc này đèn led 13 sẽ nháy nhanh hơn (mỗi 100ms). Bạn đợi tầm 30 giây sau khi nó bắt đầu nháy là ok, bạn đã nạp được Hoodloader2.

Tuy nhiên, nếu nó lại nháy chậm (blink) led 13 trong 10 giây rồi lại nháy thì quá trình burn bootloader đã không thành công! Hãy comment và quay video dưới mình bình luận quá trình làm để mình hướng dẫn thêm nhé.

Thường thì các bạn nạp không được là do dây breadboard bị đứt, nối dây sai!

3. Đối với Arduino Mega 2560

a. Nạp code để nạp bootloader cho ATmega16U2 từ Atmega1280

b. Burn Bootloader2 cho Atmega16U2

Các bạn thấy đấy, mạch này cũng không khác gì với Arduino Uno R3, vì vậy, kéo lên trên coi cách nối dây rồi thực hiện tương tự với mạch Arduino Uno R3 nhé.

4. Kiểm tra Hoodloader đã được nạp vào hay chưa?

Việt Nam dùng Windows là chủ yếu còn MAC / Linux ít dùng nên mình sẽ không hướng dẫn, các bạn nào dùng 2 hệ điều hành kia mà không biết thì hãy comment nhé!

Các bạn mở file Devices and Printers (vào phần tìm kiếm của windows và paste vào là được ngay) của Windows lên và sẽ thấy hoặc dán đường dẫn dưới vào File Explorer (My Computer cho các bạn nào không biết kiss).

Control Panel\Hardware and Sound\Devices and Printers

Thấy được cái HoodLoader2 là được heart

Một phát nữa là chắc ăn

IV. Nạp code blink trên Atmega16U2

Một khi bạn đã burn thành công HoodLoader2 lên con ATmega16u2 thì mạch Arduino Uno / Mega2560 của bạn sẽ có 2 con vi điều khiển (microcontroller unit - MCU), để thuận tiện, tác giả NicoHood đã gọi con MCU Atmega16U2Arduino USB MCU, MCU Atmega328p / MCU ATmega2560 là Arduino USB IO.

Trong phần này, mình sẽ hướng dẫn các bạn upload code blink lên cả 2 con MCU và hướng dẫn về cách sử dụng 7 pin của Arduino USB MCU.

1. Nạp code blink lên Arduino USB IO

Các bạn chọn board là HoodLoader2 Uno là được

Sau đó, nạp đoạn code blink như bình thường ở bài viết này.

2. Sơ đồ chân của con Arduino USB MCU

Sau đây là sơ đồ chân của mạch Arduino Uno R3 và Atmega16u2.

Hình trên Mega 2560 của con Atmega16u2 cũng tương tự hình này nhé.

Pinout của Atmega16u2 có nền màu vàng. 4 header màu trắng chưa được hàn, các bạn xem những hình dưới nhé.

Board Arduino Uno R3 lúc mới mua sẽ không hàn 4 chân header đó

Hàn header vào vị trí 4 lỗ có sẵn trên board

Như vậy, chúng ta có 7 chân digital được đánh số từ PB1 đến PB7. Sau này trong khi lập trình, chúng ta không cần ghi chữ PB ở trước, mà chỉ cần ghi 1, 2,..., 7 thì Arduino IDE sẽ tự hiểu là các chân đó.

3. Nạp code blink lên Arduino USB MCU

Mình sẽ làm một demo upload blink lên chân PB1.

Mình khoanh đỏ ý, bạn nhớ mắc một con LED và một con điện trở vào chân đó nhé.

Sau đó chọn board như hình dưới và tiến hành nạp code!

Đầu tiên, chọn "Hoodloader2 16u2"

Chọn loại board mà bạn nạp Hoodloader, nếu là Uno thì chọn như mình, còn mega thì chọn ô Hoodloader2 Mega

Nạp code

/*
  Blink - Nhấp nháy
  Đoạn code làm nhấp nháy một đèn LED cho trước
 */
 
// chân digital 1 cần được kết nối với đèn LED
// và chân digital 1 này sẽ được đặt tên là 'led'. Biến 'led' này có kiểu dữ liệu là int và có giá trị là 1
int led = 1;

// Hàm setup chạy một lần duy nhất khi khởi động chương trình
void setup() {                
  // đặt 'led' là OUTPUT
  pinMode(led, OUTPUT);    
}

// Hàm loop chạy mãi mãi sau khi kết thúc hàm setup()
void loop() {
  digitalWrite(led, HIGH);   // bật đèn led sáng
  delay(1000);               // dừng chương trình trong 1 giây => thây đèn sáng được 1 giây
  digitalWrite(led, LOW);    // tắt đèn led
  delay(1000);               // dừng chương trình trong 1 giây => thấy đèn tối được 1 giây
}

Và đây là kết quả

V. Serial bridge cho Arduino USB MCU

Mặc định khi gắm điện vô con Arduino Uno đã nạp Hoodloader2 cho Atmega16u2 và bạn đã nạp một sketch bất kỳ thì khi mở Serial monitor lên nó sẽ giao tiếp với con Arduino USB MCU, để giao tiếp Serial với con Arduino IO MCU từ máy tính thì bạn phải nạp code lại cho con Arduino IO MCU hoặc làm một chiếc cầu nối ở giữa như những gì mình sắp trình bày. Nhưng để thêm sôi động, mình sẽ kết hợp thêm một tí để con Arduino IO MCU gõ ra màn hình máy tính dòng chữ: "To thich HACK NAO moi nguoi <3 <3 <3".

Trước tiên, bạn hãy tải HID-project, thư viện để giả lập Arduino thành một thiết bị ngoại vi như chuột, bàn phím, tay cầm game,...

1. Upload lên Arduino IO MCU

char string[] = "To thich hack nao moi nguoi!";
void setup() {
  Serial.begin(115200); //Bật Serial monitor ở mức baudrate 115200
}

void loop() {
  for (int i = 0; i < strlen(string); i++) {
    Serial.write(string[i]);
    delay(200); //delay tí cho vui
  }
  while (1);// dừng luôn
}

Bật Serial Monitor lên thì bạn sẽ thấy nội dung sau:

2. Upload lên Arduino USB MCU

Để giao tiếp với máy tính, thì Atmega16u2 cần 1 cổng serial, để giao tiếp với Arduino IO MCU thì nó cũng cần một cổng Serial nữa. Như vậy Arduino USB MCU có 2 cổng Serial. Và thật may mắn, cả 2 cổng đó đều là hardware serial, nghĩa là bạn có thể làm rất nhiều thứ với hàng đợi buffer (128 byte) ở mỗi cổng!

#include "Keyboard.h"
#include "HID.h"

void setup() {
  //Giao tiếp với Arduino IO MCU
  Serial1.begin(115200);

  // Khởi động thư viện Keyboard
  Keyboard.begin(); //baudrate 57600, vì vậy bạn không thẻ dùng Serial ở mức baudrate 57600, vì nó đã được dùng để giao tiếp với máy tính!

  // Bật serial monitor (giao tiếp với máy tính) ở mức baudrate 1152000 để bạn debug thôi mà :3
  Serial.begin(115200);

}

void loop() {
  // đọc rồi xuất ra
  if (Serial1.available()) {
    char c = Serial1.read();
    Serial.print("USB: ");
    Serial.print(c);
    Serial.println();
    Keyboard.print(c);
  }
}

Không muốn quay video, muốn bạn tự thưởng với thành quả của mình bằng chai nước chuẩn bị lúc ban đầu!

VI. Đi xa hơn

Với việc sở hữu đến 2 cổng Serial, 1 cổng SPI, 7 chân digital (1 hỗ trợ PWM - PB7), chúng ta có thể làm rất nhiều thứ vui tươi. Sắp tới, mình sẽ viết một bài việc 2 mạch Arduino giao tiếp với nhau bằng Serial với 4 mạch NRF. Các bạn nên nhớ, giá của một mạch NRF rất rẻ cho 10k thôi, mà về Việt Nam bị các shop thổi lên đến 60 - 80k / mạch :3. Đúng kiểu BPhone!

VII. Cách nạp lại Hoodloader Uno nếu bị lỗi

Mình đã mò ra được rồi , cám ơn bạn . Mình xin chia sẻ là sau khi nạp xong chip 16u2 muốn nạp quay trở lại nạp 328 thì các bạn có thể sử dụng pin reset của 16u2 để đưa về bootloader mode để nạp như trước . Bạn có thể chặp chân reset và chân ground của nhóm 6 chân gần 16u2 2 lần liên tục thật nhanh để đưa về bootloader mode các bạn nhé .

Đóng góp của bạn leesontungggg

lên
24 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Bộ điều khiển PID - ứng dụng phần 2 - xe dò line dùng thuật toán PID

Tiép nối bài viết về xe dò line cảm ơn Đỗ Hữu Toàn đã viết hộ mình phần 4. hôm nay mình sẽ làm cho chiếc xe dò line đi mượt và có hồn hơn 

lên
34 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

File PDF cho dự án này

Bài viết của bạn rát tuyệt, mình thấy có yêu cầu chuyển file này sang PDF nên mình giúp bạn một tay smiley.

Bản PDF của dự án này các bạn có thể tải về tại đây.

http://k3.arduino.vn/img/2016/03/24/0/2251_812450-1458813451-0-arduinobox-cad7-model-1.pdf

lên
6 thành viên đã đánh giá bài viết này hữu ích.