Kĩ năng mềm

Lỗi của Arduino? Và các lỗi thường gặp khi lập trình Arduino

  • 13/04/2018
  • Kĩ năng mềm

1. Tại sao tôi lại không upload được chương trình lên mạch Arduino của mình?

Chương trình của bạn phải trải qua rất nhiều phần để được "vận chuyển" và "thi hành" trên một mạch Arduino! Và vì thế, nào một trong những phần ấy có vấn đề thì bạn sẽ không thể nào upload được chương trình lên Arduino. Những phần đó bao gồm:

  1. Chương trình Arduino IDE.
  2. Driver cho mạch Arduino.
  3. Sự cho phép truy cập đến cổng Serial
  4. Các kết nối vật lý tới mạch Arduino
  5. Firmware đối với các mạch Arduino Uno và Arduino Mega 2560
  6. Bootloader đối với con chip được gắn trên Arduino
  7. Thiết lập cầu chì của vi điều khiển
  8. ... 

Sau đây là một số hướng dẫn cụ thể cho từng vấn đề được nêu ra

  1. Chương trình Arduino IDE

    • Nếu bạn chưa có chương trình Arduino IDE xin hãy vào đây: http://arduino.vn/bai-viet/68-cai-da...
    • Hãy chắc chắn rằng bạn đã chọn đúng mạch bạn cần lập trình trong mục Tools > Board, nếu bạn đang có một mạch Arduino Uno R3 thì hãy chọn nó. Ngoài ra, với một số mạch Arduino Duemilanove đời mới đi kèm với chip ATmega328 (loại cụ thì đi với ATmega168, để kiểm tra hãy xem mấy dòng chữ nhỏ trên con chip). Để xem thêm thông tin, xin hãy click vào xem đường dẫn trên.
    • Sau đó kiểm tra phần tử được chọn trong thẻ Tools > Serial Port có phải là cổng Serial được kết nối với Arduino hay không (nếu bạn vừa chưa thấy xin hãy gỡ kết nối USB từ máy tính và tắt Arduino IDE, sau đó gắn USB lại và bật Arduino).
      • Trên máy MAC, một cổng serial của Arduino thường có dạng là /dev/tty.usbmodem621 (trên các phiên bản Arduino Uno và Arduino Mega 2560) hoặc có dạng /dev/tty.usbserial-A02f8e (trên các mạch phiên bản cũ hoặc các bản FDTI-based board).
      • Trên Linux, nó lại có dạng /dev/ttyACM0 hoặc tương tự (trên các phiên bản Arduino Uno và Arduino Mega 2560) hoặc cũng có thể là /dev/ttyUSB0 (hoặc tương tự) trên các mạch cũ hơn.
      • Còn trên Windows, có lại có tiền tố là COM, nhưng bạn nên vào Device Manager của Windows để kiểm tra cho lựa chọn của mình (gợi ý: bạn hãy đảm bảo chưa gắn Arduino vào máy tính, sau đó vô Device Manager, rồi gắn Arduino vào, xem cổng COM nào hiện ra, nếu không có cổng COM nào hiện ra, truy cập vào đây, còn nếu có cổng COM mới hiện ra thì đấy chính là cổng COM mà bạn cần phải chọn)
      • Nếu vẫn còn lỗi, xin bạn xem phần tiếp theo, đó là Drivers
  2. Driver

    • Driver là gì? Driver là một phương tiện phần mềm cung cấp cho bạn một phương thức để cho phần mềm của bạn (ví dụ Arduino IDE) kết nối với một mạch điện tử (ví dụ như Arduino Uno). Trong trường hợp của Arduino, driver sẽ tạo một cổng Serial ảo (hoặc là cổng COM ảo). Mạch Arduino Uno và Mega 2560 sử dụng bộ driver cơ bản (USB CDC) để xây dựng phương thức kết nối đến vi điều khiển dạng ATmega8U2 (ATmega168, ATmega328,...) trên mạch. Còn một số mạch khác thì sử dụng bộ driver FTDI để xây dựng phương thức kết nối đến vi điều khiển dạng FTDI trên mạch (nằm cứng lên luôn, không tháo rời được).

    • Cách tốt nhất để kiểm tra xem rằng bạn đã cài đặt driver cho bản mạch của mình hay chưa là kiểm tra mục Tools > Serial Port. Nếu trong danh sách hiện ra có cổng Serial của mạch Arduino bạn đang sử dụng thì bạn đã cài, nếu chưa thì hãy vào đây. Một lưu ý nhỏ, chẳng hạn bạn sử dụng một mạch Arduino Uno có cổng Serial tên là COM3, giờ gắn một cái Arduino Uno thứ hai vào thì cổng COM3 không phải là cổng Serial để kết nối tới mạch Arduino Uno thứ hai này, để khắc phục, bạn hãy cài đặt driver lại.

      • Nếu bạn gặp lỗi "The system cannot find the file specified" khi cài đặt driver cho Arduino Mega 2560 trên Windows XP, xin hãy thử cách này.

      • Trên Linux, mạch Arduino Uno và Arduino Mega 2560 được chọn mặc định là /dev/ttyACM0. Nhưng Linux lại không hỗ trợ thư viện RXTX chuẩn mà những mạch này sử dụng để giao tiếp với vi điều khiển. Vì vậy trong bản tải về dành cho Linux, Arduino đã thêm vào một thư viện RXTX một patch để tự động tìm kiếm những Serial port có dạng /dev/ttyACM* khác. Ngoài ra, còn có một gói dành cho Ubuntu (phiên bản 11.04) đã bao gồm patch đấy. Đôi khi, nếu bạn vẫn sử dụng gói RXTX từ bản distribution của bạn, thì bạn nên đổi /dev/ttyACM0 thành /dev/ttyUSB0 (đây chỉ là một ví dụ, bạn hãy chọn cái nào hiện ra trong Arduino IDE).

  3. Sự cho phép truy cập đến cổng Serial

    • Trên Windows, nếu bạn thấy chương trình Arduino IDE khởi động chậm, hoặc khi vào Tools > Serial Port thấy nó lâu hiện ra, bạn nên tắt các cổng Bluetooth serial hoặc bất cứ cổng Serial qua mạng nào hết. Vì khi khởi động chương trình Arduino IDE hoặc tìm các cổng Serial hợp lệ, Arduino IDE sẽ quét TẤT CẢ các cổng Serial có thể quét, nếu trong các cổng ấy có những cổng Bluetooth Serial hoặc Serial qua mạng, và chúng bị lỗi hoặc delay thì chương trình sẽ tốn nhiều thời gian để quét xong chúng => chương trình khởi động chậm.
    • Hãy đảm bảo rằng, bạn không đang chạy các chương trình cũng có dạng quét tất cả các cổng Serial, ví dụ như USB Cellular Wifi Dongle software (từ Sprint hoặc Verizon), các phần mềm quét các thiết bị cầm tay, Bluetooth-USB drivers (ví dụ BlueSoleil), virtual daemon tools, ...
    • Bạn hãy đảm rằng, không có phần mềm nào cài tường lửa để truy cập đến cổng Serial đó, ví dụ như ZoneAlarm
    • Bạn phải tắt các chương trình như Processing, PD, vvvv, ...nếu như các chương trình này đang đọc dữ liệu qua cổng Serial mà bạn đang chọn.
    • Trên Linux, bạn cần tạm chời chạy Arduino dưới quyền root để xem thử nó có giúp ích gì cho việc upload chương trình hay không.
  4. Các kết nối vật lý tới mạch Arduino

    • Điều đầu tiên mà bạn bắt buộc phải làm, đó là kiểm tra xem thử mạch Arduino đã được gắn điện (đèn màu xanh sáng).
    • Mạch Arduino Uno và Arduino Mega 2560 hay gặp vấn đề trong việc kết nối thông qua USB hub trên máy MAC. Nếu bạn kiểm tra không thấy cổng Serial mà mình hay sử dụng trong Tools > Serial Port thì xin hãy gỡ kết nối USB với USB hub sau đó gắn trực tiếp vào máy MAC sau đó khởi động lại Arduino IDE.
    • Ngắt kết nối của hai cổng digital 0 và 1 trong quá trình upload từ máy tính vào mạch Arduino, sau đó bạn có thể dùng chúng một cách bình thường.
    • Hãy thử upload chương trình mà không có bất cứ thiết bị, dây diện nào được nối tới Arduino (và dĩ nhiên là phải loại trừ dây USB )
    • Thay đổi dây USB vì đôi lúc do nó quá dài hoặc không có cục lọc nhiễu nên bạn không thể upload được.
  5. Auto-reset

    • Auto-reset là một chức năng tự động của một số mạch của Arduino, chức năng này hỗ trợ việc tự động reset để lập trình vi điều khiển nằm trên mạch. Tuy nhiên, một số mạch lại không có chức năng này (để tiết kiệm diện tích và thể tích lắp đặt nên buộc phải đánh đổi một chức năng không quá quan trọng khi sản xuất một sản phẩm). Những mạch nào không có cổng USB (hoặc mini USB) và cực kì nhỏ thường không hỗ trợ chức năng Auto-reset
    • Nếu bạn có một mạch không có chức năng Auto-reset thì bạn cần reset mạch bằng tay trước khi bắt đầu quá trình upload. (Arduino Diecimila, Duemilanove, và Nano cũng như là LilyPad, Pro, và Pro Mini đều hỗ trợ chức năng này với 6 chân lập trình)
    • Tuy nhiên, hãy chú ý rằ[VP 1] Device is not responding correctlyng, một số mạch Arduino Diecimila bị lỗi trong qua trình cài bootloader và bắt buộc bạn phải nhấn nút reset bằng tay. Xem trả lời cụ thể cho câu hỏi này, tại đây.
    • Còn nếu bạn gặp lỗi này: [VP 1] Device is not responding correctly . Hãy thử reset lại board, upload lại.
  6. Bootloader đối với con chip được gắn trên Arduino

    • Hãy chắc chắn rằng bootloader đã được cài đặt. Để kiểm tra, bạn hãy nhấn nút reset và xem thử đèn số 13 (đèn LED được kết nối trực tiếp với chân số 13) có nhấp nháy hay không? Nếu không thì mạch của bạn chưa được cài bootloader.

