Comment créer un inclinomètre à l’aide d’un Raspberry Pi et d’un IMU

Comment créer un inclinomètre à l'aide d'un Raspberry Pi et d'un IMU
YouTube video

Ce guide explique comment utiliser une unité de mesure inertielle (IMU) avec un Raspberry Pi pour créer un inclinomètre, tout comme le type que vous trouverez dans un 4×4.

Une condition préalable à ce guide est d’avoir un gyroscope et un accéléromètre d’un IMU déjà opérationnel sur votre Raspberry Pi. Un guide pour interfacer un IMU avec un Raspberry Pi peut être trouvé ici.

Nous allons couvrir quelques bases SDL qui sera utilisé pour produire nos graphiques.

L’IMU utilisé dans ce guide est le BerryIMU. Cependant, d’autres IMU ou accéléromètres et gyroscopes peuvent être utilisés. Pololu MinIMU, Adafruit IMU et IMU Sparkfun

Dépôt Git ici
Le code peut être extrait sur votre Raspberry Pi avec ;

pi@raspberrypi ~ $ git clone https://github.com/ozzmaker/BerryIMU.git

Le code de ce guide se trouve sous le gyro_accelerometer_tutorial02_inclinometer annuaire.

Accéléromètre gyroscope BerryIMU Raspberry Pi

Installation de SDL

pi@raspberrypi ~ $ sudo apt-get install libsdl1.2-dev libsdl-image1.2-dev libsdl-gfx1.2-dev libi2c-dev

Si vous souhaitez tester pour voir si SDL est correctement installé, vous pouvez créer un fichier appelé test.c et copier le code ci-dessous ;

#include <SDL/SDL.h>

int main(int argc, char** argv) {
        SDL_Init(SDL_INIT_EVERYTHING);
        SDL_Surface *screen;

        screen = SDL_SetVideoMode( 480, 320, 16, SDL_SWSURFACE );
        SDL_Rect rect;
        rect.x = 10;
        rect.y = 10;
        rect.w = 20;
        rect.h = 20;

        Uint32 color = SDL_MapRGB(screen->format, 0xff,0xff,0xff);
        Uint32 color2 = SDL_MapRGB(screen->format, 0,0,0);
        SDL_FillRect(screen, &rect, color);
        SDL_Flip(screen);
        getchar();

        SDL_Quit();
        return 0;
}

Le code ci-dessus peut être compilé avec ;

pi@raspberrypi ~ $ gcc -o test test.c `sdl-config –cflags` `sdl-config –libs`

Et pour exécuter le programme ;

pi@raspberrypi ~ $ sudo ./test

Vous devriez voir votre écran devenir blanc ou un carré blanc devrait être affiché.

Nous allons ajouter au code qui a déjà été créé dans le Guide pour interfacer un gyroscope et un accéléromètre avec un guide Raspberry Pi.

Comme nous utilisons SDL, nous devrons inclure les fichiers d’en-tête SDL dans notre programme ;

#include "SDL.h"
#include "SDL/SDL_image.h"

Lorsque vous utilisez SDL, vous devez d’abord initialiser SDL et configurer vos surfaces avant de pouvoir commencer à afficher des informations à l’écran. La section suivante montre comment cela est fait.

Les deux lignes ci-dessous initialisent SDL et le configurent pour qu’il n’affiche pas de curseur ;

        SDL_Init(SDL_INIT_VIDEO);
        SDL_ShowCursor(SDL_DISABLE);

Nous utilisons ensuite la fonction SDL_GetVideoInfo() pour obtenir des informations sur notre affichage. Par exemple, résolution et bits par pixel, etc. Ceci est stocké dans la structure ‘videoinfo’. Pour voir quelle hauteur a été retournée, nous utiliserions ‘videoInfo->current_h’

Nous utilisons ensuite ces informations pour créer notre écran, en utilisant la fonction SDL_SetVideoMode(). Cette fonction a besoin de ces paramètres, résolution X, résolution Y, bits par pixel et type de surface d’affichage. Dans le code ci-dessous, nous utilisons une surface logicielle pour le type d’affichage.

        videoInfo = SDL_GetVideoInfo();

        screen = SDL_SetVideoMode(videoInfo->current_w, videoInfo->current_h, videoInfo->vfmt->BitsPerPixel, SDL_SWSURFACE );
        if ( screen == NULL ) {
                fprintf(stderr, "Unable to setvideo: %sn", SDL_GetError());
                exit(1);
        }

Une fois que nous avons configuré SDL, nous pouvons commencer à charger nos images.

        inclinometerOverlay =  IMG_Load("inclinometerOverlay.png");
                if (inclinometerOverlay == NULL){
                         printf("error loading Overlay imagen");
                        SDL_Quit();
                        exit(1);
                }

