Tôi không thể tải bản phác thảo lên Arduino Uno của mình.
- Tôi đã "gạch" nó?
- Những bước tôi có thể thực hiện để tìm ra những gì sai?
- Tôi có thể làm gì để khắc phục nó?
Tôi không thể tải bản phác thảo lên Arduino Uno của mình.
Câu trả lời:
Tôi đã có khá nhiều Arduinos, và trong vài năm qua chỉ có một "cục gạch", và tôi nghĩ đó là bằng cách hạ gục nó bằng tĩnh điện. Thật không may, một thiết bị đặc biệt có chip xử lý SM (gắn trên bề mặt), vì vậy không dễ để thử đổi nó với chip khác.
Giữ bình tĩnh và thử các bước sau ...
"Arduino Uno" không chỉ là một thứ có thể thất bại. Nó có nhiều thành phần chính, và có thể chỉ có một thành phần bị lỗi (nếu có). Xem ảnh tham khảo này:
Các thành phần chính là:
Lưu ý rằng đèn LED Rx và Tx không được kết nối trực tiếp với chân kỹ thuật số 0 và 1 trên bảng (được đánh dấu Rx và Tx). Chúng chỉ sáng nếu bạn đang thực hiện liên lạc nối tiếp qua USB , chứ không phải nếu bạn có thứ gì đó (như GPS) cắm trực tiếp vào chân kỹ thuật số 0 và 1.
Cũng lưu ý rằng vì đèn LED "L" được kết nối qua op-amp, nó có thể phát sáng nếu chân 13 được đặt thành đầu vào trong bản phác thảo của bạn. Điều này là bình thường. Điều đó không có nghĩa là một cái gì đó đang gửi dữ liệu sai.
Cắm bảng vào máy tính của bạn bằng cáp USB và kiểm tra xem đèn LED "Bật" màu xanh lá cây có sáng lên không.
Sử dụng đồng hồ vạn năng và một vài bước nhảy để kiểm tra giữa chân 5V và chân GND (mũi tên ở phía dưới). Bạn sẽ nhận được khoảng 5.0 V (tôi có 5.04 V trên máy của tôi).
(Bạn có thể mua đồng hồ vạn năng giá rẻ với giá khoảng 10 đô la nếu bạn không có, nhưng tốt hơn hết là bạn nên mua một chiếc tốt hơn với giá khoảng 50 đô la - kiểm tra tất cả các trang web và cửa hàng điện tử.)
Nếu bạn không cắm 5 V với cáp USB được cắm, hãy đảm bảo đầu kia được kết nối với máy tính của bạn. Cũng thử một loại cáp khác.
Nếu bạn đang sử dụng hoặc dự định sử dụng, giắc cắm nguồn (được đánh dấu "cấp nguồn" trên ảnh) sẽ ngắt kết nối USB và cắm nguồn điện - phải là 7 đến 12 V DC với cực dương ở chân giữa .
Đo các chân 5 V và 3,3 V như trên. Bạn vẫn sẽ thấy các điện áp tương tự trên chúng.
Nếu bạn nhận được 5 V với USB được kết nối, nhưng không có nguồn điện thì bộ điều chỉnh điện áp (được đánh dấu trên ảnh) có thể bị hỏng. Hoặc, có thể việc cung cấp điện đã thất bại. Hãy thử một nguồn cung cấp năng lượng khác nhau để xác nhận đó là.
Nếu bạn có bộ tải khởi động Optiboot (Uno thường đi cùng với nó) thì nếu bạn nhấn và nhả nút Reset, hoặc rút phích cắm và cắm lại USB hoặc cáp nguồn, đèn LED "L" sẽ nháy nhanh 3 lần. Thời gian "bật" và "tắt" là 50 ms mỗi lần, ba lần nhấp nháy sẽ kết thúc trong khoảng 1/3 giây.
Nếu không, bạn có thể gặp sự cố với bộ nạp khởi động hoặc chip xử lý chính (Atmega328P).
Quan trọng: Nếu bạn gặp sự cố khi tải lên bản phác thảo, hãy xóa mọi thiết bị được kết nối (như tấm khiên). Cũng loại bỏ dây nhảy cắm vào ổ cắm bảng. Cụ thể, không nên cắm bất cứ thứ gì vào chân kỹ thuật số 0 và 1 (Rx và Tx) vì điều đó sẽ cản trở việc giao tiếp với máy tính đang tải lên.
Chọn một trong những bản phác thảo ví dụ đơn giản (ví dụ: Blink) và thử tải nó lên. Đây là những gì bạn sẽ thấy:
Đèn LED "L" sẽ nhấp nháy 3 lần. Điều này là do chip chính đang được thiết lập lại bằng lệnh từ quá trình tải lên.
Đèn LED "Rx" sẽ nhấp nháy nhanh. Đây là hướng dẫn từ quá trình tải lên cố gắng kích hoạt bộ nạp khởi động.
Đèn LED "Tx" sẽ nhấp nháy nhanh. Đây là bộ xử lý thừa nhận dữ liệu đã tải lên.
Bạn có thể thấy ở trên, ngay cả khi quá trình tải lên không thành công. Điều này có thể là do loại bảng sai được chọn.
Nếu chỉ đèn LED "Rx" nhấp nháy, có thể là do sự cố với bộ tải khởi động hoặc chip xử lý chính (Atmega328P). Có người đang gõ cửa, nhưng không có ai ở nhà!
Nếu đèn LED nhấp nháy, nhưng bạn nhận được một thông báo như thế này:
avrdude: stk500_recv(): programmer is not responding
Kiểm tra loại bảng:
Nếu bạn chọn loại bảng sai, nó có thể sẽ gửi hướng dẫn tải lên sai và hết thời gian hoặc không thành công. Nếu bạn giống như tôi và có các bảng khác nhau nằm xung quanh thì thật dễ quên rằng lần tải lên cuối cùng bạn đã làm là cho một loại bảng khác.
Nếu đèn LED hoàn toàn không nhấp nháy, bạn có thể đã chọn cổng comm sai.
Kiểm tra cổng comm:
Hãy thử Arduino của bạn trên PC / Mac khác nếu bạn có một tay. Điều này có thể thu hẹp xem bạn có gặp sự cố với máy tính cụ thể mà bạn đã cắm hay máy tính nói chung hay không.
Đấu dây:
Nếu mọi thứ được lặp lại: Điều đó xác nhận bạn có cổng comm đúng, cáp USB vẫn ổn và chip giao diện USB (Atmega16U2) có thể ổn.
Nếu không có gì được lặp lại, kiểm tra:
Nếu bo mạch của bạn không thực hiện kiểm tra vòng lặp ngược lại và bạn chắc chắn rằng cáp USB vẫn ổn, thì bạn có thể tự kiểm tra chip Atmega16U2. Có một tiêu đề ICSP (Lập trình nối tiếp mạch) trên bo mạch, liền kề với chip Atmega16U2 và gần ổ cắm USB.
Ngắt kết nối nguồn trước (rút cáp USB và bất kỳ cáp nguồn nào).
Sau đó, bạn có thể kết nối tiêu đề ICSP thông qua 6 dây nhảy với một Uno tốt đã biết, như trong ảnh:
Pin-outs cho tiêu đề ICSP là (từ trên cùng):
Chân 1 trên tiêu đề ICSP gần chip Atmega16U2 được đánh dấu bằng một chấm trắng nhỏ, gần chữ "F" trong "ISF". Chân 1 trên tiêu đề ICSP gần chip ATmega328P được đánh dấu bằng một chấm trắng nhỏ, bên dưới chữ "N" trong "BẬT".
Kết nối:
Good board Target Uno
MISO MISO (pin with dot - pin 1)
VCC VCC
SCK SCK
MOSI MOSI
D10 /RESET
GND GND
Kiểm tra lại hệ thống dây điện của bạn.
Sau đó, trên bảng "được biết đến" cài đặt bản phác thảo "Atmega_Board_Detector" như được mô tả trên trang lập trình bộ tải khởi động Atmega . Mã này có tại GitHub - nickgammon / arduino_sketches . Nếu bạn nhấp vào nút Tải xuống trên trang đó, bạn sẽ nhận được một số bản phác thảo hữu ích. Người bạn muốn được gọi là "Atmega_Board_Detector".
Sau khi cài đặt, hãy mở màn hình nối tiếp, đặt thành 115200 baud và bạn sẽ thấy một cái gì đó như thế này:
Atmega chip detector.
Written by Nick Gammon.
Version 1.17
Compiled on Jul 9 2015 at 08:36:24 with Arduino IDE 10604.
Attempting to enter ICSP programming mode ...
Entered programming mode OK.
Signature = 0x1E 0x94 0x89
Processor = ATmega16U2
Flash memory size = 16384 bytes.
LFuse = 0xEF
HFuse = 0xD9
EFuse = 0xF4
Lock byte = 0xCF
Clock calibration = 0x51
Bootloader in use: No
EEPROM preserved through erase: No
Watchdog timer always on: No
Bootloader is 4096 bytes starting at 3000
Bootloader:
3000: 0x4B 0xC0 0x00 0x00 0x64 0xC0 0x00 0x00 0x62 0xC0 0x00 0x00 0x60 0xC0 0x00 0x00
3010: 0x5E 0xC0 0x00 0x00 0x5C 0xC0 0x00 0x00 0x5A 0xC0 0x00 0x00 0x58 0xC0 0x00 0x00
3020: 0x56 0xC0 0x00 0x00 0x54 0xC0 0x00 0x00 0x52 0xC0 0x00 0x00 0xEE 0xC4 0x00 0x00
...
3FE0: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
3FF0: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
MD5 sum of bootloader = 0xD8 0x8C 0x70 0x6D 0xFE 0x1F 0xDC 0x38 0x82 0x1E 0xCE 0xAE 0x23 0xB2 0xE6 0xE7
Bootloader name: Arduino-dfu-usbserial-atmega16u2-Uno-Rev3
First 256 bytes of program memory:
0: 0x90 0xC0 0x00 0x00 0xA9 0xC0 0x00 0x00 0xA7 0xC0 0x00 0x00 0xA5 0xC0 0x00 0x00
10: 0xA3 0xC0 0x00 0x00 0xA1 0xC0 0x00 0x00 0x9F 0xC0 0x00 0x00 0x9D 0xC0 0x00 0x00
20: 0x9B 0xC0 0x00 0x00 0x99 0xC0 0x00 0x00 0x97 0xC0 0x00 0x00 0x48 0xC4 0x00 0x00
30: 0x0C 0xC4 0x00 0x00 0x91 0xC0 0x00 0x00 0x8F 0xC0 0x00 0x00 0x8D 0xC0 0x00 0x00
...
Tuy nhiên nếu bạn nhận được một tin nhắn như thế này:
"Failed to enter programming mode. Double-check wiring!"
Điều đó sẽ xuất hiện để chỉ ra rằng ATmega16U2 của bạn không hoạt động.
Ngắt kết nối nguồn từ Arduino Uno "đã biết" và tua lại bộ nhảy ICSP theo ảnh này, để kết nối chúng với bộ xử lý "chính" trên Uno của bạn:
Pin-outs cho tiêu đề ICSP là (từ trên cùng):
Chân 1 trên tiêu đề ICSP gần chip ATmega328P được đánh dấu bằng một chấm trắng nhỏ, bên dưới chữ "N" trong "BẬT".
Hệ thống dây vẫn giống như trước đây, ngoại trừ bạn đang kết nối với tiêu đề ICSP khác - cái ở cuối bảng, xa nhất từ ổ cắm USB.
Good board Target Uno
MISO MISO (pin with dot - pin 1)
VCC VCC
SCK SCK
MOSI MOSI
D10 /RESET
GND GND
Sau khi kết nối, hãy mở màn hình nối tiếp, đặt thành 115200 baud và bạn sẽ thấy một cái gì đó như thế này:
Atmega chip detector.
Written by Nick Gammon.
Version 1.17
Compiled on Jul 9 2015 at 08:36:24 with Arduino IDE 10604.
Attempting to enter ICSP programming mode ...
Entered programming mode OK.
Signature = 0x1E 0x95 0x0F
Processor = ATmega328P
Flash memory size = 32768 bytes.
LFuse = 0xFF
HFuse = 0xDE
EFuse = 0xFD
Lock byte = 0xEF
Clock calibration = 0x83
Bootloader in use: Yes
EEPROM preserved through erase: No
Watchdog timer always on: No
Bootloader is 512 bytes starting at 7E00
Bootloader:
7E00: 0x11 0x24 0x84 0xB7 0x14 0xBE 0x81 0xFF 0xF0 0xD0 0x85 0xE0 0x80 0x93 0x81 0x00
7E10: 0x82 0xE0 0x80 0x93 0xC0 0x00 0x88 0xE1 0x80 0x93 0xC1 0x00 0x86 0xE0 0x80 0x93
...
MD5 sum of bootloader = 0xFB 0xF4 0x9B 0x7B 0x59 0x73 0x7F 0x65 0xE8 0xD0 0xF8 0xA5 0x08 0x12 0xE7 0x9F
Bootloader name: optiboot_atmega328
First 256 bytes of program memory:
0: 0x0C 0x94 0x35 0x00 0x0C 0x94 0x5D 0x00 0x0C 0x94 0x5D 0x00 0x0C 0x94 0x5D 0x00
10: 0x0C 0x94 0x5D 0x00 0x0C 0x94 0x5D 0x00 0x0C 0x94 0x5D 0x00 0x0C 0x94 0x5D 0x00
20: 0x0C 0x94 0x5D 0x00 0x0C 0x94 0x5D 0x00 0x0C 0x94 0x5D 0x00 0x0C 0x94 0x5D 0x00
30: 0x0C 0x94 0x5D 0x00 0x0C 0x94 0x5D 0x00 0x0C 0x94 0x5D 0x00 0x0C 0x94 0x5D 0x00
...
Trong trường hợp này, nó xác nhận rằng bộ xử lý chính đang hoạt động và có bộ tải khởi động Optiboot trên đó.
Điều này không dễ thay thế, nhưng nó chỉ cần thiết nếu bạn sử dụng giắc cắm điện. Nếu bạn chạy từ USB thì không bắt buộc. Ngoài ra, bạn có thể sắp xếp nguồn cung cấp 4 đến 5 V (ví dụ: pin 3 x AA) và kết nối chúng với ổ cắm 5 V trên bo mạch trực tiếp.
Điều này chỉ cần thiết để tải lên bản phác thảo qua cổng USB và gỡ lỗi nối tiếp. Nó không đặc biệt dễ dàng để thay thế bởi vì nó là một SM (thiết bị gắn trên bề mặt). Tuy nhiên bạn có thể quản lý mà không có nó.
Bạn có thể tải lên bản phác thảo thông qua tiêu đề ICSP, nếu bạn mua thiết bị lập trình ICSP.
Ví dụ về các thiết bị như vậy được cắm vào ổ cắm ICSP:
(Những bức ảnh đó được chụp bởi một Ruggeduino, nhưng khái niệm này giống nhau).
Bạn cũng có thể nhận được cáp FTDI, như thế này:
Kết nối nó với các cổng nối tiếp của bảng của bạn như thế này:
FTDI Arduino Uno
GND GND (black wire on FTDI cable, blue jumper wire)
CTS not connected
VCC 5V
TxD D0 (RX)
RxD D1 (TX)
RTS To RESET with a 0.1 µF capacitor in series with it (green wire)
Bây giờ bạn có thể tải các bản phác thảo trực tiếp lên bộ xử lý chính, bỏ qua chip USB.
Bạn cũng có thể sử dụng lập trình viên độc lập chip Atmega của tôi để tải lên các tệp .hex - điều này cho phép bạn sao chép tệp .hex để phác thảo vào thẻ SD, sau đó lập trình bảng thông qua tiêu đề ICSP.
Bộ xử lý chính có thể được thay thế khá dễ dàng nếu được gắn trong ổ cắm. Nhận một con chip thay thế từ một nơi nào đó như Adaf nhung với giá khoảng US $ 6. Ngoài ra, hãy thử eBay. Hãy thử lấy một con chip có bộ tải khởi động Optiboot trên đó, để tiết kiệm rắc rối.
Cẩn thận thưởng chip hiện có ra khỏi ổ cắm và cài đặt chip mới, lưu ý vị trí của pin 1. Chân 1 có một notch trên chip và hướng chính xác của nó được ghi chú trên ảnh đầu tiên trong bài này với màu vàng dấu chấm (gần cạnh của bảng). Bạn có thể sẽ cần phải duỗi thẳng chân một chút. Giữ chip ở hai đầu và nhẹ nhàng đẩy xuống một bề mặt phẳng, như bàn, cho đến khi được đẩy vào trong một chút. Cố gắng không chạm vào các chân kim loại, bạn có thể hạ gục chúng bằng tĩnh điện.
Tôi có một bản phác thảo tại lập trình viên bộ nạp khởi động Atmega sẽ thay thế bộ tải khởi động Optiboot. Hệ thống dây cũng giống như đối với bản phác thảo máy dò chip. Mã này có tại GitHub - nickgammon / arduino_sketches . Nếu bạn nhấp vào nút Tải xuống trên trang đó, bạn sẽ nhận được một số bản phác thảo hữu ích. Người bạn muốn được gọi là "Atmega_Board_Programmer".
Cài đặt bản phác thảo trên Uno "đã biết" của bạn và kết nối nó với bảng mục tiêu với hệ thống dây được hiển thị trước đó.
Mở Trình giám sát nối tiếp trên Uno "tốt" của bạn và bạn sẽ thấy điều này:
Atmega chip programmer.
Written by Nick Gammon.
Version 1.35
Compiled on Jul 9 2015 at 15:06:58 with Arduino IDE 10604.
Attempting to enter ICSP programming mode ...
Entered programming mode OK.
Signature = 0x1E 0x95 0x0F
Processor = ATmega328P
Flash memory size = 32768 bytes.
LFuse = 0xFF
HFuse = 0xDE
EFuse = 0xFD
Lock byte = 0xEF
Clock calibration = 0x83
Type 'L' to use Lilypad (8 MHz) loader, or 'U' for Uno (16 MHz) loader ...
Nhập "U" cho trình tải Uno (Optiboot).
Using Uno Optiboot 16 MHz loader.
Bootloader address = 0x7E00
Bootloader length = 512 bytes.
Type 'Q' to quit, 'V' to verify, or 'G' to program the chip with the bootloader ...
Nhập "G" để lập trình chip.
Bạn nên thấy:
Erasing chip ...
Writing bootloader ...
Committing page starting at 0x7E00
Committing page starting at 0x7E80
Committing page starting at 0x7F00
Committing page starting at 0x7F80
Written.
Verifying ...
No errors found.
Writing fuses ...
LFuse = 0xFF
HFuse = 0xDE
EFuse = 0xFD
Lock byte = 0xEF
Clock calibration = 0x83
Done.
Programming mode off.
Type 'C' when ready to continue with another chip ...
Điều này mất khoảng một giây. Bây giờ bộ nạp khởi động đã được cài đặt.
Đồng hồ bấm giờ (tắt theo mặc định) có thể được cấu hình để đặt lại bộ xử lý sau một thời gian nhất định. Mục đích là để phục hồi từ "treo" cho bộ xử lý được triển khai trong trường. Tuy nhiên, nếu bộ hẹn giờ được đặt trong một khoảng thời gian ngắn (như 16 ms) thì bộ xử lý có thể đặt lại lần nữa trước khi bộ tải khởi động có cơ hội làm bất cứ điều gì.
Các triệu chứng là bạn không thể tải lên bất kỳ bản phác thảo mới. Một số bộ tải khởi động hiện đại (như Optiboot) thực hiện các bước để ngăn chặn vấn đề này là một trong những điều đầu tiên họ làm. Tuy nhiên những người khác thì không.
Điều này có thể khó phục hồi, vì một khi bản phác thảo chạy, bạn có vấn đề về việc đặt lại và nếu bạn gặp vấn đề, bạn không thể thay thế bản phác thảo. Mọi người thường báo cáo rằng họ phải ghi một bộ tải khởi động mới để phục hồi. Tuy nhiên, đó chỉ là vì, như một hiệu ứng phụ, việc ghi bộ tải khởi động sẽ xóa bản phác thảo hiện tại.
Có là một cách để hồi phục. Thực hiện các bước sau:
Tôi đề cập đến vấn đề này ở đây, mặc dù bài đăng này thực sự nhắm mục tiêu vào bảng Uno, vì nó khá phổ biến.
Một số phiên bản của bộ tải khởi động Mega2560 tìm kiếm "!!!" trong tải lên đến từ PC và nếu họ thấy điều đó, hãy chuyển sang chế độ gỡ lỗi. Điều này khiến việc tải lên không thành công.
Mã ví dụ:
Serial.println ("Furnace overheating!!!");
Các giải pháp:
Hoặc (đơn giản hơn):
Các bo mạch với bộ xử lý ATmega32u4 là bộ xử lý chính (và duy nhất) của chúng có thể phức tạp hơn để tải lên. Điều này là do cùng một con chip phải xử lý tải lên và cũng chạy mã của bạn.
Có một cửa sổ cơ hội nhỏ, sau khi bảng được thiết lập lại, khi nó tìm kiếm một bản phác thảo mới sẽ được tải lên. Kỹ thuật để tải lên các bảng này là:
Bạn chỉ có một giây hoặc lâu hơn để làm điều này, trước khi bản phác thảo cũ bắt đầu chạy. Đừng nản lòng nếu bạn phải lặp lại quá trình này một vài lần. Đó là bình thường.
Ít nhất - như tôi giả sử bạn tải lên bản phác thảo của mình qua avrdude - vui lòng cung cấp thêm thông tin về lỗi tải lên (ví dụ: đầu ra của trình tải lên bản phác thảo) để mọi người ở đây có thể giúp bạn tốt hơn.
Ngoài câu trả lời tuyệt vời của Nick Gammon, vui lòng tìm kiếm dấu chấm than trong bản phác thảo của bạn. Nếu bản phác thảo của bạn chứa một chuỗi có nhiều hơn hoặc bằng 3 dấu chấm than, quá trình tải lên sẽ thất bại, vì các phiên bản cũ của Arduino Bootloader sẽ diễn giải các dấu chấm than này là một chức năng khác và quá trình tải lên sẽ dừng lại.
Một ví dụ để dừng tải lên:
char* test = "This will stop the upload!!!";
Xem vấn đề về Mã Google .
Tôi đã gạch 2 lần ATMega328P trên bo mạch Arduino Uno của mình do tĩnh (tôi nghĩ vậy).
Tĩnh dường như đã giết chết pin TX và do đó chương trình không thể được tải xuống bằng cáp USB.
Giải pháp đơn giản nhất là thay thế vi điều khiển. Bạn có thể mua một ATMega328P DIP mới được lập trình với bộ tải khởi động Arduino ( chẳng hạn như cái này từ Adaf nhung ) và bạn đã sẵn sàng để đi lại.
Ngoài ra, bạn vẫn có thể lập trình ATMega328P bằng cách sử dụng trình lập trình AVRISPmkII. Khi bạn làm, tất cả trừ pin Tx hoạt động tốt.