BÀN LED TƯƠNG TÁC - INTERACTIVE RGB LED TABLE

Ngoài chức năng hiển thị như LED thông thường, “BÀN LED TƯƠNG TÁC” còn giống như một "màn hình cảm ứng" được làm từ LED với các hiệu ứng rất đẹp mắt. Nó được dùng làm bàn ăn tối, bàn coffee, hay được trang trí ở quán bar,  làm bàn phòng khách …. Với dự án mình chia sẻ dưới đây, bàn LED tương tác này có kích thước khoảng khổ A2 với 256 RGB LED và dùng Led phát hồng ngoại - phototransistor để xác định vị trí của vật thể trên bàn và tạo ra hiệu ứng đẹp mắt tại các vị trí đó.... Trước tiên, để biết bàn này hoạt động như thế nào, các bạn có thể xem DEMO KIT 8x8 tại:

I. GIỚI THIỆU

Ngoài chức năng hiển thị như LED thông thường, “BÀN LED TƯƠNG TÁC” còn giống như một "màn hình cảm ứng" được làm từ LED với các hiệu ứng rất đẹp mắt. Nó được dùng làm bàn ăn tối, bàn coffee, hay được trang trí ở quán bar,  làm bàn phòng khách …. Với dự án mình chia sẻ dưới đây, Bàn LED tương tác này có kích thước khoảng khổ A2 với 256 RGB LED và dùng Led phát hồng ngoại - phototransistor để xác định vị trí của vật thể trên bàn và tạo ra hiệu ứng đẹp mắt tại các vị trí đó....

II. B.O.M

No.

Item

Spec

Q'ty

Unit

Remarks

1

RBG LEDs

5mm 4-pin RGB LEDs, common anode, diffused

256

pcs

 

2

IR LEDs

 

56

pcs

 

3

IR photo-transistors

 

64

pcs

 

4

74HC595

8 channel shift register

12

pcs

 

5

ULN2803

 

12

pcs

 

6

TIP42C

 

8

pcs

 

7

2N2222

 

8

pcs

 

8

74HC4051

Analog multiplexer IC 8: 1

8

pcs

 

9

Arduino Uno/ Mega

 

1

pcs

 

10

Dây đồng/ Kẽm

Copper wire

1

spools

Dùng nhiều

11

R100

 

200

pcs

Hạn dòng LED

12

Tụ 0.1uF

 

16

pcs

 

13

R1K

 

20

pcs

 

14

R10K

 

40

pcs

 

15

Bus 8

 

20

pcs

 

16

Bus 4

 

4

pcs

 

17

Mica trong/đục

 

1

pcs

 

18

Jack 3.5mm & dây

 

1

pcs

Để làm VU meter

19

Jack nguồn, linh tinh khác

 

1

pcs

 

20

Power Supply 20A 5V

 

1

pcs

 

III. MẠCH NGUYÊN LÝ

3.1. Table template

Các bạn xem hình bên dưới để hiểu rõ thêm cách sắp xếp RGB Led – Phototransistor – Led hồng ngoại. Kích thước bàn các bạn có thể tùy chọn sao cho hợp lý, mình chọn khổ A2 (594 x 420 mm) cho bàn Led 16x16.
- Mặt trên của bàn led tương tác có tổng cộng các linh kiện sau:
  • Hàng màu xanh: RGB Led – 256 pcs – Ma trận 16x16.
  • Hàng màu đỏ: Phototransistor – 64 pcs – Ma trận 8x8.
  • Hàng màu hồng: IR Led – 56 pcs – Ma trận 8x7.

- Mặt sau của template như sau:
  • RGB Led: dùng dây đồng/ kẽm để hàn các chân R, G, B và Anode lại với nhau
  • Led phát hồng ngoại: mắc vào nguồn 5V & thêm điện trở hạn dòng khoảng từ 100 ~ 150 ohm.

    

 

 

 

 

 

 

 

 

 

  • Phototransistor: mình dùng loại Common – Collector (màu đen) và được đấu nối như hình bên dưới:

        

 

 

 

 

 

 

 

 

3.2. Mạch nguyên lý

