Projet interfaçage DESCHAMPS JAHNICH 12/06/2018
Dependencies: AX12 BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG mbed
main.cpp
- Committer:
- jumpstars
- Date:
- 2018-06-12
- Revision:
- 1:7c20e55d185e
- Parent:
- 0:83911d619e5c
File content as of revision 1:7c20e55d185e:
/* Veuillez trouver ci-dessous le programme permettant de creer et d'intéragir avec une interface qui controle un moteur dynamixel AX-12A * Vous trouverez 3 boutons : -un bouton init qui permet de placer le moteur à la position 0° * -un bouton demi-tour qui permet de diminuer ou augmenter la position de 180° * -un bouton quart de tour qui permet de diminuer ou augmenter la position de 90° * Ainsi qu'un cercle tactile qui permet de selectionner 7 positions, tous les 45°. * AUTEURS : Rémi JAHNICH Antoine DESCHAMPS Licence professionelle MECSE sesam1 */ #include "mbed.h" #include "TS_DISCO_F746NG.h" #include "LCD_DISCO_F746NG.h" #include "AX12.h" TS_DISCO_F746NG ts; LCD_DISCO_F746NG lcd; AX12 myax12 (D1, D0, 1); // definition des broches TX RX int main() { /////////// Initialisation des variables pour le LCD ///////////// TS_StateTypeDef TS_State; uint16_t x, y; uint8_t text[30]; uint8_t text2[30]; uint8_t text3[30]; uint8_t status; uint8_t idx; uint8_t cleared = 0; uint8_t prev_nb_touches = 0; //uint16_t x_cercle = 450; //uint16_t y_cercle = 100; //////// Initialisation des variables ///////// uint8_t demitour = 0; uint8_t quarttour = 0; uint8_t position = 1; uint8_t old_position = 1; uint8_t compteur; uint8_t compteur2; uint8_t compteur3; uint16_t rot = 0; // valeur en degree pour le servo moteur float temp; float volt; lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"INTERFACE SERVOMOTEUR", CENTER_MODE); // Affichage du titre de l'interface wait(1); //////////// Initialisation de l'écran tactile avec retour fail/ok //////////////// status = ts.Init(lcd.GetXSize(), lcd.GetYSize()); if (status != TS_OK) { lcd.Clear(LCD_COLOR_RED); lcd.SetBackColor(LCD_COLOR_RED); lcd.SetTextColor(LCD_COLOR_WHITE); lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT FAIL", CENTER_MODE); } else { lcd.Clear(LCD_COLOR_GREEN); lcd.SetBackColor(LCD_COLOR_GREEN); lcd.SetTextColor(LCD_COLOR_WHITE); lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT OK", CENTER_MODE); } wait(1); lcd.Clear(LCD_COLOR_WHITE); /////////// Boucle du programme ///////////// while(1) { myax12.SetGoal(rot); //Aller à la valeur de rot //affichage de la position lcd.SetBackColor(LCD_COLOR_WHITE); lcd.SetTextColor(LCD_COLOR_BLACK); sprintf((char*)text, "position: %d degrees", rot); lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, CENTER_MODE); /* Retour de la température et volt du moteur mais ne fonctionne pas -> retour 0 pour les deux temp = myax12.GetTemp(); volt = myax12.GetVolts(); sprintf((char*)text2, "Temp : %.2f ", temp); lcd.DisplayStringAt(0, LINE(9), (uint8_t *)&text2, LEFT_MODE); sprintf((char*)text3, "Volts : %.2f ", volt); lcd.DisplayStringAt(0, LINE(10), (uint8_t *)&text3, LEFT_MODE); */ //initialisation affichage lcd.SetTextColor(LCD_COLOR_BLACK); lcd.DrawCircle(240, 200, 50); // Affichage du cercle rouge(selon la valeur de rot) // lcd.SetTextColor(LCD_COLOR_RED); if(rot == 0){ lcd.FillCircle(240,150,15); } if(rot == 45){ lcd.FillCircle(275,165,15); } if(rot == 90){ lcd.FillCircle(290,200,15); } if(rot == 135){ lcd.FillCircle(275,235,15); } if(rot == 180){ lcd.FillCircle(240,250,15); } if(rot == 225){ lcd.FillCircle(205,235,15); } if(rot == 270){ lcd.FillCircle(190,200,15); } if(rot == 300){ lcd.FillCircle(205,165,15); } //Clear de l'écran if(position != old_position){ lcd.Clear(LCD_COLOR_WHITE); old_position = position; } //gestion du demi tour (selon la valeur de rot) // if(demitour == 1){ if(rot == 0){//ok rot = 180; demitour = 0; }else if(rot == 45){//? rot = 225; demitour = 0; }else if(rot == 90){//? rot = 270; demitour = 0; }else if(rot == 135){ rot = 300; demitour = 0; }else if(rot == 180){ rot = 0; demitour = 0; }else if(rot == 225){ rot = 45; demitour = 0; }else if(rot == 270){ rot = 90; demitour = 0; }else if(rot == 300){ rot = 135; demitour = 0; } } //gestion quart de tour (selon la valeur de rot) // if(quarttour == 1){ if(rot == 0){//ok rot = 90; quarttour = 0; } else if(rot == 45){//? rot = 135; quarttour = 0; }else if(rot == 90){//? rot = 180; quarttour = 0; }else if(rot == 135){ rot = 225; quarttour = 0; }else if(rot == 180){ rot = 270; quarttour = 0; }else if(rot == 225){ rot = 300; quarttour = 0; }else if(rot == 270){ rot = 0; quarttour = 0; }else if(rot == 300){ rot =45; quarttour = 0; } } // gestion du tactile ts.GetState(&TS_State); if (TS_State.touchDetected) { if (TS_State.touchDetected < prev_nb_touches) { for (idx = (TS_State.touchDetected + 1); idx <= 5; idx++) { lcd.ClearStringLine(idx); } } compteur = 0; for (idx = 0; idx < TS_State.touchDetected; idx++) { x = TS_State.touchX[idx]; y = TS_State.touchY[idx]; // Ici, nous avons défini des zones de l'écran tactile pour le cercle rouge et les 3 boutons // //POSITION 1 if((x > 225) && (x < 255) && (y > 135) && (y < 165)){ rot = 0; } //POSITION 2 if((x > 260) && (x < 290) && (y > 150) && (y < 180)){ rot = 45; } //POSITION 3 if((x > 275) && (x < 305) && (y > 185) && (y < 215)){ rot = 90; } //POSITION 4 if((x > 260) && (x < 290) && (y > 220) && (y < 250)){ rot = 135; } //POSITION 5 if((x > 225) && (x < 255) && (y > 235) && (y < 265)){ rot = 180; } //POSITION 6 if((x > 190) && (x < 220) && (y > 220) && (y < 250)){ rot = 225; } //POSITION 7 if((x > 175) && (x < 205) && (y > 185) && (y < 215)){ rot = 270; } //POSITION 8 if((x > 190) && (x < 220) && (y > 150) && (y < 180)){ rot = 300; } //bouton demi tour if((x > 40) && (x < 140) && (y > 40) && (y < 100)){ lcd.SetTextColor(LCD_COLOR_BLACK); lcd.FillRect(40,40,100,60); lcd.SetBackColor(LCD_COLOR_BLACK); lcd.SetTextColor(LCD_COLOR_WHITE); lcd.DisplayStringAt(60, LINE(2), (uint8_t *)"Demi", LEFT_MODE); lcd.DisplayStringAt(60, LINE(3), (uint8_t *)"Tour", LEFT_MODE); // réalisation du demi tour une seule fois if(compteur2 < 1){ demitour=1; compteur2++; } } //bouton quart de tour if((x > 165) && (x < 315) && (y > 40) && (y < 100)){ lcd.SetTextColor(LCD_COLOR_BLACK); lcd.FillRect(165,40,150,60); lcd.SetBackColor(LCD_COLOR_BLACK); lcd.SetTextColor(LCD_COLOR_WHITE); lcd.DisplayStringAt(0, LINE(2), (uint8_t *)"Quart", CENTER_MODE); lcd.DisplayStringAt(0, LINE(3), (uint8_t *)"de tour", CENTER_MODE); // réalisation du quart de tour une seule fois if(compteur3 < 1){ quarttour=1; compteur3++; } } //bouton init if((x > 340) && (x < 440) && (y > 40) && (y < 100)){ lcd.SetTextColor(LCD_COLOR_BLACK); lcd.FillRect(340,40,100,60); lcd.SetBackColor(LCD_COLOR_BLACK); lcd.SetTextColor(LCD_COLOR_WHITE); lcd.DisplayStringAt(358, LINE(2), (uint8_t *)"Init", LEFT_MODE); rot = 0; } } } else { // Réaliser un seul clear quand le tactile n'est pas utilisé // compteur2 = 0; compteur3 = 0; if(compteur < 1){ lcd.Clear(LCD_COLOR_WHITE); compteur++; } // Affichage des trois boutons quand le tactile n'est pas utilisé // lcd.SetTextColor(LCD_COLOR_BLACK); lcd.DrawRect(40,40,100,60); lcd.SetBackColor(LCD_COLOR_WHITE); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.DisplayStringAt(60, LINE(2), (uint8_t *)"Demi", LEFT_MODE); lcd.DisplayStringAt(60, LINE(3), (uint8_t *)"Tour", LEFT_MODE); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.DrawRect(165,40,150,60); lcd.SetBackColor(LCD_COLOR_WHITE); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.DisplayStringAt(0, LINE(2), (uint8_t *)"Quart", CENTER_MODE); lcd.DisplayStringAt(0, LINE(3), (uint8_t *)"de tour", CENTER_MODE); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.DrawRect(340,40,100,60); lcd.SetBackColor(LCD_COLOR_WHITE); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.DisplayStringAt(358, LINE(2), (uint8_t *)"Init", LEFT_MODE); if (!cleared) { //lcd.Clear(LCD_COLOR_WHITE); cleared = 1; } } } }