Wednesday, February 11, 2015

Thiết kế đèn ngủ tự động tắt mở với cảm biến ánh sang- quang trở (Photoresistor)

Hôm nay tôi sẽ hướng dẫn các bạn điều khiển đèn ngủ với cảm biến ánh sáng sử dụng Arduino!

Chắc hẳn nhà các bạn đều sử dụng cái đèn ngủ tự động bật - tắt, buổi tối thì tự động sáng lên và buổi sáng thì tự động tắt đi.

Có nhiều cách để làm các mạch điều khiển bóng đèn tự động tắt mở như này, trong chuyên mục Cùng chơi-Sáng tạo cùng Arduino, Tôi xin giới thiệu đến các bạn cách sử dụng Cảm biến ánh sang để thiết kể đèn tự động tắt mở.

Trước khi đi vào bài học chúng ta hãy tìm hiểu sơ lược về cảm biến ánh sáng hay quang trở (các bạn có thể theo link sau để lấy tài liệu về quang trở (:

Quang trở (Light Dependent Resistors) Điện trở phụ thuộc vào ánh sáng: là một loại cảm biến ánh sáng đơn giản, nguyên tắc hoạt động dựa vào hiện tượng quang điện trong.
Nguyên lý làm việc của quang điện trở là khi ánh sáng chiếu vào chất bán dẫn (có thể là Cadmium sulfide – CdS, Cadmium selenide – CdSe) làm phát sinh các điện tử tự do, tức sự dẫn điện tăng lên và làm giảm điện trở của chất bán dẫn. Các đặc tính điện và độ nhạy của quang điện trở tùy thuộc vào vật liệu chế tạo.
Khi ánh sáng kích thích chiếu vào LDR thì nội trở của LDR sẽ giảm xuống , tiến về 0 ôm( mạch kín).
Nhưng khi ánh sáng kích thích ngừng thì nội trở tăng đến vô cùng(hở mạch).
Ứng dụng trong mạch điện : Chuyển mạch (switch sytems).
Trên đây là hình ảnh mô phỏng hoạt động của LDR khi chiếu ánh sáng vào quang trở.

Bây giờ các bạn đã hiểu cơ bản về cảm biến ánh sáng (quang trở)
Chúng ta hãy cùng đi vào lập trình Arduino với cảm biến ánh sáng để điều khiển tắt mở đèn, sau này khi hiểu về cảm biến ánh sáng các bạn ứng dụng để làm đèn ngủ tự động tắt mở với một bộ điều khiển đơn giản như: sử đụng transistor, hay ic để điều khiển.

Để thực hiện bài học này chúng ta cần:
1. Arduino board
2. Quang trở
3. Bảng cắm
4. Dây cắm
5. Điện trở

Sơ đồ ráp mạch

Code
int potpin=0; //Định nghĩa chân quang trở chân 0
int ledpin=11;//Chân Led chân 11
int val=0;// giá trị ban đầu
void setup()
{
pinMode(ledpin,OUTPUT);//Định nghĩa chân xuất tín hiệu
Serial.begin(9600);
}
void loop()
{
val=analogRead(potpin);
Serial.println(val);
analogWrite(ledpin,val);
delay(10); 
}

Chúc các bạn thành công

Saturday, February 7, 2015

Lập trình Arduino điều khiển LED bảy đoạn

Trong bài học này, tôi sẽ hướng dẫn các bạn cách điều khiển LED 7 đoạn với mạch điều khiển Arduino.
Trước khi vào lập trình, chúng ta hãy cùng đi vào tìm hiểu cấu trúc của LED 7 đoạn.

Thực ra cấu trúc của LED 7 đoạn gồm 8 LED đơn, nhìn lên hình trên chắc các bạn cũng thấy gồm có 7 đoạn và một dấu chấm nhỏ, mỗi đoạn và dấu chấm nhỏ đó là một LED đơn.

Với việc sử dụng LED 7 đoạn chúng ta có thể sử dụng để hiển thị các số, các chữ cái anphabet và nhiều kiểu ký tự khác nhau.

Như trên hình các bạn đã thấy, một LED 7 đoạn đơn gồm 10 chân đó là các chân: a, b, c, d, e, f, g, 2 chân chung và chân dấu chấm tròn.

LED 7 đoạn gồm 2 loại đó là dương chung và âm chung.
Trong bài học này chúng ta sẽ viết chương trình và tải vào Arduino để hiển thị các số từ 0-9.

Để thực hiện bài học này chúng ta cần chuẩn bị các linh kiện sau:
- 1 LED 7 đoạn loại cathode chung ( âm chung)
- 1 board Arduino ( ở đây tôi sử dụng Arduino Uno)
- 8 điện trở 270 Ohm
- Các dây nối

8 điện trở 270Ohm được gắn với 8 chân xuất tín hiệu của Arduino và kết nối với với 8 đoạn. Chúng có tác dụng giới hạn dòng qua mỗi LED, để không làm cháy LED.

Để hiểu được chương trình làm việc như thế nào đầu tiên chúng ta hãy xem làm sao để LED 7 đoạn hiển thị.
LED Display Segment

Để LED hiển thị chúng ta phải làm cho 8 LED đơn như ở trên hiển thị, ví dụ ở đây 8 LED ở đây là các led mang kí tự a, b, c, d, e, f, g và một dấu chấm ở chân cuối.
Bây giờ chúng ta thử suy nghĩ nếu chúng ta muốn hiển thị số 0 chúng ta phải làm thế nào?
Nhìn vào hình LED hiển thị ở đầu bài chúng ta thấy:
Để hiển thị số 0 thì chúng ta phải làm cho các LED đơn a, b, c, d, e, f phải sáng lên, dấu chấm và g phải tắt đi. Như vậy để tạo số 0 chúng ta phải thể hiện mã code hệ nhị phân (binary) là B111111100.
Tương tự đối với số 1 thì có những cái LED nào sáng?
Các bạn có thể viết được mã làm xuất hiện số 1 được không?
Đó là: B01100000.
Tương tự đối với các số 2. 3, 4, 5, 6, 7, 9.
Để dễ hiểu hơn tôi xin đưa ra một bảng sau để các bạn dò. Lưu ý: sáng là 1, tắt là 0.
Số thập phân
Số nhị phân
a
b
c
d
e
f
g
DP(demical point)
0
B11111100
1
1
1
1
1
1
0
0
1
B01100000
0
1
1
0
0
0
0
0
2
B11011010
1
1
0
1
1
0
1
0
3
B11110010
1
1
1
1
0
0
1
0
4
B01100110
0
1
1
0
0
1
1
0
5
B10110110
1
0
1
1
0
1
1
0
6
B10111110
1
0
1
1
1
1
1
0
7
B11100000
1
1
1
0
0
0
0
0
8
B11111110
1
1
1
1
1
1
1
0
9
B11100110
1
1
1
0
1
1
1
0
Bây giờ chúng ta đã biết những con số hiển thị như thế nào khi điều khiển LED. Công việc tiếp theo chúng ta cần làm là kết nối LED 7 đoạn với Arduino.
Hình trên hiển thị các chân của LED 7 đoạn loại Cathode chung ( âm chung ).

Sơ đồ nối dây
7-segment to arduino wiring diagram
Cách kết nối các chân cũng rất đơn giản các bạn nhìn trên hình có thể tự làm được.
Bảng dưới đây thể hiện các chân kết nối
Chân LED 7 đoạn
Chân kết nối với Arduino
a
2
b
3
c
4
d
5
e
6
f
7
g
8
DP
9
Công tiếp theo là viết Code


Code

// Khai báo chânconst int G = 8;  // G= Arduino chân 8
const int F = 7;  // F= Arduino chân  7
const int A = 2;  // A = Arduino chân 2
const int B = 3;  // B = Arduino chân 3
const int E = 6;  // E = Arduino chân 6
const int D = 5;  // D = Arduino chân 5
const int C = 4;  // C = Arduino chân 4
const int dp = 9; // dp = Arduino chân 9

const int second = 1000; // thiết lập với mili giây, 1000 milliseconds = 1 second

const int digit = 10;   // Số ký tự hiển thị
10 digits (0 - 9)
const int segment = 7;  // Số thanh hiển thị trong LED (7) 

// Định nghĩa những thanh( led đơn) sáng 
byte digseg[digit][segment] =  { 
                                           { 1,1,1,1,1,1,0 },  // = 0
                                           { 0,1,1,0,0,0,0 },  // = 1
                                           { 1,1,0,1,1,0,1 },  // = 2
                                           { 1,1,1,1,0,0,1 },  // = 3
                                           { 0,1,1,0,0,1,1 },  // = 4
                                           { 1,0,1,1,0,1,1 },  // = 5
                                           { 1,0,1,1,1,1,1 },  // = 6
                                           { 1,1,1,0,0,0,0 },  // = 7
                                           { 1,1,1,1,1,1,1 },  // = 8
                                           { 1,1,1,1,0,1,1 }   // = 9
                                         };

void setup() {                
  // Định nghĩa chân xuất tín hiệu OUTPUT
  pinMode(A, OUTPUT);   
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(dp, OUTPUT);
  
  // Tắt dấu chấm
  digitalWrite(dp, LOW); 
}

// Loop through all 7 LED segments starting with pin 2    
void writeDigit(byte digit) 
{
  byte pin = 2; 
  byte seg;

  for (seg = 0; seg < 7; seg++) 
  {
    digitalWrite(pin, digseg[digit][seg]);
    pin++;
  }
}

void loop() 
{
  byte digit;
  
  for (digit=0; digit < 10; digit++) 
  {
   writeDigit(digit); 
   delay(second); 
  }
  delay(4*second);
}