Dựa vào sơ đồ nguyên lý trên, ta thấy mạch cho BÀN TƯƠNG TÁC có hai khối chính:
- Khối hiển thị 256 RGB LED dùng phương pháp B.A.M 4 bit:
  Các bạn có thể tham khảo tại: 
  • Cột: dùng tổng cộng 12 con 74HC595 + 12 con ULN2803, và được điều khiển qua SPI.
  • Hàng: dùng chung 8 hàng với 8 con 2N2222 + 8 con TIP42C. Để có đáp ứng nhanh hơn và không bị ghosting (bóng mờ) các bạn có thể chuyển qua dùng MOSFET cho hàng.

- Khối xử lý 64 tín hiệu Analog từ Photosensors:
  • Mạch phát hồng ngoại: IR Led có tổng cộng là 56 con được nối với nguồn 5V và mắc qua điện trở hạn dòng.
  • Mạch thu hồng ngoại: có tổng cộng 64 phototransistors được đọc thông qua 8 IC tách kênh/ dồn kênh Analog  - 74HC4051 (8:1) vì Arduino Mega 2560 chỉ có thể đọc trực tiếp 16 kênh Analog. Về 74HC4051 các bạn có thể tham khảo tại: https://github.com/sparkfun/74HC4051_8-Channel_Mux_Breakout
Các bạn cũng có thể dùng 74HC4067 (16:1) để dồn kênh từ 16 sang 1 nhưng nó hơi khó tìm ở Việt Nam (Mình tìm mua hoài không đượclaugh).

Bàn Led tương tác hoạt động như sau:
  • Bình thường khi không có vật thể đặt lên bàn, led hồng ngoại sáng nhưng phototransistor sẽ không nhận được ánh sáng này, các đèn RGB Led sẽ tắt.
  • Khi có vật thể đặt lên bàn, tia hồng ngoại phát ra từ IR Led sẽ phản xạ từ vật thể và truyền đến phototransistors, các RGB LED xung quanh phototransistor (4 RGB LED) này sẽ sáng.
  • Theo sơ đồ nguyên lý trên, cứ mỗi một thời gian xác định Arduino Mega 2560 sẽ đọc 8 tín hiệu phototransistors phụ thuộc vào 3 tín hiệu: Select 1 – Select 2 – Select 3. Như vậy nếu như cứ 200us, Arduino Mega đọc 1 lần (mỗi lần đọc 8 tín hiệu Analog) thì chúng ta cần khoảng 200x8 = 1600us ~ 1.6ms để đọc 64 kênh Analog và lưu dữ liệu vào mảng: phototransistor_data[0] ~ phototransistor_data[63]. Như vậy là đủ nhanh để bàn tương tác không bị đáp ứng trễ khi vật thể đi qua. Các bạn có thể xem cụ thể hơn ở chương trình bên dưới.

3.3. Hình ảnh BÀN LED TƯƠNG TÁC thực tế

  • Hình mặt trên bàn:

  • Hình mặt dưới bàn:

  • Hình các board điều khiển:

IV. CHƯƠNG TRÌNH

4.1. Chương trình chính

void Interactive_Table()
{   
	if ( (unsigned long) (micros() - samplingtime) > 200  ) // Read 8 phototransistors every 200us   
	{   
	// Read 8 phototransistors every 200us and store data into array
	  phototransistor_data[0 + photo_adder] = analogRead(A0);   
	  phototransistor_data[8 + photo_adder] = analogRead(A1);   
	  phototransistor_data[16 + photo_adder] = analogRead(A2);   
	  phototransistor_data[24 + photo_adder] = analogRead(A3);   
	  phototransistor_data[32 + photo_adder] = analogRead(A4);   
	  phototransistor_data[40 + photo_adder] = analogRead(A5);   
	  phototransistor_data[48 + photo_adder] = analogRead(A6);   
	  phototransistor_data[56 + photo_adder] = analogRead(A7);   
	  // update sensor group and mux selects for next time through   
	if (photo_adder < 7 ) 
		{     
		photo_adder ++;   
		} 
	else 
		{     
		photo_adder = 0;   
		}    
	  digitalWrite(Select1, bitRead(photo_adder, 2));    // sense mux MSB   
	  digitalWrite(Select2, bitRead(photo_adder, 1));   
	  digitalWrite(Select3, bitRead(photo_adder, 0));    // sense mux LSB   
	  samplingtime = micros();   
	}     
	for (byte i=0; i<64; i++)
	{     
	if (phototransistor_data[i] < LimitSense)     
		{      
		ClearLightZone(i); // clear color     
		}     
	else     
		{        
		SetLightZone(i, 15, 0, 0); // set RED color     
		}   
	}  
}