2. Tại sao trên máy MAC của tôi lại xuất hiện lỗi: "Build folder disappeared or could not be written" ?

Bạn đã copy file Arduino.app ra khỏi file image  (và dán vào thư mục Applications ) chưa? Nếu không, bạn sẽ không thể upload được chương trình của mình đâu.

3. Tại sao chương trình Arduino IDE của tôi lại không hoạt động khi tôi cập nhập chương trình Java?

Phiên bản Java mới nhất của Apple đã cố gắng sử dụng phiên bản thư viện hệ thống 64 bit để biên dịch, nhưng mà Arduino IDE lại sử dụng phiên bản 32 bit của thư viện RXTX. Vì vậy, khi khởi động Arduino bạn sẽ gặp một thông báo như sau: Uncaught exception in main method: java.lang.UnsatisfiedLinkError: /Applications/arduino-0016/Arduino 16.app/Contents/Resources/Java/librxtxSerial.jnilib: no suitable image found. Did find: /Applications/arduino-0016/Arduino 16.app/Contents/Resources/Java/librxtxSerial.jnilib: no matching architecture in universal wrapperUncaught exception in main method: java.lang.UnsatisfiedLinkError: /Applications/arduino-0016/Arduino 16.app/Contents/Resources/Java/librxtxSerial.jnilib: no suitable image found. Did find: /Applications/arduino-0016/Arduino 16.app/Contents/Resources/Java/librxtxSerial.jnilib: no matching architecture in universal wrapper