Après avoir chargé l’image, qui est un PNG, nous devons la convertir au bon format afin qu’elle conserve sa transparence

         compatibleInclinometerOverlay = SDL_DisplayFormatAlpha(inclinometerOverlay);

Nous allons créer une fonction pour faire pivoter nos images car cela devra être fait à chaque fois que la boucle principale du programme est traitée. Nous allons passer deux paramètres à cette fonction, carRoll (qui est l’angle X) et CarPitch (qui est l’angle Y).

int graphics(float carRoll, float carPitch)

La première tâche que nous voulons faire dans la fonction est d’effacer toutes les informations sur la surface actuelle. Cela peut être fait en utilisant SDL_FillRect() et la valeur 0x000000, qui est noire.

        SDL_FillRect(screen,NULL,0x000000);

La prochaine section de code positionnera correctement les deux images de jeep sur notre surface. La formule pour la position ‘y’ la placera au milieu de la surface.

        inclinometerJeepFrontPosition.x = 30;
        inclinometerJeepFrontPosition.y = (videoInfo->current_h/2)-(compatibleInclinometerJeepFront->h/2);
        inclinometerJeepSidePosition.x = 262;
        inclinometerJeepSidePosition.y = (videoInfo->current_h/2)-(compatibleInclinometerJeepFront->h/2);

Nous pouvons maintenant faire pivoter nos images en fonction de l’angle de l’IMU. Pour ce faire, nous utiliserons la fonction rotozoomSurface(). Nous y passerons nos images de jeep compatibles, les angles de roulis et de tangage, le facteur de zoom (1,0 pour pas de zoom) et le lissage (0 pour pas de lissage).

        rotationInclinometerJeepSide = rotozoomSurface(compatibleInclinometerJeepSide, carPitch, 1.0, 0);
        rotationInclinometerJeepFront = rotozoomSurface(compatibleInclinometerJeepFront, carRoll, 1.0, 0);

Après avoir fait pivoter l’image, nous devons recentrer le point de pivot.

        inclinometerJeepFrontPosition.x -= rotationInclinometerJeepFront->w/2-compatibleInclinometerJeepFront->w/2;
        inclinometerJeepFrontPosition.y -= rotationInclinometerJeepFront->h/2-compatibleInclinometerJeepFront->h/2;
        inclinometerJeepSidePosition.x -= rotationInclinometerJeepSide->w/2-compatibleInclinometerJeepSide->w/2;
        inclinometerJeepSidePosition.y -= rotationInclinometerJeepSide->h/2-compatibleInclinometerJeepSide->h/2;

Nous pouvons maintenant retourner notre surface pour pouvoir la voir sur notre écran

        SDL_Flip(screen);

Et enfin, nous devons libérer nos surfaces pour le prochain appel de la fonction graphic(). Cela évite une fuite de mémoire.

        SDL_FreeSurface(screen);
        SDL_FreeSurface(rotationInclinometerJeepFront);
        SDL_FreeSurface(rotationInclinometerJeepSide);

Vous pouvez maintenant appeler la fonction graphics() depuis votre boucle principale et passer les angles CFangleX & CFangleY

  graphics(CFangleX,CFangleY);

Comme il existe un certain nombre de bibliothèques que nous utilisons pour créer ce programme, nous devons les inclure lors de la compilation. Vous pouvez l’utiliser pour compiler ;

pi@raspberrypi ~ $ gcc -o gyro_accelerometer_tutorial02 -lm gyro_accelerometer_tutorial02.c `sdl-config –cflags` `sdl-config –libs` -lSDL_image -lSDL_gfx

Courir;

pi@raspberrypi ~ $ sudo ./gyro_accelerometer_tutorial02

1625600891 688 Comment creer un inclinometre a laide dun Raspberry Pi et

Si vous utilisez un petit TFT connecté à votre Raspberry Pi, vous pouvez afficher la sortie sur ce TFT comme dans la vidéo ci-dessus.

Pour ce faire, vous devez d’abord spécifier /dev/fb1 comme périphérique framebuffer.

putenv("SDL_FBDEV=/dev/fb1");

La commande ci-dessus doit être placée juste avant SDL_Init();

Vous devrez également augmenter le temps que prend chaque passage de la boucle principale. En effet, l’écriture sur le TFT entraînera des retards dans la boucle et la boucle doit s’exécuter à une heure cohérente pour que le suivi gyroscopique fonctionne. Le soufflet coupé force la boucle principale à prendre au moins 130 ms pour s’exécuter.

#define DT 0.13

        while(mymillis() - startInt < (DT*1000))
        {
            usleep(100);
        }

