Difference between revisions of "Serial communication with Matlab"

From Mech
Jump to navigationJump to search
 
(50 intermediate revisions by 3 users not shown)
Line 1: Line 1:
== Original Assignment ==
== Overview ==
Matlab has a "serial" function that allows it to communicate through a serial port. This project is to establish serial port connection with the PIC microcontroller and demonstrate bidirectional communication between the PIC and a Matlab program. For demonstration purposes, the PIC will send digital potentiometer readings to Matlab as well as receive keystrokes from the Matlab user to light up LEDs on its circuit board.


A USB to RS232 adapter and level shifter chip were used to connect the computer to the PIC. In this lab, we used a cheap cable found at http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&item=220199148938&ih=012&category=41995&ssPageName=WDVW&rd=1
Matlab has a "serial" function that allows it to communicate through a serial port. This project is to establish serial port connection with the PIC and demonstrate bidirectional communication between the PIC and a Matlab program, using, for example, a USB to RS232 adapter and level shifter chip. The Matlab program could simply log data from the PIC (e.g., the angle of a potentiometer knob), or plot it on a user interface in real time. Keystrokes from the user of the Matlab program should be obviously received by the PIC, perhaps by lighting the LEDs on the PIC board.


== Overview ==
Matlab has a "serial" function that allows it to communicate through a serial port. This project is to establish serial port connection with the PIC and demonstrate bidirectional communication between the PIC and a Matlab program. To demonstrate this, the PIC will send potentiometer readings to Matlab as well as receive keystrokes from the Matlab user to light up LEDs on its circuit board.


'''**Important! DO NOT connect the serial Rx/Tx lines DIRECTLY to the PIC!!!**'''
A USB to RS232 adapter and level shifter chip were used to hook up the computer to the PIC. A level shifter is necessary because the power/ground voltages are different for the desktop computer and the PIC. An RS232 plug looks like this: http://www.aggsoft.com/rs232-pinout-cable/serial-cable-connections.htm

A level shifter chip is necessary to convert the high and low logic voltages from the desktop computer (+12V/-5V) to (+5V,0V) for the PIC. A standard RS232 connection is called a DB9 connector and follows the pin diagram shown here: http://www.aggsoft.com/rs232-pinout-cable/serial-cable-connections.htm
This cable requires 1 driver installation as included on the mini-cd. To install this driver, you must first plug in the USB cable, and run the installation program located on the CD corresponding to the model on the USB Cable (<CDROM>:\HL-232-340\HL-340.exe). This driver is also available online at this link:
http://129.105.69.13/pic/usb_drivers/HL-340_USB_serial_drivers_WinXP/ . To configure the Matlab script to connect to the proper serial port, use the device manager (Right click My Computer->manage) and expand the section "Ports (COM & LPT)". Make a note of the COM port number corresponding to "USB-SERIAL CH340" as listed in this section. In our program, our serial port was COM4. A picture is shown below of how to get this information in the device manager.

[[Image:ComPortLookup.JPG |thumb|300px|right| COM Port Lookup - Device Manager]]



The RS232 was wired to our level shifter to convert the voltages, and then the level shifter was wired to our PIC. Refer to the Circuit section for details.
A female DB9 connector was wired to our level shifter to convert the voltages, with the level shifter connected to our PIC. The female DB9 connector is used so no wires need to be directly soldered to the serial cable. Refer to the Circuit section for details on this connection.


First, the PIC was stamped with our C code (Refer to PIC Code below). It was programmed to read the potentiometer readings from its ADC (Analog to Digital Convertor) port and transmit the digitized readings through the RS232 cables to Matlab. If the Matlab user typed a character, the PIC was also programmed to display the character on its LED array. (8 on/off LEDs represent the 1 byte binary equivalent of any character). In real-time, Matlab would display the potentiometer reading from the PIC and the PIC LEDs would display the keystroke from the user.
The PIC was programmed with our C code as shown below. Our program was designed to read a potentiometer through the PIC's ADC (Analog to Digital Converter) port and transmit the digitized readings over the serial cable to the PC (upon request). In Matlab, if a users sends data to the PIC by entering a character, the PIC responds with the current potentiometer reading and the last received byte from the PC. The PIC is also programmed to display the character received from the PC on its LED array (D register) as a 8-bit ASCII number. The programs can easily be modified to create any custom protocol, but are designed to show simple 2-way communication between Matlab and the PIC.