Để sửa, bạn kích vào chương trình Arduino nào đó (ví dụ Arduino16.app) trong Finder, và chọn Get Info từ bảng chọn Menu. Và trong thẻ thông tin, kích chọn mục Open in 32 Bit Mode. Từ bây giờ, bạn có thể tiếp tục lập trình cho chú Arduino của mình rồi!

4. Tại sao tôi lại nhận đươc thông báo java.lang.StackOverflowError khi tôi đang trong qua trình upload chương trình?

Arduino IDE sử dụng một số biểu thức thường dùng để minh họa trong chương trình (Ví dụ như để thể một ký tự thì ta đặt ký tự đó giữa hai dấu nháy hơn, nhưng để thể hiện một chuỗi thì ta lại đặt chuỗi đó giữa một dấu nháy kép,...). Vì bạn có một số nhầm lẫn về vấn đề sử dụng những biểu thức này nên bạn đã gặp lỗi trên. Nói nôm na, nếu bạn khai báo chuỗi nằm giữa cặp dấu nháy đơn thì bộ nhớ của java sẽ bị tràn.  Một đoạn thông báo lỗi có thể như sau:

java.lang.StackOverflowError
at java.util.Vector.addElement(Unknown Source)
at java.util.Stack.push(Unknown Source)
at com.oroinc.text.regex.Perl5Matcher._pushState(Perl5Matcher.java) 

