Báo cáo Vi Điều Khiển

43 0 0
Tài liệu đã được kiểm tra trùng lặp
Báo cáo Vi Điều Khiển

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Bài báo cáo này tập trung vào nghiên cứu và phát triển các loại xe điều khiển từ xa và xe dò line. Nội dung bao gồm các phần chính sau: Giới thiệu chung: Tổng quan về xe điều khiển từ xa và xe dò line. Ứng dụng của xe điều khiển trong các lĩnh vực như giải trí, giáo dục và nghiên cứu khoa học. Xe điều khiển từ xa: Nguyên lý hoạt động và cấu tạo của xe điều khiển từ xa. Các loại xe điều khiển phổ biến trên thị trường. Phân tích chi tiết về hệ thống điều khiển, động cơ, pin và các linh kiện liên quan. Thuật toán điều khiển: Mô tả các thuật toán điều khiển xe từ xa, bao gồm thuật toán điều khiển tốc độ và hướng di chuyển. Các thuật toán xử lý tín hiệu từ bộ điều khiển để điều khiển động cơ và bánh xe. Xe dò line Nguyên lý hoạt động và cấu tạo của xe dò line. Các cảm biến được sử dụng trong xe dò line như cảm biến hồng ngoại, cảm biến quang. Ứng dụng của xe dò line trong các cuộc thi robot và trong nghiên cứu công nghệ tự động hóa. Thuật toán dò line: Mô tả các thuật toán dò line, bao gồm thuật toán theo dõi đường kẻ và điều chỉnh hướng đi. Cách sử dụng dữ liệu từ các cảm biến để điều khiển động cơ và bánh xe nhằm duy trì xe trên đường kẻ. Thiết kế và thực hiện: Quy trình thiết kế và lắp ráp một chiếc xe điều khiển và xe dò line từ đầu. Các bước cài đặt phần mềm và lập trình cho xe dò line để nó có thể theo dõi đường kẻ. Kết quả và đánh giá: Kết quả thử nghiệm và đánh giá hiệu suất của các mẫu xe. Những khó khăn gặp phải trong quá trình thực hiện và cách khắc phục. Kết luận: Tóm tắt các điểm chính của bài báo cáo. Định hướng phát triển trong tương lai cho các dự án liên quan đến xe điều khiển và xe dò line.

Trang 1

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN &TRUYỀN THÔNG VIỆT HÀN

KHOA KỸ THUẬT MÁY TÍNH & ĐIỆN TỬ

Trang 2

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN &TRUYỀN THÔNG VIỆT HÀN

KHOA KỸ THUẬT MÁY TÍNH & ĐIỆN TỬ

Trang 3

LỜI CẢM ƠN

Lời đầu tiên cho phép em gửi lời cảm ơn đến Trường Đại học Công nghệ Thôngtin & Truyền thông Việt – Hàn đã tạo điều kiện cho em với một môi trường học tậpthật ý nghĩa Bên cạnh việc học lí thuyết thì đi song song là thực hành Điều này đãgiúp em củng cố kiến thức, rèn cho mình tính tự lập trong việc tự nghiên cứu, học tậptrong môi trường thế giới đang chuyển đổi số nói chung và công nghệ thông tin nóiriêng.

Tiếp theo, em cũng xin chân thành gửi lời cảm ơn đến ThS Nguyễn Thị HuyềnTrang đã luôn góp ý, giúp đỡ, chia sẻ những kinh nghiệm, hỗ trợ em trong quá trìnhthực hiện chế tạo xe Robocar cho cuộc thi và cuối kì môn học Điều này đã là nguồnđộng viên quý báu giúp em những thách thức, khó khăn và phát triển không ngừngtrong quá trình nghiên cứu và học tập.

Em xin chân thành cảm ơn.

Nhóm sinh viên thực hiện

Trang 6

2.1.3 Các chân vào/ra của Arduino Uno R3 5

2.1.4 Ứng dụng của Arduino Uno R3 6

Trang 8

DANH MỤC CỤM TỪ VIẾT TẮT

Trang 9

Hình 7 Module điều khiển động cơ L298N 10

Hình 8 Sơ đồ khối xe điều khiển 14

Hình 9 Sơ đồ mạch xe Tank 21