.

  • AUTOUTLET Inclinomètre Numérique Rapporteur 4 * 90 ° Level Box Viseur d'Angle Rétroéclairage Jauge Biseau Jauge Magnétique de Base en/FT MM/M avec Piles Tournevis Manuel d'Utilisation
    🔧 【Largement Utilisé】Inclinomètre fournit une mesure rapide et précise dans le travail du bois, la construction, les machines, les télécommunications, les automobiles, etc.particulièrement facile à mesurer le terrain de l'hélicoptère, angle de biseau de la scie à onglets, d'essai et de réparation automobile et ainsi de suite 📐 【Léger et Facile à Utiliser】Grand écran de LCD numérique avec rétro-éclairage, peut être utilisé facilement même dans des environnements à faible luminosité; Petit et léger, il est vraiment facile à porter et utiliser 🎈【Base Magnétique Puissante】Puissants aimants intégré à la base sécurise le système d'attache à n'Importe quelle surface de fer, egalement étanche IP54 📌 【Spécification】Plage de mesure: 4 * 90 ° (0-360 °), précision : /-0,1 ° à 0 et 90 ° et 0,2 ° le reste, 0,05 ° de Résolution 🍀 【Autres Fonctionnalités Utiles et Accessoires Complets】 Fonction de rétention des données, fonction d'arrêt automatique, fonction de remise à zéro, invite de faible puissance et fonction d'étalonnage; Le paquet contient 2 piles AAA, un mini tournevis (un tournevis est nécessaire pour ouvrir le couvercle des piles) et un manuel en anglais.
  • Lytool Inclinomètre Numérique,Inclinometre Numerique Magnetique,2 * 180 °,Numérique Électronique d'Angle Numérique,Affichage LED,Inclinometre Numerique pour Menuiserie, Bâtiment, Automobile
    Lytool Inclinomètre numérique,Inclinometre Numerique Magnetique,2 * 180 °,Numérique Électronique d'Angle Numérique,Affichage LED,pour Menuiserie, Bâtiment, Automobile La base magnétique intégrée peut être fermement fixée sur n'importe quelle surface métallique pour une mesure et une coupe précises, ce qui facilite le travail du bois, la construction et d'autres tâches. En particulier, le chercheur d'angle numérique est très approprié pour le réglage de l'angle de la lame des scies à table et des scies à onglets. La précision de l'inclinomètre numérique est de 0,2°, la plage de mesure est de 2 * 180 ° et l'unité d'affichage est uniquement DEGREE. La lecture peut être rapidement stabilisée et le nombre ne changera pas à plusieurs reprises. Cet rapporteur d'angle rapporteur numerique dispose de 3 boutons de fonction. Appuyez longuement sur "ON / OFF" pour allumer ou éteindre l'appareil. Appuyez sur la touche "HOLD" pour figer la lecture pour une lecture facile. Appuyez sur la touche "ZERO" pour remettre à zéro, qui est utilisée pour mesurer les angles relatifs. Il s'agit d'une jauge d'angle numérique compacte et portable. Nous vous avons équipé d'un sac en tissu, qui vous permet de le transporter avec vous. L'écran LCD de haute précision avec rétroéclairage vous permet de lire clairement les valeurs, même lorsque vous travaillez dans un environnement à faible éclairage. La batterie est facile à installer et ne nécessite pas de tournevis. 1 pile AAA est incluse. Il s'éteindra automatiquement s'il n'est pas utilisé pendant 3 minutes, économisant ainsi de l'énergie.
  • Neoteck Mesureur Angle Mesure Digital LCD Goniomètres Numériques Coque Chanfrein Inclinomètre Protractor Imperméable pour Voiture Travail, Bleu
    【Mesureur d’Angle Numérique】Le Mesureur d’Angle Numérique avec une Plage de Mesure de ± 180 ° (0-360 °), Petit et Léger, ce qui le Rend Pratique pour être Utilisé et Conçu pour le Réglage ou le Rontrôle d'Angles Relatifs entre les Surfaces, Fonctionnant également comme Niveau Numérique Réel pour les Points Serrés. 【Affichage LCD】 Les Valeurs peuvent être facilement Lues sur l'Ecran LCD. 【Magnets Intégrés】 Il existe des Aimants Intégrés Puissants sur la Base qui Assurent l'Attachement à toute Surface de Fer. 【Haute Précision】 Il Fournit des Mesures Précises, dont la Précision est de ± 0.2 Degrés. 【Arrêt Automatique】 Il est Alimenté par 2 x LR03 AAA Batterie, qui n'est pas inclus et peut Désactiver Automatiquement après 3 Minutes de Fonctionnement.