1. Connector P1 (Các cổng GPIO trên RPi model A, B và B+, Rpi 2)
2. Relay dùng cho RPi
RPi dùng relay 5VDC (dòng 5 volt một chiều), có nhiều loại phân biệt bởi số chân cắm (5, 8, 14). Các relay này cần một đế cắm tương thích.
Cấu tạo của relay gồm một mạch điều khiển (5VDC) đóng mở mạch ngoài (DC hay AC).
Các cổng GPIO của RPi cung cấp các dòng rất nhỏ ở 3.3V nên có thể không điều khiển được relay. Vì vậy thông thường cần một IC và một điện trở để làm mạch khuếch đại.
Để tiện dùng, người ta lắp sẵn các board relay bao gồm relay và mạch khuếch đại (chợ Nhật Tảo tpHCM có bán nhiều).
3. Đấu nối RPi và relay
Mạch điều khiển được kết nối qua các chân cắm, bao gồm VCC (hay VCC+), GND (hay VCC-) và một hay nhiều IN. Chân VCC nối với chân 5V của RPi (PIN 2 hay PIN 4), chân GND nối với GND của RPi (PIN 6, 9, 14, 20, 25, 30, 34 hay PIN 39), các chân IN nối với các chân GPIO của RPi tùy nhu cầu.
Kết nối với mạch ngoài gồm các vít NC (normally close – thường đóng), Common và NO (normally open – thường mở). NC + Common / NO + Common được nối thông tùy vào trạng thái đóng/mở của relay (NC thông thì NO ngắt và ngược lại).
Với đa số board relay, điện thế 0-0.25V được xem là mức LOW, điện thế 2.5-5V được xem là mức HIGH.
4. Lập trình đóng/ngắt relay
Cài đặt wiringpi2 để lập trình trên các chân điều khiển GPIO của RPi.
apt-get install python-dev python-pip
sudo pip install wiringpi2
4.1 wiringPi định nghĩa 28 chân cắm
Dùng lệnh gpio readall để xem sơ đồ chân cắm
- wPi 0, 2-6 (BMC 17, 27, 22, 23, 24, 25): sử dụng an toàn trong mọi trường hợp
- wPi 7 (BMC 4): có thể sử dụng, tuy đã dùng bởi 1-Wire kernel driver
- PWM (BMC 18): nếu dùng có audio qua jack 3.5mm, một kênh âm thanh sử dụng pin này
- wPi 8, 9, 30, 31 (BMC 2, 3, 0, 1): pin I2C. Nếu không dùng I2C drivers thì có thể sử dụng các pin này, không có sẵn điện trờ 1.8Kohm trên board nên phải thêm vào mạch ngoài.
- wPi 10-14 (BMC 8, 7, 10, 9, 11): SPI interface. Tương tự như I2C
- wPi 15, 16 (BMC 14, 15): dùng bới UART cho Tx và Rx. Muốn dùng các pin này, phải disable serial console khi khởi động (xem /boot/cmdline.txt)
- wPi 17-20 (BMC 28-31): các pin GPIO bổ sung trên model B.
- wPi 21-29 (BMC 5, 6, 13, 19, 26, 12, 16, 20, 21): các pin bổ sung trên model B+
Chú ý là RPi là thiết bị 3.3V, nối một thành phần của RPi với 5V có thể gây hư hỏng.
4.2 wiringPi dùng với python
Gần đầu Python script cần khai báo dòng import wiringPi
import wiringpi2 as wiringpi
Đánh số các chân cắm, có 3 cách
- WiringPi pin mode
- GPIO mode
- Physical pin numbers (header P1 only)
tương ứng với 3 cách khai báo
wiringpi.wiringPiSetup()
wiringpi.wiringPiSetupGpio()
wiringpi.wiringPiSetupPhys()
Cài đặt port
wiringpi.pinMode(port_or_pin_number, X)
trong đó port_number là số GPIO port (hoặc pin)
X = 0 dùng cho input,
X = 1 dùng cho output,
X = 2 dùng cho chức năng thay thế (e.g. PWM trên port 18)
Thí dụ
# GPIO port numbers import wiringpi2 as wiringpi wiringpi.wiringPiSetupGpio() wiringpi.pinMode(25, 0) # sets GPIO 25 to input wiringpi.pinMode(24, 1) # sets GPIO 24 to output wiringpi.pinMode(18, 2) # sets GPIO 18 to PWM mode
# wiringpi numbers import wiringpi2 as wiringpi wiringpi.wiringPiSetup() wiringpi.pinMode(6, 0) # sets WP pin 6 to input wiringpi.pinMode(5, 1) # sets WP pin 5 to output wiringpi.pinMode(1, 2) # sets WP pin 1 to PWM mode
# Physical P1 header pin numbers import wiringpi2 as wiringpi wiringPiSetupPhys() wiringpi.pinMode(22, 0) # sets P1 pin 22 to input wiringpi.pinMode(18, 1) # sets P1 pin 18 to output wiringpi.pinMode(12, 2) # sets P1 pin 12 to PWM mode
Đọc từ input
my_input = wiringpi.digitalRead(port_or_pin_number)
if my_input: print "Input on Portport_or_pin_number
is 1" # then you'd code what you want to happen when portport_or_pin_number
is HIGH else: print "Input on Portport_or_pin_number
is 0" # then you'd code what you want to happen when portport_or_pin_number
is LOW
Ghi ra output
#GPIO port numbers
import wiringpi2 as wiringpi
from time import sleep
wiringpi.wiringPiSetupGpio()
wiringpi.pinMode(24, 1) # sets GPIO 24 to output
wiringpi.digitalWrite(24, 0) # sets port 24 to 0 (0V, off)
sleep(10) # wait 10s
wiringpi.digitalWrite(24, 1) # sets port 24 to 1 (3V3, on)
sleep(10) # wait 10s
wiringpi.digitalWrite(24, 0) # sets port 24 to 0 (0V, off)
Clean up khi xong việc
Trong đoạn mã trên, script kết thúc với port 24 ở mode output, ở lần truy cập sau chúng ta có thể gặp lỗi “port is already in use by another program”. Tốt nhất là đặt lại port ở mode input
wiringpi.digitalWrite(24, 0)
# sets port 24 to 0 (0V, off) – may be unnecessary, but I prefer to do it
wiringpi.pinMode(24, 0)
# sets GPIO 24 to input Mode
4.3 Minh họa
Vật dụng
- RPi model B+
- Board mạch relay
- Cáp nối
- Máy đo ohm
Đấu nối
- Dây đỏ nối pin 2 (5VDC) trên RPi với pin VCC trên board relay
- Dây đen nối pin 6 (GND) trên RPi với pin GND trên board relay
- Dây tím nối pin 11 trên RPi với pin IN1 trên board relay
- Dây trắng nối pin 12 trên RPi với pin IN2 trên board relay
Thực nghiệm
- Dùng wiringPi để thay đổi trạng thái của các pin 11 và 12, qua đó đóng/mở các relay.
- Dùng đồng hồ đo ohm để đo điện trở giữa vít Common – NO/NC để biết trạng thái đóng/mở của relay.
Mã lệnh
import wiringpi2 as wiringpi
from time import sleep
wiringpi.wiringPiSetupPhys()
wiringpi.pinMode(11, 1) # sets pin 11 to output
wiringpi.pinMode(12, 1) # sets pin 12 to output
#pin 11 off/on
wiringpi.digitalWrite(11, 0) # sets pin 11 to 0 (0V, off)
sleep(20) # wait 20s
wiringpi.digitalWrite(11, 1) # sets pin 11 to 1 (3V3, on)
sleep(20)
#pin 12 off/on
wiringpi.digitalWrite(12, 0) # sets pin 12 to 0 (0V, off)
sleep(20) # wait 20s
wiringpi.digitalWrite(12, 1) # sets pin 12 to 1 (3V3, on)
sleep(20)
#clean up
wiringpi.pinMode(11, 0) # sets P1 pin 11 to input
wiringpi.pinMode(12, 0) # sets P1 pin 12 to input
Kết quả
Bình thường NC đóng,
- gởi điện áp thấp ra pin 11/pin 12 sẽ làm NC mở/NO đóng
- gởi điện áp cao ra pin 11/pin 12 sẽ làm NC đóng/NO mở