Skip to main content

Dùng mạch nạp USBasp để nạp code cho Arduino

Arduino có thể dễ dàng nạp code và chạy chương trình chỉ với thao tác đơn giản cắm board mạch vào máy tính chọn cổng COM và nhấn nút Upload. Để làm được như vậy, bên trong chip vi xử lý được nạp sẵn một đoạn mã lệnh gọi là boot loader. Boot loader luôn luôn được chạy lên đầu tiên, sau đó mới chuyển quyền điều khiển lại cho phần mã của người dùng nạp vào.

Arduino UNO, MEGA, NANO
 

Như vậy để các Chip Arduino có thể làm việc được với Arduino IDE thông qua giao tiếp USB-COM thì trong vi điều khiển phải được nạp sẵn boot loader. Các board mạch Arduino bán sẵn trên thị trường như Arduino Uno, Arduino Nano, Arduino Mega 2560,... đều được nạp sẵn boot loader. Như vậy ưu điểm của boot loader là để người dùng dễ dàng tiếp cận, thử nghiệm, và làm ra được sản phẩm nhanh chóng, dễ dàng. Nhưng nhược điểm là boot loader luôn luôn cần một khoảng thời gian từ 1.6s đến 2s để khởi động. Nếu bạn không muốn mất 1.6 - 2s đầu tiên mà muốn chương trình chạy gần như ngay lập tức khi cấp nguồn hoặc reset thì dùng mạch nạp USBasp để nạp code trực tiếp không thông qua boot loader. Ngoài ra mạch nạp USBasp có thể dùng để nạp boot loader cho những con chip chưa có boot loader hoặc là boot loader bị hỏng vì lý do nào đó.

Mạch nạp USBasp có giá vào khoảng 40k nhưng rất hữu ích có thể làm được nhiều thứ hay ho.

1. Driver cho mạch nạp USBasp

Mình dùng windows 10, vì vậy cần phải nạp WinUSB (v6.1.7600.16385) driver.

- Cắm USBasp vào máy tính, mở Device Manager sẽ thấy thiết bị USBasp chưa có driver như hình dưới

USBasp no driver

 - Tải zadig tại địa chỉ https://zadig.akeo.ie và chạy chương trình lên, chọn USBasp ở hộp chọn sổ xuống, chọn WinUSB (v6.1.7600.16385), cuối cùng click chọn Install Driver và chờ chương trình hoàn tất rồi đóng cửa sổ Zadig lại.

WinUSB driver for USBasp

- Lưu ý nếu bạn cài đặt không đúng driver, như trường hợp mình cài đặt libusb phiên bản mới nhất thì khi dùng Arduino IDE để nạp code thông qua USBasp sẽ nhận được thông báo lỗi như sau:

Arduino: 1.8.13 (Windows 10), Board: "Arduino Uno"
Sketch uses 924 bytes (2%) of program storage space. Maximum is 32256 bytes.
Global variables use 9 bytes (0%) of dynamic memory, leaving 2039 bytes for local variables. Maximum is 2048 bytes.
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: error: program enable: target doesn't answer. 0
avrdude: initialization failed, rc=-1
         Double check connections and try again, or use -F to override
         this check.
the selected serial port does not exist or your board is not connected
This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

Wrong driver for USBasp

- Để cài lại driver cho USBasp bạn cần phải xóa driver cũ trước. Để làm như vậy, vào device manager, nhớ cắm USBasp vào cổng usb sau đó right click vào USBasp, chọn Uninstall device. Ở cửa sổ hiện lên, tick chọn Delete the driver software for this device, và click và nút Uninstall.

Uninstall usb driver

- Ngoài ra có một lỗi khác với USBasp là thỉnh thoảng kết nối với máy tính bị lỗi và sẽ xuất hiện báo lỗi như sau khi nạp code cho arduino thông qua USBasp:

Sketch uses 924 bytes (2%) of program storage space. Maximum is 32256 bytes.
Global variables use 9 bytes (0%) of dynamic memory, leaving 2039 bytes for local variables. Maximum is 2048 bytes.
An error occurred while uploading the sketch
avrdude: error: could not find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp'

USBasp disconnected
 

