Khả năng sử dụng phần mềm mô phỏng, vẽ mạch - Proteus Vẽ sơ đồ nguyên lý của mạch trong Proteus.. Khả năng sử dụng phần mềm lập trình cho PIC - MikroC Một hình ảnh chụp màn hình Full
Trang 1BÁO CÁO THỰC HÀNH
GIAO TIẾP ĐIỀU KHIỂN THIẾT BỊ NGOẠI VI
Tên bài thực hành: Điều khiển đóng/mở cổng
Tên thành viên nhóm:
• Phan Thế Hoàng 21093641
• Đinh Đức Hùng 21107541
• Nguyễn Văn Đức Tuân 21069361
Ngày thực hiện: 17/01/2024
PHẦN I: Chuẩn đầu ra môn học -1: Trình bày được cấu tạo, nguyên lý hoạt động và
biết sử dụng các thành phần trong hệ thống, thiết bị điện tử
1.1 Mô tả tóm tắt nội dung bài thực hành
- Mô tả tóm tắt nội dung, yêu cầu và mục đích của bài thực hành
Quá trình đóng cổng: Nhấn BT1 trên bo mạch hoặc trên VS-C# để bắt đầu đóng → L1
sáng để báo cổng đang được đóng → VS-C# hiển thị “Đang đóng cổng” →nhấn SW1 để báo đã đóng xong →L1 tắt →VS-C# hiển thị “Đã đóng”
Quá trình mở cổng: Nhấn BT2 trên bo mạch hoặc trên VS-C# để bắt đầu mở →L2 sáng
để báo cổng đang được mở →VS-C# hiển thị “Đang mở cổng” →nhấn SW1 để báo đã
mở xong →L2 tắt →VS-C# hiển thị “Đã mở”
- Xác định, liệt kê các linh kiện, thiết bị cần sử dụng
o 02 SWITCH: 01 Switch (SW1) báo hành trình đã đóng cổng xong; 01 Switch
-1-
Trang 2(SW2) báo hành trình đã mở cổng xong; o 02 LED: 01 Led (L1) báo trạng thái
cổng đang trong quá trình đóng; 01 Led (L2) báo trạng thái cổng đang trong quá trình mở;
o 02 BUTTON: 01 Button (BT1) để đóng cổng, 01 Button (BT2) để mở cổng o
01 PIC18F4550 o Cổng USB
1.2 Sơ đồ khối của bài thực hành -
Vẽ sơ đồ khối
- Giải thích chức năng, nhiệm vụ từng khối
+ Khối Program (chương trình): điều khiển hoạt động của các thành phần linh kiện + Khối RS232 (cổng USB): Giúp thiết bị điều khiển (PIC18F4550) giao tiếp với các thiết
bị ngoại vi
+ Khối Switch: thông báo quá trình đóng/mở cổng đã hoàn thành
+ Khối LED: thông báo quá trình đóng/mở cổng đang được thực hiện
+ Khối Button: dùng để đóng/mở cổng
-2-
Trang 3PHẦN II: Chuẩn đầu ra môn học 2: Có khả sử dụng các phần mềm lập trình, mô
phỏng
2.1 Khả năng sử dụng phần mềm mô phỏng, vẽ mạch -
Proteus Vẽ sơ đồ nguyên lý của mạch trong Proteus
2.2 Khả năng sử dụng phần mềm lập trình cho PIC -
MikroC
Một hình ảnh chụp màn hình Full – có code trong phần mềm MikroC
-3-
Trang 42.3 Khả năng sử dụng phần mềm viết giao diện Visual Studio C#
Hai hình ảnh chụp màn hình Full – code và giao diện VS C#
-4-
Trang 5PHẦN III Chuẩn đầu ra môn học 3: Có khả năng phân tích, thiết kế giải thuật và
lập trình ứng dụng
3.1 Lưu đồ giải thuật cho Arduino hoặc PIC
Vẽ lưu đồ giải thuật cho Arduino hoặc PIC
-5-
Trang 63.2 Lập trình code cho Arduino hoặc PIC
Code đầy đủ, có giải thích từng câu lệnh của code // Khai bao bien va du lieu
#define led_on 1 // Muc logic dieu khien trang thai LED
#define led_off 0
#define in_size 64 // Mac dinh kich thuoc du lieu doc/ghi
#define out_size 64
char count = 0; // Chua so lan nhan SW bit
oldstate; // Co bao trang thai cho SW
-6-
Trang 7unsigned char readbuff[in_size] absolute 0x500; // Bo dem chua du lieu doc va ghi unsigned char writebuff[out_size] absolute 0x540; // Nen de trong vung USB RAM, xem them trong datasheet
void interrupt ()
{
if(PIR2.USBIF == 1)
{
PIR2.USBIF = 0; // Clear interrupt bit
USB_Interrupt_Proc(); // ISR cho USB
}
if(INTCON.INT0IF == 1)
{
INTCON.INT0IF = 0; // Clear interrupt bit
count++;
writebuff[0] = count;
oldstate = 1;
}
}
void main(void)
{
ADCON1 |= 0x0F; // Tat ca chan Analog thanh chan Digital
CMCON |= 0x07; // Cam modul Comparators
-7-
Trang 8// Cau hinh Port B
PORTB= 0x00; LATB = 0x00;
TRISE.TRISB0 = 1;
TRISE.TRISB1 = 1;
TRISE.TRISB2 = 1;
TRISE.TRISB3 = 1;
INTCON2 RBPU = 0;
// Cau hinh Port D
PORTE = 0x00; LATE = 0x00;
TRISE.TRISE0 = 0;
TRISE.TRISE1 = 0;
// Cau hinh modul USB
HID_Enable(&readbuff, &writebuff); // Cho phep USB o che do HID // Cau hinh ngat
INTCON.INT0IF = 0; // Clear interrupt bit
INTCON.INT0IE = 1; // Enable external interrupts
INTCON2.INTEDG0 = 1; // External interrupt on rising edge
PIR2.USBIF = 0; // Clear interrupt bit
PIE2.USBIE = 1; // Enable the USB interrupt
INTCON.GIE = 1; // Enable global interrupt
INTCON.PEIE = 1; // Enable periphiral interrupts while
(1)
{
if(Button(&PORTB, 0, 10, 0))
{
-8-
Trang 9while(Button(&PORTB, 0, 10, 0));
RE0_bit = led_on; writebuff[0] =
'a';
//HID_Write(&writebuff, out_size); // Gui du lieu den HOST thong qua USB }
else if(Button(&PORTB, 1, 10, 0))
{
while(Button(&PORTB, 1, 10, 0));
RE1_bit = led_on; writebuff[0] =
'b';
HID_Write(&writebuff, out_size); // Gui du lieu den HOST thong qua USB }
else if(Button(&PORTB, 2, 10, 0))
{
while(Button(&PORTB, 2, 10, 1));
RE1_bit = led_off; writebuff[0] =
'c';
HID_Write(&writebuff, out_size); // Gui du lieu den HOST thong qua USB }
else if(Button(&PORTB, 3, 10, 0))
{
while(Button(&PORTB, 3, 10, 1));
RE0_bit = led_off;
writebuff[0] = 'd';
HID_Write(&writebuff, out_size); // Gui du lieu den HOST thong qua USB
-9-
Trang 10}
//**********************************
if(HID_Read() != 0) // Doc du lieu tu HOST thong qua USB
{
if(readbuff[0] == 1)
{
RE0_bit = led_on; // Dieu khien LED sang writebuff[0] = 'a'; // Gui phan hoi ma bao LED sang
}
else if(readbuff[0] == 0)
{
RE1_bit = led_on; // Dieu khien LED tat
writebuff[0] = 'b'; // Gui phan hoi ma bao LED tat
}
HID_Write(&writebuff, out_size); // Gui du lieu den HOST thong qua USB
}
//**********************************
if (oldstate == 1)
{
oldstate = 0;
HID_Write(&writebuff, out_size); // Gui du lieu den HOST thong qua USB
}
}
}
-10-
Trang 113.3 Lập trình giao diện VS C#
Code đầy đủ, có giải thích cho VS C#
using System;
using
System.Collections.Generic;
using System.ComponentModel;
using System.Data; using
System.Drawing; using
System.Linq; using
System.Text; using
System.Threading.Tasks; using
System.Windows.Forms; using
UsbLibrary;
namespace USB
{
public partial class Form1 : Form
{
byte [] readbuff = new byte [65];
byte [] writebuff = new byte [65];
public Form1()
{
InitializeComponent();
}
private void Form1_Load( object sender, EventArgs e)
{
this usbHidPort.VendorId = 0x04d8;
this usbHidPort.ProductId = 0x0001;
this usbHidPort.CheckDevicePresent();
if ( this usbHidPort.SpecifiedDevice != null )
this usbHidPort.SpecifiedDevice.SendData( this writebuff);
textBox_VID.Text = usbHidPort.VendorId.ToString( "x4" );
textBox_PID.Text = usbHidPort.ProductId.ToString( "x4" ); }
private void button_Exit_Click( object sender, EventArgs e)
{
DialogResult answer = MessageBox Show( "Do you want to exit the program?" , "Question" ,
MessageBoxButtons YesNo,
MessageBoxIcon Question); if (answer == DialogResult Yes) {
this Close();
}
} private void button_ON_Click( object
sender, EventArgs e)
{
writebuff[1] = 1;
if ( this usbHidPort.SpecifiedDevice !=
null ) {
this usbHidPort.SpecifiedDevice.SendData(writebuff);
textBox_St.Text = "Opening" ;
-11-
Trang 12}
else
{
MessageBox Show( "Device not found Please reconnect USB device to use." , "Information" ,
MessageBoxButtons OK, MessageBoxIcon Information);
}
}
private void button_OFF_Click( object sender, EventArgs e)
{
writebuff[1] = 0;
if ( this usbHidPort.SpecifiedDevice != null )
{
this usbHidPort.SpecifiedDevice.SendData(writebuff);
textBox_St.Text = "Closing" ;
}
else
{
MessageBox Show( "Device not found Please reconnect USB device to use." , "Information" ,
MessageBoxButtons OK, MessageBoxIcon Information);
}
}
private void usbHidPort_OnSpecifiedDeviceArrived( object sender, EventArgs
e)
{
toolStripStatusLabel.Text = "Device Detected" ;
textBox_Status.Text = "Connected!" ;
textBox_Status.BackColor = Color Lime;
}
private void usbHidPort_OnSpecifiedDeviceRemoved( object sender, EventArgs
e)
{
if (InvokeRequired)
{
Invoke( new
EventHandler ( this usbHidPort_OnSpecifiedDeviceRemoved), sender,
( object )e); } else {
toolStripStatusLabel.Text = "Device Disconnected" ;
textBox_Status.Text = "Disconnected!!" ;
textBox_Status.BackColor = Color Red;
}
}
private void usbHidPort_OnDeviceArrived( object sender, EventArgs e)
{
toolStripStatusLabel.Text = "USB
Connected" ; }
private void usbHidPort_OnDeviceRemoved( object sender, EventArgs e)
{
if (InvokeRequired)
Invoke( new EventHandler ( this usbHidPort_OnDeviceRemoved), sender, ( object )e);
else
toolStripStatusLabel.Text = "USB Removed" ;
}
private void usbHidPort_OnDataRecieved( object sender,
DataRecievedEventArgs args)
-12-
Trang 13{
if (InvokeRequired) {
try {
Invoke( new DataRecievedEventHandler ( this usbHidPort_OnDataRecieved), sender, ( object )args); } catch {
} }
else
{ readbuff = args.data; toolStripStatusLabel.Text = "New Received Data" ; if (readbuff[1] == 'a' ) // Khi dữ liệu nhận là 1 {
textBox_St.Text = "Opening" ; }
else if (readbuff[1] == 'b' ) // Khi dữ liệu nhận là 2 {
textBox_St.Text = "Closing" ; }
else if (readbuff[1] == 'c' ) // Khi dữ liệu nhận là 3 {
textBox_St.Text = "Closed" ; }
else if (readbuff[1] == 'd' ) // Khi dữ liệu nhận là 4 {
textBox_St.Text = "Opened" ; }
}
} private void usbHidPort_OnDataSend( object sender, EventArgs e) {
toolStripStatusLabel.Text = "Data sent" ; }
protected override void OnHandleCreated( EventArgs e) {
base OnHandleCreated(e);
usbHidPort.RegisterHandle(Handle); }
protected override void WndProc( ref Message m) {
usbHidPort.ParseMessages( ref m);
base WndProc( ref m); }
}
}
-13-
Trang 143.4 Biên dịch code và sửa lỗi
- Hai hình ảnh chụp màn hình khi biên dịch code thành công cho Arduino (hoặc PIC) và VS C#
- Một vài hình ảnh bị lỗi (nếu có) và trình bày cách khắc phục lỗi đó
Link video minh chứng:
https://youtu.be/8L7Xw0AGqfc?
si=QzCJj2bTxza48NfG
-14-
Trang 15PHẦN IV: Chuẩn đầu ra môn học 4: Có khả năng lắp ráp, cân chỉnh các board
mạch điện tử theo qui trình
4.1 Quy trình Lắp ráp và Test thực nghiệm
Viết quy trình Test theo từng bước: bước 1, bước 2, bước 3 …
4.2 Lắp ráp mạch thực tế
Một hình ảnh chụp bo mạch sau khi đã lắp ráp xong hoàn thiện
Một hoặc hai hình ảnh có các thành viên đang thao tác trên Testboard
Một hình ảnh chụp kết quả khi bo giao tiếp được với VS C#
4.3 Khả năng cân chỉnh bo mạch
Trình bày + hình ảnh lỗi khi thao tác lắp ráp và Test
Trình bày cách khắc phục, xử lý lỗi đó
-15-
Trang 16PHẦN V: Kết luận bài thực hành
cho bài thực hành
-16-