Thứ Năm, 13 tháng 3, 2014

Sử dụng Raspberry Pi để điều khiển từ xa các thiết bị điện tử

Giới thiệu
Để sử dụng điều khiển từ xa trên Raspberry Pi với giao diện đồ họa XBMC (Raspbmc), xem bài viết ở đây, hướng dẫn cụ thể và đơn giản:
Tuy nhiên, bài viết trên đề cập cách dùng điều khiển từ xa để điều khiển Raspberry Pi, còn bài viết này nói về cách sử dụng Raspberry Pi để điều khiển từ xa các thiết bị điện tử (như TV, đầu đĩa DVD, đầu thu truyền hình kỹ thuật số, điều hòa nhiệt độ, máy quay phim, cửa cuốn... nói chung là bất kỳ thiết bị điện tử gì có kèm theo remote hồng ngoại, mà không cần remote hồng ngoại).
Những đoạn màu xanh trong bài viết này là phần nâng cao, mở rộng thêm và có thể bỏ qua.

Yêu cầu phần cứng
- Raspberry Pi phiên bản 2 (phiên bản 1 cũng sử dụng được)
- Thẻ nhớ SD (dung lượng 1 GB trở lên)
- Nguồn USB 5V để cấp điện cho Raspberry Pi
- Màn hình (TV) có cổng HDMI hoặc cổng composite, cáp HDMI hoặc composite (chỉ cần lúc ban đầu)
- Bàn phím USB (chỉ cần lúc ban đầu)
- Cáp mạng nối vào cổng RJ-45 của Raspberry Pi
- Mắt nhận hồng ngoại 3 chân TSOP ???? (có thể mua ở các cửa hàng điện tử, giá rẻ bèo)
- LED phát hồng ngoại (có thể mua ở các cửa hàng điện tử, giá rẻ bèo)
- Một vài sợi cáp hai đầu cái để nối các chân GPIO với các chân của mắt hồng ngoại
- Transistor NPN, một số điện trở (không bắt buộc, xem chi tiết mạch phát hồng ngoại bên dưới)

