Thứ Tư, 5 tháng 8, 2020

Giới thiệu Servo SG90 và cách điều khiển bằng biến trở


1. Giới thiệu

Servo là một dạng động cơ điện đặc biệt. Không giống như động cơ thông thường cứ cắm điện vào là quay liên tục, servo chỉ quay khi được điều khiển (bằng xung PPM) với góc quay nằm trong khoảng bất kì từ 0o - 180o. Mỗi loại servo có kích thước, khối lượng và cấu tạo khác nhau. Có loại thì nặng chỉ 9g (chủ yếu dùng trên máy bay mô mình), có loại thì sở hữu một momen lực bá đạo (vài chục Newton/m), hoặc có loại thì khỏe và nhông sắc chắc chắn,...

Động cơ servo được thiết kế những hệ thống hồi tiếp vòng kín. Tín hiệu ra của động cơ được nối với một mạch điều khiển. Khi động cơ quay, vận tốc và vị trí sẽ được hồi tiếp về mạch điều khiển này. Nếu có bầt kỳ lý do nào ngăn cản chuyển động quay của động cơ, cơ cấu hồi tiếp sẽ nhận thấy tín hiệu ra chưa đạt được vị trí mong muốn. Mạch điều khiển tiếp tục chỉnh sai lệch cho động cơ đạt được điểm chính xác. Các động cơ servo điều khiển bằng liên lạc vô tuyến được gọi là động cơ servo RC (radio-controlled). Trong thực tế, bản thân động cơ servo không phải được điều khiển bằng vô tuyến, nó chỉ nối với máy thu vô tuyến trên máy bay hay xe hơi. Động cơ servo nhận tín hiệu từ máy thu này.


2. Lắp mạch
Chuẩn bị
x1 Micro Servo
x1 Biến trở
x1 Arduino Uno
x1 Breadboard
x1 Dây cắm breadboard



Hình 3: Sơ đồ mạch breadboard

Thư viện Servo đã có sẵn trong hệ thống thư viện mặc định của Arduino nên bạn không cần phải download một thư viện mới về.

Copy và dán code sau

  1. #include <Servo.h> // Thư viện điều khiển servo
  2.  
  3. // Khai báo đối tượng myservo dùng để điều khiển servo
  4. Servo myservo;
  5.  
  6. int bientro = A0; // Khai báo chân analog đọc biến trở điều khiển servo
  7. int servoPin = 9; // Khai báo chân điều khiển servo
  8.  
  9. void setup ()
  10. {
  11. // Cài đặt chức năng điều khiển servo cho chân servoPin
  12. myservo.attach(servoPin);
  13. Serial.begin(9600); // Mở giao tiếp Serial ở baudrate 9600
  14. }
  15.  
  16. void loop ()
  17. {
  18. int value = analogRead(bientro);// Đọc giá trị biến trở
  19. // Chuyển giá trị analog (0-1023) đọc được từ biến trở sang số đo độ (0-180độ)
  20. // dùng để điều khiển góc quay cho servo
  21. int servoPos = map(value, 0, 1023, 0, 180);
  22. // Cho servo quay một góc là servoPos độ
  23. myservo.write(servoPos);
  24. Serial.println(servoPos);
  25. delay(100);
  26. }

 

Hướng dẫn điều khiển động cơ bước 28BYJ-48 với ULN2003

Động cơ bước là gì?


Có rất nhiều tài liệu trên mạng nói về động cơ bước. Bạn có thể google để tìm ra nó.



Nôm na, động cơ bước là một loại động cơ mà ở đó bạn sẽ có thể quy định chính xác số góc quay và động cơ bước sẽ phải quay. Không giống như Servo, động cơ bước có thể quay bao nhiêu độ tùy ý và mỗi lần quay nó sẽ quay được 1 step, 1 step ở đây là bao nhiêu còn phụ thuộc vào động cơ bước của bạn. Ví dụ, động cơ bước của bạn có 72 step thì nó sẽ cần quay 72 step để hoàn thành một vòng quay. Số step này là hằng số, nhưng bạn có thể dùng công nghệ micro step để "cải thiện" số vòng quay động cơ bước của bạn.
2

Động cơ bước 28BYJ-48

Động cơ bước sử dụng trong bài toán là động cơ bước 4 pha (thực ra là 2 pha được chia ra làm 2 ở mỗi pha ngay tại vị trí giữa) (gồm 5 dây), 4 trong 5 dây này được kết nối với 2 cuộn dây trong động cơ và 1 dây là dây nguồn chung cho cả 2 cuộn dây. Mỗi bước của động cơ quét 1 góc 5.625 độ, vậy để quay 1 vòng động cơ phải thực hiện 64 bước.



Các bạn có thể tra thêm datasheet ở đây.
3

Cần chuẩn bị

Arduino Board
BYJ48 Stepper Motor 5v
ULN2003 Board
Dây breadboard cái-cái

4 Nối mạch





5 Cùng lập trình


Arduino IDE có một thư viện hỗ trợ điều khiển động cơ bước tên là Stepper Motor, nó cực kì dễ sử dụng, chỉ việc kết nối như trên rồi nạp code, thế là xong! Nhưng mọi việc không dễ dàng như thế, chúng ta cần phải quan tâm một số điều sau:

Động cơ BYJ48 Stepper chỉ có sẵn bộ hộp số và nó cho ta đến *64 (tỉ lệ bánh răng) => nó có đến 64 * 64 = 4096 bước. Quá đã phải không nào!
sCông thức tính số bước

Số bước thật = Số bước lý thuyết * tỉ lệ bánh răng

Trong trường hợp này: Số bước thật = 64 * 64 = 4096.

Vì vậy, hãy kiểm tra datasheet để có thêm thông tin nhé!

  1. #include <Stepper.h>
  2.  
  3. const int stepsPerRevolution = 4096; // hehe
  4.  
  5. Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
  6.  
  7. void setup() {
  8.  
  9. myStepper.setSpeed(5);
  10. Serial.begin(9600);
  11. }
  12.  
  13. void loop() {
  14.  
  15. Serial.println("clockwise");
  16. myStepper.step(stepsPerRevolution);
  17. delay(500);
  18.  
  19. Serial.println("counterclockwise");
  20. myStepper.step(-stepsPerRevolution);
  21. delay(500);
  22. }

 

Đọc nhiệt độ - độ ẩm và xuất ra màn hình LCD


1. Giới thiệu

Bài viết này sẽ hướng dẫn các bạn cách đọc nhiệt độ - độ ẩm từ cảm biến và xuất ra màn hình LCD. Hy vọng rằng qua bài viết này, bạn sẽ dần hiểu được Arduino tạo cho người dùng một sự đơn giản và tiện lợi đến mức nào.

2. Nội dung chính
Đọc dữ liệu từ cảm biến nhiệt độ - độ ẩm DHT11.
Sử dụng màn hình LCD để xuất thông tin.

3. Phần cứng cần thiết
Màn hình LCD 16 x 2
Mạch điều khiển màn hình LCD sử dụng giao tiếp I2C
Cảm biến nhiệt độ - độ ẩm DHT11
Arduino UNO R3 (hoặc tương đương)
Dây cắm breadboard

4. Cảm biến DHT11



Cảm biến DHT11 đã được tích hợp trong một mạch duy nhất, bạn chỉ việc nối dây nguồn (Vcc, GND) và dây tín hiệu (Signal) vào mạch Arduino là xong.

Thông số kĩ thuật
Điện áp hoạt động: 3-5.5V DC
Ngưỡng độ ẩm: 20 - 90%
Sai số độ ẩm: ± 5%
Ngưỡng nhiệt độ: 0 - 55oC
Sai số nhiệt độ: ± 2oC

Download và cài đặt thư viện hỗ trợ sử dụng DHT11: download tại đây

Kết nối cảm biến DHT11 với mạch Arduino





Lập trình

#include "DHT.h"

const int DHTPIN = 2; //Đọc dữ liệu từ DHT11 ở chân 2 trên mạch Arduino
const int DHTTYPE = DHT11; //Khai báo loại cảm biến, có 2 loại là DHT11 và DHT22

DHT dht(DHTPIN, DHTTYPE);

void setup() {
Serial.begin(9600);
dht.begin(); // Khởi động cảm biến
}

void loop() {
float h = dht.readHumidity(); //Đọc độ ẩm
float t = dht.readTemperature(); //Đọc nhiệt độ

Serial.print("Nhiet do: ");
Serial.println(t); //Xuất nhiệt độ
Serial.print("Do am: ");
Serial.println(h); //Xuất độ ẩm

Serial.println(); //Xuống hàng
delay(1000); //Đợi 1 giây
}



Sau khi upload chương trình lên mạch Arduino, bạn hãy bấm Ctrl + Shift + M để mở cửa sổ Serial Monitor và xem kết quả.




Một lưu ý nho nhỏ cho những bạn lập trình nâng cao, đó là cảm biến DHT11 sẽ "treo" (delay) chương trình của bạn trong quá trình nó đọc nhiệt độ, độ ẩm!
5. Màn hình LCD



Nếu bạn không có module hỗ trợ này, bạn vẫn có thể điều khiển màn hình theo cách thông thường. Tuy nhiên sẽ rất tốn thời gian và chưa chắc bạn sẽ làm được !

Kết nối module màn hình với Arduino





Lập trình
#include <DHT.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

const int DHTPIN = 2;
const int DHTTYPE = DHT11;
DHT dht(DHTPIN, DHTTYPE);

byte degree[8] = {
  0B01110,
  0B01010,
  0B01110,
  0B00000,
  0B00000,
  0B00000,
  0B00000,
  0B00000
};

void setup() {
  lcd.init();  
  lcd.backlight();
  
  lcd.print("Nhiet do: ");
  lcd.setCursor(0,1);
  lcd.print("Do am: ");
  
  lcd.createChar(1, degree);

  dht.begin();  
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(t) || isnan(h)) { // Kiểm tra xem thử việc đọc giá trị
  } 
  else {
    lcd.setCursor(10,0);
    lcd.print(round(t));
    lcd.print(" ");
    lcd.write(1);
    lcd.print("C");

    lcd.setCursor(10,1);
    lcd.print(round(h));
    lcd.print(" %");    
  }
}

Arduino: Cài đặt hiển thì trên LCD với modul I2C LCD


I. Giới thiệu

 Một trò nhỏ nhưng đủ làm các bạn khác phải ngạc nhiên vì khả năng của bạn

II. Chuẩn bị
a. Màn hình LCD

b. Module giao tiếp I2C

Thông thường, để sử dụng màn hình LCD, bạn sẽ phải mất rất nhiều chân trên Arduino để điều khiển. Do vậy, để đơn giản hóa công việc, người ta đã tạo ra một loại mạch điều khiển màn hình LCD sử dụng giao tiếp I2C. Nói một cách đơn giản, bạn chỉ tốn ... 2 dây để điều khiển màn hình, thay vì 8 dây như cách thông thường.



Sau đó các bạn chỉ việc hàn mạch như thế này là xong. Bởi vì giao tiếp I2C được thiết kế riêng nhằm giúp LCD giao tiếp với Board xử lý một cách dễ dàng, nên rất dễ kết nối



2 chân SDA và SCL là 2 chân tín hiệu dùng cho giao tiếp I2C. Và để sử dụng được module giao tiếp i2C, các bạn phải Down thư viện hỗ trợ sử dụng LCD qua giao tiếp I2C tại đây

III. Bắt đầu
a. Kết nối



Các bạn kết nối như thế này nhé!!! Bởi vì thư viện bắt buộc dùng 2 chân A4, A5


b. Code

#include <Wire.h>;
#include <LiquidCrystal_I2C.h>;
LiquidCrystal_I2C lcd(0x27,16,2);
//0x27 là địa chỉ màn hình trong bus I2C. Phần này chúng ta không cần phải quá bận tâm vì hầu hết màn hình (20x4,...) đều như thế này!
//16 là số cột của màn hình (nếu dùng loại màn hình 20x4) thì thay bằng 20
//2 là số dòng của màn hình (nếu dùng loại màn hình 20x4) thì thay bằng 4
byte traitim[8]={
B01010,
B11111,
B11111,
B01110,
B00100,
B00000,
B00000,
B00000
}; // Cái này là tạo hình trái tim...đoạn này tham khảo của Thạc Sĩ Huỳnh Minh Phú đó các bạn
void setup(){
lcd.init(); //Khởi động màn hình. Bắt đầu cho phép Arduino sử dụng màn hình
lcd.backlight(); //Bật đèn nền
}
void loop()
{
lcd.setCursor(3,0);
lcd.print("Hello anh em"); //Viết dòng chữ Anh Yêu Em...Các bạn có thể thay bằng dòng khác như Minh Thich Ban...

delay(2000);
lcd.clear();//Xóa màn hình
delay(300);
}

Thứ Ba, 4 tháng 8, 2020

Arduino: Bật tắt máy bơm nước - Sử dụng module siêu âm


I. Sơ đồ

Sơ đồ mạch của mình tương tự bài viết Arduino: Bật tắt máy bơm nước - Sử dụng module siêu âm, các bạn tham khảo thêm nhé.
Mình chỉ thêm phần hiển thị mực nước bằng LED và nút bấm để bật tắt bằng tay.