Hình 10 Sơ đồ mạch điều khiển cánh tay 21

Hình 11 Lưu đồ thuật toán xe điều khiển 22

Hình 12 Mã nguồn xe điều khiển(Tank) 23

Hình 13 Mã nguồn điều khiển cánh tay 24

Hình 14 Sơ đồ khối xe tự hành 25

Hình 15 Sơ đồ mạch xe tự hành 29

Hình 16 Lưu đồ thuật toán xe tự hành 30

Trang 10

DANH MỤC BẢNG BIỂU

Bảng 1 Cấu hình sơ đồ chân L298N 10Bảng 2 Linh kiện xe điều khiển 18Bảng 3 Link kiện xe tự hành 28

Trang 11

PHẦN 1:TỔNG QUAN

1.1 Giới thiệu về Robocar

Robocar là cuộc thi được tổ chức thường niên do khoa Kỹ Thuật Máy Tính &Điện Tử của trường VKU tổ chức cho những sinh viên đã hoặc đang theo học họcphần Vi Điều Khiển.

Cuộc thi với hình thức theo nhóm, mỗi nhóm từ 8-9 người Nhiệm vụ là phải tựchế tạo và thiết kế 2 xe (Racing Car và Self-driving Car) để tham gia đường đua vớithể thức tiếp sức gồm 2 phần: đường đua Autonomous Car, đường đua Racing Car, cácxe phải hoàn thành đường đua với những nhiệm vụ được BTC định sẵn.

Và 2 xe này cũng là sản phẩm để thi kết thúc học phần môn Vi Điều Khiển, vớiyêu cầu xe phải chạy được và hiểu được thuật toán, cách thức hoạt động của xe.

1 2 Mục tiêu

Mục tiêu của cuộc thi Robocar thứ nhất là để tạo sân chơi cho các sinh viên cóthể giao lưu, cạnh tranh với nhau, tiếp đến là có thể ứng dụng các kiến thức đã đượchọc qua học phần Vi Điều Khiển vào thực tế.

Tìm hiểu về các linh kiện điện tử như: Động cơ DC 5V, Arduino UNO R3,ESP32, mạch điều khiển động cơ L298N… hiểu được nguyên lí hoạt động và cách nốidây, từ đó có thể kết hợp các linh kiện lại với nhau để có thể tạo ra sản phẩm mongmuốn.

Tạo ra được Xe điều khiển bánh xích với cánh tay gắp và Xe tự hành (Dò line)có thể hoạt động tốt Hai xe phải được thiết kế đẹp cũng như tối ưu được khả nănghoạt động, chạy nhanh, không lỗi và có thể tiết kiệm được chi phí.

1.3 Phần mềm thiết kế1.3.1 Arduino IDE

Arduino IDE được viết tắt (Arduino Integrated Development Environment) làmột trình soạn thảo văn bản, giúp bạn viết code để nạp vào bo mạch Arduino.

Khi người dùng viết mã và biên dịch, IDE sẽ tạo file Hex cho mã File Hex làcác file thập phân Hexa được Arduino hiểu và gửi đến bo mạch bằng cáp USB Mỗi bo

Trang 12

Arduino đều được tích hợp một bộ vi điều khiển, bộ vi điều khiển sẽ nhận file Hex vàchạy theo mã được viết.

Hình 1 Phần mềm Arduino IDE

Hình 2 Proteus 8 Professional

Trang 13

+ Tạo bản vẽ sơ đồ+ Vẽ mạch mô phỏng+ Thiết kế mạch PCB+ Tạo Hình Ảnh 3D+ Tạo hoá đơn vật liệu

Ngoài những ưu điểm như giúp người dùng có thể tương tác với các mô phỏngchạy thử, sử dụng công tắc… Có sẵn dụng cụ ảo đo điện thì phần mềm vẫn có nhượcđiểm đó là giao diện vẫn chưa thân thiện với người dùng.

Trang 14

PHẦN 2: CƠ SỞ LÝ THUYẾT

2.1 Arduino Uno R3

2.1.1 Giới thiệu về Arduino Uno R3

Arduino Uno R3 được sử dụng vi điều khiển ATmega328, tương thích với hầuhết các loại Arduino Shield trên thị trường, có thể gắn thêm các module mở rộng đểthực hiện thêm các chức năng như điều khiển motor, kết nối wifi hay các chức năngkhác

