Contrôle d’un microcontrôleur PIC à partir d’une interface utilisateur graphique (GUI) PC via USB
Figure 1: Figure 1: Commande d’un Microcontrôleur PIC à partir d’un ordinateur
Une interface utilisateur graphique est un dispositif d’interface homme-machine, dans lequel les objets à manipuler sont dessinés sous forme d’icônes sur l’écran, l’utilisateur peut envoyer des commandes par un dispositif de pointage, généralement une souris ou un clavier.
C’est facile et ça nécessite moins de compétences pour faire fonctionner un dispositif à partir d’ une représentation visuelle de l’espace de travail (GUI) en cliquant simplement une souris ou à l’ aide d’ un clavier plutôt que d’une ligne de commande.
L’interface graphique peut également être utilisé pour l’ interface avec d’ autres périphériques externes situés dans des endroits différents.
Il y a beaucoup de différents types de logiciels qui peuvent être utilisés pour concevoir une plate – forme graphique, le choix dépend généralement des préférences personnelles, les capacités logicielles et les systèmes d’exploitation (Windows, Linux, Mac …).
Parmi les plus populaires , nous avons Microsoft Visual Studio avec ses langages de programmation comme Visual Basic et C#, Labview, Python, Matlab etc.
Dans le projet: Contrôle d’un microcontrôleur PIC à partir d’une interface utilisateur graphique (GUI) d’un Ordinateur, nous avons conçu un logiciel d’interface utilisateur graphique (GUI) à l’aide de Microsoft Visual C # pour contrôler les LED connectées au microcontrôleur PIC. Ce logiciel peut être installé sur n’importe quel ordinateur exécutant des systèmes d’exploitation Windows. L’ordinateur se connecte au microcontrôleur à l’aide d’un câble série RS232. Le microcontrôleur PIC recevra des commandes de l’ordinateur pour contrôler les appareils qui lui sont connectés tels que les moteurs, les LED, etc.
Comme le port d’interface série RS-232 (port COM) est maintenant rarement trouvé sur un ordinateur personnel (PC), cette interface commune a été virtuellement remplacée par le bus série universel ou USB.
Aujourd’hui, l’USB s’est développé au-delà des PC pour devenir l’interface commune de nombreux produits industriels et grand public intégrés comme les appareils photo, les GPS, les imprimantes, etc.
Cela a créé un problème car de nombreux logiciels PC ont été conçus pour communiquer avec les applications intégrées à l’aide de l’interface RS-232, car l’USART est toujours l’un des protocoles série les plus simples à utiliser avec n’importe quel microcontrôleur, de nombreux appareils l’utilisent toujours comme communication principale. protocole comme les modules GSM / GPRS, GPS, etc.
Dans ce projet, nous allons émuler l’interface du port série en utilisant le port USB pour contrôler le PIC à partir de l’interface GUI du PC. En utilisant l’USB dans la classe CDC, aucune modification ne sera requise sur le logiciel PC.
Cela peut être utilisé pour migrer facilement d’anciens projets en utilisant RS232 vers USB rapidement sans changer le logiciel de l’ordinateur, nous aurons juste besoin de changer le PIC en PIC avec interface USB et changer le code du microcontrôleur.
Figure 2: Émulation de l’interface du port série
Pour en savoir plus, veuillez d’abord lire ces articles:
USB Communication With PIC Microcontroller CDC – XC8
Pour le prototypage rapide ou pour les produits commerciaux, il est toujours indispensable d’utiliser un fabricant de PCB spécialisé de bonne réputation au lieu de le faire vous-même et, heureusement, de nos jours, vous n’avez pas à dépenser une fortune pour faire fabriquer vos cartes de manière professionnelle.
Nous recommandons PCBWay un fabricant de PCB basé en Chine spécialisé dans le prototypage de PCB, la production en petit volume et le service d’assemblage de PCB avec plus d’une décennie d’expérience, vous pouvez en obtenir 10 PCB de bonne qualité (1-2 couches) pour seulement 5 $. Ils ont également une fonction de suivi de 24 heures sur leur page de commande, vous pourrez surveiller chaque étape de la façon dont ils fabriquent vos PCB jusqu’à ce qu’ils soient prêts pour l’expédition.
Alors que le monde entier se bat contre le coronavirus, c’est le moment de la solidarité et de la collaboration mondiales pour combattre le COVID-19, l’amour vaincra la peur!
PCBWay.com, s’associe aussi à la communauté mondiale. En ce moment de besoin car il y a une pénurie de masques dans le monde entier, ils envoient maintenant des masques faciaux gratuits (10 pièces) au hasard avec vos commandes. La priorité est donnée aux zones à épidémies sévères. Si vous avez des questions ou si vous avez besoin du masque, vous pouvez contacter directement votre représentant commercial.
Pour en savoir plus sur la façon d’obtenir vos masques gratuits ou sur la façon d’obtenir des PCB de grande qualité à bas prix, veuillez cliquer sur l’image ci-dessous ou aller à la page d’accueil de PCBWay
Vous pouvez également télécharger gratuitement le Manuel de prévention et de traitement de COVID-19 (en Anglais) qui fournit des directives complètes et les meilleures pratiques des meilleurs experts chinois pour faire face à COVID-19.
Restez en sécurité et en bonne santé! Nous vous accompagnons! #StandWithPCBWayers
Vous pouvez acheter un microcontrôleur PIC USB dans notre boutique en ligne:
Configuration USB avec configurateur de code MPLAB
Vous pouvez consulter la configuration et l’explication dans l’article Communication USB avec microcontrôleur PIC CDC – XC8, dans ce projet, nous ajouterons la configuration des broches LED.
Nous utilisons le PIC18F45K50, trois LED sont connectées au PORTB, une LED rouge sur RB0, une LED jaune sur RB1 et une LED verte sur RB2. Lorsque l’utilisateur clique sur le bouton LED ROUGE, il enverra un ‘1’ au microcontrôleur PIC pour allumer la LED ROUGE uniquement, si la LED JAUNE est cliquée, un ‘2’ sera envoyé pour allumer la LED JAUNE et si le bouton LED VERTE est cliqué, un ‘3’ sera envoyé pour allumer la LED VERTE.
Paramètres d’horloge USB
Démarrez un nouveau projet MPLAB X et sélectionnez le PIC18F45K50. Démarrez le MCC pour configurer nos périphériques.
Cliquez sur le module système dans les ressources du projet. Lorsque le PIC18F45k50 est utilisé pour la connectivité USB, 6 MHz ou 48 MHz doit être fourni au module USB pour fonctionner en mode basse vitesse (1,5 Mbit / s) ou pleine vitesse (12 Mbit / s). Pour y parvenir, nous aurons besoin d’une fréquence USB de 48 MHz que nous pouvons obtenir en utilisant l’horloge interne de 16 MHz avec PLL (Phase-locked loop). Ce PIC a des multiplicateurs d’horloge 3x et 4xPLL comme indiqué sur la figure ci-dessous. En utilisant le 16 MHz interne avec 3 PLL, nous pouvons augmenter la fréquence d’horloge USB à 48 MHz.
Figure 3: PIC18F45K50 Paramètres d’horloge pour USB 48 MHz pleine vitesse avec MCC
Le HFINTOSC est réglé à l’aide d’événements USB pleine vitesse. L’ACT est activé en définissant le bit ACTEN du registre ACTCON. L’ACT utilise l’horloge de référence ACT sélectionnée pour régler l’oscillateur interne à 16 MHz avec une précision de 16 MHz ± 0,2%. Le réglage ajuste automatiquement le registre OSCTUNE à chaque cycle d’horloge de référence
Figure 4: PIC18F45K50 Registre ACTON
MLA USB Device Lite
Sous les ressources du périphérique, double-cliquez sur le périphérique USB MLA Lite pour l’ajouter aux ressources des propriétés sous les périphériques. Sélectionnez-le pour définir ses propriétés. C’est ici que nous allons configurer tous les paramètres USB, avec MCC, la configuration est super facile.
Figure 5: Configuration de MLA USB Device Lite dans MCC
Paramètres CDC:
Module de broche
Les broches RB0, RB1 et RB2 sont définies comme broches de sortie et reçoivent des noms personnalisés dans le MCC comme Red, Yellow et Green respectivement.
Code de microcontrôleur complet avec compilateur MPLAB XC8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
/** Generated Main Source File Company: (c) 2020 www.studentcompanion.co.za * Date: April 2020 File Name: main.c Summary: This is the main file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs Description: This header file provides implementations for driver APIs for all modules selected in the GUI. Generation Information : Product Revision : PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.80.0 Device : PIC18F45K50 XC8 Compiler : Version 2.05 C Standard : C99/C90 MCC : Version 3.95.0 MPLAB X IDE : Version 5.25 */ #include "mcc_generated_files/mcc.h" /* Main application */ static uint8_t readBuffer[64]; static uint8_t writeBuffer[64]; void UserApplication(void); //USB User Application Tasks void main(void) { // Initialize the device SYSTEM_Initialize(); // If using interrupts in PIC18 High/Low Priority Mode you need to enable the Global High and Low Interrupts // If using interrupts in PIC Mid-Range Compatibility Mode you need to enable the Global and Peripheral Interrupts // Use the following macros to: // Enable the Global Interrupts INTERRUPT_GlobalInterruptEnable(); // Disable the Global Interrupts //INTERRUPT_GlobalInterruptDisable(); // Enable the Peripheral Interrupts INTERRUPT_PeripheralInterruptEnable(); // Disable the Peripheral Interrupts //INTERRUPT_PeripheralInterruptDisable(); TRISB = 0x0; // Set PORTB as Output LATB=0; //Switch OFF all LEDs on PORTB while (1) { UserApplication(); // Add your application code } } void UserApplication(void) { /* If the USB device isn't configured yet, we can't really do anything * else since we don't have a host to talk to. So jump back to the * top of the while loop. */ if( USBGetDeviceState() < CONFIGURED_STATE ) { return; } /* If we are currently suspended, then we need to see if we need to * issue a remote wakeup. In either case, we shouldn't process any * keyboard commands since we aren't currently communicating to the host * thus just continue back to the start of the while loop. */ if( USBIsDeviceSuspended()== true ) { return; } /* Make sure that the CDC driver is ready for a transmission. */ if( USBUSARTIsTxTrfReady() == true) { uint8_t numBytesRead; numBytesRead = getsUSBUSART(readBuffer, sizeof(readBuffer)); if(numBytesRead > 0) { //Check the received data to control the LEDs if (readBuffer[0] =='1') { Red_SetHigh(); //Switch ON the RED LED only Yellow_SetLow(); Green_SetLow(); } else if (readBuffer[0] =='2') { Red_SetLow(); Yellow_SetHigh(); //Switch ON the YELLOW LED only Green_SetLow(); } else if (readBuffer[0] =='3') { Red_SetLow(); Yellow_SetLow(); Green_SetHigh(); //Switch ON the GREEN LED only } //Switch OFF all the LEDs if any other character is received else { Red_SetLow(); Yellow_SetLow(); Green_SetLow(); } } } /* This handles device-to-host transaction(s). * Failure to call CDCTxService() periodically will prevent data from * being sent to the USB host. */ CDCTxService(); } /** End of File */ |
Configuration USB avec mikroC
Pour la configuration USB avec mikroC pro pour PIC, veuillez vous référer à cet article:
Logiciel GUI de l’Ordinateur
Regardez le tutoriel vidéo partie 1: Concevoir avec C#
La figure 8 ci-dessous montre l’interface PC GUI. Le composant de port série C # est utilisé pour envoyer des données au port série de l’ordinateur, le même code sera utilisé que ce soit en utilisant USB ou RS232.
Figure 8: Logiciel GUI de l’ordinateur
Nous avons trois boutons LED sur le formulaire. Les boutons rouge, jaune et vert. Cliquer sur un bouton enverra une commande au microcontrôleur.
Quelques méthodes de la classe port série:
- Close(): Ferme la connexion du port, définit la IsOpen propriété à false (faux ), et dispose de l’objet Stream interne. Appelez cela pour déconnecter votre port série.
- DiscardInBuffer (): Supprime les données du tampon de réception du pilote série.
- Dispose (): Libère toutes les ressources utilisées par le composant.
- Open (): Ouvre une nouvelle connexion du port série.
- Lire (Char [], Int32, Int32): Lit un nombre de caractères de la mémoire tampon d’entrée SerialPort et les écrit dans un tableau de caractères à une position donnée.
- ReadExisting (): Lit tous les octets immédiatement disponibles, en fonction du codage, dans le flux et dans le tampon d’entrée de l’objet SerialPort.
- ReadLine (): lit jusqu’à la valeur NewLine dans le tampon d’entrée.
- Write (String): Ecrit la chaîne spécifiée au port série.
- Ecrire (Char [], Int32, Int32): Écrit un nombre spécifié de caractères sur le port série à l’aide des données d’un tampon, comme indiqué sur le code ci-dessous.
1 2 3 4 5 6 7 8 9 10 11 |
//Send a character 1'to serial port. private void redLEDOFF_Click(object sender, EventArgs e) { char[] buff = new char[1]; buff[0] = '1'; //ASCII for 1. ComPort.Write(buff, 0, 1); redLEDOFF.Visible = false; redONLED.Visible = true; yellowLEDOFF.Visible = true; greenLEDOFF.Visible = true; } |
Avant d’ envoyer des données, le port série doit être ouvert d’abord en utilisant le serialPort.Open () ;
Pour en savoir plus en détail comment concevoir une interface de port série avec C#, s’il vous plaît lire l’article:
La figure 9 ci-dessous montre l’interface PC GUI envoyant des commandes au microcontrôleur PIC. Dans cet exemple, lorsque le bouton rouge est cliqué, la LED rouge PIC s’allume (le caractère 1 est envoyé à PIC), lorsque le bouton jaune est cliqué, la LED jaune PIC s’allume (le caractère 2 est envoyé à PIC) et enfin lorsque le Le bouton vert est cliqué, la LED verte PIC est allumée (le caractère 3 est envoyé au PIC). Si un bouton est cliqué à nouveau alors que déjà le caractère 4 est envoyé au PIC pour éteindre toutes les LED.
Figure 9: Logiciel GUI PC envoyant des commandes au microcontrôleur PIC
Regardez le tutoriel vidéo partie 2: Projet d’installation
Code C# complet du GUI
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
/* * Project: Serial Port Interface in C# * Company: StudentCompanion * Created: December 2018 * Notes: This is a simple demonstration on how to use the SerialPort control for * communicating with your PC's COM Port. * This is for educational purposes only and not for any commercial use. * For more on this, please visit: https://www.studentcompanion.co.za/creating-a-serial-port-interface-with-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 System.IO.Ports; //This is a namespace that contains the SerialPort class namespace PIC_GUI { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { updatePorts(); //Call this function everytime the page load //to update port names } private SerialPort ComPort = new SerialPort(); //Initialise ComPort Variable as SerialPort private void updatePorts() { // Retrieve the list of all COM ports on your Computer string[] ports = SerialPort.GetPortNames(); foreach (string port in ports) { cmbPortName.Items.Add(port); } } //whenever the connect button is clicked, it will check if the port is already open, call the disconnect function. // if the port is closed, call the connect function. private void btnConnect_Click(object sender, EventArgs e) { if (ComPort.IsOpen) { disconnect(); } else { connect(); } } private void connect() { bool error = false; // Check if all settings have been selected if (cmbPortName.SelectedIndex != -1 & cmbBaudRate.SelectedIndex != -1 & cmbParity.SelectedIndex != -1 & cmbDataBits.SelectedIndex != -1 & cmbStopBits.SelectedIndex != -1) { //if yes than Set The Port's settings ComPort.PortName = cmbPortName.Text; ComPort.BaudRate = int.Parse(cmbBaudRate.Text); //convert Text to Integer ComPort.Parity = (Parity)Enum.Parse(typeof(Parity), cmbParity.Text); //convert Text to Parity ComPort.DataBits = int.Parse(cmbDataBits.Text); //convert Text to Integer ComPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmbStopBits.Text); //convert Text to stop bits try //always try to use this try and catch method to open your port. //if there is an error your program will not display a message instead of freezing. { //Open Port ComPort.Open(); } catch (UnauthorizedAccessException) { error = true; } catch (System.IO.IOException) { error = true; } catch (ArgumentException) { error = true; } if (error) MessageBox.Show(this, "Could not open the COM port. Most likely it is already in use, has been removed, or is unavailable.", "COM Port unavailable", MessageBoxButtons.OK, MessageBoxIcon.Stop); } else { MessageBox.Show("Please select all the COM Port Settings", "Controlling a PIC Microcontroller from a PC GUI", MessageBoxButtons.OK, MessageBoxIcon.Stop); } //if the port is open, Change the Connect button to disconnect, enable the send button. //and disable the groupBox to prevent changing configuration of an open port. if (ComPort.IsOpen) { btnConnect.Text = "Disconnect"; groupRed.Enabled = true; //enable the red LED button groupYellow.Enabled = true; //enable the Yellow LED button groupGreen.Enabled = true; //enable the Green LED button } } // Call this function to close the port. private void disconnect() { ComPort.Close(); btnConnect.Text = "Connect"; groupRed.Enabled = false; //disable the red LED button groupYellow.Enabled = false; //disable the Yellow LED button groupGreen.Enabled = false; //disable the Green LED button } private void btnExit_Click(object sender, EventArgs e) { this.Close(); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (ComPort.IsOpen) ComPort.Close(); //close the port if open when exiting the application. } //Send a character 1'to serial port. private void redLEDOFF_Click(object sender, EventArgs e) { char[] buff = new char[1]; buff[0] = '1'; //ASCII for 1. ComPort.Write(buff, 0, 1); redLEDOFF.Visible = false; redONLED.Visible = true; yellowLEDOFF.Visible = true; greenLEDOFF.Visible = true; } //Switch OFF all LEDs by sending '4' private void redONLED_Click(object sender, EventArgs e) { char[] buff = new char[1]; buff[0] = '4'; //ASCII for 4. ComPort.Write(buff, 0, 1); redLEDOFF.Visible = true; redONLED.Visible = false; } private void yellowLEDOFF_Click(object sender, EventArgs e) { char[] buff = new char[1]; buff[0] = '2'; //ASCII for 2. ComPort.Write(buff, 0, 1); yellowLEDOFF.Visible = false; yellowLEDON.Visible = true; greenLEDOFF.Visible = true; redLEDOFF.Visible = true; } private void yellowLEDON_Click(object sender, EventArgs e) { char[] buff = new char[1]; buff[0] = '4'; //ASCII for 4. ComPort.Write(buff, 0, 1); yellowLEDOFF.Visible = true; yellowLEDON.Visible = false; } private void greenLEDOFF_Click(object sender, EventArgs e) { char[] buff = new char[1]; buff[0] = '3'; //ASCII for 3. ComPort.Write(buff, 0, 1); greenLEDOFF.Visible = false; greenLEDON.Visible = true; yellowLEDOFF.Visible = true; redLEDOFF.Visible = true; } private void greenLEDON_Click(object sender, EventArgs e) { char[] buff = new char[1]; buff[0] = '4'; //ASCII for 4. ComPort.Write(buff, 0, 1); greenLEDOFF.Visible = true; greenLEDON.Visible = false; } } } |
Vous pouvez télécharger les fichiers de projet complet (code source MPLAB XC8 et projet C#) ci – dessous ici. Tous les fichiers sont compressés, vous aurez besoin de les dézipper ( Télécharger une version gratuite de l’utilitaire Winzip pour décompresser les fichiers ).
Télécharger MPLAB projet: PIC-USB-CDC-GUI
Télécharger le projet C#: pic_gui_c_project