Showing posts with label ARDUINO. Show all posts
Showing posts with label ARDUINO. Show all posts

BÀI 5 : ĐIỀU KHIỂN TỐC ĐỘ ĐỘNG CƠ BẰNG PWM

12:40:00 AM Add Comment
1. Sơ đồ mạch.
điều khiển động cơ arduino
Hình 1.
2. Code chương trình.
int potPin = 0;
int transistorPin = 9;
int potValue = 0;
void setup() {
pinMode(transistorPin, OUTPUT);}
void loop() {
potValue = analogRead(potPin) / 4;
analogWrite(transistorPin, potValue);
}
3. Giải thích chương trình.
Như trong sơ đồ mạch ta thấy biến trở được nối với chân A0, transistor được nối với
chân số 9 thông qua điện trở 1k. Như vậy ta khai báo 2 biến chứa vị trí chân cho biến trở và transistor.
int potPin = 0;
int transistorPin = 9;
Biến integer potValue chứa giá trị đọc được từ chân A0.
int potValue = 0
Một câu hỏi đặt ra ở đây là nếu chúng ta không kết nối transistor điều khiển động cơ
vào chân số 9 mà thay vào đó là chân số 1 hoặc 2 để điều khiển tốc độ động cơ thì có được không ?.
Câu trả lời là Không. Vậy tại sao Không ?
Tôi sẽ trả lời câu hỏi này sau. Nhưng trước hết tôi nói về PWM. PWM (pulse width
modulation) là phương pháp điều chế dựa trên sự thay đổi độ rộng của chuổi xung dẫn đến sự thay đổi điện áp ra. Để tạo ra được PWM trên Arduino thì chúng ta sử dụng lệnh analogWrite(Pin, Value);
Trong đó:
Pin: là vị trí chân, đối với Arduino Uno thì chỉ có các chân 3, 5, 6, 9, 10 & 11 mới
có chức năng tạo PWM. Vậy chúng ta có thể trả lời được câu hỏi bên trên, các chân digital còn lại của có thể đọc hoặc xuất 2 giá trị là 0 và 1 mà thôi. Value: Giá trị nằm trong khoảng 0 đến 255. Để hiểu rõ hơn về PWM tôi sẽ minh hoạ qua ví dụ sau.
Nếu tôi sử dụng lệnh analogWrite(transistorPin, 127); thì dạng xung ở chân 9 (
transistorPin = 9) sẽ như hình dưới và giá trị trung bình ngõ ra sẽ là 2,5V (50% ).
PWM 50%
Hình 2. PWM 50%
Nếu Value = 64 (hay 25%) thì dạng xung như sau:
Hình 3. PWM 25%
Value = 229 (hay 90%) thì dạng xung sẽ là :
Hình 3. PWM 90%
Từ ví dụ trên ta thấy sự thay đổi độ rộng của chuổi xung dẫn đến sự thay đổi điện áp
ra. Ta cũng thấy rằng điện áp trên motor cũng thay đổi tuyến tính theo sự thay đổi điện áp ngõ ra trên chân 9. Tức là nếu điện áp trung bình trên chân 9 là 2,5 volt (50% ) thì điện áp trên hai đầu motor là 6 volt ( nguồn motor là 12 volt ). Quay lại chương trình ta cần quan tâm tới một câu lệnh đó là:
potValue = analogRead(potPin) / 4;
Chúng ta cần phải chia giá trị đọc được cho 4 vì giá trị analog sẽ nằm trong khoảng
0 (0 volt ) đến 1023 (5 volt ), nhưng giá trị cần xuất ra ngoài chân 9 lại nằm trong khoảng 0 đến 255 đó chính là lý do tại sao có chia 4 ở đây. Và câu lệnh cuối cùng là tạo PWM trên chân 9 để điều khiển tốc đố động cơ.
analogWrite(transistorPin, potValue);
Nếu như đã điều kiển được tốc độ động cơ bằng PWM rồi thì việc điều khiển độ sáng
của Led hay đèn đối với các bạn bay giờ là chuyện quá đơn giản. Các bạn chỉ cần nối chân số 9 với một Led có điện trở hạn dòng là 220 ohm và code chương trình hoàn toàn giống như điều khiển động cơ. Lưu ý là khi mô phỏng các bạn sẽ không thấy được led thay đổi độ sáng mà chỉ thấy nhấp nháy nguyên nhân là do phần mềm proteus không đáp ứng kịp sự thay đổi của các xung PWM. Nhưng khi làm thực tế các bạn sẽ thấy được sự thay đổi độ sáng của Led rõ rệt.