Sử dụng ngôn ngữ lập trình C, C++ hoặc Arduino, một ngôn ngữ bắt nguồn từC, C++ trên phần mềm riêng cho lập trình Arduino IDE.

Hình 3 Arduino Uno R3

2.1.2 Các chân nguồn

Arduino Uno R3 được cấp nguồn 5V qua cáp usb hoặc cấp nguồn ngoài thôngqua Adaptor chuyển đổi, với điện áp khuyên dùng là khoảng 6-9V Có thể cấp nguồntừ máy tính qua cổng usb về

● Các chân 5V, 3.3V là chân dùng để cấp nguồn đầu ra cho các thiết bị chứ khôngphải chân cấp nguồn vào.

4

Trang 15

Vin (Voltage Input): Dùng để cấp nguồn ngoài cho Arduino Uno, nối dương

cực vào chân nà và cực âm vào chân GND.

GND(Ground): Cực âm của nguồn điện cấp cho Arduino Uno Khi sử dụng

các thiết bị sử dụng những nguồn điện riêng biệt thì phải nối các chân này.

IOREF: Điện áp hoạt động của Arduino, có mức điện áp là 5V Không được sử

dụng để lấy nguồn từ chân này.

RESET: Việc nhấn nút RESET trên mạch arduino tương tự như khi nối chân

RESET với GND qua điện trở 10KΩ.

2.1.3 Các chân vào/ra của Arduino Uno R3

Arduino Uno R3 có 14 chân digital dùng để đọc ghi dữ liệu Chúng chỉ hoạt độngở 2 mức điện áp 0V và 5V với các dòng vào/ra tối đa trên mỗi chân là 40 mA

* Một số chân digital có chức năng đặc biệt như:

2 chân Serial: 0(RX) và 1(TX): dùng để gửi (transmit TX) và nhận (Receive

-RX) dữ liệu TTL Serial Arduino Uno có thể giao tiếp với các thiết bị khác thông qua2 chân này, như gắn thêm màn hình LCD để hiển thị.

- Chân PWM: 3, 5,6,9, 10 và 11: Cho phép bạn xuất xung PWM với độ phân giải

