Giới thiệu Arduino là một bo mạch vi xử lý được dùng để lập trình tương tác với các thiết bị phần cứng như cảm biến, động cơ, đèn hoặc các thiết bị khác.. Đặc điểm nổi bật của Arduino là
Trang 1Mạch Cảm Ứng Điện Dung Hiển Thị LED Sử Dụng Kit
Arduino
Nhóm 16: Nguyễn Tuấn Duy
Hoàng Minh Phương Phan Phi Hóa
Nguyễn Minh Tuấn
1 Giới thiệu
Arduino là một bo mạch vi xử lý được dùng để lập trình tương tác với các thiết bị phần cứng như cảm biến, động cơ, đèn hoặc các thiết bị khác Đặc điểm nổi bật của Arduino là môi trường phát triển ứng dụng cực kỳ dễ sử dụng, với một ngôn ngữ lập trình có thể học
Trang 2một cách nhanh chóng ngay cả với người ít am hiểu về điện tử và lập trình Và điều làm nên hiện tượng Arduino chính là mức giá rất thấp và tính chất nguồn mở từ phần cứng tới phần mềm Chỉ với khoảng $30, người dùng đã có thể sở hữu một bo Arduino có 20 ngõ I/O có thể tương tác và điều khiển chừng ấy thiết bị
Hiện nay có rất nhiều loại kit arduino được sử dụng , trong bài báo cáo này nhóm sử dụng Kit Arduino NaNo( ATmega328) để phù hợp với các điều kiện của nhóm.
1 số hình ảnh kit arduino nano
2 Mô tả Kit Arduino Nano
Trang 3• Arduino Nano là một thiết kế nhỏ gọn với chức năng, sức mạnh, phần cứng cũng như cách sử dụng hoàn toàn tương đương với Arduino Uno, nếu bạn thích sự nhỏ gọn trong thiết kế thì đây là 1 sự lựa chọn hoàn toàn tối ưu dành cho bạn.
• Arduino Nano sử dụng chip dán ATmega328 (Arduino Nano 3.x) hoặc Atmega168 (Arduino Nano 2.x) Nó có chức năng tương tự của Arduino Duemilanove, nhưng khác pakage(gói) Nó thiếu chỉ một jack cắm điện DC, và làm việc với một cáp USB Mini-B Nano được thiết kế và được sản xuất rộng khắp.
• Nguồn Arduino Nano
Arduino Nano có thể được hỗ trợ thông qua kết nối USB Mini-B, với nguồn ngoài giới hạn 6-20V (pin 30), hoặc 5V quy định cung cấp điện bên ngoài (pin 27) Arduino Nano
Chip FTDI FT232RL trên Nano chỉ được hỗ trợ nếu board đang được cung cấp thông qua cổng USB Kết quả là, khi chạy nguồn điện ngoài (không USB), đầu ra 3.3V (được cung cấp bởi chip FTDI) không có sẵn và các đèn LED RX và TX sẽ nhấp nháy nếu chân số 0 hoặc 1 là cao.
• Bộ Nhớ
Các Atmega168 có 16 KB bộ nhớ flash để lưu trữ(trong đó có 2 KB được sử dụng cho bộ nạp khởi động); các ATmega328 có 32 KB, (cũng với 2 KB được sử dụng cho bộ nạp khởi động) Atmega168 có 1 KB của SRAM và 512 byte EEPROM (có thể đọc và ghi với thư viện EEPROM); các ATmega328 có 2 KB của SRAM và 1 KB EEPROM
Sơ đồ và chức năng các chân của Arduino Nano
• Bộ Nhớ
Các Atmega168 có 16 KB bộ nhớ flash để lýu
trữ(trong đó có 2 KB đýợc sử dụng cho bộ nạp khởi động); các ATmega328 có 32 KB, (cũng với 2
KB đýợc sử dụng cho bộ nạp khởi động)
Atmega168 có 1 KB của SRAM và 512 byte EEPROM (có thể đọc và ghi với thý viện EEPROM); các ATmega328 có 2 KB của SRAM và
1 KB EEPROM.
Sõ đồ và chức năng các chân của
Arduino Nano
Trang 4Chân Input / Output
Với mỗi chân trong số 14 chân (digital) trên Nano có thể được sử dụng như một đầu vào hay đầu ra, qua việc sử dụng pinMode (), digitalWrite (), và digitalRead () Mỗi chân
đó hoạt động ở mức 5 volts Mỗi pin có thể cung cấp hoặc nhận tối đa 40 mA và có một điện trở kéo lên bên trong (ngắt kết nối theo mặc định) 20-50 kohms Ngoài ra, một số chân có chức năng khác như:
Serial: 0 (RX) và 1 (TX) Được sử dụng để nhận (RX) và truyền tải (TX) TTL dữ
liệu nối tiếp Các chân này được kết nối với các chân tương ứng của FTDI USB-to-TTL
và nối tiếp chip.
Ngắt ngoài(pin 2 và 3):Các chân có thể được code để kích hoạt một ngắt trên một
giá trị thấp, một xung lên và xuống, hoặc một sự thay đổi về giá trị
PWM: 3, 5, 6, 9, 10, và 11Cung cấp 8-bit đầu ra PWM với analogWrite ()
SPI: 10 (SS), 11 (MOSI), 12 (miso), 13 (SCK)Những chân hỗ trợ SPI truyền
thông
LED: 13 Có một LED kết nối với pin số 13 Khi pin là giá trị cao, đèn LED được
bật, khi pin là thấp, nó ra.
Arduino Nano có 8 đầu vào tương tự, mỗi trong số đó cung cấp độ phân giải 10 bit
(tức là năm 1024 giá trị khác nhau) Theo mặc định thì mức điện sẽ là 5 volts, tuy nhiên
có thể thay đổi phạm vi của nó bằng cách sử dụng analogReference () chức năng Chân Analog 6 và 7 không thể được sử dụng như chân số (digital).
Ngoài ra, một số chân có chức năng khác:
I2C: 4 (SDA) và 5 (SCL) Hỗ trợ I2C (TWI) giao tiếp bằng cách sử dụng Wire
library.
Aref Điện áp tham chiếu cho các đầu vào tương tự Được sử dụng với
analogReference ().
Reset: Thiết lập lại hệ thống.
3 Sơ đồ nguyên lý
Trang 5Thiết đặt các phần cứng cơ bản +) Thiết đặt LED
3 Sõ đồ nguyên lý c
Trang 6+) Thiết đặt công tắc
Trang 7+) Thiết đặt biến trở
Trang 8#define set_PortB (1 << 7)
#define set_PortD (1 << 2)
#define CLK_ROW 2
#define DATA_ROW 3
#define CHOT 4
#define CLK_COL 5
#define DATA_COL 6
#define BUTTON1 10
#define BUTTON2 11
#define BUTTON3 12
#define BUTTON4 13
Trang 9#define buffer_size 48
unsigned char mahang[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
unsigned char macot [(buffer_size >> 3)][8] = {
{0x3c, 0x66, 0x66, 0x7e, 0x7e, 0x66, 0x66, 0x66}, // A
{0x7c, 0x66, 0x66, 0x7c, 0x7e, 0x66, 0x66, 0x7c}, // B
{0x3c, 0x76, 0x62, 0x60, 0x60, 0x62, 0x76, 0x3c}, // C
{0x7c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c}, // D
{0x7e, 0x60, 0x60, 0x7e, 0x7e, 0x60, 0x60, 0x7e}, // E
{0x3c, 0x66, 0x66, 0x7e, 0x7e, 0x66, 0x66, 0x66}, // A
};
unsigned char fon[20][8] = {
//{0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}, // T
//{0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c}, // I
//{0x7e, 0x60, 0x60, 0x7e, 0x7e, 0x60, 0x60, 0x7e}, // E
//{0x66, 0x76, 0x76, 0x7e, 0x6e, 0x66, 0x66, 0x66}, // N
//{0x3c, 0x66, 0x60, 0x7c, 0x66, 0x66, 0x7E, 0x3c}, // 6
//{0x3c, 0x7E, 0x66, 0x66, 0x3e, 0x06, 0x66, 0x3c}, // 9
{0x7c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c}, // D
{0x30, 0x71, 0x30, 0x30, 0x30, 0x30, 0x30, 0x79}, // 1-1
{0xC6, 0xC6, 0xC3, 0xC1, 0xC1, 0xC3, 0xC6, 0xe6}, // 1-x
{0x66, 0x66, 0xC6, 0x86, 0x86, 0xC6, 0x66, 0x67}, // x-L
{0x3F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC}, // L-T
{0x66, 0x66, 0x66, 0x7E, 0x7E, 0x66, 0x66, 0x66}, // H
{0x66, 0x76, 0x76, 0x7e, 0x6e, 0x66, 0x66, 0x66}, // N
{0x66, 0x66, 0x66, 0x7E, 0x7E, 0x66, 0x66, 0x66}, // H
{0x3c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3c}, // O
{0xC3, 0xE7, 0xFF, 0xDB, 0xC3, 0xC3, 0xC3, 0xC3}, // M
{0x18, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E}, // 1
{0x3c, 0x66, 0x60, 0x7c, 0x66, 0x66, 0x7E, 0x3c}, // 6
{0x7c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c}, // D
{0x18, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E}, // 1
{0x18, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E}, // 1
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
};
unsigned char Row_Data_Offset[128] =
{
0x00, 0xfe, 0xff, 0x19, 0x19, 0xff, 0xfe, 0x00, // A
0x00, 0xff, 0xff, 0x99, 0x99, 0xff, 0x76, 0x00, // B
0x00, 0x7e, 0xff, 0xc3, 0x81, 0xc3, 0x66, 0x00, // C
0x00, 0xff, 0xff, 0x81, 0x81, 0xff, 0x7e, 0x00, // D
0x00, 0x7e, 0xff, 0xc3, 0x81, 0xc3, 0x66, 0x00, // C
0x00, 0xff, 0xff, 0x99, 0x99, 0xff, 0x76, 0x00, // B
0x00, 0xfe, 0xff, 0x19, 0x19, 0xff, 0xfe, 0x00, // A
};
unsigned char Col_Data_Offset[32][4] =
{
Trang 10{0x80, 0x00, 0x00, 0x00},
{0x40, 0x00, 0x00, 0x00},
{0x20, 0x00, 0x00, 0x00},
{0x10, 0x00, 0x00, 0x00},
{0x08, 0x00, 0x00, 0x00},
{0x04, 0x00, 0x00, 0x00},
{0x02, 0x00, 0x00, 0x00},
{0x01, 0x00, 0x00, 0x00},
{0x00, 0x80, 0x00, 0x00},
{0x00, 0x40, 0x00, 0x00},
{0x00, 0x20, 0x00, 0x00},
{0x00, 0x10, 0x00, 0x00},
{0x00, 0x08, 0x00, 0x00},
{0x00, 0x04, 0x00, 0x00},
{0x00, 0x02, 0x00, 0x00},
{0x00, 0x01, 0x00, 0x00},
{0x00, 0x00, 0x80, 0x00},
{0x00, 0x00, 0x40, 0x00},
{0x00, 0x00, 0x20, 0x00},
{0x00, 0x00, 0x10, 0x00},
{0x00, 0x00, 0x08, 0x00},
{0x00, 0x00, 0x04, 0x00},
{0x00, 0x00, 0x02, 0x00},
{0x00, 0x00, 0x01, 0x00},
{0x00, 0x00, 0x00, 0x80},
{0x00, 0x00, 0x00, 0x40},
{0x00, 0x00, 0x00, 0x20},
{0x00, 0x00, 0x00, 0x10},
{0x00, 0x00, 0x00, 0x08},
{0x00, 0x00, 0x00, 0x04},
{0x00, 0x00, 0x00, 0x02},
{0x00, 0x00, 0x00, 0x01}
};
int i, j;
int temp;
int buttonState[4], Last, State;
void GPIO_Init(void)
{
// Output
pinMode(CLK_ROW, OUTPUT);
pinMode(DATA_ROW, OUTPUT);
pinMode(CHOT, OUTPUT);
pinMode(CLK_COL, OUTPUT);
pinMode(DATA_COL, OUTPUT);
// input
pinMode(BUTTON1, INPUT);
pinMode(BUTTON2, INPUT);
pinMode(BUTTON3, INPUT);
pinMode(BUTTON4, INPUT);
}
void ShiftOut_Row(unsigned char TxData) {
unsigned int i, temp;
Trang 11for( i=0; i<8; i++)
{
temp = TxData;
temp = temp & 0x80; // lay ra bit trong so cao nhat cua data "TxData"
if(temp == 0x80) // so sanh tung bit cua data
"Pin_Out" bang 1 hay bang 0 de xuot gia tri tuong ung voi bit ra chan DS digitalWrite(DATA_ROW, 1); //DATA_ROW = 1; // dat bit 1 len chan DS serial data input 74595
else
digitalWrite(DATA_ROW, 0); // DATA_ROW = 0; // dat bit 0 len chan DS serial data input 74595
TxData = TxData << 1;
digitalWrite(CLK_ROW, 0); // CLK_ROW = 0;// tao xung clock dang suon duong cho chan SHCP shift register clock input
digitalWrite(CLK_ROW, 1); // CLK_ROW = 1; // cho SCK len
1 de tao ra 1 suon duong
}
}
void ShiftOut_Col(unsigned char TxData)
{
unsigned int i, temp;
for( i=0; i<8; i++)
{
temp = TxData;
temp = temp & 0x01; // lay ra bit trong so thap nhat cua data "TxData"
if(temp == 0x01) // so sanh tung bit cua data
"TxData" bang 1 hay bang 0 de xuot gia tri tuong ung voi bit ra chan DS digitalWrite(DATA_COL, 1); // DATA_COL = 1; // dat bit 1 len chan DS serial data input 74595
else
digitalWrite(DATA_COL, 0); //DATA_COL = 0; // dat bit 0 len chan DS serial data input 74595
TxData = TxData >> 1;
digitalWrite(CLK_COL, 0); // SCK_COL = 0;// tao xung clock dang suon duong cho chan SHCP shift register clock input
digitalWrite(CLK_COL, 1); // SCK_COL = 1;// cho SCK len 1
de tao ra 1 suon duong
}
}
void GotoXY(unsigned char a)
{
unsigned char i;
for(i=0; i<a; i++)
{
digitalWrite(DATA_COL, 0); // DATA_COL = 0;
digitalWrite(CLK_COL, 0); // SCK_COL = 0; // tao xung clock dang suon duong cho chan SHCP shift register clock input
digitalWrite(CLK_COL, 1); // SCK_COL = 1; // cho SCK len
1 de tao ra 1 suon duong
}
}
Trang 12void Data1(unsigned char Number_Col, unsigned char Number_Row, unsigned char numder_lap, unsigned char a)
{
unsigned char i, m, n, k;
Number_Col = Number_Col >> 3;
Number_Row = Number_Row >> 3;
for(k=0; k<numder_lap; k++)
for(i=0; i<8; i++)
{
for(n=0; n<Number_Col; n++)
{
ShiftOut_Col(macot[Number_Col-n-1][i]);
}
GotoXY(a);
for(m=0; m<Number_Row; m++)
{
ShiftOut_Row(mahang[i]);
}
digitalWrite(CHOT, 0); // CHOT = 0;
digitalWrite(CHOT, 1); // CHOT = 1;
//for(m=0; m<=Number_Row; m++) ShiftOut_Row(0X00);
//digitalWrite(CHOT, 0); // CHOT = 0;
//digitalWrite(CHOT, 1); // CHOT = 1;
}
}
void LED_Write_All_Matrix_Out(unsigned char Number_Col, unsigned char Number_Row, unsigned char x, unsigned char a)
{
unsigned char col_index, row_index, m, n, k, Number;
Number = Number_Col >> 3;
Number_Row = Number_Row >> 3;
for(k=0; k<10; k++)
for(col_index=0; col_index < Number_Col-x; col_index++)
{
for(row_index=0; row_index < Number_Row; row_index++)
{
ShiftOut_Row(Row_Data_Offset[col_index + (Number_Col *
(Number_Row-1) - row_index * Number_Col)]);
}
for(m=0; m<Number; m++)
{
ShiftOut_Col(Col_Data_Offset[col_index+x][Number-m-1]);
}
digitalWrite(CHOT, 0); // CHOT = 0;
digitalWrite(CHOT, 1); // CHOT = 1;
}
}
int CheckButtom()
{
int i;
for(i=0; i<4; i++)
{
buttonState[i] = 0;
}
buttonState[0] = digitalRead(BUTTON1);
Trang 13buttonState[1] = digitalRead(BUTTON2);
buttonState[2] = digitalRead(BUTTON3);
buttonState[3] = digitalRead(BUTTON4);
for(i=0; i<4; i++)
{
if(buttonState[i] == 1)
{
Last = i+1;
//Serial.println(Last);
return Last;
}
}
}
int Interface1(int value)
{
int ck;
switch(value)
{
////////////////////////////////////////////////////case 1//////////////////////////////////////////////////////////
case 1:
for(i=0; i<6; i++)
{
for(j=0; j<8; j++)
{
macot[i][j] = fon[i+12][j];
}
}
for(j=0; j<32; j++)
{
for(i=0; i<24 ;i++)
{
ck = CheckButtom();
if(ck != -1)
{
Last = ck;
return 0;
}
Data1(buffer_size, 24, 5, i);
}
for(i=24; i>=0 ;i )
{
ck = CheckButtom();
if(ck != -1)
{
Last = ck;
return 0;
}
Data1(buffer_size, 24, 5, i);
}
}
break;
////////////////////////////////////////////////////case 2//////////////////////////////////////////////////////////
case 2:
for(i=0; i<6; i++)
Trang 14{
for(j=0; j<8; j++)
{
macot[i][j] = fon[i][j];
}
}
for(j=0; j<20; j++)
{
for(i=0; i<48 ;i++)
{
ck = CheckButtom();
if(ck != -1)
{
Last = ck;
return 0;
}
Data1(buffer_size, 24, 15, i);
}
for(i=48; i>=0 ;i )
{
ck = CheckButtom();
if(ck != -1)
{
Last = ck;
return 0;
}
Data1(buffer_size, 24, 15, i);
}
}
break;
////////////////////////////////////////////////////case 3//////////////////////////////////////////////////////////
case 3:
for(i=0; i<6; i++)
{
for(j=0; j<8; j++)
{
macot[i][j] = fon[i][j];
}
}
for(j=0; j<20; j++)
{
for(i=0; i<2 ;i++)
{
ck = CheckButtom();
if(ck != -1)
{
Last = ck;
return 0;
}
Data1(buffer_size, 24, 10, 0);
}
ck = CheckButtom();
if(ck != -1)
{
Last = ck;
return 0;
Trang 15}
Data1(buffer_size, 24, 10, 48);
}
break;
////////////////////////////////////////////////////case 4//////////////////////////////////////////////////////////
case 4:
for(i=0; i<6; i++)
{
for(j=0; j<8; j++)
{
macot[i][j] = fon[i+6][j];
}
}
for(j=0; j<20; j++)
{
for(i=0; i<48 ;i++)
{
ck = CheckButtom();
if(ck != -1)
{
Last = ck;
return 0;
}
Data1(buffer_size, 24, 15, i);
}
for(i=48; i>=0 ;i )
{
ck = CheckButtom();
if(ck != -1)
{
Last = ck;
return 0;
}
Data1(buffer_size, 24, 15, i);
}
}
break;
}
}
// setup
void setup()
{
Serial.begin(9600);
DDRB = 0xff;
DDRC = 0xff;
DDRD = 0xff;
GPIO_Init();
Last = 1;
}
// loop
void loop()
{
//PORTB = 0xf0;
//delay(500);
//Serial.println(255);