== Circuit ==
== Circuit ==
The wiring diagram for serial communication is shown below. There are three basic components in this setup. The potentiometer serves as an analog input to the PIC, which is later interpreted by the PC. The MAX232N level converter provides bidirectional voltage shifting for for digital communication between the PIC and PC (read more about this chip and level conversion on the RS232 wiki [http://hades.mech.northwestern.edu/wiki/index.php/PIC_RS232 here]). Finally, the female DB-9 connector allows the circuit to connect to the PC's serial port.
The wiring diagram for serial communication is shown below. There are three basic components in this setup. The potentiometer serves as an analog input to the PIC, which is converted to a digital signal through the PIC's analog to digital converter pin. The MAX232N level converter provides bidirectional voltage shifting for digital communication between the PIC and PC (read more about this chip and level conversion on the RS232 wiki [http://hades.mech.northwestern.edu/wiki/index.php/PIC_RS232 here]). Finally, the female DB-9 connector allows the circuit to connect to the PC's serial port.
[[Image:SerialCom.jpg]] [[Image:P1120664.JPG |Thumb|640x470 px|Image of wiring for serial communication between PIC 18F4520 and PC]]
[[Image:Team26-SerialComCircuit.jpg |thumb|640x470 px|center| Circuit Diagram for Serial Communication between PIC and PC]]

The connections to the female DB-9 adapter are shown below. '''These wires are soldered to the cup-side of the adapter, not directly to the serial cable.''' Our DB-9 adapter is pictured below and follows the given connections:
PIN5:DB-9 (green wire) -> Common Ground
PIN3:DB-9 (yellow wire) -> Receive (RX) -> PIN14:MAX232
PIN2:DB-9 (white wire) -> Transmit (TX) -> PIN13:MAX232

[[Image:DB9Connector.jpg |thumb|300px|center| Closeup of DB-9 Connector]]

Our final circuit is pictured below.

[[Image:P1120664.JPG |thumb|640x470 px|center| Image of wiring for serial communication between PIC 18F4520 and PC]]


== PIC Code ==
== PIC Code ==
Line 56: Line 74:
data_rx = fgetc(); // Read in recieved value from buffer
data_rx = fgetc(); // Read in recieved value from buffer
printf("Pot: %u Char: %u\n", data_tx, data_rx); // Once data sent and read, PIC sends data back
printf("Pot: %u Char: %u\n", data_tx, data_rx); // Once data sent and read, PIC sends data back
delay_ms(100);
//delay_ms(10); // As tested briefly, this delay is unnecessary for our (relatively) slow data rate
// If you are receiving data errors, you may want to introduce a slight delay
}
}
}
}
}
}


== Tips on Designing a Protocol ==
A good way to start or debug your program is to use the PIC-C Serial Port Monitor (Tools Tab->Serial Port Monitor). This will allow you to send and receive raw data over the serial port, which is much easier for understanding why a protocol isn't behaving correctly. You can also use HyperTerminal on windows XP (Start->Programs->Accessories->Communications->HyperTerminal), although in our testing this appeared to be less stable than the PIC-C Compiler's monitor. Note for both programs, you will have to configure which serial port to monitor using the same method described in the Overview.


Be sure to close all other programs accessing the serial ports (PIC-C/Hypterm etc.) if you are having difficulty opening the port in MATLAB.


== Matlab Code ==
== Matlab Code ==

'''**** THIS MATLAB CODE SHOULD BE UPDATED TO USE "fread(s,1)" instead of "fscanf(s)". fread(s,1) reads 1 bitwise value at a time (opposed to an ascii value). Without this change, matlab can only read 8 bit ASCII characters and will reject a subset of the values between 0 and 255. *****'''

'''If your program doesn't close and delete the serial port object correctly, you can use the command shown below to delete all of the serial port objects.'''

delete(instrfind)


% SerialComm.m Scott McLeod, Sandeep Prabhu, Brett Pihl 2/4/2008
% SerialComm.m Scott McLeod, Sandeep Prabhu, Brett Pihl 2/4/2008
% This program is designed to communicate to a PIC 18F4520 via RS232 (Serial) Communication.
% This program is designed to communicate to a PIC 18F4520 via RS232 (Serial) Communication.
Line 69: Line 104:
% upon which it transmits the ascii value and waits for data to be written.
% upon which it transmits the ascii value and waits for data to be written.
s = serial('COM14','BAUD',19200); % Create serial object (PORT Dependent)
s = serial('COM4','BAUD',19200); % Create serial object (PORT Dependent)
fopen(s) % Open the serial port for r/w
fopen(s) % Open the serial port for r/w
Line 76: Line 111:
while (myChar ~= 'q') % While user hasn't typed 'q'
while (myChar ~= 'q') % While user hasn't typed 'q'
myChar = input(prompt, 's'); % Get user input
fprintf(s, '%s', myChar(1)) % Write first char of user input to serial port
fprintf(s, '%s', myChar(1)) % Write first char of user input to serial port
fprintf(fscanf(s)) % Read Data back from PIC
fprintf(fscanf(s)) % Read Data back from PIC
myChar = input(prompt, 's'); % Get user input
end
end
Line 84: Line 119:
delete(s); % Delete the serial object
delete(s); % Delete the serial object


