Mạ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
mộ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
•
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
tự
động
với
nguồn
điện
áp
cao
nhất.
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
Châ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ý
3. Sõ đồ nguyên lý
c
Thiết đặt các phần cứng cơ bản
+) Thiết đặt LED
+) Thiết đặt công tắc
+) Thiết đặt biến trở
4.Code
#define set_PortB (1 << 7)
#define set_PortD (1 << 2)
#define
#define
#define
#define
#define
CLK_ROW
DATA_ROW
CHOT
CLK_COL
DATA_COL
2
3
4
5
6
#define
#define
#define
#define
BUTTON1
BUTTON2
BUTTON3
BUTTON4
10
11
12
13
#define buffer_size 48
unsigned char mahang[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40,
0x80};
unsigned
{0x3c,
{0x7c,
{0x3c,
{0x7c,
{0x7e,
{0x3c,
};
char macot [(buffer_size >> 3)][8] = {
0x66, 0x66, 0x7e, 0x7e, 0x66, 0x66, 0x66},
0x66, 0x66, 0x7c, 0x7e, 0x66, 0x66, 0x7c},
0x76, 0x62, 0x60, 0x60, 0x62, 0x76, 0x3c},
0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c},
0x60, 0x60, 0x7e, 0x7e, 0x60, 0x60, 0x7e},
0x66, 0x66, 0x7e, 0x7e, 0x66, 0x66, 0x66},
unsigned char fon[20][8] = {
//{0x7E, 0x18, 0x18, 0x18,
//{0x3c, 0x18, 0x18, 0x18,
//{0x7e, 0x60, 0x60, 0x7e,
//{0x66, 0x76, 0x76, 0x7e,
//{0x3c, 0x66, 0x60, 0x7c,
//{0x3c, 0x7E, 0x66, 0x66,
0x18,
0x18,
0x7e,
0x6e,
0x66,
0x3e,
0x18,
0x18,
0x60,
0x66,
0x66,
0x06,
0x18,
0x18,
0x60,
0x66,
0x7E,
0x66,
//
//
//
//
//
//
0x18},
0x3c},
0x7e},
0x66},
0x3c},
0x3c},
A
B
C
D
E
A
//
//
//
//
//
//
T
I
E
N
6
9
{0x7c,
{0x30,
{0xC6,
{0x66,
{0x3F,
{0x66,
0x66,
0x71,
0xC6,
0x66,
0x0C,
0x66,
0x66,
0x30,
0xC3,
0xC6,
0x0C,
0x66,
0x66,
0x30,
0xC1,
0x86,
0x0C,
0x7E,
0x66,
0x30,
0xC1,
0x86,
0x0C,
0x7E,
0x66,
0x30,
0xC3,
0xC6,
0x0C,
0x66,
0x66,
0x30,
0xC6,
0x66,
0x0C,
0x66,
0x7c},
0x79},
0xe6},
0x67},
0xCC},
0x66},
//
//
//
//
//
//
D
1-1
1-x
x-L
L-T
H
{0x66,
{0x66,
{0x3c,
{0xC3,
{0x18,
{0x3c,
0x76,
0x66,
0x66,
0xE7,
0x38,
0x66,
0x76,
0x66,
0x66,
0xFF,
0x18,
0x60,
0x7e,
0x7E,
0x66,
0xDB,
0x18,
0x7c,
0x6e,
0x7E,
0x66,
0xC3,
0x18,
0x66,
0x66,
0x66,
0x66,
0xC3,
0x18,
0x66,
0x66,
0x66,
0x66,
0xC3,
0x18,
0x7E,
0x66},
0x66},
0x3c},
0xC3},
0x7E},
0x3c},
//
//
//
//
//
//
N
H
O
M
1
6
{0x7c,
{0x18,
{0x18,
{0x00,
{0x00,
{0x00,
0x66,
0x38,
0x38,
0x00,
0x00,
0x00,
0x66,
0x18,
0x18,
0x00,
0x00,
0x00,
0x66,
0x18,
0x18,
0x00,
0x00,
0x00,
0x66,
0x18,
0x18,
0x00,
0x00,
0x00,
0x66,
0x18,
0x18,
0x00,
0x00,
0x00,
0x66,
0x18,
0x18,
0x00,
0x00,
0x00,
0x7c},
0x7E},
0x7E},
0x00},
0x00},
0x00}
// D
// 1
// 1
};
unsigned char
{
0x00, 0xfe,
0x00, 0xff,
0x00, 0x7e,
0x00, 0xff,
0x00, 0x7e,
0x00, 0xff,
0x00, 0xfe,
};
Row_Data_Offset[128] =
0xff,
0xff,
0xff,
0xff,
0xff,
0xff,
0xff,
0x19,
0x99,
0xc3,
0x81,
0xc3,
0x99,
0x19,
0x19,
0x99,
0x81,
0x81,
0x81,
0x99,
0x19,
0xff,
0xff,
0xc3,
0xff,
0xc3,
0xff,
0xff,
unsigned char Col_Data_Offset[32][4] =
{
0xfe,
0x76,
0x66,
0x7e,
0x66,
0x76,
0xfe,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
//
//
//
//
//
//
//
A
B
C
D
C
B
A
{0x80,
{0x40,
{0x20,
{0x10,
{0x08,
{0x04,
{0x02,
{0x01,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
{0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x80,
0x40,
0x20,
0x10,
0x08,
0x04,
0x02,
0x01,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x80,
0x40,
0x20,
0x10,
0x08,
0x04,
0x02,
0x01,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x00},
0x80},
0x40},
0x20},
0x10},
0x08},
0x04},
0x02},
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,
pinMode(BUTTON2,
pinMode(BUTTON3,
pinMode(BUTTON4,
INPUT);
INPUT);
INPUT);
INPUT);
}
void ShiftOut_Row(unsigned char TxData)
{
unsigned int i, temp;
for( 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
{
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
}
}
void 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
for(i=0; i<8; i++)
{
for(n=0; n
{
ShiftOut_Col(macot[Number_Col-n-1][i]);
}
GotoXY(a);
for(m=0; 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
{
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);
buttonState[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++)
{
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;
}
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);
//for(i=0; i
// Data1(buffer_size, 24, 0, i);
State = CheckButtom();
Serial.println(Last);
Interface1(Last);
/*
for(i=0; i<6; i++)
{
for(j=0; j<8; j++)
{
macot[i][j] = fon[i+12][j];
}
}
for(i=buffer_size; i>=0 ;i--)
Data1(buffer_size, 24, 10, 0);
for(i=buffer_size; i>=0 ;i--)
Data1(buffer_size, 24, 10, i);
for(j=0; j<6; j++)
{
for(i=2; i>=0 ;i--)
Data1(buffer_size, 24, 10, 0);
for(i=1; i>=0 ;i--)
Data1(buffer_size, 24, 10, 48);
}
for(j=0; j<32; j++)
{
for(i=0; i<24 ;i++)
Data1(buffer_size, 24, 5, i);
for(i=24; i>=0 ;i--)
Data1(buffer_size, 24, 5, i);
}
*/
}
5. Ứng dụng trong trong thực tế
Máy in 3D
Một cuộc cách mạng khác cũng đang âm thầm định hình nhờ vào Arduino, đó là
sự phát triển máy in 3D nguồn mở Reprap. Máy in 3D là công cụ giúp tạo ra các
vật thể thực trực tiếp từ các file CAD 3D. Công nghệ này hứa hẹn nhiều ứng
dụng rất thú vị trong đó có cách mạng hóa việc sản xuất cá nhân
Robot
Do kích thước nhỏ gọn và khả năng xử lý mạnh mẽ, Arduino được chọn làm
bộ xử lý trung tâm của rất nhiều loại robot, đặc biệt là robot di động
6. Kết luận
Arduino đã và đang được sử dụng rất rộng rãi trên thế giới, và ngày càng chứng tỏ
được sức mạnh của chúng thông qua vô số ứng dụng độc đáo của người dùng trong cộng
đồng nguồn mở (open-source). Tuy nhiên tại Việt Nam Arduino vẫn còn chưa được biết
đến nhiều. Arduino thực sự đã gây sóng gió trên thị trường người dùng DIY (là những
người tự chế ra sản phẩm của mình) trên toàn thế giới trong vài năm gần đây, gần giống
với những gì Apple đã làm được trên thị trường thiết bị di động. Số lượng người dùng
cực lớn và đa dạng với trình độ trải rộng từ bậc phổ thông lên đến đại học. Arduino được
chọn làm bộ não xử lý của rất nhiều thiết bị từ đơn giản đến phức tạp. Trong số đó có một
vài ứng dụng thực sự chứng tỏ khả năng vượt trội của Arduino do chúng có khả năng
thực hiện nhiều nhiệm vụ rất phức tạp. Do thời gian có hạn nên nhóm làm mạch cũng
như báo cáo còn chỗ thiếu xót . Mong thầy và các bạn thông cảm. Nhóm cũng xin cảm ơn
thầy Nguyễn Ngọc Minh đã giúp đỡ nhóm hoàn thành báo cáo này.