Thứ Hai, 24 tháng 3, 2014

Sử dụng Raspberry Pi (hoặc máy tính) và modem quay số cũ làm máy trả lời điện thoại

Bước 1: Kết nối phần cứng
Kết nối modem quay số gắn ngoài có chức năng thoại với máy tính (qua cáp USB - RS232), cắm đường dây điện thoại và điện thoại cố định (qua cáp RJ11) vào hai cổng RJ11 tương ứng. Có thể cắm thêm microphone và loa (headphone) vào các ngõ microphone và speaker của modem.
Bước 2: Cài đặt phần mềm
Trên máy tính chạy Ubuntu hoặc Raspberry Pi chạy Raspbian, cài đặt các phần mềm cần thiết:
sudo apt-get install mgetty mgetty-voice mgetty-pvftools
Bước 3: Kiểm tra modem (bước này không bắt buộc nhưng nên thực hiện)
Cắm điện, bật công tắc, kiểm tra modem và cáp kết nối bằng minicom:
sudo apt-get install minicom
minicom -D /dev/ttyUSB0
Trong cửa sổ minicom, gõ ATZ, modem phải hiển thị chữ OK, không có chữ OK có nghĩa là modem không khởi tạo được, nguyên nhân có thể do chưa có điện vào modem hoặc cáp USB-RS232 bị hỏng. minicom cho phép tương tác với modem qua các lệnh AT, ví dụ gõ ATZ, modem trả lời OK, gõ ATI, ATI1, ATI2, ATI3… modem đưa ra câu trả lời tương ứng cho các lệnh này.
Ấn Ctrl-A sau đó X để thoát minicom.
hoặc dùng gnome-ppp, kppp...
Bước 4: Cấu hình ban đầu
Sửa đổi tập tin /etc/mgetty/voice.conf, dòng voice_devices sửa thành
voice_devices ttyUSB0
Sửa đổi tham số rings trong tập tin nếu cần thiết, đây là số lần đổ chuông trước khi hệ thống tự động chấp nhận cuộc gọi và kích hoạt chế độ máy trả lời điện thoại (số lần đổ chuông mặc định là 3, tối thiểu là 2).
rings 3
Thêm pi (hoặc người dùng hiện tại) vào nhóm voice.
sudo usermod -a -G voice pi
Bước 5A: Thu âm thông báo nhắc nhở (phương pháp 5A3 có thể thực hiện sau nếu không xác định được kiểu hoặc tốc độ lấy mẫu của modem)
Có một số cách khác nhau để thu âm thông báo nhắc nhở
5A1: Dùng điện thoại
Kiểm tra thiết bị với vm (không bắt buộc)
sudo vm devicetest
Thu âm trực tiếp thành định dạng tương thích với modem sử dụng điện thoại
sudo vm record standard.rmd
hoặc
sudo vm record -t standard.rmd
Chờ vm hiển thị thông báo Recording message… nhấc điện thoại lên và nói vào ống nói của điện thoại. Để dừng thu âm, ấn Ctrl-C.
5A2: Dùng microphone cắm vào modem
sudo vm record -m standard.rmd
Đối với cách 5A1 và cách 5A2, thông tin nhật ký của vm được lưu trong /var/log/mgetty/vm.log, mỗi phiên vm chiếm một vài dòng. Tập tin này có thể cho biết thông tin về kiểu modem, ví dụ:
detecting voice modem type
Multitech 2834ZDXv detected
initializing Multitech 2834 voice modem
Để biết tốc độ lấy mẫu mà modem hỗ trợ, chuyển đổi tập tin rmd thành pvf và kiểm tra tốc độ tập tin pvf bằng các lệnh:
rmdtopvf standard.rmd test.pvf
file test.pvf
test.pvf: portable voice format (binary 1 8000 32)
Thông số 8000 trong kết quả trên nghĩa là tốc độ lấy mẫu mà modem hỗ trợ là 8000 Hz.
5A3: Dùng tập tin wav thu âm hoặc tập tin wav đã có sẵn (cách này cần biết trước kiểu và tốc độ lấy mẫu của modem)
Để thu âm, có thể dùng chương trình thu âm mặc định trên Ubuntu, ví dụ thông báo nhắc nhở được lưu thành voice.wav (âm thanh PCM không nén, mono, 32 bit).
- Chuyển đổi sang 16 bit:
sox voice.wav -b 16 voice16.wav
- Kiểm tra lại định dạng của âm thanh:
file voice16.wav
voice16.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 22050 Hz
- Nghe lại (không bắt buộc):
sox voice16.wav -t alsa
- Chuyển đổi wav thành pvf ở tốc độ mà modem hỗ trợ (ở đây là 8000 Hz)
wavtopvf voice16.wav | pvfspeed -s 8000 > voice.pvf
- Kiểm tra lại định dạng của âm thanh:
file voice.pvf
voice.pvf: portable voice format (binary 1 8000 32)
- Nghe lại (không bắt buộc):
pvfspeed -s 8000 voice.pvf | pvftowav | sox -t wav - -t alsa
- Chuyển đổi pvf thành định dạng tương thích với modem (ở đây là MT_2834, 4 bit)
pvftormd MT_2834 4 voice.pvf standard.rmd
Chạy pvftormd -L để biết các kiểu modem được hỗ trợ. Có thể xem các tập tin nhật ký trong thư mục /var/log/mgetty để biết kiểu của modem mà vgetty phát hiện được. Nếu định dạng hoặc tốc độ của standard.rmd không tương thích với modem, người gọi sẽ không nghe thấy thông báo nhắc nhở.
- Kiểm tra lại định dạng của âm thanh:
file standard.rmd
standard.rmd: raw modem data (Multitech2834 / compression type 0x0400)
Bước 5B: Nghe lại thông báo nhắc nhở (không bắt buộc, chung cho cả ba cách thu âm ở bước 5A)
- Nghe lại trên ống nghe của điện thoại
sudo vm play standard.rmd
hoặc
sudo vm play -t standard.rmd
- Nghe lại trên loa (headphone) cắm vào modem:
sudo vm play -s standard.rmd
- Nghe lại trên Raspberry Pi hoặc máy tính:
rmdtopvf standard.rmd | pvfspeed -s 8000 | pvftowav | sox -t wav - -t alsa
Bước 5C: Đặt thông báo nhắc nhở vào đúng vị trí
sudo cp standard.rmd /var/spool/voice/messages/standard.rmd
Bước 6: Cấu hình để vgetty chạy tự động
Trên Raspbian
Sửa /etc/inittab, tìm đoạn
# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3
thêm vào ngay dưới đoạn đó dòng
USB0:2345:respawn:/usr/sbin/vgetty ttyUSB0
Thêm dấu # để bỏ bớt các getty không cần thiết từ tty2 đến tty6, ttyAMA0.
Chạy
sudo telinit q
để cập nhật init mà không phải khởi động lại
Trên Ubuntu
Tạo tập tin /etc/init/ttyUSB0.conf với nội dung
start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec /usr/sbin/vgetty ttyUSB0
Khởi động lại
Nếu chỉ muốn chạy thủ công
sudo vgetty /dev/ttyUSB0
Thông tin nhật ký của vgetty được lưu trong /var/log/mgetty/vg_ttyUSB0.log. Thông tin này có thể cho biết modem có khởi tạo được hay không, kiểu modem là gì, có phát được thông báo nhắc nhở không (thông báo lỗi nếu định dạng hoặc tốc độ lấy mẫu của tập tin standard.rmd không tương thích với modem, xem lại bước 5A để biết cách tạo tập tin tương thích)...
Bước 7: Thử nghiệm máy trả lời tự động
Dùng một điện thoại khác gọi tới số điện thoại cố định, sau 3 tiếng chuông, hệ thống sẽ chuyển sang chế độ trả lời tự động. Điện thoại gọi sẽ nghe thấy thông báo nhắc nhở tự động và có thể để lại lời nhắn. Lời nhắn để lại cho điện thoại cố định được lưu trong thư mục /var/spool/voice/incoming.
Bước 8: Phát lại lời nhắn đã lưu
- Trên ống nghe của điện thoại:
vm play message.rmd
hoặc
vm play -t message.rmd
- Trên loa (headphone) cắm vào modem:
vm play -s message.rmd
- Trên Raspberry Pi (hoặc máy tính):
rmdtopvf message.rmd | pvftowav | sox -t wav - -t alsa
rmdtopvf message.rmd | pvfspeed -s 8000 | pvftowav | sox -t wav - -t alsa
Bước 9: Xử lý cuộc gọi tự động dựa vào thông tin số gọi đến (đây là bước mở rộng, không bắt buộc)
Tạo tập tin /etc/mgetty/message.sh với quyền +x có nội dung (chỉ là ví dụ)
#!/bin/bash


