Outils pour utilisateurs

Outils du site


projet_europ

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
projet_europ [2024/06/13 22:02] – Mushussuprojet_europ [2024/12/14 21:34] (Version actuelle) – [Démarrage automatique] Mushussu
Ligne 1: Ligne 1:
-====== Projet initié par Europ ======+====== Vélos interactifs ======
  
 [[https://github.com/woutgg/ofxGenericDmx/blob/master/ofxGenericDmx_RawDmxExample/src/ofApp.cpp|Gestion du DMX]] [[https://github.com/woutgg/ofxGenericDmx/blob/master/ofxGenericDmx_RawDmxExample/src/ofApp.cpp|Gestion du DMX]]
  
-Pour Utiliser le boîtier Enttec sous Linux, il faut autoriser l'utilisateur principal à accéder au port USB. 
-Il faut saisir dans un terminal la commande suivante : 
-  sudo nano /etc/udev/rules.d/11-usbuser. 
  
-Puis, il faut écrire à l'intérieur la règle +===== Installation du driver FTDI ===== 
-  rulesACTION=="add", SUBSYSTEMS=="usb", GROUP:="usbuser", MODE:="0666"+Tous les boîtiers ENTTEC utilisent une puce FTDI pour la communications à travers le port USB. Voici la [[https://www.youtube.com/watch?v=jynlynjOOek|procédure]] pour l'installer sur une RPI4 : 
 +  wget https://ftdichip.com/wp-content/uploads/2022/07/libftd2xx-arm-v8-1.4.27.tgz 
 +  tar -xvf libftd2xx-arm-v8-1.4.27.tgz 
 +  sudo cp release/build/lib* /usr/local/lib 
 +  cd /usr/local/lib 
 +  ls 
 +  sudo ln -s libftd2xx.so.1.4.27 libftd2xx.so 
 +  sudo chmod 0755 libftd2xx.so.1.4.27 
 +   
 +Brancher le boîtier ENTTEC 
 +  sudo rmmod ftdi_sio 
 +  sudo rmmod usbserial 
 +  cd 
 +  cd release/examples 
 +  make 
 +  cd EEPROM/read 
 +  ls 
 +  sudo ./read 
 +===== Installation du addon ofxGenericDmx ===== 
 +Installation de la librairie ftdi : 
 +  sudo apt-get install libftdi-dev
  
-Sauvegarde le tout avec le raccourci Ctrl + X ; et reboote le PC.+Pour certaines distributions, il pourrait être nécessaire d'autoriser l'utilisateur à accéder à l'interface via son port USB. Des solutions diverses sont détaillées [[https://getdlight.com/wiki/index.php/Interfaces_DMX#Linux|ici]]
  
  
-Create the file /etc/udev/rules.d/10-ftdi.rules+  wget https://github.com/woutgg/ofxGenericDmx/archive/refs/heads/master.zip 
 +   
 +  cd openFrameworks/addons/ofxGenericDmx/ofxGenericDmx_EnttecDmxUsbProExample 
 +  make 
 +  startx ./bin/ofxGenericDmx_EnttecDmxUsbProExample -- -s off
  
-Write on it:+Si vous souhaitez partir d'un projet vierge, il faudra ajouter des instructions pour le linker lors de la compilation : 
 +Dans le fichier config.make du projet : 
 +  sudo nano config.make 
 +Vérifiez les lignes suivantes : 
 +  PROJECT_LDFLAGS=-Wl,-rpath=./libs 
 +  PROJECT_LDFLAGS+=-lftdi
  
-SUBSYSTEM=="usb_device", GROUP="dialout", MODE="0664"+===== Code ===== 
 +<code c> 
 +// g++ -Wall -o compteur compteur.c -l wiringPi 
 +// ./compteur
  
-SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GROUP="dialout", MODE="0664"+#include <wiringPi.h> 
 +#include <stdio.h> 
 +#include <stdlib.h>
  
 +#define COMPTEUR 26
 +#define TEMOIN 19
  
 +int drapeau = 0;
  
-https://getdlight.com/wiki/index.php/Interfaces_DMX#Linux+int main() 
 +{ 
 + wiringPiSetupGpio(); 
 +    pinMode (COMPTEUR, INPUT);  
 +    pullUpDnControl(COMPTEUR, PUD_UP); 
 +    pinMode (TEMOIN, OUTPUT);  
 +    digitalWrite(TEMOIN, LOW); 
 +    while(1) { 
 +        if ((digitalRead(COMPTEUR) == LOW) && (drapeau == 0)) { 
 +            digitalWrite(TEMOIN, HIGH); 
 +            delay(20); 
 +            drapeau = 1; 
 +        } 
 +        if (digitalRead(COMPTEUR) == HIGH) { 
 +            drapeau = 0; 
 +        } 
 +    }
  
 + return 0;
 +}</code>
 +
 +=== ofApp.h ===
 +<code cpp>
 +#pragma once
 +
 +#include "ofMain.h"
 +#include "ofxGenericDmx.h"
 +#include "ofUtils.h"
 +#include <wiringPi.h>
 +#include "Compteur.hpp"
 +
 +#define DMX_DATA_LENGTH 513
 +#define TEMOIN1 19
 +#define TEMOIN2 27
 +#define ROUE 2.27
 +
 +class ofApp : public ofBaseApp{
 + public:
 + void setup();
 + void update();
 + void draw();
 +
 + //pointer to our Enntec DMX USB Pro object
 + DmxDevice* dmxInterface_;
 +
 + //our DMX packet (which holds the channel values + 1st byte for the start code)
 + unsigned char dmxData_[DMX_DATA_LENGTH];
 +
 + // Compteurs
 + Compteur compteur1;
 + Compteur compteur2;
 +
 + ofTrueTypeFont myfont;
 +};
 +
 +</code>
 +=== ofApp.cpp ===
 +<code cpp>
 +#include <stdlib.h>
 +#include "ofApp.h"
 +
 +//--------------------------------------------------------------
 +void ofApp::setup(){
 + ofSetFrameRate( 44 );
 +
 + //zero our DMX value array
 + memset( dmxData_, 0, DMX_DATA_LENGTH );
 +
 + //open the device
 + dmxInterface_ = ofxGenericDmx::openFirstDevice();
 + if ( dmxInterface_ == 0 ) printf( "No Enttec Device Found\n" );
 + else printf( "isOpen: %i\n", dmxInterface_->isOpen() );
 +
 + //frames = 0;
 +
 + printf("ofxGenericDmx addon version: %s.%s\n", ofxGenericDmx::VERSION_MAJOR, ofxGenericDmx::VERSION_MINOR);
 +
 + // Initialisation valeurs
 + compteur1.set(TEMOIN1, ROUE, ofGetCurrentTime().getAsMilliseconds());
 + compteur2.set(TEMOIN2, ROUE, ofGetCurrentTime().getAsMilliseconds());
 +
 + // Affichage
 + myfont.load("arial.ttf", 32);
 +
 + // WiringPi
 + wiringPiSetupGpio();
 +}
 +
 +//--------------------------------------------------------------
 +void ofApp::update(){
 + dmxData_[401] = 80;
 + dmxData_[402] = 160;
 + dmxData_[403] = 255;
 +
 + //force first byte to zero (it is not a channel but DMX type info - start code)
 + dmxData_[0] = 0;
 +
 + if ( ! dmxInterface_ || ! dmxInterface_->isOpen() ) {
 + printf( "Not updating, enttec device is not open.\n");
 + }
 + else{
 + //send the data to the dmx interface
 + dmxInterface_->writeDmx( dmxData_, DMX_DATA_LENGTH );
 + }
 + compteur1.mettreAJour();
 + compteur2.mettreAJour();
 +}
 +
 +//--------------------------------------------------------------
 +void ofApp::draw(){
 + ofBackground(0x21, 0X80, 0XC3);
 + compteur1.afficher(0, 0, myfont);
 + compteur2.afficher(640, 0, myfont);
 +}
 +</code>
 +=== Compteur.hpp ===
 +<code cpp>
 +#include "ofUtils.h"
 +#include "ofGraphics.h"
 +#include "ofTrueTypeFont.h"
 +#include <wiringPi.h>
 +
 +class Compteur
 +{
 +public:
 + // Constructeur
 + Compteur();
 +
 + void set(uint8_t _pinTemoin, float _roue, uint64_t _tempsDepart);
 +
 + //Accesseurs et mutateurs
 + //void setX(int x);
 + //void setY(int y);
 + //int getX() const;
 + //int getY() const;
 +
 + // Autres méthodes
 + void afficher(int x, int y, ofTrueTypeFont police);
 + void mettreAJour();
 +
 +private: 
 + int x, y;
 + int pinTemoin;
 + float roue;
 + int compteur;
 + uint64_t temps, tempsDepart;
 + uint16_t distance;
 + float vitesseIntantanee;
 + float vitesseMax;
 + ofTrueTypeFont policeVitesse, policeDistance, policeLabel;
 +};
 +</code>
 +=== Compteur.cpp ===
 +<code cpp>
 +#include "Compteur.hpp"
 +
 +//--------------------------------------------------------------
 +Compteur::Compteur()
 +{
 + compteur = 0;
 + temps = 0;
 + vitesseIntantanee = 0.0;
 + vitesseMax = 0.0;
 + policeVitesse.load("AUDIMRG_.TTF", 12);
 + policeDistance.load("arial.ttf", 50);
 + policeLabel.load("arial.ttf", 20);
 + distance = 0;
 +}
 +
 +//--------------------------------------------------------------
 +void Compteur::afficher(int x, int y, ofTrueTypeFont police)
 +{
 + ofPushMatrix();
 + ofTranslate(x, y);
 + ofSetCircleResolution(100);
 + ofSetLineWidth(3);
 + // Dessin du compteur
 + ofPushMatrix();
 + ofTranslate(150, 800);
 + // Aiguille de la vitesse Max
 + ofSetColor(255, 0, 0);
 + ofFill();
 + ofPushMatrix();
 + ofRotateDeg(60 + vitesseMax * 4);
 + ofDrawTriangle(-6, 0, 0, 90, 6, 0);
 + ofPopMatrix();
 + // Aiguille de la vitesse  instantanée
 + ofSetColor(0, 0, 0);
 + ofPushMatrix();
 + ofRotateDeg(60 + vitesseIntantanee * 4);
 + ofDrawTriangle(-6, 0, 0, 90, 6, 0);
 + ofPopMatrix();
 + // Dessin du cadran
 + ofSetColor(255, 255, 255);
 +    ofFill();
 + ofDrawCircle(0,0,20);
 + ofSetColor(0,0,0);
 + ofNoFill();
 + ofDrawCircle(0,0,100);
 + ofDrawCircle(0,0,20);
 + char nombre[3];
 + for (int i = 0; i < 61; i += 5) {
 + ofPushMatrix();
 + ofRotateDeg(4 * i - 120);
 + sprintf(nombre, "%i", i);
 + policeVitesse.drawString(nombre, -policeVitesse.stringWidth(nombre) / 2, -115);
 + ofDrawLine(0, -100, 0, -110);
 + ofPopMatrix();
 + }
 + ofSetColor(0, 0, 0);
 + char labelCompteur[255];
 + sprintf(labelCompteur, "Vitesse max.");
 + policeLabel.drawString(labelCompteur, -policeLabel.stringWidth(labelCompteur) / 2, 130);
 + ofPopMatrix();
 + // Affichage de la distance
 + ofPushMatrix();
 + ofTranslate(320, 750);
 + ofSetColor(0, 0, 0);
 +    ofFill();
 + ofDrawRectangle(00, 00, 300, 100);
 + ofSetColor(255, 255, 255);
 + char ligneDistance[255];
 + sprintf(ligneDistance, "%i m", distance);
 + policeDistance.drawString(ligneDistance,  290 - policeDistance.stringWidth(ligneDistance), 75);
 + ofSetColor(0, 0, 0);
 + char labelDistance[255];
 + sprintf(labelDistance, "Distance parcourue");
 + policeLabel.drawString(labelDistance, 20, 180);
 + ofPopMatrix();
 + ofPopMatrix();
 +}
 +
 +//--------------------------------------------------------------
 +void Compteur::mettreAJour() {
 + if (digitalRead(pinTemoin) == 1) {
 + digitalWrite(pinTemoin, 0);
 + compteur++;
 + uint64_t tempsCourant = ofGetCurrentTime().getAsMilliseconds();
 + vitesseIntantanee = (3.6 * 1000 * roue) / (tempsCourant - temps);
 + if (vitesseMax < vitesseIntantanee) {
 + vitesseMax = vitesseIntantanee;
 + }
 + temps = tempsCourant;
 + }
 + // Mise à zéro de la vitesse si la roue est arrêtée
 + if ((ofGetCurrentTime().getAsMilliseconds() - temps) > 6000) {
 + vitesseIntantanee = 0;
 + }
 + distance = (int)(roue * compteur);
 +}
 +
 +//--------------------------------------------------------------
 +void Compteur::set(uint8_t _pinTemoin, float _roue, uint64_t _tempsDepart)
 +{
 + pinTemoin = _pinTemoin;
 + roue = _roue;
 + tempsDepart = _tempsDepart;
 +}
 +</code>
 +
 +===== Démarrage automatique =====
 +  sudo nano /etc/systemd/system/compteur.service
 +
 +  [Unit]
 +  Description=Met en route le compteur des vélos
 +  
 +  [Service]
 +  Type=simple
 +  WorkingDirectory=/home/pi/openFrameworks/apps/myApps/velosInteractifs/
 +  ExecStart=/home/pi/openFrameworks/apps/myApps/velosInteractifs/./compteur
 +  Restart=on-failure
 +  RestartSec=1
 +  User=pi
 +  Group=pi
 +  
 +  [Install]
 +  WantedBy=multi-user.target
 +
 +  sudo systemctl enable compteur.service
 +
 +  sudo systemctl status compteur.service
 +Construction d'un autre service pour la course :
 +
 +  sudo nano /etc/rc.local
 +Ajouter avant la ligne exit 0
 +  startx ./home/pi/openFrameworks/apps/myApps/velosInteractifs/bin/velosInteractifs -- -s off &
 +Il faut aussi désactiver les sorties audio par l'HDMI. Ajouter ,noaudio à la fin de la ligne dtoverlay=vc4-kms-v3d dans le fichier /boot/firmware/config.txt :
 +  sudo nano /boot/firmware/config.txt
 +  dtoverlay=vc4-kms-v3d,noaudio
 +
 +{{tag>raspberry_pi sylvain OpenFrameworks}}
projet_europ.1718316179.txt.gz · Dernière modification : de Mushussu