BÀI 4 : CHASER LED (P2)

5:31:00 AM 1 Comment
Project 4 : Led sáng dần từ led 1 đến led 10 và ngược lại thời gian delay thay đổi được.
1. Sơ đồ mch.
Trong project này hoàn toàn giống project 3 chỉ thêm một biến trở dùng để điều chỉnh
thời gian delay cho chương trình.

chaser led arduino
Hình 1
2. Code chương trình.
int ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int direction = 1;

int currentLED = 0;
int potPin = 0;
unsigned long changeTime;
void setup() {
for (int x=0; x<10; x++) {
pinMode(ledPin[x], OUTPUT);
} }
void loop() {
int delayvalu= analogRead(potPin);
for (int x=0; x<10; x++) {
digitalWrite(ledPin[x], LOW);
}
digitalWrite(ledPin[currentLED], HIGH);
currentLED += direction;
if (currentLED == 9) {direction = -1;}
if (currentLED == 0) {direction = 1;}
delay(delayvalu);
}

3. Giải thích chương trình.
Chương trình ta chỉ thêm và thay đổi một vài câu lệnh mà thôi ngoài ra không khác
gì nhiều so với project 3, các câu lệnh đó như sau :
int potPin = 0 ;
int delayvalu= analogRead(potPin);
delay(delayvalu);
Đầu tiên chúng ta khai báo một biến chứa vị trí chân biến trở kết nối đó là vị trí A0
int potPin = 0 ;
Đọc giá trị từ chân analog A0 bằng câu lệnh analogRead(potPin) và gán nó cho biến
delayvalu. Arduino có 6 chân đầu vào analog đánh dấu từ A0 đên A5 với 10 bit chuyển đổi từ analog sang digital (ADC). Nghĩa là chân analog có thể đọc được các giá trị điện áp từ 0 đến 5 volt tương ứng với các số integer từ 0 ( 0 volt ) đến 1023 ( 5 volt ).
Trong project này chúng ta cần thiết lập thời gian delay bằng cách điều chỉnh biến trở. Ta sử dụng câu lệnh delay(delayvalu) để tạo thời gian trễ. Nếu ta điều chỉnh biến trở
sao cho điện áp đầu vào chân analog là 5 volt thì delayvalu sẽ có giá trị là 1023 ( hơn 1
giây), nếu là 2,5 volt thì delayvalu sẽ là 511. Các bạn thử điều chỉnh biến trở ta sẽ thấy thời gian delay thay đổi hoặc là nhanh dần hoặc là chậm dần. Lưu ý : đối với các chân analog chúng ta không cần thiết lập chế độ vào ra bằng hàm 
pinMode như các chân digital. Mc định các chân analog là input. 

BÀI 3 : CHASER LED (P1)

6:26:00 PM Add Comment
Project 3 : Led sáng dần từ led 1 đến led 10 và ngược lại.
1.  Sơ đồ mạch.
chaser led arduino
- Code chương trình.
byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int direction = 1;
int currentLED = 0;
void setup()
{
for (int x=0; x<10; x++)
{
pinMode(ledPin[x], OUTPUT);
}
 }