MESSAGE=$1
CALLERID=$2
CALLNAME=$3


WAVFILE=`echo $MESSAGE | sed 's/.rmd$/.wav/'`


rmdtopvf $MESSAGE | pvfspeed -s 8000 | pvftowav >$WAVFILE


echo "Number: $CALLERID Name: $CALLNAME" >> /home/pi/incomings.txt


exit 0
Sửa đổi dòng message_program trong /etc/mgetty/message.sh thành
message_program /etc/mgetty/message.sh

Bài này được viết sau khi đã kiểm tra thực tế (từ bước 1 đến bước 8), sử dụng thông tin tham khảo từ http://frank.harvard.edu/~coldwell/answering_machine/

Thứ Tư, 19 tháng 3, 2014

Dựng phim tua nhanh thời gian (time-lapse) với Raspberry Pi

Dựng phim tua nhanh thời gian là một trong những thứ thú vị bạn có thể làm với Raspberry Pi. Tôi đánh cuộc bạn đã tìm thấy nhiều giải pháp ở đâu đó khác cho kỹ thuật này. Tuy nhiên, tôi viết hướng dẫn này vì giải pháp của tôi có nhiều ưu điểm mà không có trong các hướng dẫn khác, chẳng hạn: - Bạn có thể sử dụng module camera cho Raspberry Pi, hoặc một camera USB (hay webcam)
- Không yêu cầu kỹ năng lập trình, chỉ sử dụng các ứng dụng/tiện ích đã có
- Phần cứng dễ tìm, không có gì đặc biệt
- Ưu điểm quan trọng nhất: mã hóa video tăng tốc phần cứng, do đó bạn không cần phải chuyển các bức ảnh sang một máy tính khác để dựng thành phim. Sử dụng hướng dẫn này, Raspberry Pi có thể dựng phim nhanh hơn cả một chiếc MacBook!
- Dễ dàng tùy chỉnh cho thiết lập tua nhanh thời gian của riêng bạn
- Và cuối cùng, kỹ thuật tua nhanh thời gian ngược
Chúng ta hãy bắt đầu!