Đối với tình trạng này, bạn hãy thử rút ra cắm lại USBasp và xem trong Device Manager có xuất hiện thiết bị không. Với các mạch chất lượng thấp, hãy kiểm tra các chân data chỗ đầu usb có được hàn cẩn thận vào vỉ mạch của USBasp không.

2. Kết nối USBasp với arduino

USBasp có jumper để chọn nguồn 3v3 hay 5v thì jumper này cần set ở mức 5v (lật USBasp qua mặt sau để xem chỗ nào là 5v chỗ nào là 3v3). Trong các hình dưới đây, jumper đang được đặt ở mức 5v.

Để tránh xung đột nguồn, không cùng lúc cắm USBasp và cổng USBA (cổng USB mà kết nối giữa board và PC)

Xem các hình dưới đây để biết cách kết nối USBasp với các board arduino uno, mega 2560, và nano.

USBasp - Arduino Mega 2560

 
USBasp - Arduino UNO DIP

 
 
USBasp - Arduino Nano
 

3. Nạp chương trình cho arduino thông qua USBasp

- Mở Arduino IDE, trong Tools > Board, chọn đúng board tương ứng.

- Không nạp code bằng nút Upload như thông thường mà thay vào đó hãy upload bằng cách vào menu Sketch > Upload Using Programmer hoặc dùng tổ hợp phím tắt là Ctrl + Shift + U.

Arduino upload using programmer

4. Nạp lại boot loader cho board arduino

Sau khi board được nạp code bằng cách sử dụng USBasp như trên, bạn không thể cắm board vào cổng usb máy tính để nạp code như ban đầu được nữa vì lúc này trong chip AVR đã không còn boot loader.

Để board arduino có thể nạp code lại bình thường bằng cổng USB-COM như ban đầu bạn cần phải nạp boot loader lại cho board mạch. Cách làm là vào Tools > Board chọn đúng board của bạn sau đó cũng trong menu Tools, chọn Burn Bootloader, chờ một chút để quá trình hoàn tất, sau đó bạn có thể rút giắc cắm ICSP ra ra và cắm board vào cổng usb máy tính và nạp code bằng cách như trước đây.

Lưu ý: Không cùng lúc cắm mạch nạp USBasp và  cổng USB-PC vì có thể gây ra xung đột ngồn.

Với một số board arduino nano cũ, Atmega328 (Old Bootloader) thì có thể chọn Tools > Processor là Atmega328 sau đó chọn Tools > Burn Bootloader để cập nhật boot loader. Việc cập nhật này sẽ giúp cho board chạy với boot loader mới nhất và tránh được lỗi như đề cập ở bài viết "Arduino Nano nạp code không được"

Cập nhật boot loader cho arduino nano



Comments

Popular posts from this blog

Arduino Nano nạp code không được

Tình trạng Khi bạn nạp code cho arduino nano, IDE sẽ hiển thị là Uploading... rất lâu sau đó báo lỗi: avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: s

STM32F103C8T6 lỗi không nạp được code

Tình trạng Sau khi nạp code lần đầu, STM32 ST-Link Utility sẽ không kết nối được nữa và hiện lên thông báo lỗi: Cannot connect to target! Please select "Connect Under Reset" mode from Target -> Settings menu and try again. If you are trying to connect to low frequency application, please select a lower SWD Frequency mode from Target -> Settings menu. Tình trạng này có thể xảy ra với tất cả các dòng F1 và cách khắc phục cũng tương tự nhau. Khắc phục 1. Trong STM32CubeMX cần phải chọn lại trong SYS > Debug là Serial Wire sau đó generate lại code. 2. Board arm kết nối ST-Link Utility không được, lúc đó hãy nhấn giữ nút Reset trên board rồi nhấn nút Connect trên ST-Link Utility, chờ khoảng 3-5 giây sau đó thả nút Reset. Có thể bạn sẽ phải làm vài lần như vậy mới có được 1 lần kết nối thành công. 3. Sau khi kết nối thành công, nạp code mới có config Debug là Serial Wire ở trên. Khi đó board sẽ kết nối bình thường cho các lần tiếp theo Mạch nạp ST-LINK có thể m