void loop() {
for (int x=0; x<10; x++)
{
digitalWrite(ledPin[x], LOW);
}
digitalWrite(ledPin[currentLED], HIGH);
currentLED += direction;
if (currentLED == 9)
{
direction = -1;
}
if (currentLED == 0)
{
direction = 1;
}
delay(500);
}
- Giải thích chương trình.
Trong Project này chúng  ta sử  dụng  10 chân digital để  điều  khiển 10 led,  để  cho
chương  trình ngắn gọn  thì  ở đây tôi sử dụng  mảng  1 chiều gồm  10 phần tử  trong đó chứa
10 vị trí chân led mà ta sử dụng trong project
byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
Tiếp tục khai báo 2 biến integer là :
int direction = 1;
int currentLED = 0;
Trong hàm setup() tôi sử dụng một vòng lặp  để định nghĩa mode cho các chân led.
Tôi nghĩ là không khó để hiểu được các câu lệnh này.
Tiếp theo là hàm loop(), đầu tiên tôi tắt tất cả các led bằng các câu lệnh:
for (int x=0; x<10; x++)
 {
digitalWrite(ledPin[x], LOW);
}
Sau đó cho sáng led đầu tiên bằng câu lệnh :
digitalWrite(ledPin[currentLED], HIGH);
Vì  ta  đã  khai báo  currentLED  = 0    nên mãng  sẽ  truy xuất  phần tử  đầu tiên  trong
mãng có giá trị là 4 vì thế led ở vị trí chân digital số 4 sẽ sáng.
currentLED += direction;
Tăng currentLED  lên 1 đơn vị ( direction =1 ). Vòng lặp tiếp theo sẽ là led ở chân
digital 5 sáng và cứ như thế cho đến led ở chân số 13 sáng, thì  lúc này currentLED == 9,
câu lệnh  “ if (currentLED == 9) {direction =  -1;}” sẽ thực  hiện  và led sẽ  sáng ngược lại
từ led 10 xuống led thứ 1.
Hai câu lệnh :
if (currentLED == 9)
 {
direction = -1;
}
if (currentLED == 0)
{
direction = 1;
}
dùng để quy định chiều sáng của led là tăng dần hay giảm dần. Nếu là Led thứ 10 sang thì
tiếp theo sẽ giảm xuống led thứ 9 và ngược lại nếu led thứ 0 sang thì chu kỳ tiếp theo led
1 sẽ sáng.

BÀI 2 : GIAO TIẾP VỚI NÚT NHẤN

10:11:00 PM Add Comment
Chào các bạn trong bài đăng này mình sẽ hướng dẫn các bạn giao tiếp với nút nhấn sử dụng Board Arduino Uno, trước tiên chúng ta sẽ xem sơ đồ nguyên lý :
1. Sơ đồ nguyên lý.

1    2. Code chương trình.
const int buttonPin = 2; 
const int ledPin = 13;
int buttonState = LOW;
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT); }
void loop()
{
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH)
{  
           digitalWrite(ledPin, HIGH);
 }
else
 {
digitalWrite(ledPin, LOW);
}
}
3. Giải thích chương trình.
Trước tiên ta khai báo hai biến để lưu trữ vị trí chân của phím nhấn và led :
const int buttonPin = 2; 
const int ledPin = 13;
Phím nhấn sẽ ở vị trí chân số 2 và led chân số 13.
Ta khai báo một biến trang thái của phím nhấn  là  int buttonState = LOW;
Trong hàm setup() là khai chế độ (Mode) cho chân button và chân led. Chân button là chân ngõ vào và chân led là chân ngõ ra.
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
Trong hàm loop() ta có câu lệnh đầu tiên là :
buttonState = digitalRead(buttonPin);
Câu lệnh  này có  nghĩa  là  gán giá  trị  đọc  được  từ  chân button (chân 2) cho biến buttonState.. buttonState sẽ có giá trị 0 nếu như button không được nhấn và có giá trị  1 nếu được nhấn. Bằng cách sử dụng hàm digitalRead() ta có thể kiểm tra được các chân digital đang ở mức cao hay thấp.
Sau khi đọc được  giá  trị có ở chân buttonPin ( chân 2) ta kiểm tra xem là button có nhấn hay không.
Nếu có tức là buttonState =HIGH  thì lúc này ta bật led bằng lệnh digitalWrite()
if (buttonState == HIGH)
{
digitalWrite(ledPin, HIGH);
}
Ngược lại thì ta một lần nửa sử dụng hàm digitalWrite()  để tắt led
else
{
digitalWrite(ledPin, LOW);
}
Chương trình chúng ta đơn giản vậy thôi ! Ai chưa hiểu gì thì comment bên dưới !