Giới thiệu
Theo Wikipedia, tua nhanh thời gian (time-lapse) là một kỹ thuật trong đó tần số mà các khung hình được chụp (tốc độ khung) thấp hơn nhiều so với tần số được sử dụng để xem các khung hình đó. Khi phát ở tốc độ bình thường, thời gian có vẻ trôi nhanh hơn.
Ý tưởng để dựng phim tua nhanh thời gian rất đơn giản: thay vì chụp các khung hình ở tốc độ bình thường (24, 25 hoặc 30 hình/giây là các chuẩn cho điện ảnh, truyền hình chuẩn PAL và truyền hình chuẩn NTSC), bạn chụp các khung hình ở tốc độ thấp hơn nhiều, sau đó ghép chúng lại thành phim ở tốc độ bình thường. Kỹ thuật tua nhanh thời gian thường được sử dụng để dựng những cảnh hoặc sự kiện diễn ra lâu trong thực tế.
Lấy ví dụ, giả sử chúng ta muốn dựng một đoạn phim có độ dài 1 phút cho một sự kiện diễn ra 1 giờ trong thực tế. Chúng ta chọn tốc độ của đoạn phim là 24 hình/giây. Do đó chúng ta cần chụp 24 x 60 = 1440 khung hình (ảnh). Tốc độ khung khi chụp do đó sẽ là 1440 hình/giờ hay 0,4 fps (hình/giây), tức cứ sau mỗi 2,5 giây chúng ta chụp một hình.
Độ phân giải cho đoạn phim được xác định bởi khả năng của camera và cả dự kiến của chúng ta. Giả sử là 1280x720.

