Compte tours, temps, vitesse par mini PC Raspberry


Message

tm68780
Jeune Padawan sloteur

Voir plus


Date du message : samedi 14 mars 2020 à 20h58


Bonsoir,

J'ai mis en route un système basé sur un mini PC "Raspberry" pour compter les tours de circuit, afficher les temps, classements ...
Le système fonctionne mais je souhaite le faire évoluer et je recherche des compétences et des conseils.
Comme je débute dans le slot je n'ai aucune idée des fonctionnalités des systèmes existants et disponibles dans le commerce.

Merci d'avance pour vos remarques

Thierry

Message

noscollections
Jeune Padawan sloteur

Voir plus


Date du message : mercredi 13 mai 2020 à 15h46


Bonjour,

J'aimerai bien savoir ce que tu utilise sur ton raspberry pour le SLOT.
Tu as installé un truc tout fait ou tu as développé quelque chose ?

Message

tm68780
Jeune Padawan sloteur

Voir plus


Date du message : mercredi 13 mai 2020 à 16h29


Bonjour,

j'ai commencé un programme qui pour l'instant comptabilise les tours et chronomètre les passages.
Le tout affiché sur écran PC connecté au Raspberry.
Au niveau matériel j'ai acheté une barrière infra-rouge utilisée habituellement pour les trains électriques.
Cette dernière est connectée sur une entrée GPIO du raspberry.

Message

noscollections
Jeune Padawan sloteur

Voir plus


Date du message : vendredi 15 mai 2020 à 17h01


Moi sur le raspberry pi (RPI), j'ai fais un programme en Python.
Aussi sur un GPIO, j'ai un capteur infrarouge.
Je compte les tours et récupère les temps.

Pour la visualisation, le Raspberry sert à rien, même si il peut aussi s'en charger.
On accès au RPI en http (une page web), du coup on peu afficher les infos sur un PC, un téléphone, une tablette, tout ce qui affiche du web !
On peu afficher les temps, des graphs avec les temps au tour ou cumulé.
Afficher qu'un joueur ou une synthèse de plusieurs. Ca fait longtemps que j'ai pas utilisé mon proto !
J'ai du me faire une doc à l'époque. Il y avait encore quelques bugs, mais y'avait une bonne base.

Message

tm68780
Jeune Padawan sloteur

Voir plus


Date du message : mardi 22 septembre 2020 à 16h12


Bonjour,

Désolé j'ai mis du temps à répondre, je n'avais plus de temps à moi.

Apparemment on a fait à peu près la même chose.
Par contre j'ai eu un soucis de temps de traitement. Lorsque les voitures passent les barrières presque en même temps, 1 seule impulsion sur les entrées GPIO est prise en compte.

Message

tieum357
Sloteur Fou

Voir plus


Date du message : mardi 22 septembre 2020 à 20h33


tm68780 a écrit :

Bonjour,

Désolé j'ai mis du temps à répondre, je n'avais plus de temps à moi.

Apparemment on a fait à peu près la même chose.
Par contre j'ai eu un soucis de temps de traitement. Lorsque les voitures passent les barrières presque en même temps, 1 seule impulsion sur les entrées GPIO est prise en compte.

Salut c'est intéressant vos projets les gars. Ton code est en quoi ? python ?
Pour ton impulsion manquée quand les passages sont très rapprochés, tu n'as pas un sleep quelque part, qui te ferait perdre toute info plus rapide ?
Ou tu utilises des interrupts ?

Message

tm68780
Jeune Padawan sloteur

Voir plus


Date du message : mardi 22 septembre 2020 à 20h51


Bonsoir,

oui c'est du python

Oui effectivement il y a un sleep dans la procédure de calcul du temps au tour

def calculTempsTour():
global lasttime

z=time.time()
dt = z -lasttime
lasttime = z
tiTuple=time.gmtime(dt)
reste=dt-tiTuple[3]*3600.0-tiTuple[4]*60.0-tiTuple[5]*1.0
resteS=("%.2f" % reste )[-2::]
tt=time.strftime("%H:%M:%S", tiTuple)+","+resteS
time.sleep(0.2) #Attente en seconde

Et sinon il y a ça dans le main:

fen1.after(50,afficheChrono) # => boucler, après 50 millisecondes
return(tt)