BÀI 1 : CHỚP TẮT LED ARDUINO

6:23:00 AM Add Comment
Sau đây tôi sẽ  tạo  một project nhấp  nháy  led  thời  gian delay là  1 giây sử  dụng proteus
để mô phỏng.
- Sơ đồ mạch : 

chớp tắt led arduino
- Code chương trình.
int ledPin = 9;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
- Giải thích chương trình.
int ledPin = 9;
Khai báo một giá trị biến integer là ledPin = 9.
void setup()
{
pinMode(ledPin, OUTPUT); 
}
Trong  Arduino sketch  cần phải có  hàm  setup() và  loop() nếu  không có  thì  chương
trình  báo  lỗi.  Hàm Setup() chỉ  chạy  một lần  kể  từ  khi bắt  đầu  chương  trình. Hàm này có chức  năng  thiết  lập  chế  độ  vào,  ra cho các  chân digital hay tốc  độ  baud  cho giao tiếp  Serial...
Cấu trúc của hàm pinMode() là như sau:
pinMode(pin,Mode);
pin : là vị trí chân digital.
Mode: là chế độ vào ( INPUT), ra (OUTPUT).
Lệnh tiếp theo.
pinMode(ledPin, OUTPUT);
Lệnh này thiết  lập chân số  9 trên board là chân ngõ  ra (OUTPUT). Nếu không khai
báo “ int ledPin = 9; ” thì bạn có thể viết cách sau nhưng ý nghĩa không thay đổi:
pinMode(9, OUTPUT);
Bắt buộc khai báo một hàm loop() trong Arduino IDE. Hàm này là vòng lặp vô hạn
void loop() 
{
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
Tiếp  theo ta sẽ  phân tích  hàm digitalWrite(  ledPin, HIGH);  lệnh  này có  ý  nghĩa  là
xuất  ra chân digital có  tên là  ledPin  ( chân 9)  mức  cao  (  HIGH),  mức  cao tướng  ứng  là  5 volt.
delay(1000);
Lệnh này tạo một khoảng trễ với thời gian là 1 giây. Trong hàm delay() của IDE thì
1000 tương ứng với 1 giây.
digitalWrite(ledPin, LOW);
Cũng  giống  như  digitalWrite(  ledPin, HIGH);  lệnh  này xuất  ra chân ledPin  mức  thấp
(LOW) tức là 0 volt.
Và tiếp tục là một hàm delay().
Như  vậy  chúng  ta có  thể thấy  chương  trình  sẽ  thực  hiện  tắt  sáng  led  liên tục  không
ngừng trừ khi ta ngắt nguồn.
Ai chưa có thư viện mô phỏng cho Arduino trên Protues thì download Tại Đây nha !

THƯ VIÊN MÔ PHỎNG CHO ARDUINO TRÊN PROTEUS

7:19:00 PM 1 Comment
Chào các bạn hôm này mình sẽ giới thiệu vè chia sẽ với các bạn một thư viện hỗ trợ mô phỏng Arduino trên phần mềm protues. Trước tiên mình xin giới thiệu với các bạn các Board Arduino có thể mô phỏng được.
1. SIMULINO UNO



2. SIMULINO LILYPAD


3. SIMULINO MEGA


4. SIMULINO NANO


5. ULTRASONIC V2


- Link download thư viện : Click here
Hương dẫn sử dụng sau khi download file về các bạn giải nén và copy 2 file trong thư mục past vào đường dẫn sau : C:\ProgramData\Labcenter Electronics\Proteus 8 Professional\LIBRARY sau đó các ban mở Protues lên lên và gõ đúng các tên như mình đã nêu ở trên và lôi ra sử dụng thôi nha ! Chúc các bạn thành công ai có thắc mắc gì thì comment ở dưới nha !