Yêu cầu phần cứng
Trước hết, chúng ta cần Raspberry Pi phiên bản B. Tiếp theo chúng ta có thể sử dụng module camera cho Raspberry Pi, đây là một lựa chọn tốt. Tuy nhiên, do chúng ta chỉ sử dụng camera để chụp các ảnh tĩnh ở tốc độ thấp, nên một camera USB (webcam) cũng đạt yêu cầu. Nhiều webcam có thể cắm trực tiếp vào cổng USB của Raspberry Pi, nếu không thì sử dụng hub USB gắn ngoài có cấp điện. Hướng dẫn này sẽ đề cập cả hai trường hợp (module camera cho Raspberry Pi và webcam USB).
Nếu bạn cần quay phim ngoài trời ở những nơi không có điện lưới, một giải pháp đơn giản và kinh tế để cấp điện cho Raspberry Pi là 4 cục pin sạc kích thước AA (mỗi cục pin có điện áp 1.2V) qua các chân GPIO (chân +5V và chân GND).
Chúng ta cần kết nối Internet để cài đặt một số phần mềm cần thiết trước khi bắt đầu. Tôi giả sử bạn đã biết cách truy cập vào Raspberry Pi (qua bàn phím+màn hình hoặc qua ssh). Nếu sử dụng ssh, bạn có thể copy-paste các dòng lệnh trong hướng dẫn vào terminal.
Cuối cùng là thẻ nhớ SD đã cài đặt hệ điều hành Linux. Tôi sử dụng Raspbian trong hướng dẫn này. Dung lượng cần thiết cho thẻ SD tùy thuộc vào bạn muốn đoạn phim dài bao lâu, độ phân giải cũng như tốc độ của nó (24, 25 hay 30 fps), do đó tùy thuộc vào số lượng ảnh bạn sẽ chụp và độ phân giải của chúng. Công thức tính kích thước cho một ảnh không nén (.ppm) là (3 x chiều rộng x chiều cao + 16) byte, do đó một ảnh không nén độ phân giải 1280x720 sẽ có kích thước khoảng 2.8 MB. Nếu chọn định dạng ảnh nén (chẳng hạn .jpeg như trong hướng dẫn này) mỗi tập tin ảnh 1280x720 chỉ có kích thước dưới 100 KB. Nói chung thẻ nhớ SD 4GB là đủ cho hầu hết các trường hợp.