4.2. Các chương trình con

void SetLightZone(byte Zone, byte R, byte G, byte B)
{
switch (Zone)
  {
    case 0:   DrawLight(Zone00, R, G, B); break;
    case 1:   DrawLight(Zone01, R, G, B); break;
    case 2:   DrawLight(Zone02, R, G, B); break;
    case 3:   DrawLight(Zone03, R, G, B); break;
    case 4:   DrawLight(Zone04, R, G, B); break;
    case 5:   DrawLight(Zone05, R, G, B); break;
    case 6:   DrawLight(Zone06, R, G, B); break;
    case 7:   DrawLight(Zone07, R, G, B); break;
    case 8:   DrawLight(Zone08, R, G, B); break;
    case 9:   DrawLight(Zone09, R, G, B); break;
    case 10:  DrawLight(Zone10, R, G, B); break;
    case 11:  DrawLight(Zone11, R, G, B); break;
    case 12:  DrawLight(Zone12, R, G, B); break;
    case 13:  DrawLight(Zone13, R, G, B); break;
    case 14:  DrawLight(Zone14, R, G, B); break;
    case 15:  DrawLight(Zone15, R, G, B); break;
    case 16:  DrawLight(Zone16, R, G, B); break;
    case 17:  DrawLight(Zone17, R, G, B); break;
    case 18:  DrawLight(Zone18, R, G, B); break;
    case 19:  DrawLight(Zone19, R, G, B); break;
    case 20:  DrawLight(Zone20, R, G, B); break;
    case 21:  DrawLight(Zone21, R, G, B); break;
    case 22:  DrawLight(Zone22, R, G, B); break;
    case 23:  DrawLight(Zone23, R, G, B); break;
    case 24:  DrawLight(Zone24, R, G, B); break;
    case 25:  DrawLight(Zone25, R, G, B); break;
    case 26:  DrawLight(Zone26, R, G, B); break;
    case 27:  DrawLight(Zone27, R, G, B); break;
    case 28:  DrawLight(Zone28, R, G, B); break;
    case 29:  DrawLight(Zone29, R, G, B); break;
    case 30:  DrawLight(Zone30, R, G, B); break;
    case 31:  DrawLight(Zone31, R, G, B); break;
    case 32:  DrawLight(Zone32, R, G, B); break;
    case 33:  DrawLight(Zone33, R, G, B); break;
    case 34:  DrawLight(Zone34, R, G, B); break;
    case 35:  DrawLight(Zone35, R, G, B); break;
    case 36:  DrawLight(Zone36, R, G, B); break;
    case 37:  DrawLight(Zone37, R, G, B); break;
    case 38:  DrawLight(Zone38, R, G, B); break;
    case 39:  DrawLight(Zone39, R, G, B); break;
    case 40:  DrawLight(Zone40, R, G, B); break;
    case 41:  DrawLight(Zone41, R, G, B); break;
    case 42:  DrawLight(Zone42, R, G, B); break;
    case 43:  DrawLight(Zone43, R, G, B); break;
    case 44:  DrawLight(Zone44, R, G, B); break;
    case 45:  DrawLight(Zone45, R, G, B); break;
    case 46:  DrawLight(Zone46, R, G, B); break;
    case 47:  DrawLight(Zone47, R, G, B); break;
    case 48:  DrawLight(Zone48, R, G, B); break;
    case 49:  DrawLight(Zone49, R, G, B); break;
    case 50:  DrawLight(Zone50, R, G, B); break;
    case 51:  DrawLight(Zone51, R, G, B); break;
    case 52:  DrawLight(Zone52, R, G, B); break;
    case 53:  DrawLight(Zone53, R, G, B); break;
    case 54:  DrawLight(Zone54, R, G, B); break;
    case 55:  DrawLight(Zone55, R, G, B); break;
    case 56:  DrawLight(Zone56, R, G, B); break;
    case 57:  DrawLight(Zone57, R, G, B); break;
    case 58:  DrawLight(Zone58, R, G, B); break;
    case 59:  DrawLight(Zone59, R, G, B); break;
    case 60:  DrawLight(Zone60, R, G, B); break;
    case 61:  DrawLight(Zone61, R, G, B); break;
    case 62:  DrawLight(Zone62, R, G, B); break;
    case 63:  DrawLight(Zone63, R, G, B); break;    
  }
}

