Nội dung bài viết
STDIO Việc đưa hệ thống về trạng thái ban đầu được ứng dụng rất nhiều và hiệu quả cũng rất cao. Board mạch Arduino cũng là một hệ thống nhỏ với chip MCU ATmega cho nên việc reset hệ thống là hoàn toàn khả thi. Bài viết sau hướng dẫn các bạn làm sao để reset Arduino vào trạng thái trước khi code thực thi.

Giới thiệu

Việc đưa hệ thống về trạng thái ban đầu được ứng dụng rất nhiều và hiệu quả cũng rất cao. Board mạch Arduino cũng là một hệ thống nhỏ với chip MCU ATmega cho nên việc reset hệ thống là hoàn toàn khả thi. Bài viết sau hướng dẫn các bạn làm sao để reset Arduino vào trạng thái trước khi code thực thi.

Tiền đề bài viết

Trong các lần hiện thực mẫu thử xe điều khiển tự động – Cheryl Prototype 1 của anh La Kiến Vinh :: www.stdio.vn/users/index/1/la-kien-vinh. Nhiều lần tôi muốn xe tự động ngắt và chạy lại từ đầu nhưng tôi lại phải tiến đến, chộp lấy nó ngắt nguồn rồi bật lại hoặc nhấn nút reset có sẵn trên Board mạch Arduino.

Đối tượng hướng đến

Những bạn đang tìm hiểu về Arduino và cách thao tác trên Arduino.

Để reset Arduino có 3 cách

Bài viết dưới đây tôi sử dụng Arduino Uno, để tìm hiểu về Arduino Uno bạn có thể tham khảo bài viết Thông Số Kĩ Thuật Arduino Uno R3 - Các Biến Thể Và Lưu Ý :: www.stdio.vn/articles/read/400/thong-so-ki-thuat-arduino-uno-r3-va-cac-luu-y.

Cách 1: Tương tác vào chân Reset của Arduino

Như ta đã biết Arduino được điều khiển bởi một trong các con chip dòng Atmega của hãng Atmels. Với các con chip MCU đều có chân reset, nếu chân reset được cài đặt vè 0 tức là xung nhận là LOW thì MCU tự động ngắt và chạy lại từ đầu còn bình thường chân này ta sẽ cài đặt là HIGH.
Việc cần làm là ta gán một chân vào cổng Reset trên Board thông qua một con trở 10 ngàn ôm. Việc thông qua con trở 10 ngàn ôm nhằm đảm bảo an toàn cho Board mạch. Ở đây tôi dùng chân số 8.

ss_01

void ResetBoard()
{
  digitalWrite( 8, LOW);
}

void setup()
{ 
  pinMode( 8, OUTPUT);
  digitalWrite( 8, HIGH);
}

void loop()
{
  ResetBoard();
}

Tuy nhiên việc này có thể dễ dàng dẫn đến vòng lặp Reset vô hạn vì tùy thuộc và con chip trên Board Arduino khác nhau. Chân mà ta cài đặt để điều khiển Reset có thể được trả về LOW liên tục sau khi lệnh Reset đầu tiên được thực thi.

Cách 2: Sử dụng thư viện có sẵn

Có một phương pháp để reset hệ thống thiết bị mà người ta gọi đó là Watchdog Reset. Nếu bạn đang thao tác trên Arduino thì Arduino có một thư viện có sẵn đó là “wdt.h”. Với câu lệnh wdt_enable() và các thông số:

  • DTO_15MS
  • WDTO_30MS
  • WDTO_60MS
  • WDTO_120MS
  • WDTO_250MS
  • WDTO_500MS
  • WDTO_1S
  • WDTO_2S
  • WDTO_4S
  • WDTO_8S

Tượng trưng cho 15 mili giây tới 8 giây là thời gian đợi trước khi thực sự reset Board Arduino.

#include <avr/wdt.h>

void ResetBoard( uint8_t time) 
{
  wdt_enable(time);
  while(1) {}
}

void setup()
{

}

void loop() 
{
 ResetBoard( WDTO_60MS);
}

Cách 3: Sử dụng code

Arduino cho phép bạn nhúng code ngôn ngữ Assembly vậy ta có thể khiến chương trình “reset” bằng cách cho “nhảy” đến dòng code đầu tiên của chương trình. Như ta đã biết thì ngôn ngữ Assembly có câu lệnh nhảy jmp và nhảy đến dòng code 0.

void ResetBoard()
{
  asm volatile ( "jmp 0");  
}
THẢO LUẬN
ĐÓNG