Showing posts with label Arduino cơ bản. Show all posts
Showing posts with label Arduino cơ bản. Show all posts

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);
}

Thursday, September 18, 2014

Nút nhấn

Đọc tín hiệu từ nút nhấn - Button

Ví dụ này chỉ cho chúng ta cách bật LED sáng ở chân 13 khi chúng ta nhấn nút nhấn.
Yêu cầu phần cứng
  • Mạch Arduino Board
  • Nút nhấn
  • Điện trở 10K ohm 
  • Bảng breadboard
  • Dây cắm

Mạch kết nối

Hình ảnh sử dụng Fritzing. Các ví dụ khác, truy cập Fritzing project page
Kết nối dây như hình vẽ, dây đỏ cấp nguồn 5V và dây đen cấp mát Gnd được cắm vào 2 chan của hàng dọc Breadboard như hình vẽ. 
Một chân của nút nhấn nối với dây đỏ, chân còn lại nối với dây màu đen qua điện trở 10K
Chân đối diện nối với chân Digital output số 3
Khi chúng ta không nhấn không có sự kết nối giữa 2 chân của nút nhấn, chân 3 sẽ kết nối với chân Gnd, tín hiệu đọc được là LOW, khi chúng ta nhấn nút, nguồn 5V sẽ được cấp vào chân 3 khi đó tín hiệu đọc được là HIGH

Sơ đồ

Code

/*
  Button
 
 Bật và tắt LED khi nhấn nút nhấn 
 
 
 Mạch:
 * LED nối chân 13 với chân Gnd
 * Nút nhấn được nối với chân 2 từ nguồn 5V
 * Điện trở 10K được nối với chân 2 với chân Gnd
 
 
*/


// Hằng số là không đổi chúng ta sử dụng ở đây để định nghĩa cho chân nút nhấn.

const int buttonPin = 2;     // chân của nút nhấn là chân số 2
const int ledPin =  13;      // chân của LED là chân 13

//Giá trị sẽ thay đổi:
int buttonState = 0;         // Giá trị đọc từ trạng thái của nút nhấn

void setup() {
  // chỉ ra chân nào là chân Output
  pinMode(ledPin, OUTPUT);    
  // Chỉ ra chân nào là chân Input
  pinMode(buttonPin, INPUT);    
}

void loop(){
  // Đọc trạng thái của nút nhấn
  buttonState = digitalRead(buttonPin);

  // Kiểm tra khi nút nhấn được nhấn.
  // Nếu được nhấn thì đọc giá trị HIGH:
  if (buttonState == HIGH) {    
    // Bật LED sáng:    
    digitalWrite(ledPin, HIGH); 
  }
  else {
    // Tắt LED, nếu đọc giá trị ngược lại:
    digitalWrite(ledPin, LOW);
  }
}

Wednesday, September 17, 2014

Bink Without Delay

Blink Without Delay

Thỉnh thoảng chúng ta cần làm 2 thứ một lúc nhưng có thể làm bằng cách nào? Ví dụ này giúp cho chúng ta vừa làm LED nháy vừa đọc tín hiệu từ nút nhấn hoặc tín hiệu khác. Trong trường hợp này chúng ta không thể sử dụng hàm delay(), nếu chúng ta sử dụng hàm này sẽ dẫn đến kết quả như sau: chương trình sẽ dừng khi nhấn nút nhấn nếu nó xảy ra khi sẻ dụng hàm delay(). Bản code dưới đay sẽ chỉ ra cách làm LED nháy mà không sử dụng hàm delay(). 
Yêu cầu phần cứng
  • Mạch Arduino Board
  • LED

Kết nối mạch

Trong mạch này chân dương của LED sẽ đi vào chân số 13, chân âm của LED sẽ đi vào chân GND. Kết nối Arduino với máy tính và nhập chương trình bên dưới vào
Sơ đồ

hình ảnh sử dụng Fritzing. Các ví dụ khác, xem Fritzing project page

Code

Trong đoạn code này sử dụng hàm millis() để làm LED nháy
/* Blink without Delay
 
 Bật và tắt LED bằng khi kết nối với chân Digital sử dụng hàm millis()
 
 Lắp mạch:
 * LED kết nối giữa chân 13 và chân Gnd.
*/