void DrawLight(byte zone_dots[4][2], byte R, byte G, byte B)
{
  for (int i = 0; i < 4; i++)
  {
    LED(zone_dots[i][0], zone_dots[i][1], R, G, B);
    //delay_ms(10);
  }
}

4.3. Giải thích chương trình

Để dễ hiểu hơn, các bạn xem hình bên dưới, trong đó ô tô đỏ ứng với 64 phototransistors được đánh dấu từ Zone00 ~ Zone63 và xung quanh mỗi zone là 4 RGB LED.
Ví dụ: Zone00[4][2] = {{6, 0}, {7, 0}, {6, 1}, {7, 1}};
Nó cho ta biết được phototransistor thứ 0 được đọc bởi chân A0 của Arduino Mega và xung quanh nó là 4 RGB LED có tọa độ lần lượt là: {6, 0}, {7, 0}, {6, 1}, {7, 1}. Khi phototransistor này nhận được giá trị đạt ngưỡng cài đặt LimitSense thì tương ứng 4 RGB LED sẽ bị tác động (bật sáng).

V. LỜI KẾT

  • Các phototransistor nhận được tia hồng ngoại từ ánh sáng mặt trời nên bàn này không dùng chế độ tương tác vào ban ngày. Lưu ý, các vật màu đen sẽ hầu như hấp thụ hoàn toàn tia hồng ngoại nên sẽ không phản xạ lên phototransistor. Mica trong cho tia hồng ngoại đi qua nên có thể đặt mica trong lên mặt trên của các linh kiện. Và mặt trên bàn chúng ta có thể đặt các vật dụng như sách, ly, tách, ấm ... một cách dễ dàng.
  • Bàn này có thể dùng làm VU meter hoặc chơi các game như: Tetris, Pong …. VU meter: https://www.youtube.com/watch?v=dUb9VGRIXf8&list=PLfrr5s2He43B5q-70VjncUdvHf1KyzLte&index=3
  • LED tương tác sẽ đẹp hơn nhiều nếu tăng kích thước bàn khoảng 16x32 LED (gấp đôi bàn hiện tại) và được đặt trong một bàn gỗ với thiết kế pro. Thật là tuyệt vời nếu cả gia đình ngồi vào bàn cùng ăn tối dưới ánh đèn lung linh phải không các bạn....!!!
Youtube: 
NTERACTIVE LED TABLE 16x16 - FIRST TEST
INTERACTIVE LED TABLE 16x16 - FULL TEST
INTERACTIVE LED TABLE 16x16 - SPECTRUM ANALYZER
INTERACTIVE LED TABLE - DEMO KIT 8x8
Bài viết truyền cảm hứng: 
lên
6 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

ĐIỀU KHIỂN BẢNG LED BICOLOR 32x32 BẰNG B.A.M

Về LED ma trận, mình thấy trên diễn đàn cũng đã có rất nhiều bài viết. Để tiếp tục chuỗi bài về B.A.M, mình sẽ chia sẻ các bạn cách để Bicolor Led Matrix có thể hiển thị 256 màu riêng biệt với phương pháp B.A.M – 4 bit, tất nhiên nếu mắt người có thể phân biệt được sự khác biệt này...

lên
2 thành viên đã đánh giá bài viết này hữu ích.

Phương pháp Charlieplexing và LoLShield VU Meter

Phương pháp Charliplexing là gì? Mình sẽ giới thiệu sơ lược về nó và hướng dẫn các bạn làm một board LoLShield (Lots of Lights Shield). Với LoLShield, mục tiêu chúng ta là điều khiển 126 đèn led đơn được xếp thành ma trận 9x14 bằng phương pháp Charliplexing để tiết kiệm chân Arduino và thiết kế sao nó thành Shield cắm thẳng lên Arduino

lên
11 thành viên đã đánh giá bài viết này hữu ích.