Arduino
Arduino là gì ?
Khái niệm, lịch sử hình thành và phát triển.
Theo định nghĩa từ www.arduino.cc, Arduino là nền tảng điện tử mã nguồn mở, dựa trên phần cứng và phần mềm, linh hoạt và dễ sử dụng, các board Arduino có khả năng đọc dữ liệu từ môi trường (ánh sáng, nhiệt độ, độ ẩm…), trạng thái nút nhấn, tin nhắn từ Twitter… và điều khiển trở lại với các thiết bị như động cơ, đèn LED, gửi thông tin đến 1 nơi khác.
Chúng ta có thể điều khiển vi điều khiển trên board Arduino bằng cách sử dụng ngôn ngữ lập trình C++, được biên dịch bởi Arduino IDE và các trình biên dịch đi kèm ra mã máy nhị phân. Lúc này Vi điều khiển có thể dễ dàng thực thi chương trình.
Hiện tại, Arduino là một công ty hoạt động trong lĩnh vực phần cứng và phần mềm máy tính mã nguồn mở. Dự án Arduino được sinh ra tại học viện Interaction Design ở Ivrea, Italy vào năm 2003. Mục đích ban đầu của board Arduino là giúp cho các sinh viên ở học viện – những người không có nền tảng kiến thức về điện tử có thể tạo ra các sản phẩm 1 cách nhanh chóng với chi phí thấp và dễ sử dụng. Đó là 1 dự án mã nguồn mở, Arduino phát triển thông qua việc cho phép người dùng trên toàn thế giới có thể xây dựng, phát triển và đóng góp vào dự án.
Tên Arduino là tên của 1 quán bar ở Ivrea, Italy. Đây là nơi những nhà sáng lập ra dự án arduino gặp mặt để bắt đầu ý tưởng hình thành dự án này. Tên của quán bar này đặt theo tên của người chỉ huy quân đội (như lãnh chúa thời phong kiến) tại Ivrea và sau đó ông này là vua của nước Italy từ năm 1002 đến năm 1014. |
Tại sao là Arduino ?
Hiện nay, Arduino được sử dụng trong rất nhiều dự án và trong nhiều lĩnh vực khác nhau. Chính vì sự đơn giản, dễ sử dụng và đặc biệt là mã nguồn và phần cứng mở nên nó nhận được sự hỗ trợ rất lớn từ các lập trình viên trên toàn thế giới. Phần mềm rất dễ cho những người mới bắt đầu nhưng cũng không thiếu sự linh hoạt cho những lập trình viên lâu năm. Cộng đồng Arduino rất lớn nên khi sử dụng với Arduino, theo cách nói vui là bạn được “support tới tận răng”, có nghĩa là vấn đề bạn gặp phải bây giờ, người dùng Arduino trên thế giới cũng đã gặp phải, giải quyết nó và đưa ra các thư viện tốt nhất cho bạn, với cộng đồng lớn và đặc biệt là tất cả đều open-source nên sẽ dễ dàng hơn nếu bạn chọn Arduino thay vì nền tảng lập trình khác.
Với những người “ngoại đạo” (đề cập đến những người không có nhiều kiến thức về điện tử) thì Arduino quả thực rất tuyệt vời, nó giúp họ dễ dàng tạo ra những sản phẩm liên quan đến điện tử. Những kiến trúc sư, giáo viên, nghệ sĩ có thể chỉ mất vài ngày để tạo ra sản phẩm điện tử nhằm phục vụ cho nhu cầu của họ, trong khi việc này trước đây dường như là bất khả thi. Tuy nhiên, có một câu hỏi đặt ra là: Nếu là 1 kỹ sư điện tử lập trình, có nên dùng Arduino cho các dự án của mình hay không? Bởi nó quá đơn giản và nhìn giống như là “đồ chơi của trẻ con” ???
Đây là chủ đề được bàn luận khá sôi nổi và thật khó để tìm ra câu trả lời chính xác. Arduino che đi sự phức tạp của việc lập trình cho vi điều khiển bằng cách phủ lên mình lớp “vỏ bọc” bên trên. Chỉ 1 vài câu lệnh đơn giản là có thể chớp, tắt được 1 con LED trong khi với các nền tảng lập trình khác, muốn làm được chuyện này thì bạn phải hiểu kiến trúc của vi điều khiển, hiểu cách truy cập, setup giá trị các bit trong thanh ghi,… từ đó mới có thể dùng tập lệnh của nó để viết code điều khiển LED. Và sự phức tạp, tinh vi của nền tảng Arduino cũng không thua kém gì các thư viện của nhà sản xuất, có chăng nó làm cho người dùng cảm giác đơn giản hơn thôi.
Những người xây dựng nền tảng Arduino đã tạo ra những lệnh vô cùng đơn giản, giúp cho người dùng dễ tiếp cận. Tuy nhiên cách học đối với “những người trong nghề” không gì tốt hơn nếu muốn nắm rõ về lập trình vi điều khiển là đào sâu tìm hiểu.
Ví dụ, đối với 1 người đang làm việc ở lĩnh vực IT, muốn tạo hiệu ứng cho các bóng đèn LED qua 1 ứng dụng trên điện thoại. Với họ, việc tạo ứng dụng trên điện thoại là không thành vấn đề, liên quan đến điều khiển LED, chỉ cần kết nối board Arduino với LED, “google search” để tìm kiếm 1 thư viện phù hợp, lấy những hiệu ứng họ cần trong thư viện đó. Việc này khá đơn giản nếu dùng Arduino. Vấn đề của họ đã được giải quyết thành công mà không cần biết quá nhiều về kiến thức điện tử.
Tuy nhiên, vấn đề phát sinh ở đây là: tôi muốn LED sáng mờ hơn, tôi muốn tạo 1 số hiệu ứng theo ý mình, tôi cần kết nối nó với các cảm biến khác, tôi cần truyền, nhận dữ liệu giữa các module mà tôi đã kết hợp,… bài toán đặt ra đã trở nên thực sự phức tạp và vượt tầm hiểu biết của họ. Lúc này, giá trị của 1 kĩ sư điện tử lập trình sẽ được thể hiện. Để làm được những yêu cầu ấy, bạn phải hiểu rõ cách thức hoạt động của vi điều khiển, các chức năng, các chuẩn truyền dữ liệu,… để từ đó có thể hiệu chỉnh lại thư viện đang có, tối ưu hóa và tùy biến theo yêu cầu của người dùng.
Câu hỏi đặt ra tiếp theo ở đây là: rất nhiều nền tảng lập trình khác cũng làm được điều này, vậy đâu là những lợi ích của Arduino ?
Ích lợi chính ở đây đó là sự đơn giản của các tập lệnh, cộng đồng lớn và open-source. Thư viện dành cho Arduino không quá khó tìm, lệnh không quá nhiều để học nhưng cái chính là bạn phải hiểu nó hoạt động như thế nào. Để tìm hiểu sâu hơn về nó, những người phát triển Arduino đã cung cấp cho chúng ta 1 thư viện Hardware Abstraction Library (gọi tắt là HAL) dành cho những ai muốn tìm hiểu sâu hơn về cách mà Arduino hoạt động.
Ví dụ, với Arduino, để bật 1 bóng LED, chúng ta sẽ dùng 2 lệnh đơn giản là pinMode(PIN_LED)
và lệnh digitalWrite(PIN_LED)
với PIN_LED
là định nghĩa chân được đấu nối với đèn LED ngoài thực tế. Tìm hiểu chi tiết hơn thì pinMode()
là 1 hàm :
-
Nhằm cấu hình chân giống như ngõ vào (input) hoặc ngõ ra (output), nó sẽ cấu hình thanh ghi hướng dữ liệu DDR (Data Direction Register), nếu 1 bit của thanh ghi DDR là 0 thì chân đó sẽ được cấu hình là input, giá trị bit bằng 1 là output.
-
Giá trị mặc định ban đầu của các bit này là 0 (input).
-
DDR là tên gọi chung của các thanh ghi ở chip ATmega328P, nó bao gồm 3 thanh ghi DDRB, DDRC, DDRD. Các thanh ghi này liên quan đến các chân của chip ATmega328P (board Arduino Uno R3) như bảng bên dưới:
Tiếp theo, ATmega328P có 3 thanh ghi PORT để cài đặt giá trị cho các bit, các bit này tương ứng với các chân I/O của chip ATmega328P. Chân A0 – A5 là các chân Analog, các chân D0 – D13 là các chân Digital. Giá trị bit bằng 0 là LOW (mức thấp, điện áp 0V DC), bằng 1 là HIGH (mức cao, điện áp 5VDC). Giá trị mặc định ban đầu của bit là 0.
Như vậy, nếu chúng ta muốn cho các chân từ D0 – D7 là ngõ ra thì ta cần cài đặt DDRD = 0b00000000 (0b là định dạng kiểu nhị phân, được hiểu là gán giá trị 0 hoặc 1 cho từng bit), cho các chân này mức HIGH thì cài đặt giá trị thanh ghi PORTD = 0b11111111.
Đó là cách hoạt động chung khi cài đặt hướng và setup giá trị cho các chân GPIPO của các nền tảng lập trình hiện nay. Nếu bạn là 1 kĩ sư điện tử lập trình thì cách học nên theo hướng như vậy. Một khi bạn đã hiểu cách hoạt động của vi điều khiển thì sử dụng Arduino sẽ giúp chúng ta xây dựng dự án 1 cách nhanh chóng do tập lệnh khá đơn giản để dùng.
Chúng ta có thể xem các tập lệnh của Arduino tại www.arduino.cc/reference/en và tìm hiểu sâu hơn các tập lệnh của Arduino tại link Arduino hardware core |
Một số hàm cơ bản được giải thích chi tiết hơn tại garretlab.web.fc2.com |
Bên cạnh đó, một số điểm mạnh của Arduino nữa là:
-
Các ví dụ mẫu đi kèm với thư viện và tất cả đều open-source nên khi tìm đến các ví dụ mẫu, chúng ta sẽ hiểu cách thức thư viện hoạt động. đồng thời có thể xem source code của họ viết để có thể hiệu chỉnh, tối ưu thư viện theo cách của mình.
-
Việc upload code thông qua cổng USB, giúp đơn giản quá trình nạp code.
Những board mạch Arduino trên thị trường
Hiện nay trên thị trường có hàng trăm board mạch Arduino khác nhau, chúng đa phần là các biến thể PCB (các board mạch điện) của những board mạch chính đến từ nhà sản xuất Arduino. Những board mạch này hoặc có thêm 1 số tính năng cải tiến nào đó hoặc đơn giản là được thiết kế lại nhằm giảm giá thành sản phẩm để có thể tới tay người dùng nhiều hơn. Chúng ta hãy cùng điểm qua 1 số board mạch Arduino chính như bên dưới :
1. Arduino Uno R3
Đây là board mạch được đánh giá là tốt nhất cho những người mới bắt đầu về điện tử và lập trình. Nó được sử dụng nhiều nhất trong các board mạch thuộc họ Arduino. Hình ảnh và các chức năng của board Arduino Uno R3 :
Điểm qua 1 số thông tin chính của boad:
-
Giá thành : €20.00 (theo www.arduino.cc).
-
Sử dụng vi điều khiển ATmega328 của hãng Atmel.
-
Lập trình thông qua giao diện cổng USB.
-
Header cho các chân GPIO.
-
Gồm 4 LED: nguồn, RX, TX và Debug.
-
Nút nhấn Reset board mạch.
-
Có jack để cấp nguồn khi không dùng nguồn ở cổng USB.
-
Các header cho In-circuit serial programmer (ICSP), hiểu đơn giản thì đây là các header để kết nối với mạch nạp cho chip nếu không nạp thông qua cổng USB.
Giới thiệu về vi điều khiển ATmega328
Vi điều khiển (tiếng Anh là microcontroller hoặc microcontroller unit) là trái tim của các board mạch lập trình được. Nó có khả năng thực thi code khi chúng ta yêu cầu. Bên trong vi điều khiển bao gồm rất nhiều các mạch điện với các khối chức năng như CPU (Central Processing Unit), RAM (Random Access Memmory), ROM (Read Only Memory), Input/output ports, các bus giao tiếp (I2C, SPI),…
Vi điều khiển giúp chúng ta có thể giao tiếp với sensor, điều khiển thiết bị.
Board Arduino Uno R3 sử dụng vi điều khiển ATmega328 của hãng Atmel (một công ty thiết kế và chế tạo vật liệu bán dẫn ở Mỹ). ATmega328 là vi điều khiển thuộc dòng vi điều khiển 8 bits (data bus là 8 bit)
Parameter | Value |
---|---|
CPU type |
8-bit AVR |
Performance |
20 MIPS at 20 MHz |
Flash memory |
32 kB |
SRAM |
2 kB |
EEPROM |
1 kB |
Pin count |
28-pin PDIP, MLF, 32-pin TQFP, MLF |
Maximum operating frequency |
20 MHz |
Number of touch channels |
16 |
Hardware QTouch Acquisition |
No |
Maximum I/O pins |
26 |
External interrupts |
2 |
USB Interface |
No |
Chúng ta sẽ tìm hiểu sâu hơn về ATmega328 ở các chương tiếp theo của sách. Dưới đây là bảng thông số kỹ thuật của board Arduino Uno R3
Parameter | Information |
---|---|
Microcontroller |
ATmega328P |
Operating Voltage |
5V |
Input Voltage (recommended) |
7-12V |
Input Voltage (limit) |
6-20V |
Digital I/O Pins |
14 (of which 6 provide PWM output) |
PWM Digital I/O Pins |
6 |
Analog Input Pins |
6 |
DC Current per I/O Pin |
20 mA |
DC Current for 3.3V Pin |
50 mA |
Flash Memory |
32 KB (ATmega328P) of which 0.5 KB used by bootloader |
SRAM |
2 KB (ATmega328P) |
EEPROM |
1 KB (ATmega328P) |
Clock Speed |
16 MHz |
LED_BUILTIN |
13 |
Length x Width |
68.6 mm x 53.4 mm |
Weight |
25 g |
2. Arduino Nano
Arduino Nano là một board mạch sử dụng chip ATmega328 (loại Arduino Nano 3.x) hoặc dùng ATmega168 (Arduino Nano 2.x), tuy nhiên có kích thước nhỏ gọn hơn để có thể tích hợp vào các hệ thống, đi kèm với đó là 1 vài điểm khác khi so sánh với board Arduino Uno R3 :
-
Sử dụng cổng Mini-B USB thay vì cổng USB chuẩn.
-
Bổ sung thêm 2 chân Analog.
-
Không có jack nguồn DC.
3. Arduino Leonardo
Arduino Leonardo sử dụng vi điều khiển ATmega32u4, một số điểm khác biệt chính so với board Arduino Uno được liệt kê bên dưới:
-
Bên trong chip ATmega32u4 được tích hợp 1 chip usb to serial thay vì phải dùng 2 mcu trên board.
-
Có thể giả lập board Leonardo như chuột, bàn phím, joystick thay vì phải dùng 1 thiết bị serial khác. Chúng ta sẽ tìm hiểu tính năng này ở phần USB-serial.
-
Giá thành rẻ hơn (€18.00 trên www.arduino.cc)
-
20 digital I/O (7 chân PWM).
-
12 chân Analog (các chân PWM có thể được dùng như Analog)
4. Arduino mega2560
Arduino mega2560 sử dụng chip ATmega2560 với 54 chân digital I/O (15 chân có thể dùng với PWM), 16 chân Analog, 4 UARTs,… board mạch này là phiên bản nâng cao của Arduino Uno, được dùng trong các dự án phức tạp như máy in 3D, robot,…