8 bit(giá trị từ 0 -> 28-1 tương ứng với 0 - 5V

- Chân giao tiếp SPI: 10(SS), 11(MOSI), 12(MISO), 13(SCK) Ngoài chức năng

thông thường, 4 chân này có thể truyền phát dữ liệu bằng giao thức SPI tới các thiết bịkhác

- LED 13: Trên arduino có 1 đèn led, khi bấm nút reset thì đèn led này sẽ nhấp

nháy để báo hiệu Nó được nối với chân số 13 Khi chân này được sử dụng, đèn led sẽsáng.

- Arduino Uno R3 có 6 chân analog (A0 -> A5) cung cấp độ phân giải 10 bit(0 →210-1) để đọc giá trị điện áp trong khoảng 0 -> 5V.

- Arduino Uno còn có 2 chân A4(SDA) và A5(SCL) để hỗ trợ giao tiếp I2C/TWIvới các thiết bị khác.

Trang 16

2.1.4 Ứng dụng của Arduino Uno R3

Arduino Uno R3 được sử dụng phổ biến trong việc tự thiết kế ra các mạch điệntử như điều khiển led, gửi dữ liệu lên lcd, điều khiển motor hay được gắn thêm cácShield để kết nối nhiều module cảm biến khác để thực hiện thêm nhiều chức năng mởrộng như gửi dữ liệu qua wifi.

Ngoài ra, trên thị trường còn có nhiều biến thể của Arduino Uno để thực hiệnthêm các tính năng chuyên dụng, ví dụ như mCore, Orion trên mBot được chuyêndụng với việc dễ dàng phân biệt các loại module nào có thể sử dụng cắm vào trên cáccổng để trẻ dễ dàng sử dụng

Hình 4 Ứng dụng Arduino Uno R3

Trang 17

+ Ở chế độ SLAVE: bạn cần thiết lập kết nối từ smartphone, laptop, usb bluetoothđể dò tìm module sau đó pair với mã PIN là 1234 Sau khi pair thành công, bạn đã có 1cổng serial từ xa hoạt động ở baud rate 9600.

Trang 18

+ Ở chế độ MASTER: module sẽ tự động dò tìm thiết bị bluetooth khác (1 modulebluetooth HC-06, usb bluetooth, bluetooth của laptop…) và tiến hành pair chủ độngmà không cần thiết lập gì từ máy tính hoặc smartphone.

Module Bluetooth thu phát HC-05 được thiết kế nhỏ gọn ra chân tín hiệu giaotiếp cơ bản và nút bấm để vào chế độ AT COMMAND, mạch được thiết kế để có thểcấp nguồn và giao tiếp qua 3.3VDC hoặc 5VDC, thích hợp cho nhiều ứng dụng khácnhau: Robot Bluetooth, điều khiển thiết bị qua Bluetooth….

Hình 6 Bluetooth HC-05

Trang 19

2.2.1 Thông số kỹ thuật Module Thu Phát Bluetooth HC-05

● Điện áp hoạt động: 3.3 ~ 5VDC

● Mức điện áp chân giao tiếp: TTL tương thích 3.3VDC và 5VDC.

● Dòng điện khi hoạt động: khi Pairing 30 mA, sau khi pairing hoạt động truyềnnhận bình thường 8 mA.

● Baudrate UART có thể chọn được: 1200, 2400, 4800, 9600, 19200, 38400,57600, 115200

● Support profiles: Bluetooth serial port (master and slave)

● Bluetooth protocol: Bluetooth specification v2.0 + EDR

● Frequency: 2.4 GHz ISM band

● Modulation: GFSK (Gaussian frequency shift keying)

● Transmit power: =4 dBm, class 2

● Thiết lập UART mặc định: Baudrate 9600, N, 8, 1.

● Pairing code mặc định: 1234 hoặc 0000.

Trang 20

● Để vào chế độ AT COMMAND, bấm và giữ nút trước khi cấp nguồn, LED sẽnháy 2s baud rate cho chế đọ AT COMMAND là 38400 Chân TX nối với chânRX Lưu ý các lệnh AT đều là chữ in hoa.

● Cấp nguồn và không nhấn nút sẽ chạy bình thường LED sẽ nháy nhanh

● Chân EN chỉ nhận mức logic TTL 3V3 Không có chức năng chọn vào chế độAT COMMAND.

2.3 Module điều khiển động cơ L298N

L298N là module điều khiển động cơ trong các xe DC và động cơ bước.Module có một IC điều khiển động cơ L298 và một bộ điều chỉnh điện áp 5V 78M05.Module L298N có thể điều khiển tối đa 4 động cơ DC hoặc 2 động cơ DC với khảnăng điều khiển hướng và tốc độ.

Hình 7 Module điều khiển động cơ L298N

Trang 21

*

* Cấu hình sơ đồ chân L298N

Bảng 1 Cấu hình sơ đồ chân L298N

Tên chân Mô tả

IN1 & IN2 Các chân đầu vào điều khiển hướng quay động cơ A

IN3 & IN4 Các chân đầu vào điều khiển hướng quay của Động cơ B

ENA Kích hoạt tín hiệu PWM cho Động cơ A

VIB Kích hoạt tín hiệu PWM cho Động cơ B

OUT1 & OUT2 Chân đầu ra cho động cơ A

OUT3 & OUT4 Chân đầu ra cho Động cơ B

12V Đầu vào cấp nguồn 12

Trang 22

5V Cấp nguồn cho mạch logic bên trong IC L298N

GND Chân nối đất

2.4 Động cơ servo SG90

Động cơ Servo SG90 là một loại động cơ được sử dụng rộng rãi trong các dự ánlập trình Arduino Dưới đây là một số thông tin về nó:

Cấu tạo bên trong động cơ Servo SG90:

+ Động cơ DC: Tạo chuyển động quay của trục đầu ra bằng cách cấp điện áp.+ Hệ thống điều khiển: Bao gồm bộ điều khiển và mạch phản hồi Bộ điều khiểnnhận tín hiệu từ nguồn điều khiển (như Arduino) và điều chỉnh tín hiệu để kiểmsoát chuyển động của động cơ Mạch phản hồi (potentiometer) cung cấp thông tinvề vị trí hiện tại của động cơ.

+ Hệ thống giảm tốc: Động cơ Servo SG90 thường đi kèm với hệ thống giảm tốcđể tăng lực xoắn và giảm tốc độ quay Hệ thống này giúp đạt độ chính xác cao hơntrong việc điều chỉnh vị trí.

+ Hoạt động của động cơ Servo SG90:

+ Nhận tín hiệu điều khiển: Tín hiệu PWM (Pulse Width Modulation) từ nguồnđiều khiển (như Arduino) điều chỉnh vị trí.

+ Điều chỉnh vị trí: Bộ điều khiển so sánh tín hiệu điều khiển với vị trí hiện tại củađộng cơ Dựa trên sự khác biệt, bộ điều khiển điều chỉnh tín hiệu để tạo ra chuyểnđộng quay.

+ Phản hồi vị trí: Mạch phản hồi gửi thông tin về vị trí hiện tại của động cơ cho bộđiều khiển.

Sơ đồ chân động cơ Servo SG90:

+ 5V: Chân dương cấp nguồn cho động cơ servo.+ GND: Chân âm nối đất.

+ Control: Chân tín hiệu điều khiển để điều chỉnh vị trí của động cơ (được gửi dướidạng xung PWM).

12

Trang 23

2.5 Động cơ motor DC 5V

* Động cơ DC 5V là loại động cơ điện một chiều sử dụng nguồn điện áp 5V để

hoạt động Loại động cơ này thường được sử dụng trong các ứng dụng điện tử nhỏgọn, yêu cầu tiêu thụ điện thấp và dễ dàng điều khiển.

* Cấu tạo:

- Roto: Là phần quay của động cơ, bao gồm các lõi thép dẫn điện.

- Stator: Là phần cố định của động cơ, bao gồm các cuộn dây tạo ra từ trường.- Bộ góp: Là bộ phận giúp chuyển đổi hướng dòng điện trong roto để tạo ra chuyển

động quay liên tục.

- Chổi than: Là bộ phận tiếp xúc với bộ góp để truyền dòng điện vào roto.

* Nguyên lý hoạt động: Khi cung cấp điện áp 5V cho động cơ, dòng điện sẽ chạy

qua các cuộn dây ở stato, tạo ra từ trường Từ trường này tương tác với từ trường của roto, tạo ra mô-men xoắn làm roto quay Hướng quay của roto phụ thuộc vào hướng của dòng điện trong các cuộn dây stato.

Trang 24

- Động cơ DC 5V được sử dụng rộng rãi trong các thiết bị điện tử nhỏ gọn như đồ chơi, robot, máy in, quạt, v.v.

- Cũng được sử dụng trong các ứng dụng tự động hóa và điều khiển.

* Một số lưu ý khi sử dụng động cơ DC 5V:

- Nên sử dụng nguồn điện ổn định để đảm bảo động cơ hoạt động trơn tru.- Tránh để động cơ hoạt động quá tải trong thời gian dài.

- Vệ sinh động cơ định kỳ để loại bỏ bụi bẩn và bôi trơn các bộ phận chuyển động.

14

Trang 25

● Nguồn điện (Power Supply):

Chức năng: Cung cấp năng lượng cho toàn bộ hệ thống Robocar.Thành phần: Pin hoặc ắc quy.

Lưu ý: Nên bổ sung thêm khối Power Management để quản lý năng lượng hiệu quả,bao gồm:

Chuyển đổi nguồn: Chuyển đổi điện áp từ pin sang điện áp phù hợp cho các khốikhác.

Quản lý năng lượng: Theo dõi mức năng lượng pin, điều chỉnh mức tiêu thụ điệnnăng để tối ưu hóa thời gian hoạt động.

Trang 26

● Vi điều khiển (Microcontroller):

Chức năng: Xử lý dữ liệu từ các cảm biến, điều khiển động cơ, xử lý thông tin từ hệthống định vị và giao tiếp.

Thành phần: Arduino, Raspberry Pi, hoặc các vi điều khiển khác.

Lưu ý: Vi điều khiển đóng vai trò trung tâm điều khiển, cần có khả năng xử lý đanhiệm, quản lý bộ nhớ hiệu quả.

● Cảm biến (Sensors):

Chức năng: Thu thập thông tin về môi trường xung quanh và trạng thái của Robocar.Thành phần: Cảm biến hồng ngoại (IR), cảm biến siêu âm (Ultrasonic), camera, cảmbiến gia tốc (Accelerometer), cảm biến độ nghiêng (Gyroscope), v.v.

Lưu ý: Nên bổ sung thêm các loại cảm biến khác như cảm biến khoảng cách, cảmbiến nhiệt độ, cảm biến ánh sáng để tăng khả năng nhận biết môi trường của Robocar.

● Động cơ và bộ điều khiển động cơ (Motor and Motor Driver):

Chức năng: Điều khiển chuyển động của Robocar.

Thành phần: Động cơ DC, động cơ servo, động cơ bước (Stepper motor), và bộ điềukhiển động cơ (Motor drivers).

Lưu ý: Nên bổ sung thêm khối Motion Control để quản lý và điều khiển chuyển độngcủa Robocar, bao gồm:

Điều khiển tốc độ: Điều chỉnh tốc độ của động cơ.

Điều khiển hướng: Điều khiển hướng di chuyển của Robocar.Điều khiển vị trí: Điều khiển vị trí chính xác của Robocar.

● Giao tiếp (Communication):

16

Trang 27

Chức năng: Giao tiếp không dây hoặc có dây để điều khiển Robocar từ xa hoặc thuthập dữ liệu.

Thành phần: Module Bluetooth, Wi-Fi, hoặc RF.

Lưu ý: Nên bổ sung thêm khối Communication System để quản lý các giao thứctruyền thông, đảm bảo tính ổn định và an toàn trong quá trình giao tiếp.

● Khung xe (Chassis):

Chức năng: Cấu trúc vật lý hỗ trợ tất cả các thành phần khác.

Thành phần: Khung xe bằng nhựa, kim loại hoặc vật liệu khác phù hợp với thiết kế.Lưu ý: Nên lựa chọn vật liệu phù hợp với trọng lượng, kích thước và mục đích sửdụng của Robocar.

● Hệ thống điều khiển (Control System):

Chức năng: Xử lý thông tin từ các cảm biến, đưa ra quyết định và điều khiển các bộphận của Robocar.

Thành phần: Thuật toán điều khiển, logic điều khiển, giao diện người dùng.

3.1.3. Nguyên lý hoạt động

Xe điều khiển từ xa (RC) hoạt động dựa trên sự kết hợp giữa hai bộ phận chính:

bộ điều khiển và xe điều khiển.* Bộ điều khiển:

Trang 28

 Thiết bị cầm tay, ứng dụng điện thoại: Đây là bộ phận bạn cầm trong tay đểđiều khiển xe và cánh tay.

 Cần điều khiển: Thường có hai cần điều khiển chính:

o Cần điều khiển hướng: Dùng để điều khiển xe di chuyển tiến, lùi, trái vàphải.

o Cần điều khiển tốc độ: Dùng để điều khiển tốc độ di chuyển của xe.

 Nút bấm chức năng: Ngoài ra, bộ điều khiển có thể có các nút bấm chức năngkhác để điều khiển các tính năng phụ của xe, như bật đèn, còi, v.v Đối với cánhtay thì là đóng, mở tay gắp, xoay đế, v.v.

 Bộ thu sóng, bluetooth điện thoại: Bộ thu sóng nhận tín hiệu từ bộ điều khiển vàtruyền đến bo mạch chủ của xe.

* Xe điều khiển:

 Bo mạch chủ: Là trung tâm điều khiển của xe, nhận tín hiệu từ bộ thu sóng vàđiều khiển động cơ, servo, v.v.

 Động cơ: Cung cấp năng lượng cho xe di chuyển.

 Servo: Các bộ phận cơ điện nhỏ, dùng để điều khiển các bộ phận chuyển độngcủa xe, như bánh lái, phuộc nhún, v.v.

 Bộ thu sóng: Nhận tín hiệu từ bộ điều khiển và truyền đến bo mạch chủ của xe.

 Pin: Cung cấp năng lượng cho xe hoạt động.

18

Ngày đăng: 14/06/2024, 12:23

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan