Hiển thị các bài đăng có nhãn Arduino Rasp. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Arduino Rasp. Hiển thị tất cả bài đăng

Chủ Nhật, 28 tháng 7, 2019

Arduino và Module cảm biến bụi (Dust Sensor)

 
Ứng dụng
Do sự ô nhiễm môi trường không khí ngày càng trầm trọng. Nó trở thành một vấn đề được xã hội vô cùng quan tâm. Ô nhiễm môi trường ảnh hưởng trực tiếp tới sức khỏe mỗi con người. Vì vậy module cảm biến bụi sẽ giúp chúng ta biết được mức độ ô nhiễm môi trường không khí để có thể cải thiện chất lượng không khí. 
- Máy lọc không khí.
- Điều hòa.
- Máy giám sát không khí.
.v.v..
Thông số cơ bản của module 
- Độ nhạy: 0.5V / (100 mg / m3).
- Dải đo: 500μg / m3.
- Nguồn cung cấp: 2.5V ~ 5.5V.
- Dòng hoạt động: 20mA (tối đa).
- Nhiệt độ hoạt động: -10 ℃ ~ 65 ℃.
- Nhiệt độ bảo quản: -20 ℃ ~ 80 ℃.
- Thời gian sử dụng: 5 năm.
- Kích thước: 63.2mm × 41.3mm × 21.1mm.
- Kích thước lỗ khí: 9.0mm.


Sơ đồ kết nối chân
Sơ đồ kết nối
- Chân VCC: kết nối nguồn  2.5V ~ 5.5V.
- Chân GND: đất chung.
- Chân Aout : Analog output.
- Chân I led: Digital input.


Hoạt động
- Kích hoạt các diot hồng ngoại bằng cách thiết lập các pin LED ở mức HIGH.
- Chờ 0.28ms, sau đó bắt đầu để lấy mẫu điện áp từ pin Aout của module. Ghi chú rằng tín hiệu đầu ra sẽ mất 0.28ms để đạt trạng thái ổn định sau khi diot hồng ngoại được kích hoạt.
- Chu kì lấy mẫu là 0.004ms . Khi hoàn tất, thiết lập các pin LED LOW để vô hiệu hóa các diot hồng ngoại.
- Tính nồng độ bụi theo mối quan hệ giữa điện áp đầu ra và nồng độ bụi.
Bảng quan hệ giữa giá trị điện áp ra và nồng độ bụi.
Các tiêu chí chất lượng không khí.


Sensitivity (TYP) = 0.5V/(100ug/m3)... Đọc giá trị Analog trả về từ Sensor ta sẽ xác định được độ bụi không khí.


Ứng dụng minh họa: thiết bị đo và cảnh báo mức độ ô nhiễm trong văn phòng hiển thị thông số trên LCD.

Chuẩn bị phần cứng
Bạn có thể  xem hình sau đây
- Các bạn tham khảo hình sau đây :
-  Cắm dây USB 5V vào Arduino. Như vậy ta đã chuẩn bị xong phần cứng.
Phần lập trình , các bạn mở Arduino IDE lên và copy đoạn code dưới vào.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/****** HE THONG DO MUC O NHIEM CUA MOI TRUONG********
 *    **********************************************
 */
#include<LiquidCrystal.h>                                           // thu vien LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);                                 // cau hinh chan LCD
#define        COV_RATIO                       0.2            //ug/mmm / mv
#define        NO_DUST_VOLTAGE                 400            //mv
#define        SYS_VOLTAGE                     5000           
/*
I/O
*/
const int iled = 2;                                            //pin 2 ket noi voi led cua sensor
const int vout = 1;                                            //analog input
/*
variable
*/
float density, voltage;
int   adcvalue, level;
/*
ham loc
*/
int Filter(int m)
{
  static int flag_first = 0, _buff[10], sum;
  const int _buff_max = 10;
  int i;
  
  if(flag_first == 0)
  {
    flag_first = 1;
    for(i = 0, sum = 0; i < _buff_max; i++)
    {
      _buff[i] = m;
      sum += _buff[i];
    }
    return m;
  }
  else
  {
    sum -= _buff[0];
    for(i = 0; i < (_buff_max - 1); i++)
    {
      _buff[i] = _buff[i + 1];
    }
    _buff[9] = m;
    sum += _buff[9];
    
    i = sum / 10.0;
    return i;
  }
}
int pollution_level (float x){                       // tinh gia muc o nhiem
  if (x <= 35) return 0;
  if (x <= 75) return 1;
  if (x <= 115) return 2;
  if (x <= 150) return 3;
  if (x <= 250) return 4;
  return 5;
  
  }
void setup(void)
{
  pinMode(iled, OUTPUT);                                  // cau hinh chan output
  digitalWrite(iled, LOW);                                     //tin hieu outout, o muc thap
  lcd.begin(16,2);                                                  // khai bao LCD 16x2
  Serial.begin(9600);                                         //khai bao UART , baudrate 9600  
  Serial.print("*********************************** COGE Tech Corp ***********************************\n");
}
void loop(void)
{
  /*
  get adcvalue
  */
  digitalWrite(iled, HIGH);                   //  iled high
  delayMicroseconds(280);
  adcvalue = analogRead(vout);                 // doc gia tri adc
  digitalWrite(iled, LOW);                     //   iled low
  
  adcvalue = Filter(adcvalue);                 //  loc adc
  
  /*
  chuyen muc dien ap (mv)
  */
  voltage = (SYS_VOLTAGE / 1024.0) * adcvalue * 11;
  
  /*
chuyen tu dien ap sang do bui
  */
  if(voltage >= NO_DUST_VOLTAGE)
  {
    voltage -= NO_DUST_VOLTAGE;
    
    density = voltage * COV_RATIO;
  }
  else
    density = 0;
  Serial.print("The current dust concentration is: ");
  Serial.print(density);
  Serial.print(" ug/m3\n"); 
  delay(1000);
  
  level = pollution_level (density);
  switch(level) {                 // hien thi do bui len lcd
    case 0: {                        // muc trong sach
        lcd.setCursor(0, 0);
        lcd.print("                ");
        lcd.setCursor(0, 0);
        lcd.print("Trong sach");
      break;
      }
      case 1:{                              // muc trung binh
        lcd.setCursor(0, 0);
        lcd.print("                ");
        lcd.setCursor(0, 0);
        lcd.print("Muc trung binh");
      break;
        }
      case 2:{                         // muc o nhiem nhe
        lcd.setCursor(0, 0);
        lcd.print("                ");
        lcd.setCursor(0, 0);
        lcd.print("O nhiem nhe");
        break;
        }
       case 3:{                      // muc o nhiem vua
        lcd.setCursor(0, 0);
        lcd.print("                ");
        lcd.setCursor(0, 0);
        lcd.print("O nhiem Vua");
        break;
        }
       case 4: {                    // muc o nhiem nang
        lcd.setCursor(0, 0);
        lcd.print("                ");
        lcd.setCursor(0, 0);
        lcd.print("O nhiem nang ");
         break;
        }
       case 5: {                   // muc o nhiem vo cung nghiem trong
        lcd.setCursor(0, 0);
        lcd.print("                ");
        lcd.setCursor(0, 0);
        lcd.print("Nghiem trong");
        break;
        }
    }
    lcd.setCursor(0,1);
    lcd.print(density);
    lcd.setCursor(6,1);
    lcd.print("(ug/m3)");
}

Thứ Ba, 29 tháng 1, 2019

So sánh xung PPM và xung PWM

1.Xung PWM
Xung là các trạng thái cao / thấp (HIGH/LOW) về mức điện áp được lặp đi lặp lại. Đại lượng đặc trưng cho 1 xung PWM (Pulse Width Modulation) bao gồm tần số (frequency) và chu kì xung (duty cycle).

Tần số là gì?
Tần số là số lần lặp lại trong 1 đơn vị thời gian. Đơn vị tần số là Hz, tức là số lần lặp lại dao động trong 1 giây.

Lấy ví dụ, 1Hz = 1 dao động trong 1 giây. 2Hz = 2 dao động trong 1 giây. 16MHz = 16 triệu dao động trong 1 giây.
Như vậy theo quy tắc tam suất: 16 triệu dao động - 1 giây --> 1 dao động tốn 1/16.000.000 (giây) = 0,0625 (micro giây)

Cách xác định 1 dao động như thế nào? Đa phần các bạn mới nghiên cứu điện tử thường mắc sai lầm ở việc xác định 1 dao động. Dao động được xác định từ trạng thái bắt đầu và kết thúc ngay trước khi trạng thái bắt đầu được lặp lại.




Như vậy thông thường, 1 dao động sẽ bao gồm 2 trạng thái điện: mức cao (x giây) và mức thấp (y giây). Tỉ lệ phần trăm thời gian giữa 2 trạng thái điện này chính là chu kì xung.

Với x/y = 0% ta có xung chứa toàn bộ điện áp thấp (khái niệm xung nên hiểu mở rộng)
Với x/y = 50% thì 50% thời gian đầu, xung có điện áp cao, 50% sau xung có điện áp thấp.
Với x/y=100% ta có xung chứa toàn bộ điện áp cao.

Tóm lại, với 1 xung ta có:
Tần số: để tính toán ra được thời gian của 1 xung
Chu kì xung: bao nhiêu thời gian xung có mức áp cao, bao nhiêu thời gian xung có mức áp thấp.


2.Xung PPM
Xung PPM (Pulse Position Modulation) được sử dụng để điều khiển servo. Về bản chất PPM cũng là một xung...

Xung PPM khác với PWM ở chỗ:
tần số thông thường có giá trị trong khoảng 50Hz (20 mili giây), không quan trọng
thời gian xung ở mức cao chỉ từ 1ms đến 2ms, rất quan trọng.
có thể có nhiều hơn 1 sự thay đổi trạng thái điện cao/thấp

Nắm bắt được 2 ý trên ta đã có thể phân biệt được xung PPM và xung PWM giống nhau và khác nhau như thế nào.



Thời gian xung ở mức cao quy định góc quay của RC servo.

Với thời gian 1ms mức cao, góc quay của servo là 0, 1.5ms góc quay 90 và 2ms góc quay là 180. Các góc khác từ 0-180 được xác định trong khoảng thời gian 1-2ms.

Lưu ý: có thể ghép nhiều xung trong cùng 1 thời gian là 20ms để xác định vị trí góc của nhiều servo cùng 1 lúc. Tối đa là 10 servo.



Điều khiển 3 servo cùng lúc

Thứ Năm, 2 tháng 11, 2017

[Arduino cơ bản] Các lệnh cơ bản trong Arduino

[Arduino cơ bản] Các lệnh cơ bản trong Arduino
Image result for arduino
1. digitalRead() :

Chức năng: Đọc giá trị số ở pin của Arduino
Cú pháp: digitalRead(pin);

Giá trị trả về: HIGH hoặc LOW
Ví dụ:

int LED = 13; // mắc 1 led vào chân 13
int Btn = 7; //mắc 1 nút bấm
int value=0; //giá trị trả về của hàm digitalRead

void setting( ) {
pinMode(LED,13);
pinMode(Btn,7);
}

void loop( ) {
value=digitalRead(Btn); //đọc tín hiệu số ở chân 7
digitalWrite(LED,value); //ghi tín hiệu số ra chân 13
}

Trong hàm trên khi ta bấm nút thì LED sẽ sáng,còn không bấm nút LED sẽ tắt tương ứng với hàm digitalRead() trong Arduino.

Lưu ý: Các chân Analog cũng có thể được sử dụng như chân Digital nhé. (Ví dụ các chân A0,A1...vv)

[Arduino cơ bản] Cân điện tử với HX711 và Arduino


Cân điện tử với Loadcell, HX711 và Arduino.

Xin chào các bạn,hôm nay mình xin hướng dẫn các bạn làm cân điện tử.
Các thiết bị(module) cần sử dụng:
1.Loadcell
2.Module ADC Hx711
3.Kit Arduino bất kì.

Trước tiên chúng ta cùng tìm hiểu 1 chút về các thiết bị trên:
1.Loadcell là gì?
Các Loadcell là các cảm biến lực(Khối lượng,monen xoắn...vv)
Khi có một lực tác động lên loadcell,loadcell sẽ chuyển đổi lực tác dụng thành tín hiệu điện.
Vậy tại sao nó có thể chuyển đổi thành điện áp được?
Nguyên nhân là các loadcell sử dụng điện trở (loại strain gauge-đây là loại điện trở thay đổi điện trở khi có tác dụng của lực lên nó)
Cấu trúc của strain gauge như sau:
Loadcell là gì ? Cấu tạo loadcell

Loadcell là gì ?

Cấu tạo chính của Loadcell như hình dưới:Nó sử dụng nguyên lý mạch cầu Wheatstone.
Ban đầu cầu cân bằng,điện áp ra bằng 0V.Khi có lực tác động lên điện trở strain gauge(được mắc dưới bàn cân) nó sẽ thay đổi giá trị => Mạch cầu không còn cân bằng nữa => Xuất hiện điện áp ở 2 điểm (Như hình). Từ đó ta lấy được khối lượng từ mức điện áp trả về.

Image result for strain gauge resistor


Thông tin về Loadcell các bạn có thể tìm hiểu thêm trên google nhé.Thân
2.Module ADC Hx711

Đây là module chuyển đổi tương tự-số ADC (Analog Digital Convert):
Độ phân giải 24bit và giao tiếp 2 dây với vi điều khiển: 2 chân SCK (Clock) và DT (Data).

Thông số kĩ thuật:
- Điện áp hoạt động: 2.7 V - 5V
- Dòng tiêu thụ <1.5mA
-Tốc độ lấy mẫu:10-80 SPS(Có thể tùy chỉnh)
-Độ phân giải điện áp:40mV

Datasheet Hx711 (PDF) : 
https://drive.google.com/file/d/0B0tmnvAt3D4aeGVicnBLTDdmWE0/view

Nhiều bạn hỏi mình,có nhiều module ADC,sao bắt buộc phải dụng module Hx711 này?
Xin trả lời như sau: Do output của loadcell có điện áp rất nhỏ,cở khoảng:1-3mV. Vì vậy cần những bộ ADC có độ phân giải cao để có thể đọc được mức điện áp mV trên.
Các bạn có thể sử dụng các bộ ADC 8bit nhưng chắc chắn đọc về sẽ toàn là 0 (Do độ phân giải 8bit => Độ phân giải  Analog = 5V/256 = 19.53mV > 1-3mV của output loadcell nên không đọc được đâu nhé.Haha)


3.Kết nối Hx711 với Arduino (Ở đây mình sử dụng Arduino Uno)
Các bạn chú ý đấu đúng màu dây từ loadcell về Hx711 nhé.

Image result for adc hx711

4. Sample code
Thư viện : Mình sử dụng thư viện của Scott Russel (Có trên Arduino Library).


Code thoai nào:

#include <Q2HX711.h>
#define SCK A0
#define DT A1

Q2HX711 hx711(DT,SCK);
void setup() {
  Serial.begin(9600);
}

void loop() {
 Serial.println(hx711.read()/100.0);
 delay(500);
}