Chuẩn bị phần mềm
Chúng ta cần thực hiện hai bước để dựng phim tua nhanh thời gian trực tiếp trên Raspberry Pi:
- Bước 1: Chụp các ảnh tĩnh ở tốc độ đã định trước
- Bước 2: Ghép các ảnh tĩnh thành phim sử dụng bộ mã hóa video phần cứng của Raspberry Pi
Đã có nhiều cách trong nhiều hướng dẫn để thực hiện bước 1. Nhưng bước 2, chưa có cách nào… cho đến khi bạn đọc hướng dẫn này ;)
Để thực hiện bước 1, hướng dẫn này sẽ sử dụng raspistill cho module camera cho Raspberry Pi hoặc streamer cho webcam USB. raspistill đã có sẵn trong Raspbian, do đó chúng ta chỉ cần cài thêm streamer
sudo apt-get install streamer
Để thực hiện bước 2, chúng ta sẽ không sử dụng các công cụ phổ biến trên Linux như mencoder, ffmpeg, avconv do chúng không (hoặc chưa) hỗ trợ GPU của Raspberry Pi. Giải pháp duy nhất để mã hóa bằng phần cứng là sử dụng plugin OpenMAX trong gstreamer. Codec sẽ sử dụng là H264.
Chúng ta cần thêm một nguồn phần mềm mới vào Raspbian để cài đặt plugin OpenMAX. Chạy 3 lệnh sau đây trên Raspberry Pi (dán chúng vào terminal):
sudo sh -c 'echo deb http://vontaene.de/raspbian-updates/ . main >> /etc/apt/sources.list'

sudo apt-get update

sudo apt-get install libgstreamer1.0-0 liborc-0.4-0 gir1.2-gst-plugins-base-1.0 gir1.2-gstreamer-1.0 gstreamer1.0-alsa gstreamer1.0-omx gstreamer1.0-plugins-bad gstreamer1.0-plugins-base gstreamer1.0-plugins-base-apps gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-pulseaudio gstreamer1.0-tools gstreamer1.0-x libgstreamer-plugins-bad1.0-0 libgstreamer-plugins-base1.0-0
Kiểm tra lại kết quả cài đặt:
gst-inspect-1.0 | grep omx
Bạn sẽ thấy kết quả:
omx: omxh264enc: OpenMAX H.264 Video Encoder
omx: omxvc1dec: OpenMAX WMV Video Decoder
omx: omxmjpegdec: OpenMAX MJPEG Video Decoder
omx: omxvp8dec: OpenMAX VP8 Video Decoder
omx: omxtheoradec: OpenMAX Theora Video Decoder
omx: omxh264dec: OpenMAX H.264 Video Decoder
omx: omxh263dec: OpenMAX H.263 Video Decoder
omx: omxmpeg4videodec: OpenMAX MPEG4 Video Decoder
omx: omxmpeg2videodec: OpenMAX MPEG2 Video Decoder
Chú ý dòng đầu tiên omxh264enc. Đó là video encoder chúng ta sẽ sử dụng.

Bước 1: Chụp các ảnh tĩnh ở tốc độ đã định trước
- Đối với module camera cho Raspberry Pi:
Như đã tính toán trong phần giới thiệu, trong 1 giờ (3600000 ms) chúng ta chụp một bức ảnh cứ mỗi 2,5 giây (2500 ms). Lệnh
raspistill -o timelapse%04d.jpeg -tl 2500 -t 3600000
sẽ tạo ra 1440 ảnh (từ timelapse0001.jpeg đến timelapse1440.jpeg). Do chúng ta cần 1440 ảnh, chúng ta sử dụng mã định dạng %04d (số nguyên 4 ký tự)
- Đối với webcam USB:
streamer -t 1440 -r 0.4 -s 1280x720 -o timelapse0000.jpeg
trong đó -t là số lượng khung hình, -r là tốc độ khung (0,4 fps nghĩa là 2,5 giây mỗi hình) -s là độ phân giải
sẽ tạo ra 1440 ảnh (từ timelapse0000.jpeg đến timelapse1439.jpeg).