== External Links ==
'''If your program doesn't close and delete the serial port object correctly, you can use the command shown below to delete all of the serial port objects.'''


More on Serial and the PIC: http://hades.mech.northwestern.edu/wiki/index.php/PIC_RS232
delete(instrfind)

MAX232 Data Sheet: http://rocky.digikey.com/WebLib/Texas%20Instruments/Web%20data/MAX232,232I.pdf

Overview of RS232 Protocol: http://en.wikipedia.org/wiki/RS-232

Latest revision as of 17:53, 25 April 2009

Overview

Matlab has a "serial" function that allows it to communicate through a serial port. This project is to establish serial port connection with the PIC microcontroller and demonstrate bidirectional communication between the PIC and a Matlab program. For demonstration purposes, the PIC will send digital potentiometer readings to Matlab as well as receive keystrokes from the Matlab user to light up LEDs on its circuit board.

A USB to RS232 adapter and level shifter chip were used to connect the computer to the PIC. In this lab, we used a cheap cable found at http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&item=220199148938&ih=012&category=41995&ssPageName=WDVW&rd=1


**Important! DO NOT connect the serial Rx/Tx lines DIRECTLY to the PIC!!!**

A level shifter chip is necessary to convert the high and low logic voltages from the desktop computer (+12V/-5V) to (+5V,0V) for the PIC. A standard RS232 connection is called a DB9 connector and follows the pin diagram shown here: http://www.aggsoft.com/rs232-pinout-cable/serial-cable-connections.htm This cable requires 1 driver installation as included on the mini-cd. To install this driver, you must first plug in the USB cable, and run the installation program located on the CD corresponding to the model on the USB Cable (<CDROM>:\HL-232-340\HL-340.exe). This driver is also available online at this link: http://129.105.69.13/pic/usb_drivers/HL-340_USB_serial_drivers_WinXP/ . To configure the Matlab script to connect to the proper serial port, use the device manager (Right click My Computer->manage) and expand the section "Ports (COM & LPT)". Make a note of the COM port number corresponding to "USB-SERIAL CH340" as listed in this section. In our program, our serial port was COM4. A picture is shown below of how to get this information in the device manager.

COM Port Lookup - Device Manager


A female DB9 connector was wired to our level shifter to convert the voltages, with the level shifter connected to our PIC. The female DB9 connector is used so no wires need to be directly soldered to the serial cable. Refer to the Circuit section for details on this connection.

The PIC was programmed with our C code as shown below. Our program was designed to read a potentiometer through the PIC's ADC (Analog to Digital Converter) port and transmit the digitized readings over the serial cable to the PC (upon request). In Matlab, if a users sends data to the PIC by entering a character, the PIC responds with the current potentiometer reading and the last received byte from the PC. The PIC is also programmed to display the character received from the PC on its LED array (D register) as a 8-bit ASCII number. The programs can easily be modified to create any custom protocol, but are designed to show simple 2-way communication between Matlab and the PIC.

Circuit

The wiring diagram for serial communication is shown below. There are three basic components in this setup. The potentiometer serves as an analog input to the PIC, which is converted to a digital signal through the PIC's analog to digital converter pin. The MAX232N level converter provides bidirectional voltage shifting for digital communication between the PIC and PC (read more about this chip and level conversion on the RS232 wiki here). Finally, the female DB-9 connector allows the circuit to connect to the PC's serial port.

Circuit Diagram for Serial Communication between PIC and PC

The connections to the female DB-9 adapter are shown below. These wires are soldered to the cup-side of the adapter, not directly to the serial cable. Our DB-9 adapter is pictured below and follows the given connections:

PIN5:DB-9 (green wire)  ->  Common Ground
PIN3:DB-9 (yellow wire) ->  Receive (RX)   ->  PIN14:MAX232
PIN2:DB-9 (white wire)  ->  Transmit (TX)  ->  PIN13:MAX232
Closeup of DB-9 Connector

