● Cú pháp Procedure digitalWritepin: integer; value: integer; ● Tham số pin: chân digital cần thiết lập value: HIGH hoặc LOW ● Kiểu trả về Không ● Ví dụ... pinModeINPIN, INPUT; {th
Trang 1Saigon Institute of Technology
Thư Viện Lập Trình Pascal SArduino-1.3
SaigonTech Tháng 12, năm 2016
Trang 2Nội Dung
Trang 3Các hàm ngắt (interrupts) 24
Trang 41 Lịch sử chỉnh sửa
SArduino-1.0 Hỗ trợ các thư viện SArduino, SWire, SServo, SMPU6050
SArduino-1.1 Đổi tên và thêm một số hàm trong thư viện
SArduino-1.3 - Đổi tên các thư viện thành STArduino, STWire, STServo, STMPU6050
- Đổi các kiểu dữ liệu hỗ trợ
- Đổi tên các hàm giao tiếp serial
- Thay đổi bộ thư viện giao tiếp STMPU6050
2 Các kiểu dữ liệu cơ bản cho phép sử dụng
HIGH là một hằng số có giá trị nguyên là 1
Trong điện tử, HIGH là một mức điện áp lớn hơn 0V Giá trị của HIGH được định nghĩa khác nhau trong các mạch điện khác nhau, nhưng thường được quy ước ở các mức như 1.8V, 2.7V, 3.3V 5V, 12V, …
3.1.2 LOW
LOW là một hằng số có giá trị nguyên là 0
Trong điện tử, LOW là mức điện áp 0V hoặc gần bằng 0V, giá trị này được định nghĩa khác nhau trong các mạch điện khác nhau, nhưng thường là 0V
3.1.3 INPUT
Trang 5Hằng số này cấu hình 1 chân (pin) là đầu vào (INPUT)
3.1.9 MSBFIRST: bit nằm bên trái nhất
3.1.10 LSBFIRST: bit nằm bên phải nhất
3.1.11 SERIAL_5N1, SERIAL_6N1, SERIAL_7N1, SERIAL_8N1 (the default),
SERIAL_5N2, SERIAL_6N2, SERIAL_7N2, SERIAL_8N2, SERIAL_5E1, SERIAL_6E1, SERIAL_7E1, SERIAL_8E1, SERIAL_5E2, SERIAL_6E2, SERIAL_7E2, SERIAL_8E2, SERIAL_5O1, SERIAL_6O1, SERIAL_7O1, SERIAL_8O1, SERIAL_5O2, SERIAL_6O2, SERIAL_7O2, SERIAL_8O2: cấu hình: thiết lập dữ liệu, tính chẵn lẻ, và bit stop cho hàm serialBeginConfigures
3.1.12 BIN, OCT, DEC, HEX: các tham số dành cho loại hàm serialPrintFormat và
serialPrintlnFormat để chuyển sang các hệ cơ số khác (2, 8, 10, 16)
3.1.13 DEFAULT: Đặt mức điện áp tối đa là 5V (nếu trên mạch dùng nguồn 5V) hoặc là 3.3V
(nếu trên mạch dùng nguồn 3.3V)
3.1.14 INTERNAL: Đặt lại mức điện áp tối đa là 1.1 V nếu sử dụng vi điều khiển ATmega328
hoặc ATmega168 và đặt lại mức điện áp tối đa là 2.56V nếu sử dụng vi điều khiển ATmega8 Chú ý: không tồn tại tham số này trên mạch Arduino Mega
3.1.15 INTERNAL1V1: Đặt lại mức điện áp tối đa là 1.1 V (chỉ có trên Arduino Mega)
3.1.16 INTERNAL2V56: Đặt lại mức điện áp tối đa là 2.56 V (chỉ có trên Arduino Mega)
3.1.17 EXTERNAL: Đặt lại mức điện áp tối đa bằng với mức điện áp được cấp vào chân AREF
(chỉ được cấp vào chân AREF một điện áp nằm trong khoảng 0-5V) 3.2 Digital I/O
Trang 6mode: đầu vào (INPUT), đầu ra (OUTPUT) hoặc INPUT_PULLUP
digitalWrite(LEDPIN, HIGH); {bật đèn led}
digitalWrite(LEDPIN, LOW); {tắt đèn led}
- Xuất tín hiệu ra các chân digital
- Nếu một chân được thiết lập là OUTPUT bởi hàm pinMode Khi dùng hàm digitalWrite
để xuất tín hiệu HIGH thì điện thế tại chân này sẽ là 5V (hoặc là 3.3V trên mạch 3.3V), và khi xuất tín hiệu LOW thì hiệu điện thế là 0V
- Nếu một chân được thiết lập là INPUT bởi hàm pinMode Lúc này hàm digitalWrite sẽ bật (HIGH) hoặc tắt (LOW) hệ thống điện trở pullup nội bộ
● Cú pháp
Procedure digitalWrite(pin: integer; value: integer);
● Tham số
pin: chân digital cần thiết lập
value: HIGH hoặc LOW
● Kiểu trả về
Không
● Ví dụ
Trang 7digitalWrite(LEDPIN, HIGH); {bật đèn led}
delay(1000); {dừng trong 1 giây}
digitalWrite(LEDPIN, LOW); {tắt đèn led}
delay(1000); {dừng trong 1 giây}
LEDPIN = 13; { đèn LED được kết nối với chân digital 13}
INPIN = 7; {nút nhấn kết nối chân số 7}
Trang 8pinMode(INPIN, INPUT); {thiết lập chân số 7 là INPUT} end;
Procedure loop;
begin
val:= digitalRead(INPIN); {đọc giá trị từ chân số 7}
digitalWrite(LEDPIN, val); {truyền giá trị đọc được cho chân 13} end;
type: tham số nhận 1 trong các giá trị: DEFAULT, INTERNAL, INTERNAL1V1,
INTERNAL2V56 hoặc EXTERNAL Trong đó:
- DEFAULT: Đặt mức điện áp tối đa là 5V (nếu trên mạch dùng nguồn 5V) hoặc là 3.3V (nếu trên mạch dùng nguồn 3.3V)
- INTERNAL: Đặt lại mức điện áp tối đa là 1.1 V nếu sử dụng vi điều khiển ATmega328 hoặc ATmega168 và đặt lại mức điện áp tối đa là 2.56V nếu sử dụng vi điều khiển ATmega8 Chú ý: không tồn tại tham số này trên mạch Arduino Mega
- INTERNAL1V1: Đặt lại mức điện áp tối đa là 1.1 V (chỉ có trên Arduino Mega)
- INTERNAL2V56: Đặt lại mức điện áp tối đa là 2.56 V (chỉ có trên Arduino Mega)
- EXTERNAL: Đặt lại mức điện áp tối đa BẰNG với mức điện áp được cấp vào chân AREF (chỉ được cấp vào chân AREF một điện áp nằm trong khoảng 0-5V)
Trang 9- Hàm analogRead cần 100 micro giây (0.0001 s) để thực hiện
- Khi nói "đọc tín hiệu analog" thì có thể hiểu đó chính là việc đọc giá trị điện áp
val:= analogRead(ANALOGPIN); {đọc giá trị chân số 3}
serialPrintlnLong(val); {xuất giá trị đọc được} end;
Trang 10● Tham số
pin: chân phát xung
value: giá trị xung PWM Giá trị mức xung PWM nằm trong khoảng từ 0 đến 255, tương ứng với mức duty cycle từ 0% đến 100%
LEDPIN = 9; {LED kết nối digital chân số 9}
ANALOGPIN = 3; {chân đọc điện áp là chân 3}
val:= analogRead(ANALOGPIN); {đọc chân INPUT}
analogWrite(LEDPIN, val div 4); {analogRead có giá trị từ 0 1023}
- analogReadResolution là hàm mở rộng Analog API dành cho mạch Arduino Due và Zero
- Thiết lập kích cỡ-size (đơn vị bits) của giá trị trả về bởi analogRead Mặc định là 10 bits (trả về giá trị từ 0-1023)
- Phần Due and the Zero tương thích với mạch chuyển đổi tương tự ra số 12 bits,
có thể được truy cập bằng cách thay đổi độ phân giải thành 12 Do đó giá trị từ analogRead trả về sẽ trong khoảng từ 0 đến 4095
● Cú pháp
ProcedureanalogReadResolution(bits: integer);
Trang 11● Tham số
bits: xác định độ phân giải (bits) của giá trị trả về bởi hàm analgoRead, có thể thiết lập giá trị này từ 1 đến 32 Ta có thể thiết lập giá trị độ phân giải cao hơn 12 nhưng giá trị trả
về của hàm analogRead sẽ xấp xỉ khác đi như sau:
● Nếu ta set giá trị hàm analogReadResolution cao hơn độ tương thích của board, mạch Arduino sẽ trả về giá trị độ phân giải cao nhất cộng thêm phần đệm số bits
dư là những số 0
● Ví dụ: nếu ta set analogReadResolution(16), hàm sẽ trả về xấp xỉ 16 bits với 12 bits đầu tiên là giá trị đọc được thật sự từ ADC, cộng thêm 4 bits đệm là
những số 0
● Nếu ta set giá trị hàm analogReadResolution nhỏ hơn độ tương thích của board,
số bits nhỏ hơn sẽ bị bỏ qua
● Việc sử dụng độ phân giải 16 bit (hoặc cao hơn) cho phép người dùng phác họa những thiết bị xử lý tự động với mạch ADC có độ phân giải cao hơn khi những thiết bị này được sản xuất trong tương lai mà không cần thay đổi mã lệnh
bits: xác định độ phân giải (bits) của giá trị được dùng trong hàm analogWrite, có giá trị
từ 1 đến 32 Nếu ta chọn độ phân giải cao hay thấp hơn board, giá trị dùng trong hàm analogWrite sẽ bị hoặc bỏ bớt đi (cao hơn) hay có thêm phần đệm những số 0 nếu thấp hơn
- Khi chạy hàm này, chân digital phải kết nối tới buzzer hoặc loa để có thể phát được âm thanh
Trang 12- Lưu ý: hàm tone/toneDuration chỉ được gọi 1 lần Nếu hàm tone/toneDuration đang chạy trên một chân nào đó, thì khi gọi hàm tone/toneDuration thêm một lần sẽ không có hiệu lực
- Nếu tone/toneDuration lên chân đang được tone/toneDuration thì sẽ làm thay đổi tần số sóng của chân đó
- Việc sử dụng hàm tone sẽ gây nhiễu với các ngõ ra PWM (pulse width modulation) trên các chân 3 và 11 (với các mạch khác Arduino Mega)
- Chú ý: nếu bạn muốn có nhiều cao độ (pitches) khác nhau trên nhiều chân Thì trước khi tone/toneDuration trên một chân khác thì phải noTone trên chân đang được sử dụng
● Cú pháp
Proceduretone(pin: integer; frequency: integer);
ProceduretoneDuration(pin: integer; frequency: integer; duration: longint);
● Tham số
pin: Chân digital phát xung
frequency: Tần số của xung (Hz)
duration: Thời gian phát, đơn vị là mili giây
- Nếu đang giao tiếp với thiết bị được kích bằng cạnh, chân clockPin phải có giá trị LOW (bằng cách chạy lệnh digitalWrite(clockPin, LOW)) trước khi chạy shiftOut
Trang 13- Chú ý:
- Chân DataPin va chân clockPin phải được cấu hình là chân OUTPUT bằng hàm pinMode
- shiftOut chỉ xuất được dữ liệu kiểu byte Trong trường hợp muốn xuất một kiểu
dữ liệu lớn hơn thì phải shiftOut nhiều hơn 1 lần, mỗi lần là 8 bit
● Cú pháp
ProcedureshiftOut(dataPin: integer; clockPin: integer; bitOrder: integer; value: byte);
● Tham số
dataPin: Chân digital sẽ được xuất tín hiệu
clockPin: Chân digital dùng để xác nhận việc gửi từng bit ra chân dataPin
bitOrder: Có giá trị là một trong hai giá trị MSBFIRST (bắt đầu từ bit bên trái nhất) hoặc LSBFIRST (bắt đầu từ bit bên phải nhất)
value: Dữ liệu sẽ được chuyển từng bít ra chân dataPin
dataPin: pin sẽ được xuất ra tín hiệu
clockPin: pin dùng để xác nhận việc gửi từng bit của dataPin
bitOrder: một trong hai giá trị MSBFIRST hoặc LSBFIRST (Bắt đầu từ bit bên phải nhất hoặc Bắt đầu từ bit bên trái nhất)
pulseIn/pulseInTimeout để đọc tín hiệu
● Cú pháp
FunctionpulseIn(pin: integer; value: integer): longint;
FunctionpulseInTimeout(pin: integer; value: integer; timeout: longint): longint;
Trang 14● Tham số
pin: chân được chọn để đọc xung
value: kiểu để hàm đọc dữ liệu (HIGH hoặc LOW) Nếu đặt value là HIGH, hàm pulseIn
sẽ đợi đến khi tín hiệu đạt mức HIGH, khởi động bộ đếm thời gian Khi tín hiệu nhảy xuống LOW, bộ đếm thời gian dừng lại pulseIn sẽ trả về thời gian tín hiệu nhảy từ mức HIGH xuống LOW này Nếu đặt value là LOW, hàm pulseIn sẽ làm ngược lại, đó là đo thời gian tín hiệu nhảy từ mức LOW lên HIGH value có kiểu dữ liệu là int
timeout: Nếu tín hiệu luôn ở một mức HIGH/LOW cố định thì sau khoảng thời gian timeout, hàm pulseIn/pulseInTimeout sẽ dừng bộ đếm thời gian và trả về giá trị 0 timeout được tính bằng đơn vị micro giây Giá trị mặc định của timeout là 60.106 tương ứng với 1 phút Giá trị tối đa là 180.106 tương ứng với 3 phút
duration:= pulseIn(PIN, HIGH);
{Hãy nối chân 7 của Arduino vào đường tín hiệu muốn đọc xung} serialPrintlnLong(duration);
Trang 15Trả về số mili giây từ lúc bo Arduino bắt đầu chạy chương trình Giá trị này sẽ bị tràn và trở về số 0 sau khoảng 50 ngày
end;
procedure loop;
begin serialPrintString('Time: ');
loop;
end
● Mô tả
● Hàm trả về số microseconds từ khi mạch Arduino bắt đầu chạy chương trình hiện hành
Số microseconds này có thể bị tràn (trở về 0) sau khoảng 70 phút Trên mạch Arduino 16 MHz (như Duemilanove hay Nano), hàm này có độ phân giải 4 microseconds (giá trị trả
về là bội số của 4) Trên mạch Arduino 8 MHz (như LilyPad), hàm này có độ phân giải 8 microseconds
Trang 16Số microseconds từ khi mạch Arduino bắt đầu chạy chương trình hiện hành (longint)
Trang 17Hàm trả về giá trị lớn nhất trong 2 giá trị cho trước
a: số nhỏ nhất của khoảng cho trước
b: số lớn nhất của khoảng cho trước
Hàm chuyển một số từ 1 thang đo sang 1 thang đo khác: 1 giá trị fromLow sẽ map đến
toLow, 1 giá trị fromHigh sẽ map đến toHigh Giá trị trả về sau khi chuyển là số nguyên
● Cú pháp
Functionmap(value: integer; fromLow: integer; fromHigh: integer; toLow: integer; toHigh: integer): integer;
Trang 18● Tham số
value: số cần chuyển
fromLow: số nhỏ nhất của thang đo hiện hành
fromHigh: số lớn nhất của thang đo hiện hành
toLow: số nhỏ nhất của thang đo muốn chuyển đến
toHigh: số lớn nhất của thang đo muốn chuyển đến
base: cơ số (real)
exponent: lũy thừa (real)
Trang 233.10.2. random
● Mô tả
Hàm trả về giá trị ngẫu nhiên giữa 0 và một số cho trước
Lưu ý: nếu gọi hàm random mà không gọi hàm randomSeed trước thì chương trình sẽ mặc định chạy hàm randomSeed(0)
Trang 24n: bit cần đọc, từ 0 đến bit phải nhất
b: giá trị ghi: 0 hoặc 1
Trang 25● Tham số
x: số cần xóa bit n: bit cần xóa, từ 0 đến bit phải nhất
Mặc định, Arduino luôn bật các ngắt nên trong phần setup, bạn không cần gọi hàm này
để bật các ngắt Hàm interrupts sẽ bật toàn bộ các ngắt đã được cài đặt Nếu vì lý do nào đó bạn tắt các ngắt bằng hàm noInterrupts, bạn sử dụng hàm này để bật lại các ngắt
Khi cần chạy các đoạn chương trình yêu cầu chính xác về thời gian, bạn cần tắt các ngắt
để Arduino chỉ tập trung vào xử lý các tác vụ cần thiết và chỉ duy nhất các tác vụ này Các ngắt chạy nền sẽ không được thực thi sau khi gọi hàm noInterrupts
Trang 263.13 Hàm thư viện Serial
● Mô tả
Hàm lấy số bytes (ký tự) có sẵn từ 1 cổng serial để đọc Đây là dữ liệu đã được gửi đến
và lưu trữ trên buffer của serial
14400, 19200, 28800, 38400, 57600, hoặc 115200, và cấu hình dữ liệu (data bits), tính chẵn
lẻ (parity), và stop bit Mặc định là 8 bit dữ liệu, không có tính chẵn lẻ, một stop bit
● Cú pháp
Trang 27Procedure serialBeginConfigures(speed: longint; conf: string);
● Tham số
Speed: tốc độ truyền bits/giây
Conf: cấu hình dữ liệu, tính chẵn lẻ, và stop bit Một trong các giá trị: SERIAL_5N1, SERIAL_6N1, SERIAL_7N1, SERIAL_8N1 (the default), SERIAL_5N2, SERIAL_6N2,
SERIAL_7N2, SERIAL_8N2, SERIAL_5E1, SERIAL_6E1, SERIAL_7E1, SERIAL_8E1,
SERIAL_5E2, SERIAL_6E2, SERIAL_7E2, SERIAL_8E2, SERIAL_5O1, SERIAL_6O1,
SERIAL_7O1, SERIAL_8O1, SERIAL_5O2, SERIAL_6O2, SERIAL_7O2, SERIAL_8O2
Hàm vô hiệu hóa giao tiếp với serial, cho phép các chân RX (nhận) và TX (truyền) được
sử dụng cho việc nhập, xuất Để cho phép giao tiếp với serial trở lại, gọi hàm serialBegin
Trang 28terminal: chuỗi kết thúc tìm kiếm trong chuỗi cho ban đầu
Hàm trả về số thực dấu chấm động đầu tiên từ serial buffer Những ký tự không phải chữ
số (hoặc dấu trừ) sẽ bị bỏ qua Hàm serialParseFloat sẽ ngắt bởi ký tự không phải là một số thực dấu chấm động
Hàm tìm kiếm một số nguyên trong dữ liệu truyền đến serial Như sau:
- Những ký tự khởi tạo mà không phải chữ số hoặc là dấu trừ sẽ bị bỏ qua;
- Việc tìm kiếm sẽ dừng nếu thời gian cấu hình time-out hết (xem hàm serialSetTimeout) hoặc không có chữ số nào được tìm thấy;
- Nếu không có chữ số nào được tìm thấy cho đến khi thời gian cấu hình time-out hết, hàm sẽ trả về 0;
Trang 29● Mô tả
Hàm trả về byte đầu tiên trong dữ liệu truyền đến serial mà không cần loại bỏ nó ra khỏi
bộ đệm của serial, có nghĩa là nếu gọi hàm serialPeek nhiều lần sẽ cho ra một ký tự giống nhau
● Cú pháp
Function serialReadBytesUntil(character: Char; buffer: pbyte; length: integer): integer;
Trang 30buffer: con trỏ chỉ đến mảng lưu trữ char
length : số byte muốn đọc
Trang 34● BIN; OCT; DEC; HEX: in số dưới dạng binary, octal, decimal, hexadecimal
Trang 35● Số nguyên 1; 2; 3; 4…: in bao nhiêu số phần thập phân
Trang 36Function serialPrintlnLong(n: longint): longint;
Trang 37● BIN; OCT; DEC; HEX: in số dưới dạng binary, octal, decimal, hexadecimal
● Số nguyên 1; 2; 3; 4…: in bao nhiêu số phần thập phân
Trang 38address: địa chỉ của thiết bị Slave
quantity: số lượng byte yêu cầu
Trang 39wireBegin; {ket noi i2c bus}
wireRequestFrom(2, 6); {yeu cau 6 byte tu slave so 2}
while wireAvailable>0 do {slave co the ghi it hon so byte yeucau}
begin
c := wireRead; {doc 1 byte ky tu}
serialPrintString(c); {in ky tu vua doc duoc}
address: là địa chỉ của thiết bị Slave
quantity: số lượng byte yêu cầu
stop: nếu giá trị là true → gửi tín hiệu dừng xuống thiết bị, ngắt kết nối và giải phóng bus Nếu giá trị là false → gửi yêu cầu restart xuống thiết bị, vẫn giữ kết nối với thiết bị
Trang 401: dữ liệu dài hơn bộ đệm
2: nhận tín hiệu NACK (không nhận) từ slave sau khi truyền địa chỉ
3: nhận tín hiệu NACK (không nhận) từ slave sau khi truyền dữ liệu
1: dữ liệu dài hơn bộ đệm
2: nhận tín hiệu NACK (không nhận) từ slave sau khi truyền địa chỉ
3: nhận tín hiệu NACK (không nhận) từ slave sau khi truyền dữ liệu