Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- Nilox
- Date:
- 2019-05-17
- Revision:
- 1:19d43c4e741f
- Parent:
- 0:3b2f23672f26
File content as of revision 1:19d43c4e741f:
#include "mbed.h" #include <PwmIn.h> #include "math.h" // Initialize a pins to perform analog and digital output fucntions //Serial pc(USBTX,USBRX); Serial BT(PA_11,PA_12 ,9600); DigitalOut trig(PA_10); // D2 PwmOut servo(PB_5); // D4 PwmIn LidarI(PB_3); // D3 InterruptIn bouton(USER_BUTTON); ///////////////////////////////////////////////// void arret(){ sleep(); } ////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// void Mesure(float *pmes){ float moy=0.0f,tmp = 0.0f; int i=0; for(i=0;i<=9;i++){ tmp=LidarI.pulsewidth() / 10; //Moyenne de dix mesures stocké dans "moy" pour le calcul moy+=tmp; } wait_ms(40); //Laisser le moteur arriver à sa position trig = 1; trig=0; // Déclenchement wait_ms(10); //Attendre que le signal du LIDAR soit clair pour le microcontroleur et pas parasité par le front descendant du déclenchement *pmes = moy/10; //Lecture du signal et enregistrement dans la variable "mes" (en µs) trig = 1; //Stop de la prise de mesure // pc.printf("Mesure prise : %f \n",*pmes); //Affichage de la mesure prise (mesure de la distance en cm) } ////////////////////////////////////////////////////////////////////////////////// // Cette fonction permet de convertir des degrés d'angles en radians afin d'utiliser une valeur avec la fonction cosinus /////////////////////////////////////////////////////////////////////////////// float conversion_deg_rad (int in){ return in*0.017453292519943f; } ////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// int aireSegment (float t[],int angle,int i){ float a=t[i],b=t[i-1],c=0.0f; float tmp=0.0f,ret=0.0f,s=0.0f; tmp =(a*a)+(b*b)-(2.0f*a*b*cos(conversion_deg_rad(angle))); c = sqrt(tmp); s = (a+b+c)/2; // Shift vers la droite de 1 pour la division par 2 // Autre formule intéressante : s=1/4 sqrt((a+(b+c))*(c-(a-b))*(c+(a-b))*(a+(c-b))) // Cette formule est plus stable lorsque l'un des cotes est très petit // Utiliser de telle manière que a>b>c ret = sqrt(s*(s-a)*(s-b)*(s-c)); //pc.printf("aire segment : %f \n", ret); //TEST!!! return ret; } //////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// void programme(){ // Déclarations des variables float mes = 0; //Variable qui contient les mesures float *pmes = &mes; //Pointeur qui permettra d'accéder à la variable mesure en dehors du sous programme principale "main" float aireTotale = 0, angle=0.01f,A = 0.8f; // "aireTotale" permet de récupérer la valeur recherchée, on y ajoute l'aire de chaque segments à chaque calcul de ceux-ci // "Angle" de chaque rotation du moteur entre chaque prises de mesure (en degrés d'angle !!!) // "A" un flottant qui permet de controler le servomoteur (en millisecondes !!!) // ( 1.0 fonctionnel mais ne va pas jusqu'a 0° pour le moteur // 0.8 ne marche pas avec les autres fonctions mais permet de positionner le moteur à son maximum) // "angle_parcouru" indique en degré d'angle l'angle parcouru par le moteur depuis le lancement du programme int i = 0,nbMes = 1.4f/angle, angle_degree = 1, pourcent = 0; // "i" sert d'index dans le tableau dans lequel on stock les mesures // "nbMes" correspond au nombre de mesure qui seront effectuées float tabM[nbMes]; // "tabM" Un tableau dans lequel sera enregistré les mesures effectuées bouton.rise(&arret); // Pour arreter le programme en appuyant sur le bouton bleu //pc.printf("\nLancement du programme...\n"); BT.printf("*A\n\nLancement du programme...\n*"); trig = 1; // "trig" à 1 --> LIDAR attend que "trig" passe à 0 pour prendre des mesures en somme il est en "standby" servo.pulsewidth_us(A*1000); // On fixe le servomoteur à son angle minimum Mesure(pmes); // Lancement de la fonction qui prend une mesure et qui inscrit dans "mes" lavaleur de la mesure effectuée tabM[i]=mes; // La mesure est enregistrée dans le tableau des mesures i++; // L'index du tableau augment donc d'un wait(1); for(A = 0.8f; A <= 2.2f ; A += angle){ pourcent = (int) (i*100)/nbMes; BT.printf("*T%d*",pourcent); //if(pourcent==0){ // Mettre les couleurs dans les printf // BT.printf("*L*"); //} else if (){ // BT.printf("*L*"); //} else if (){ // BT.printf("*L*"); //} servo.pulsewidth_us(A*1000); // Positionnement du Moteur à sa position minimum Mesure(pmes); // Effectue une mesure et la stocke dans la variable "mes" tabM[i]=mes; // Stock la valeur contenu dans la varaible "mes" dans le tableau aireTotale += aireSegment(tabM, angle_degree, i); //Calcul de l'aire de chaque segment et de l'aire totale i++; // incrémentation de l'index du tableau des mesures wait(0.01); } servo.pulsewidth(0); i=0; // Reinitialisation de i pour pouvoir le reutiliser while(i<nbMes){ // Affichage des mesures //pc.printf("M(%d):[%f]\n",i,tabM[i]); //BT.printf("*AM(%d):[%f]\n*",i ,tabM[i]); i=i++; } //pc.printf("\n Aire totale : %f \n", aireTotale); BT.printf("*A\n Aire totale : %f \n*", aireTotale); //pc.printf("\n Pour une piece rectangle : %f \n", aireTotale*1.285); //BT.printf("*A\n Pour une piece rectangle : %f \n*", aireTotale*1.285); // pc.printf("\nArret du programme..."); BT.printf("*A\nArret du programme...*"); } ////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// int main(void) { char m; while(1) { if(BT.readable()){ m = BT.getc(); if(m == '*'){ m = BT.getc(); if(m == 'l'){ //pc.printf("Un paquet lancement\n"); //BT.printf("*AUn paquet lancement\n*"); programme(); } } } } } //////////////////////////////////////////////////////////////////////////////////////