hoặc là

    at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)
    at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)
    at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)
    at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)
    at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)
    at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java)
    at com.oroinc.text.regex.Perl5Matcher._match(Perl5Matcher.java) 

... đó chính xác là những gì đã xảy ra với bạn đúng không ? Hãy kiểm tra một cách CẨN THẬN những dấu nháy đơn, nháy kép, dấu gạch chéo ngược \, comments,... Ví dụ: Nếu bạn viết như thế này: '\"' thì sẽ lỗi (hãy thay cặp dấu nháy đơn bên ngoài thành cặp dấu nháy kép như thế này "\"")

5. Tại sao tôi không khởi động mạch-đã nạp chương trình của tôi khi mà tôi đang kết nối nó với nguồn ngoài ? (đối với Arduino Diecimila và những mạch trước đó)

Bởi vì chân RX chưa được kết nối. Bootloader của mạch có vẻ đang nhận một lượng lớn thông tin rác ở chân RX, và hiển nhiên nó sẽ không bao giờ hoàn thành và chạy chương trình mà bạn đã upload lên mạch. Để khắc phục bạn chỉ cần nối tắt chân TX và RX hoặc là nối RX qua một điện trở 10 kOhm  rồi nối xuống cực âm.

6. Tại sao chương trình Arduino IDE của tôi lại bị treo khi tôi đang upload chương trình ? (trên Windows) ?

Đó là do sự sung đột của chương trình Arduino IDE với một tiến trình của chương trình Logitech ('LVPrcSrv.exe'). Hãy bật Task Manager và End process nó!

7. Điều gì đã xảy ra với mạch của tôi khi nó không chịu khởi động lên? (đèn màu xanh đã sáng rồi)?

Nếu bạn đang sử dụng bản mạch Arduino Diecimila hoặc những bản mạch cũ hơn có cổng USB (Ví dụ như NG) thì bạn cần chắc chắn rằng cái jumper (miếng nhựa nhỏ dùng để nối tắt 2 chân header sát nhau) đã được gắn vào đúng chân. Nếu bạn đang cấp nguồn cho mạch bằng nguồn điện ngoài (được cắm vào chân nguồn) thì bạn cần gắn cái jumper này vào 2 cổng gần chỗ gắn cổng nguồn nhất. Còn nếu bạn đang cấp nguồn cho mạch bằng cổng USB thì bạn cần gắn cái jumper này vào 2 cổng gần chỗ gắn cổng USB nhất. http://k1.arduino.vn/img/2014/05/26/.... Bạn kích vào đường dẫn trên để xem ảnh.

8. Tại sao mạch Arduino Diecimila của tôi lại phải tốn đến 6-8 giây để khởi động chương trình mà tôi đã nạp vào ?

Trong quá trình sản xuất hàng loạt mạch Arduino Diecimila, có một số mạch bị lỗi khi cài bootloader. Nhưng không cần phải lo lắng về việc này. Bạn có thể kiểm tra mạch đã được cài bootloader hay chưa nhờ vào việc kiểm tra đèn LED số 13 có nhấp nháy khi bạn nhất nút reset hay không. Nếu nó nhấp nháy 3 lần là đã có NG bootloader, và bạn cần phải nhấn nút reset vài lần trước khi upload chương trình để chương trình khi nạp vào không bị hiện tượng như câu hỏi và bạn đang đọc. Để cài bootloader cho Arduino Diecimila bạn cần tham khảo đường dẫn này.

9. Tôi cần làm gì nếu file arduino.exe bị lỗi khi khởi động?

Nếu bạn gặp một lỗi khi khởi động chương trình arduino.exe, ví dụ là như thế này chẳng hạn:

Arduino has encountered a problem and needs to close.

Lúc này bạn cần chạy file run.bat , và hãy nghe tôi, bạn cần kiên nhẫn đợi một tí để chương trình Arduino khởi động!

Các tin khác