II. Đấu nối


Mô phỏng trên Proteus 



III. Lập trình
const int trig = 8;     // chân trig của HC-SR04
const int echo = 7;     // chân echo của HC-SR04
const int relay = 13;   // chân máy bơm

byte ledPin[] = {A5,A4,A3,A2,A1,A0}; // Mảng lưu vị trí các chân đèn LED
byte pinCount; // Khai báo biến pinCount dùng cho việc lưu tổng số chân LED
byte muc_nuoc = 2;
int moc_tren = 780;  // Thay đổi theo thực tế
int moc_duoi = 330;  // Thay đổi theo thực tế
bool relay_status = 0;  // Trạng thái relay: 0 là tắt, 1 là bật
 
void setup()
{
  Serial.begin(9600);     // giao tiếp Serial với baudrate 9600
  pinMode(trig,OUTPUT);   // chân trig sẽ phát tín hiệu
  pinMode(echo,INPUT);    // chân echo sẽ nhận tín hiệu
  pinMode(relay,OUTPUT);
    
  pinCount = sizeof(ledPin);  // Lấy số lượng LED
  for (byte i=0;i<pinCount;i++) {
    pinMode(ledPin[i],OUTPUT);  //Các chân LED là OUTPUT
    digitalWrite(ledPin[i],LOW); //Mặc định các đèn LED sẽ tắt
  }
  
  pinMode(2,INPUT_PULLUP);  // Bật điện trở trong cho Pin 2, chân Button
  
// Khởi tạo ngắt để bật tắt relay bằng tay
  attachInterrupt(0, bat_tat_relay, FALLING); // gọi hàm battatled liên tục khi còn nhấn nút

}
 
void loop()
{
  unsigned long duration; // biến đo thời gian
  int distance;           // biến lưu khoảng cách
    
/* Phát xung từ chân trig */
  digitalWrite(trig,0);   // tắt chân trig
  delayMicroseconds(2);
  digitalWrite(trig,1);   // phát xung từ chân trig
  delayMicroseconds(5);   // xung có độ dài 5 microSeconds
  digitalWrite(trig,0);   // tắt chân trig
    
/* Tính toán thời gian */
// Đo độ rộng xung HIGH ở chân echo. 
  duration = pulseIn(echo,HIGH);  
// Tính khoảng cách đến vật.
  distance = int(duration/2/29.412);
    
// thiet lap muc nuoc su dung xuong moc_tren thi tu dong bat relay
  if (distance > moc_tren)
    {
      digitalWrite (relay, HIGH);
      relay_status = 1;
    }

// thiet lap muc nuoc len den moc_duoi thi tu dong tat relay
  if (distance < moc_duoi)
    {
      digitalWrite (relay, LOW);
      relay_status = 0;
    }

// Phần hiển thị mực nước bằng LED  
  tat_led();
  muc_nuoc = (moc_tren - distance)/((moc_tren - moc_duoi)/pinCount) + 1;
  
// Nếu gần hết nước thì nháy LED
  if (muc_nuoc < 3)  {
    delay(200);
  }
    
  bat_led();
    
/* In kết quả ra Serial Monitor */
  Serial.print(distance);
  Serial.println("cm");
  delay(200);
}

void tat_led()  {
  for (byte i = 0;i < pinCount; i++) {
    digitalWrite(ledPin[i],LOW); // Tắt đèn
  }
}

void bat_led()  {
  for (byte i=0; i < muc_nuoc; i++) {
    digitalWrite(ledPin[i],HIGH); //Bật đèn
  }
}

void bat_tat_relay()  {
  relay_status = !relay_status;  // Đảo trạng thái relay
  digitalWrite(relay,relay_status); // Xuất giá trị của relay
}

III. Thành quả

Hoạt động của Project như sau:
Khi hết nước tự động bơm, khi nước đầy tự động tắt bơm (về khoảng cách mình để trong mạch là theo mô phỏng trên Proteus nhé, các bạn căn chỉnh ở thực tế và đưa vào giá trị chính xác)
Trạng thái mực nước được chỉ thị theo 6 LED (có thể mở rộng thêm nhiều LED tùy ý)
Khi ở mực nước thấp (chỉ còn 2 LED đỏ chỉ thị), 2 đèn LED đỏ sẽ nhấp nháy để cảnh báo
Có thể dùng Button để Bật hay Tắt máy bơm bất kỳ lúc nào
DBS M05479
Quang Cao