Message

tm68780
Jeune Padawan sloteur

Voir plus


Date du message : mardi 22 septembre 2020 à 20h53


erreur de copie

def calculTempsTour():
global lasttime

z=time.time()
dt = z -lasttime
lasttime = z
tiTuple=time.gmtime(dt)
reste=dt-tiTuple[3]*3600.0-tiTuple[4]*60.0-tiTuple[5]*1.0
resteS=("%.2f" % reste )[-2::]
tt=time.strftime("%H:%M:%S", tiTuple)+","+resteS
time.sleep(0.2) #Attente en seconde
return(tt)

dans le main:

fen1.after(50,afficheChrono) # => boucler, après 50 millisecondes

Message

tieum357
Sloteur Fou

Voir plus


Date du message : mercredi 23 septembre 2020 à 09h45


salut,
quel est le but du sleep de 0.2s dans ta fonction 'calculTempsTour' ?

Si je ne m'abuse, en multithread tu bloques juste cette fonction, par contre en monothread tu bloques la fonction et tout le reste du process.
Mais des experts te répondront surement mieux que moi.

Message

tm68780
Jeune Padawan sloteur

Voir plus


Date du message : mercredi 23 septembre 2020 à 11h13


Salut

Le but du sleep, malgré qu'il n'est pas placé au bon endroit est d'éviter de scruter l'entrée GPIO 2 fois.
Mais je pense que je dois utiliser le threading...

Message

tieum357
Sloteur Fou

Voir plus


Date du message : mercredi 23 septembre 2020 à 12h30


tu interroges l'entrée à la demande, ou tu utilises des événements sur son changement d'état ?

Message

tm68780
Jeune Padawan sloteur

Voir plus


Date du message : mercredi 23 septembre 2020 à 13h41


Non j'attends l'événement

def calculTempsTour():
global lasttime

z=time.time()
dt = z -lasttime
lasttime = z
tiTuple=time.gmtime(dt)
reste=dt-tiTuple[3]*3600.0-tiTuple[4]*60.0-tiTuple[5]*1.0
resteS=("%.2f" % reste )[-2::]
tt=time.strftime("%H:%M:%S", tiTuple)+","+resteS
time.sleep(0.2) #Attente en seconde
return(tt)

def attentePassage():
while True:
if GPIO.input(button1)==0:
#time.sleep(0.2) #Attente en seconde
return(1) #renvoi numPiste = 1

if GPIO.input(button2)==0:
#time.sleep(0.2) #Attente en seconde
return(2) #renvoi numPiste = 2

Dans le main:
if nbrTour1 < nbrTotalTours and nbrTour2 < nbrTotalTours:
if attentePassage() == 1:
texte1 = pilote1
lasttime = lasttime1
texte4 = calculTempsTour()

Message

tieum357
Sloteur Fou

Voir plus


Date du message : jeudi 24 septembre 2020 à 10h03


salut,
plutôt qu'une boucle infinie, je penses que tu pourrais utiliser les interrupts gpio, en gros plutot que tester toit même, tu seras notifié lors d'un changement d'état.
c'est ce que je ferais, mais ne suis pas un expert.

regarde ici quelques infos : https://roboticsbackend.com/raspberry-pi-gpio-inte

Message

tm68780
Jeune Padawan sloteur

Voir plus


Date du message : jeudi 24 septembre 2020 à 10h49


Merci pour l'information.
Je vais essayer d'étudier ça.

Message

tm68780
Jeune Padawan sloteur

Voir plus


Date du message : jeudi 24 septembre 2020 à 20h46


Salut