Chuẩn bị
- Nối mắt nhận hồng ngoại vào các chân GPIO (hình vẽ minh họa cho mắt nhận hồng ngoại 3 chân TSOP ???? màu đen mua ở Nhật Tảo, chú ý không phải mắt nhận hồng ngoại nào cũng có lược đồ chân như thế này - tham khảo bảng thông số kỹ thuật datasheet hoặc dùng ohm kế để kiểm tra), chân + bắt buộc phải là +3.3V (nối vào +5V có thể làm cháy mắt nhận hồng ngoại), chân - bắt buộc phải là GND (ví dụ chân 6), chân data nối vào một chân GPIO, mặc định là GPIO 18, tức chân 12:
+-----------------------+ 3
|               data -> +---------------------o GPIO-PIN12 (GPIO18)
|                       |
|      ______________   |
|     /                 |
|    (                  | 2  
|     \______________ + +---------------------o GPIO-PIN1 (+3.3V)
|                       |
|                       | 1
|                     - +---------------------o GPIO-PIN6 (GND)
+-----------------------+
- LED hồng ngoại anode (cực +, chân dài, cạnh tròn, bản cực nhỏ) nối vào một chân GPIO, mặc định là GPIO 17 (tức chân 11), cathode (cực -, chân ngắn, cạnh phẳng, bản cực to) nối vào chân GND (ví dụ chân 9).
- Cài đặt hệ điều hành Raspbian vào thẻ nhớ, cắm thẻ nhớ, màn hình, bàn phím, cáp mạng và cắm điện để khởi động Raspberry Pi.
Hướng dẫn cài đặt Raspbian vào thẻ nhớ http://elinux.org/RPi_Easy_SD_Card_Setup
Lý do sử dụng Raspbian là vì mặc định nó không khởi động giao diện đồ họa và không có các dịch vụ phụ, những thứ này có thể làm cho tín hiệu hồng ngoại phát ra bị sai lệch về timing, khiến cho cảm biến hồng ngoại của các thiết bị điện tử không hiểu được.
Sau khi đã cấu hình lần đầu, có thể bỏ màn hình, bàn phím (chỉ cần cắm cáp mạng để truy cập qua ssh, ví dụ ssh -l pi 192.168.0.104 với 192.168.0.104 là địa chỉ IP của Raspberry Pi, mật khẩu là raspberry, có thể đổi mật khẩu sau khi truy cập để tăng tính bảo mật).

Thao tác
- Chạy lệnh ls /dev/lirc0 để xem thiết bị /dev/lirc0 đã có chưa, nếu chưa thì chạy lệnh sudo modprobe lirc_rpi để nạp trình điều khiển. Nếu mắt nhận hồng ngoại được nối đúng, sẽ có thiết bị /dev/lirc0 được tạo ra, chạy lệnh dmesg để xem chi tiết.
Nếu chân data của mắt thu không nối vào chân mặc định (GPIO 18, tức chân 12), sử dụng tùy chọn gpio_in_pin. Nếu chân data của mắt phát không nối vào chân mặc định (GPIO 17, tức chân 11), sử dụng tùy chọn gpio_out_pin
Ví dụ: sudo modprobe lirc_rpi gpio_in_pin=0 gpio_out_pin=1
tức là chân GPIO 0 (chân 3) để nhận và chân GPIO 1 (chân 5) để phát hồng ngoại.
hoặc tạo /etc/modules.d/lirc.conf với nội dung:
options lirc_rpi gpio_in_pin=0 gpio_out_pin=1
hoặc đơn giản nhất là thêm lirc_rpi gpio_in_pin=0 gpio_out_pin=1 vào /etc/modules để tự nạp trình điều khiển lirc_rpi khi khởi động
Xem thêm ở đây: http://aron.ws/projects/lirc_rpi/

- Cài đặt lirc (cần kết nối Internet)
sudo apt-get install lirc
- Dịch vụ lirc vào thời điểm này không chạy do chưa có tập tin cấu hình /etc/lirc/lircd.conf hợp lệ. Trước khi tạo ra tập tin cấu hình, kiểm tra xem mắt nhận hồng ngoại có hoạt động không bằng cách chạy lệnh
mode2 -d /dev/lirc0
và bấm các phím trên điều khiển từ xa, sẽ có các dòng pulse và space được in ra trên màn hình, đó là dấu hiệu tốt cho thấy mắt nhận hồng ngoại đã được kết nối đúng và đang hoạt động. Chỉ tiếp tục khi nhìn thấy các dòng pulsespace được in ra.
- Chạy lệnh irrecord -list-namespace để biết các namespace được hỗ trợ. Namespace của một phím trên điều khiển từ xa sẽ xác định cách ứng xử của các chương trình ứng dụng (chẳng hạn XBMC) khi phím đó được bấm. Ví dụ nếu một phím được gán namespace KEY_VOLUMEUP, thì phím đó có tác dụng tăng âm lượng trong chương trình ứng dụng, nhưng nếu được gán namespace là KEY_UP thì nó có tác dụng như phím mũi tên Up trên bàn phím.
- Chạy lệnh irrecord -d /dev/lirc0 ~/lircd.conf
và làm theo hướng dẫn (bước này mất thời gian nhưng cực kỳ quan trọng). Mục đích của bước này là tạo ra tập tin lircd.conf lưu cấu hình của điều khiển từ xa.
Đầu tiên là đọc hiểu nội dung thông báo, ấn Enter, đọc hiểu thêm một lần nữa, ấn Enter, ấn một loạt các phím liên tiếp trên điều khiển từ xa đến khi đủ hai dòng dấu chấm.
Nhập tên namespace cho một phím, ấn Enter và bấm phím đó trên điều khiển từ xa. Tiếp tục như vậy cho đến hết. Khi không còn phím nào nữa, ấn Enter.
Bước cuối cùng là ấn nhanh và liên tục một phím tùy ý (nhấn nhả phím nhiều lần chứ không nhấn lâu) để irrecord xác định toggle bit mask. Kết thúc bước này irrecord sẽ tạo ra tập tin cấu hình lircd.conf cho điều khiển từ xa.
- Sau khi lircd.conf đã được tạo ra thành công, sửa tham số name trong lircd.conf nếu cần thiết. Ví dụ nội dung một tập tin lircd.conf:
#
# contributed by Pham Thanh Nam
#
# brand: Sony
# model no. of remote control: RM-952
# devices being controlled by this remote: Sony TV
#


begin remote


 name  Sony-RM-952
 bits           12
 flags SPACE_ENC|CONST_LENGTH
 eps            30
 aeps          100


 header       2440   560
 one          1236   561
 zero          631   561
 gap          45267
 min_repeat      2
#  suppress_repeat 2
#  uncomment to suppress unwanted repeats
 toggle_bit_mask 0x0


     begin codes
         KEY_MUTE                 0x290
         KEY_INFO                 0x5D0
         KEY_POWER                0xA90
         KEY_MENU                 0xFD0
         KEY_SWITCHVIDEOMODE      0xA50
         KEY_DISPLAYTOGGLE        0x1D0
         KEY_1                    0x010
         KEY_2                    0x810
         KEY_3                    0x410
         KEY_4                    0xC10
         KEY_5                    0x210
         KEY_6                    0xA10
         KEY_7                    0x610
         KEY_8                    0xE10
         KEY_9                    0x110
         KEY_DIGITS               0xB90
         KEY_0                    0x910
         KEY_BACK                 0xDD0
         KEY_SOUND                0x150
         KEY_AB                   0xE90
         KEY_VOLUMEUP             0x490
         KEY_VOLUMEDOWN           0xC90
         KEY_CHANNELUP            0x090
         KEY_CHANNELDOWN          0x890
         KEY_SLEEP                0x3D0
         KEY_WAKEUP               0x6D0
         KEY_RED                  0x2F0
         KEY_YELLOW               0xAF0
         KEY_GREEN                0x3F0
         KEY_BLUE                 0x270
     end codes


end remote

- Nếu sử dụng nhiều hơn một điều khiển từ xa, chỉ cần ghép nối các tập tin lircd.conf (chú ý sửa tham số name), ví dụ chạy irrecord -d /dev/lirc0 ~/lircd1.conf cho điều khiển từ xa số 1, và irrecord -d /dev/lirc0 ~/lircd2.conf cho điều khiển từ xa số 2, sau đó sửa tham số name trong lircd1.conf và lircd2.conf, cuối cùng là ghép nối bằng cách chạy lệnh:
cat lircd1.conf lircd2.conf > lircd.conf
- Đặt tập tin cấu hình lircd.conf vào đúng vị trí
sudo cp ~/lircd.conf /etc/lirc/lircd.conf

- Sửa đổi tập tin /etc/lirc/hardware.conf bằng chương trình vi hoặc nano (hy vọng bạn biết cách sửa đổi tập tin văn bản với giao diện dòng lệnh của Linux), chẳng hạn bằng lệnh sudo nano /etc/lirc/hardware.conf
Trong tập tin, tham số LIRCD_ARGS sửa thành --uinput, DRIVER sửa thành default, DEVICE sửa thành /dev/lirc0, MODULES sửa thành lirc_rpi (xem nội dung bên dưới)
Nội dung /etc/lirc/hardware.conf
# /etc/lirc/hardware.conf
#
# Arguments which will be used when launching lircd
LIRCD_ARGS="--uinput"


# Don't start lircmd even if there seems to be a good config file
# START_LIRCMD=false


# Don't start irexec, even if a good config file seems to exist.
# START_IREXEC=false


# Try to load appropriate kernel modules
LOAD_MODULES=true


# Run "lircd --driver=help" for a list of supported drivers.
DRIVER="default"
# usually /dev/lirc0 is the correct setting for systems using udev
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"


# Default configuration files for your hardware if any
LIRCD_CONF=""
LIRCMD_CONF=""
- Khởi động dịch vụ lirc
sudo service lirc start
- Kiểm tra lại bằng cách chạy lệnh irw và ấn các phím trên điều khiển từ xa. irw sẽ in ra trạng thái, tên phím cũng như tên của điều khiển từ xa (trong tham số name của lircd.conf)
- Phát tín hiệu điều khiển từ xa bằng lệnh irsend, ví dụ:
irsend SEND_ONCE Sony-RM-952 KEY_CHANNELUP
(ở đây Sony-RM-952 là tên của điều khiển từ xa trong lircd.conf, KEY_CHANNELUP là namespace đã gán cho phím tăng kênh trên điều khiển từ xa, chạy man irsend để biết thêm cách sử dụng irsend)

Mở rộng
Yêu cầu một số kiến thức điện tử cơ bản.
LED hồng ngoại nối trực tiếp vào các chân GPIO chỉ có thể hoạt động ở khoảng cách ngắn. Để tăng khoảng cách điều khiển từ xa, cần chế tạo mạch phát hồng ngoại. Sau đây là một mạch phát hồng ngoại đơn giản, tham khảo từ http://aron.ws/projects/lirc_rpi/
                GPIO-PIN2 (+5V)
                     o
                     |
                    | | 51 Ohm
                    |_|
                     |
                    _|_
                    \ /  --> TSAL5300*
                    ---  --> IR LED
                     |
          *BC337     |
        ___      |---'
 o-----|___|-----|
        10K      |->--
GPIO-PIN11            |
(GPIO17)             |
                   ----- GPIO-PIN6 (GND)
                    ---
                     -
Có thể sử dụng transistor NPN khác thay cho transistor BC337 cũng như LED hồng ngoại khác thay cho TSAL5300, nhưng khi đó cần thay đổi các giá trị điện trở. Tham khảo cách tính các giá trị điện trở ở http://elinux.org/RPi_Tutorial_EGHS:LED_output
Transistor có 3 chân, trong hình trên chân B (base) nối vào GPIO17 qua điện trở 10K, chân E (emitter) có mũi tên nối đất, chân C (collector) nối vào cathode (chân ngắn, cạnh phẳng) của LED hồng ngoại. Với transistor C828, mặt phẳng hướng về phía trước, từ trái qua phải là ECB. Xác định các chân transistor bằng đồng hồ đo điện (google với từ khóa ohmmeter transistor).
- R1 (mắc nối tiếp với LED hồng ngoại) được tính theo điện áp và dòng qua LED. Ví dụ với LED có Vled = 2 V, Iled = 5 mA = 0.005 A, thì R1 = (Vcc - Vled) / Iled = (5 - 2)/0.005 = 600 ohm. Do đó có thể lấy điện trở có giá trị 560 ohm hoặc 680 ohm để mắc nối tiếp với LED hồng ngoại.
- R2 được xác định dựa vào transistor. Ví dụ với transistor C828, tra cứu bảng thông số kỹ thuật (datasheet) hệ số khuếch đại dòng hFE (min) = 130, dòng Ic (max) = 50 mA = 0.05 A, điện áp mở Vbe = 0.8V.
Trong mạch này Vcc = 5 V, Vc = Vgpio = 3.3 V, Iout = 5 mA = 0.005 A.
Theo công thức R2 (max) = (Vc x hFE) / (5 x Ic) = (3.3 x 130) / (5 x 0.05) = 1716 ohm.
R2 (min) = (Vgpio - Vbe) / Iout = (3.3 - 0.8) / 0.005 = 500 ohm.
Do đó chọn R2 nằm trong khoảng 500 đến 1716 ohm. 560 ohm là giá trị gần nhất.
Bài viết này chỉ đề cập đến cách sử dụng trực tiếp lệnh irsend để điều khiển từ xa. Để trực quan hơn, có thể xây dựng (hoặc tìm kiếm) một chương trình client với giao diện đồ họa hoặc web trên điện thoại di động/máy tính bảng/PC và chương trình server chạy trên Raspberry Pi (chương trình server này sẽ thực thi lệnh irsend), chúng ta có thể điều khiển được các thiết bị điện tử trong nhà như điều hòa nhiệt độ từ xa qua mạng cục bộ hoặc Internet!

4 nhận xét:

Unknown nói...

Chào anh
Bài viết của anh rất hữu ích
anh có thể cho em xin số điện thoại hoặc nick skyer của anh được không
Em đang gặp lỗi về recording dữ liệu của remote
anh có thể chỉ giúp em vấn đề này được không ah

Unknown nói...

em chào anh ạ, anh cho em hỏi chút ạ. khi muốn dùng pi3 để điều khiển điều hòa bằng cách học lệnh từ remote điều hòa thì cần kết nối điều hòa vs pi3 không ạ
cảm ơn anh ạ

khanh chicanh nói...

Mình đã hiểu ra nhiều về nguyên lý hoạt động từ bài chia sẻ của bạn. cảm ơn bạn rất nhiều....

Sửa máy in tại nhà Sơn Tây

Đổ mực máy in tại nhà Dương Nội - Hà Đông

Đổ mực máy in tại nhà Mỹ Đình

SỬA CHỮA, ĐỔ MỰC MÁY IN TẠI NHÀ QUẬN HOÀNG MAI-HN

Đổ mực máy in tại nhà Hà Nội - Chất lượng

Unknown nói...

Chào anh. A có thể cho e xin số điện thoại cũng như facebook của a đc k a?