Bước 2: Ghép các ảnh tĩnh thành phim sử dụng bộ mã hóa video phần cứng của Raspberry Pi
Bây giờ bạn đã có các ảnh tĩnh. Bạn không cần chuyển chúng sang một máy tính khác để dựng thành phim. Raspberry Pi có thể dựng phim nhanh hơn cả cái máy tính đó, thậm chí khi bạn còn đang mất công chuyển ảnh sang máy tính khác thì phim đã dựng xong rồi! CPU của Raspberry Pi yếu, nhưng GPU của nó mạnh. Bài hướng dẫn này khai thác sức mạnh của GPU trên Raspberry Pi.
gst-launch-1.0 multifilesrc location=timelapse%04d.jpeg index=1 caps="image/jpeg,framerate=24/1" ! jpegdec ! omxh264enc ! avimux ! filesink location=timelapse.avi
sẽ dựng các ảnh từ timelapse0001.jpeg đến hết vào tập tin timelapse.avi. Thay đổi tham số index nếu bạn muốn bắt đầu từ một số khác, ví dụ index=100 sẽ bắt đầu dựng phim từ timelapse0100.jpeg. Bạn có thể thay đổi tốc độ khung 24/1 thành 25/1, 30/1 hay tốc độ khung của riêng bạn. Phim sẽ hoàn thành sau ít phút.
Để so sánh hiệu quả mã hóa, tôi đã tiến hành thử nghiệm. Dựng phim với độ phân giải 1280x720, 24 fps, codec H264 từ 1500 bức ảnh trên một máy tính Core Duo 2 GHz, 1 GB RAM mất 4 phút 15 giây, nhưng trên Raspberry Pi chỉ mất 2 phút 15 giây!
Chạy lệnh
sync
để Raspberry Pi ghi toàn bộ dữ liệu vào thẻ SD, tránh hỏng và mất dữ liệu. Bây giờ bạn có thể chép timelapse.avi ra khỏi Raspberry Pi qua ssh, hoặc đơn giản ngắt điện khỏi Raspberry Pi và lấy phim ra khỏi thẻ nhớ.
Bạn có thể đặt các lệnh trong bước 1 và bước 2 vào một tập tin .sh để tự động hóa toàn bộ quá trình dựng phim
Video bên dưới sẽ cho bạn thấy khái niệm tua nhanh thời gian (time-lapse)

Phụ lục: Tua nhanh thời gian ngược
- Tạo một thư mục để chứa các ảnh theo thứ tự đảo ngược:
mkdir timelapse_reverse
- Đổi tên hàng loạt, ảnh đầu tiên sẽ chuyển thành ảnh cuối cùng, ảnh thứ hai sẽ chuyển thành ảnh gần cuối cùng (ví dụ với 1440 ảnh, nếu bạn có số lượng ảnh khác, chỉ cần thay đổi số 1439 trong dòng lệnh bên dưới):
for i in {0..1439}; do ri=`expr 1439 - $i`; cp timelapse`printf %04d $i`.jpeg timelapse_reverse/timelapse`printf %04d $ri`.jpeg; done
- Dựng phim tua nhanh thời gian ngược:
gst-launch-1.0 multifilesrc location=timelapse_reverse/timelapse%04d.jpeg caps="image/jpeg,framerate=24/1" ! jpegdec ! omxh264enc ! avimux ! filesink location=timelapse_reverse.avi
Video tua nhanh thời gian ngược

Tôi hy vọng hướng dẫn này sẽ giúp bạn giải quyết một số vấn đề kỹ thuật trong việc dựng phim tua nhanh thời gian với Raspberry Pi. Bạn có thể kết hợp hướng dẫn này với những phát kiến của riêng bạn để cải tiến quá trình dựng phim. Không chỉ dựng cảnh tua nhanh thời gian của một thành phố nào đó, bạn có thể dựng nhiều đoạn phim tua nhanh thời gian ngược thú vị như hoa nở, cây mọc, phản ứng hóa học chậm, nhộng biến thành bướm, mây bay, ốc sên di chuyển… và nhiều hơn nữa, tùy vào khả năng sáng tạo của bạn! Chúc vui vẻ!
Hướng dẫn này được viết sau khi đã kiểm nghiệm thực tế. Phiên bản tiếng Anh (của cùng tác giả) có trên diễn đàn Raspberry Pi.

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!