Our final circuit is pictured below.

Image of wiring for serial communication between PIC 18F4520 and PC

PIC Code

/*
   SerialComm.c Scott McLeod, Sandeep Prabhu, Brett Pihl 2/4/2008
   This program is designed to communicate to a computer using RS232 (Serial) Communication.
   
   The main loop of this program waits for a data transmission over the Serial port, and
   responds with a current reading of an analog input (potentiometer) and the last received data.
  
   Note the analog input is only for testing purposes, and is not necessary for serial communication.
   Lines unnecessary for RS232 communication are commented with enclosing asterisks ('*..*').
 */
 
#include <18f4520.h>

#fuses HS,NOLVP,NOWDT,NOPROTECT
#DEVICE ADC=8                          // *set ADC to 8 bit accuracy*
#use delay(clock=20000000)             // 20 MHz clock
#use rs232(baud=19200, UART1)          // Set up PIC UART on RC6 (tx) and RC7 (rx)  
 
int8 data_tx, data_rx = 0;             // Set up data_tx (transmit value), data_rx (recieve value)
 
void main()
{
   setup_adc_ports(AN0);               // *Enable AN0 as analog potentiometer input*
   setup_adc(ADC_CLOCK_INTERNAL);      // *the range selected has to start with AN0*
   set_adc_channel(0);                 // *Enable AN0 as analog input*
   delay_us(10);                       // *Pause 10us to set up ADC*
   
   while (TRUE)
   {
      data_tx = read_adc();            // *Read POT on analog port (0-255)*
      output_d(data_rx);               // Output last recieved value from computer
      delay_ms(10);
      
      if (kbhit())                     // If PIC senses data pushed to serial buffer
      {
         data_rx = fgetc();            // Read in recieved value from buffer
         printf("Pot: %u Char: %u\n", data_tx, data_rx);  // Once data sent and read, PIC sends data back
 
         //delay_ms(10);               // As tested briefly, this delay is unnecessary for our (relatively) slow data rate
                                       // If you are receiving data errors, you may want to introduce a slight delay
 
 
      }
   }
}

Tips on Designing a Protocol

A good way to start or debug your program is to use the PIC-C Serial Port Monitor (Tools Tab->Serial Port Monitor). This will allow you to send and receive raw data over the serial port, which is much easier for understanding why a protocol isn't behaving correctly. You can also use HyperTerminal on windows XP (Start->Programs->Accessories->Communications->HyperTerminal), although in our testing this appeared to be less stable than the PIC-C Compiler's monitor. Note for both programs, you will have to configure which serial port to monitor using the same method described in the Overview.


Be sure to close all other programs accessing the serial ports (PIC-C/Hypterm etc.) if you are having difficulty opening the port in MATLAB.

Matlab Code

**** THIS MATLAB CODE SHOULD BE UPDATED TO USE "fread(s,1)" instead of "fscanf(s)". fread(s,1) reads 1 bitwise value at a time (opposed to an ascii value). Without this change, matlab can only read 8 bit ASCII characters and will reject a subset of the values between 0 and 255. *****

If your program doesn't close and delete the serial port object correctly, you can use the command shown below to delete all of the serial port objects.

delete(instrfind)


%  SerialComm.m  Scott McLeod, Sandeep Prabhu, Brett Pihl 2/4/2008
%  This program is designed to communicate to a PIC 18F4520 via RS232 (Serial) Communication.
%  
%  The main loop of this program waits for a character input from the user,
%  upon which it transmits the ascii value and waits for data to be written.

s = serial('COM4','BAUD',19200);            % Create serial object (PORT Dependent)
fopen(s)                                    % Open the serial port for r/w

myChar = 'a';                               
prompt = 'Enter a character (q to exit): '; 

while (myChar ~= 'q')                       % While user hasn't typed 'q'
    fprintf(s, '%s', myChar(1))             % Write first char of user input to serial port
    fprintf(fscanf(s))                      % Read Data back from PIC
    myChar = input(prompt, 's');            % Get user input
end

fclose(s);                                  % Close the serial port
delete(s);                                  % Delete the serial object

External Links

More on Serial and the PIC: http://hades.mech.northwestern.edu/wiki/index.php/PIC_RS232

MAX232 Data Sheet: http://rocky.digikey.com/WebLib/Texas%20Instruments/Web%20data/MAX232,232I.pdf

Overview of RS232 Protocol: http://en.wikipedia.org/wiki/RS-232