Je viens de tester le traitement des interruptions :-(

ça ne change pas grand chose, lors du traitement d'une interruption je ne peux pas en traiter une autre.
Comme je disais précédemment (et c'est aussi dit dans les exemples du lien) je dois passer par des threads et là ça devient compliqué.

Message

tieum357
Sloteur Fou

Voir plus


Date du message : samedi 26 septembre 2020 à 08h56


C'est ça qui est génial avec ce genre de choses, c'est qu'on apprends tout le temps, qu'on ne cesse de changer et d'améliorer pour résoudre les soucis.
Par curiosité le détecteur se présente sous quelle forme ? Tu as une même entrée gpio pour les deux pistes ou une pour chaque ?
Edit : question bête réponse dans le code plus haut

Message modifié le samedi 26 septembre 2020 à 09h40 par tieum357

Message

tm68780
Jeune Padawan sloteur

Voir plus


Date du message : samedi 26 septembre 2020 à 09h05


1 détecteur et une entrée par piste.

Message

noscollections
Jeune Padawan sloteur

Voir plus


Date du message : mercredi 11 novembre 2020 à 08h13


Bonjour à tous,

La discussion a continué sans moi, je pensais avoir des notifications !

Bon alors voici quelques infos concernant mes travaux sur le sujet.

De mon coté chaque capteur j'utilise la fonction : GPIO.add_event_detect(Pin_radar_1, GPIO.RISING, m1_step_2, bouncetime=cfg_bouncetime)

Ca exécute une fonction uniquement quand l'événement se produit, avec le bouncetime ca évite aussi des mauvaises surprises de rebonds.

Utilisant des capteurs de proximités, mon projet ne fonctionne que pour une voie et est destiné a des tests. Je ne fait pas la différence entre la voie 1et 2.
Mais ca a l'avantage d'être facile a mettre en œuvre. Et fonctionne sur tout les circuits, on pose le système le long de la piste.
J'ai fait un script de gestion de course mais avec la détection fiable que sur une voie, je ne l'utilise pas. (J'ai une nouvelle idée pour la détection on verra cela dans plusieurs semaines).
Donc j'ai une procédure de test :
Quelques infos de la 1ere version ici : https://noscollections.ddns.net/carrerago/?p=908

Objectif, définir des valeurs comme l'accélération, la vitesse max.
Tests des 1m : temps pour faire 1m départ arrêté et vitesse mesuré à 1m
Un relais est mis entre la piste et la manette branché sur le turbo.
2 capteurs infrarouges sont 1m après le départ, les 2 capteurs sont espacé de 6-8 cm.

Sur le raspbérry je déclenche le test avec un bouton sur l'interface graphique de python.
Je note le temps, déclenche le relais, la voiture démarre a fond.
A 1m, je note le temps, au passage des 2 capteurs. et je coupe le relais pour que la voiture s'arrête.

Avec les temps, un petit calcul et j'ai le temps pour faire 1m. Et la vitesse a 1m.
J'enregistre les données dans un fichier CSV, et je fais pleins de tests sur toutes les voitures.
J'ai ainsi les caractéristiques de mes voitures.

Couplé avec un peu de code et un serveur web sous python, j'ai ca sur mon ordinateur :

J'ai un autre test, le départ lancé pour avoir la vitesse max. Je contrôle la voiture a la manette, je passe un virage au plus vite, un capteur en fin de virage déclenche le turbo, en fin de ligne droite (assez longue), j'ai mes 2 capteurs qui mesure la vitesse.

Fort de ces premiers tests il y a quelques mois, cet été j'ai fait une version plus évoluée.
1er tests sur piste First : https://noscollections.ddns.net/carrerago/?p=2755
Sur voitures GO : https://noscollections.ddns.net/carrerago/?p=2770

Le principe est identique sauf que j'ai 8 capteurs répartis sur 1m.
Ainsi j'ai une courbe d'accélération.
J'ai aussi noté la distance d'arrêt après 1m. Les gaz sont coupés à 1m, et la voiture met plus ou moins de temps pour s'arrêter. Je a mesure et la note manuellement. Avec un calcul j'ai la décélération.

--------------------------------
Concernant le multithread
--------------------------------

De base pour le nombre de tours avec add_event_detect pas besoin de multithread

Par contre moi je l'utilise pour le serveur web, chacun son thread. Un pour le serveur, un autre pour la détection.
Le serveur web permet d'avoir les données en live avec une page web. Avantage, ca fonctionne sur PC, téléphone tablette, télé connectée

Message

noscollections
Jeune Padawan sloteur

Voir plus


Date du message : mercredi 11 novembre 2020 à 08h16


Le script de gestion de course que j'avais fait en attendant de trouver une solution de détection sur 2 voies (fiable) ressemble à cela dans un navigateur web :

J'ai une petite vidéo de certains de mes tests :

Message modifié le mercredi 11 novembre 2020 à 08h42 par noscollections

Surveiller Imprimer