// Hằng số là không đổi, vì vậy ở đây sử dụng hằng số để thiết lập
const int ledPin =  13;      // chân của LED

int ledState = LOW;             // ledState trạng thái của LED
long previousMillis = 0;        // sẽ lưu lại khi thời gian được cập nhật

long interval = 1000;           // Thời gian LED nháy (mini giây)

void setup() {
  // Thiết lập chân xuất tín hiệu
  pinMode(ledPin, OUTPUT);    
}

void loop()
{
  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis > interval) {
    // Lưu thời gian mà LED  nháy
    previousMillis = currentMillis;  

    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // thiết lập LED với các giá trị khác nhau của trạng thái LED
    digitalWrite(ledPin, ledState);
  }
}

Tuesday, September 16, 2014

Đọc tín hiệu điện áp

Đọc tín hiệu Analog voltages

Ví dụ này chỉ cho các bạn cách đọc tín hiệu xung vào chân 0, chuyển đổi tín hiệu từ analogRead sang volt, và xuất dữ liệu ra ngoài màn hình.
Yêu cầu phần cứng
  • Mạch Arduino Board
  • Biến trở
  • a variable resistor, like a potentiometer

Sơ đồ lắp mạch

hình ảnh sử dụng Fritzing. Các vị dụ khác, truy cập trang Fritzing project page
Nối ba dây từ biến trở đến mạch Arduino
Dây thứ nhất bên ngoài của biến trở đi đến chân Gnd, chân ngoài cùng còn lại đi vào chân 5V, chân thứ 3 đi vào chân nhập tín hiệu analog số 2.
Bằng cách vặn trục của biến trở, bạn có thể thay đổi được điện trở của nó. Sẹ thay đổi này dẫn đến sự thay đổi điện áp của chân thứ 3 (chân giữa). Điện áp này nằm trong khoảng từ 0-5V. 
Tín hiệu đọc được từ chân giữa của biến trở là tín hiệu xung analog voltage.
Bên trong của Arduino có mạch chuyển đổi từ tín hiệu xung sang tín hiệu số để đọc sự thay đổi điện áp này và chuyển đổi sang tín hiệu số từ 0-1023.
Khi chúng ta xoay theo cùng chiều kim đồng hồ đến vị trí không thể xoay được nữa, có một điện áp 0V đi đến chân 2 và giá trị là 0. Khi chúng ta quay theo chiều ngược lại đến lúc không xoay được nữa thì tại đó có điện áp 5V tại chân 2 và giá trị là 1023.
Sơ đồ

Code

Trong chương trình dưới đây, điều đầu tiên các bạn cần làm đó là tạo hàm đọc và truyền dữ liệu là 9600bits/s bằng dòng code sau:
Serial.begin(9600);
Tiếp theo, trong Main loop, các bạn cần tạo hàm đọc giá trị điện trở tại chân A0 với dòng code
int sensorValue = analogRead(A0);
Để thay đếm được giá trị từ 0-1023 quy về điện áp chúng ta sử dụng hàm float. 
float voltage= sensorValue * (5.0 / 1023.0);
Cuối cùng cần chúng ta xuất tín hiệu đọc được ra màn hình window bằng hàm
Serial.println(voltage)
Bây giờ khi mở Serial Monitor trong môi trường Arduino, các bạn có thể nhìn thấy giá trị điện áp từ 0-5V khi chúng ta xoay trục biến trở.
/*
  Đọc tín hiệu điện áp
  Đọc tín hiệu xung vào chân 0 và chuyển đổi sang điện áp sau đó xuất kết quả ra màn hình
  Nối chân giữa của biến trở tới chân A0, hai chân còn lại nối với chân 5V và Gnd.
 
 */


// Chương trình như sau:
void setup() {
  // Đặt kết nối cho Arduino 9600 bits trên giây:
  Serial.begin(9600);
}

// Vòng lặp chính, làm cho chương trình chạy liên tục:
void loop() {
  // Đọc tín hiệu analog từ chân A0:
  int sensorValue = analogRead(A0);
  // Chuyển đổi tín hiệu đọc được:
  float voltage = sensorValue * (5.0 / 1023.0);
  // Xuất ra ngoài màn hình:
  Serial.println(voltage);
}