Chrono Agility : nouveau

ddaweb

New Member
Je viens d'ajouter un petit bout de code : une temporisation des 2 barrières au repos durant 2 sec. :
else if defaut_barriere=0 and reglage_barriere=1 then '---------- 2 barrieres aux repos apres reglage barriere (s) initialise : NEW
Pensez-vous que cela peut solutionner mon problème ?

Rich (BB code):
chrono:
    do
        led_defaut=allumee : led_status=eteinte
        ;================ Appel des memoires
        if memoires_temps=0 then
            led_status=eteinte
            gosub liste_temps
        end if
        ;================ Choix mode de fonctionnement + commande led
        if choix_sens=UnVersDeux and choix_nbr=deux then
            led_sens=allumee : led_nbr=allumee
            hserout LCD,(254,128,"Mode  :  1 -> 2 ")
            i_start =%00000101 : i_stop =%00000110                'i_ = interruptions
            b_stop=%00000010 : b_all=%00000011                    'b_ = barrieres : fonctionnalites
        else if choix_sens=DeuxVersUn and choix_nbr=deux then
            led_sens=eteinte : led_nbr=allumee
            hserout LCD,(254,128,"Mode  :  2 -> 1 ")
            i_start =%00000110 : i_stop =%00000101                'i_ = interruptions
            b_stop=%00000001 : b_all=%00000011                    'b_ = barrieres : fonctionnalites
        else if choix_sens=UnVersDeux and choix_nbr=une then
            led_sens=allumee : led_nbr=eteinte
            hserout LCD,(254,128,"Mode  :  1 seule")
            i_start =%00000101 : i_stop =%00000101                'i_ = interruptions
            b_stop=%00000001 : b_all=%00000001                    'b_ = barrieres : fonctionnalites
        else if choix_sens=DeuxVersUn and choix_nbr=une then
            led_sens=eteinte : led_nbr=eteinte
            hserout LCD,(254,128,"Mode  :  2 seule")
            i_start =%00000110 : i_stop =%00000110                'i_ = interruptions
            b_stop=%00000010 : b_all=%00000010                    'b_ = barrieres : fonctionnalites
        end if
        ;================ Verification barriere(s) utilisee(s) active(s) -> affichage 2me ligne
        do
            defaut_barriere=b_all andnot barrieres
            
            if defaut_barriere>0 then
                    led_status=allumee
                reglage_barriere=1                            '---------- reglage barriers (s) initialise
            end if
        
            if defaut_barriere=%11 then                            '---------- 2 barrieres actives
                  hserout LCD,(254,192,"VERIF BARRIERES ")
                pause 4000
                led_defaut=eteinte : led_status=eteinte
                pause 4000
                led_defaut=allumee : led_status=allumee
            else if defaut_barriere>0 then                        '---------- 1 barriere active
                  hserout LCD,(254,192,"VERIF BARRIERE ", #defaut_barriere)
                if defaut_barriere=1 then
                    pause 4000
                    led_status=eteinte
                    pause 4000
                    led_status=allumee
                else
                      pause 4000
                      led_defaut=eteinte
                      pause 4000
                      led_defaut=allumee
                end if
            else if defaut_barriere=0 and reglage_barriere=1 then            '---------- 2 barrieres aux repos apres reglage barriere (s) initialise : NEW
                timer=0 : val_temps=0
                do
                    pause 2000                                'controle toute les 1/4 sec.
                    val_temps=timer
                    defaut_barriere=b_all andnot barrieres
                    if defaut_barriere>0 then
                        val_temps=210
                    end if
                loop until val_temps>200
            endif
        loop until defaut_barriere=0
        led_defaut=allumee : led_status=eteinte : reglage_barriere=0
        ;================ Affichage dernier temps -> decomposition en ASCII + affichage 2m ligne
        bintoascii val_old1, b1,b2,b3,b4,b5
        hserout LCD,(254,192,"Memoire ",b1,b2,b3,",",b4,b5," s")
        pause 8000
        ;================================ Boucle attente du START ================
        timer=0 : val_temps=0                            'RAZ variables
        
        setint or %00000000,i_start,B                        '---------- interruption : BP Start/Stop ou barriere Start

        do {                                            '---------- boucle attente du START
 

ddaweb

New Member
Je sais maintenant quand et comment ce blocage se produit, je sais le reproduire très facilement.

En fait c'est assez simple : si le START est actif dans un délai très proche du setint, l'interruption n'est pas du tout active, même avec le bouton START/STOP.
Si je fais une action qui réinitialise le chrono sans mettre le START actif, tout refonctionne.
Si le délai avant que l'entrée soit active est suffisamment long (je ne sais pas y mettre un délai< 1 sec.), pas de problème, le chrono démarre d'ailleurs alors : comme s'est programmé !!
Mon délai de 2 sec. du START au repos va diminuer le risque de blocage lors de la mise en place, mais ne le supprime pas complètement.

Je vais tenter de passer d'une interruption soft vers une interruption hard ... j'espère que ce cas de figure disparaîtra.
Si vous avez une solution, je suis évidemment preneur.
 

ddaweb

New Member
Je me sens un peu seul sur le forum :cry:

Je dois maintenant faire un 2me kit de cellules afin de pouvoir utiliser les 2 chronos le même jour (prévisions de concours en 2020, dont peut-être le championnat national).

En cherchant un peu pour des solutions + j'ai vu un chrono ce WE travaillant sur un système de proximité (ou mesure de distance), je suis tombé sur ce capteur IR : https://www.sparkfun.com/datasheets/Sensors/Infrared/gp2y0a02yk_e.pdf (https://www.gotronic.fr/art-capteur-de-mesure-sharp-gp2y0a02yk-11536.htm).
Il existe des capteurs pour des distances plus grandes, mais le prix est en conséquence.

Je vais certainement devoir mettre un µC (picaxe ?) pour gérer plusieurs de ces capteurs sur la hauteur : 2-3 ou plus, si un capteur détecte quelque chose, 2 sorties s'activent (+5v et 0v, une des 2 pour une led, l'autre pour le chrono) ... rien de plus !
Dans mon cas, je ne dois pas faire la mesure de distances, mais juste détecter un objet entre 15 et 1200 mm pour l'Agility ou entre 15 et 1000 mm pour le Hooper (autre discipline) : un swirch pour faire la différence devrait suffire.

L'avantage de ce système : plus d'alignement des cellules avec leur catadioptres et si suffisamment de capteurs, plus de réglage d’ hauteur des cellules.

Je suis ouvert à vos propositions

Edit :
Je suis également tombé sur ceci : https://www.interface-z.fr/pronfiture/sans-contact/174-proximetres-rm.html
 

ddaweb

New Member
Je vais tout de même développer cela pour une autre application (capteur Sharp) : l'allumage d'une lampe à la porte d'entrée à flanc de rue, pas possible de mettre une lampe avec détecteur sans avoir de multiple allumage intempestif quand les gens passent sur le trottoir.
Le fait que c'est un faisceau très directionnel permet de le mettre dans l'ouverture de la porte à hauteur de la serrure par exemple.

Ma première recherche : ce serait d'utiliser la fonction readadc.(?)

Au besoin j'ouvrerai un nouveau fil spécifique.
 

BESQUEUT

Senior Member
Le fait que c'est un faisceau très directionnel permet de le mettre dans l'ouverture de la porte à hauteur de la serrure par exemple.
je ne pense pas que ce genre de capteur soit réellement utilisable perpendiculairement au mouvement. Ca va être très difficile de savoir qu'elle partie du chien a déclenché la barrière, et en en plus ça va changer suivant qu'il passe plutôt à droite ou à gauche...
Pour moi, en chronométrage (hormis les solutions pour le départ arrêté : baguette pour le ski, ou barrière en course hippique) la meilleure solution est la lumière.
Pour réduire la difficulté d'alignement, il suffit d'avoir un champ large en émission. De toutes façons, le faisceau est forcément étroit entre le catadioptre et les cellules de réception.
Un seul catadioptre étroit sur toute la hauteur du jalon, nettement plus haut et plus bas que la première et la dernière cellule. La tolérance angulaire d'un catadioptre est de presque 90°. Autant dire que l'alignement est facile, y compris avec un terrain en pente.

Coté cellule c'est souvent plus délicat parce qu'on tente de compenser la faiblesse d'intensité lumineuse en ajoutant des lentilles, encore plus dans le cas d'un catadioptre parce qu'on double la distance et que la réflexion fait perdre de la puissance.
Du coup la réception devient très directionnelle.
Mais on peut aussi se passer de lentilles en augmentant la puissance d'émission. Dans ce cas il y aura parasitage entre les différentes cellules si on s'y prends mal.
Pour moi, il ne faut activer qu'un seul couple émetteur/récepteur à la fois, et donc lire successivement les différents "rayons" de façon suffisamment rapide pour que ça paraisse simultané. A presque 300 000 km/s ce n'est pas la réactivité de la lumière qui risque de poser problème.

Pour 4 rayons et un chronométrage au 1/100, il faut à minima lire 400 rayons par seconde.

Au besoin j'ouvrerai un nouveau fil spécifique.
Ce serait préférable en effet.
 
Last edited:

ddaweb

New Member
En effet, que ce soit le capteur Sharp ou une cellule IR avec catadioptre, on ne sait jamais quelle partie du chien sera détectée (tête, corps ou patte) ... comme c'est connu de tous, personne ne s'en plaint ou rouspète ... ouf.

Actuellement, côté barrière IR, j'ai une bande catadioptre de 5 cm de large (polarisée comme la cellule) sur toute la hauteur de la haie, ce qui correspond approximativement à un catadioptre rond de 8 cm : le réglage en pente ne pose pas trop de problème avec le petit réglage de parallélisme des 2 côté (cellule et bande réfléchissante), ce sont les bosses et trous d'un côté ou l'autre -> il y a un angle entre les 2 côtés sur la verticalité.
Les bonnes cellules IR donnent un spot de 1.5 à 2 cm à 1,5-2 m ... mais il faut compter +/- 60-70 €, toutefois, on en trouve à 30- 40 € -> la différence sera la sensibilité à une lumière forte de face (comme le soleil dans mon cas), 1 ou 2 réglages et/ou sortie haute ou basse ou les 2 (plus rare, un relais).
J'ai pu remarquer que les distances données sont souvent de la cellule au catadioptre ... je prend de toute façon min. 3 m pour une question de puisance.

Pour moi, il ne faut activer qu'un seul couple émetteur/récepteur à la fois, et donc lire successivement les différents "rayons" de façon suffisamment rapide pour que ça paraisse simultané. A presque 300 000 km/s ce n'est pas la réactivité de la lumière qui risque de poser problème.
J'ai 2 cellules espacées de 20-25 cm câblées en //, elles ne se perturbent absolument pas (cf photos #76) ... vraiment pas besoin de ce multiplexage ;)

La vrai solution est de mettre une caméra au dessus de la haies et détecter des changement de pixel sur la ligne de départ (filtre à faire pour ne pas détecter l'herbe qui bouge avec le vent) ... mais très difficile à mettre en œuvre, sans compter le prix :giggle:

Sinon, pour le capteur Sharp, la fonction est bien celle-là (readadc) ?
Je vais le commander + une LDR et déjà commencer avec soit le 28x2 ou le 14m2 que j'ai ... j'ouvrirai un post une fois nécessaire.
 

BESQUEUT

Senior Member
La vrai solution est de mettre une caméra au dessus de la haies et détecter des changement de pixel sur la ligne de départ (filtre à faire pour ne pas détecter l'herbe qui bouge avec le vent) ... mais très difficile à mettre en œuvre, sans compter le prix :giggle:
Au dessus ou sur le coté.
L'important est d'avoir une bande de référence d'une couleur qui ne peut pas être un chien (rouge, ou bleu)
et de détecter des pixels qui changent.
Caméra SPI 2M pixels
Même en utilisant la résolution la plus médiocre, ça va être difficile sur un Picaxe. Un T...y à 20 € serait plus adapté.
Globalement le budget me semble raisonnable, mais on est à 10fps. Trop juste pour du chronométrage...

Un Pixy serait plus adapté, et travaille à 60 images par seconde.
Ça devient crédible pour du chronométrage, mais c'est un poil plus cher.

Il y a aussi Open MV CAM qui peut travailler à 120 images/seconde, encore un peu plus cher.

Autre option "mécanique" :
relier les deux mats par une barre rigide > du coup on peut en profiter pour passer des câbles et plus besoin de catadioptres.
Alignement parfait garanti. Par contre, il faut mettre au point un système d'assemblage commode mais résistant.
 
Last edited:

ddaweb

New Member
Hummmm, vous commencez à m'intéresser, surtout si avec une caméra on couvre toute la haie :p
Ex. : en la mettant en diagonale sur le coin supérieur (+/- 1 m de haut, ne peut pas dépasser malheureusement) vers le coin inférieur de l'autre côté.

Avec des cellules de qualité, une haies revient à +/- 180-200 € petit matériel compris et 2 cellules.
En prenant du moins bon en cellules, on devrait pouvoir descendre en dessous des 150 €.

Mais là je ne saurai vraiment pas comment faire, programmer du traitement d'image, que ce soit T...y ou autre :rolleyes:
Pour être compatible avec les 2 chronos il faudrait une activation de sortie en cas de détection.
De mémoire, cela a déjà été tenté, mais aucun n'a abouti ... c'était avant l'arrivée de ces petites plaques ... loool
 

BESQUEUT

Senior Member
Hummmm, vous commencez à m'intéresser, surtout si avec une caméra on couvre toute la haie :p
Ex. : en la mettant en diagonale sur le coin supérieur (+/- 1 m de haut, ne peut pas dépasser malheureusement) vers le coin inférieur de l'autre côté.

Avec des cellules de qualité, une haies revient à +/- 180-200 € petit matériel compris et 2 cellules.
En prenant du moins bon en cellules, on devrait pouvoir descendre en dessous des 150 €.

Mais là je ne saurai vraiment pas comment faire, programmer du traitement d'image, que ce soit T...y ou autre :rolleyes:
Pour être compatible avec les 2 chronos il faudrait une activation de sortie en cas de détection.
De mémoire, cela a déjà été tenté, mais aucun n'a abouti ... c'était avant l'arrivée de ces petites plaques ... loool
Ces modules ont un processeur intégré qui fait tout le boulot... Ce qui nous intéresse est le Frame differencing : détection d'un changement dune image à la suivante.
Une fois paramétrée, c'est la caméra qui envoie un signal, mais faudrait voir la doc détaillée pour savoir si c'est du SPI ou si on peut changer l'état d'une broche.

A priori la méthode Similarity donne directement le niveau de similarité entre deux images successives !
Et il y a tout ce qu'il faut pour contrôler les ports d'entrée sortie.
Je serais même d'ais d'ajouter un potar pour régler la sensibilité et quelques LEDs pour faciliter le réglage...
Quelques lignes de microPython...
 
Last edited:

ddaweb

New Member
Je viens de regarder plusieurs vidéos d'applications depuis cette page, il reste la faille du personnel sur le terrain circulant autour de la haie qui seront également détectées.
Je n'ai pas trouvé comment on pourrait supprimer ces intrus.

Pour la commande d'une sortie, il y a également la communication qui pourrait être utilisée ... dans le cas d'un masque d'une image enregistrée, il y a true et false

Toutefois, c'est vraiment merveilleux tout ce que l'on peut faire ... mais je commence à comprendre pourquoi cela n'a pas encore été concrétisé : le facteur humain autour de la haie (pire, le personnel sur le terrain qui remet les obstacles en place pouvant être dans le champs de la caméra).

C'est vrai que ce n'est plus une question d'argent pour les pièces, mais de solutions à trouver pour supprimer au max. la détection des intrus.

Côté consommation, là oui cela fait une différence : 110 à 170 mA rien que pour la caméra Open MV (la datasheet dit moins de 150 mA ??) qui serait celle à utiliser pour la précision du chrono ... faut encore la carte de gestion derrière (le uno si plus facile que la tienne ... librairies dispo).
Les cellules font 20 - 30 mA max. :unsure:
 

BESQUEUT

Senior Member
Je viens de regarder plusieurs vidéos d'applications depuis cette page, il reste la faille du personnel sur le terrain circulant autour de la haie qui seront également détectées.
Je n'ai pas trouvé comment on pourrait supprimer ces intrus.

Pour la commande d'une sortie, il y a également la communication qui pourrait être utilisée ... dans le cas d'un masque d'une image enregistrée, il y a true et false

Toutefois, c'est vraiment merveilleux tout ce que l'on peut faire ... mais je commence à comprendre pourquoi cela n'a pas encore été concrétisé : le facteur humain autour de la haie (pire, le personnel sur le terrain qui remet les obstacles en place pouvant être dans le champs de la caméra).

C'est vrai que ce n'est plus une question d'argent pour les pièces, mais de solutions à trouver pour supprimer au max. la détection des intrus.

Côté consommation, là oui cela fait une différence : 110 à 170 mA rien que pour la caméra Open MV (la datasheet dit moins de 150 mA ??) qui serait celle à utiliser pour la précision du chrono ... faut encore la carte de gestion derrière (le uno si plus facile que la tienne ... librairies dispo).
Les cellules font 20 - 30 mA max. :unsure:
Il me semble que le mieux serait d'avoir un poteau d'une couleur impossible à la place du catadioptre. Il doit être possible de filtrer uniquement les changements dans cette zone. C'est un peu plus de code, mais à priori, il y a toutes les fonctions utiles pour ça.

Pas besoin d'autre chose que le processeur intégré à la caméra et programmable en micro-python.
Il y a des ports I/O disponibles pour communiquer directement avec le Picaxe.
 

ddaweb

New Member
Oui, comme vous l'aviez déjà dit, une couleur bleu clair par exemple ... le jour où je vois un chien de cette couleur, j'aurai très peur :ROFLMAO:
Il faudra alors faire du réglage comme avec les cellules... au lieu d'aligner les cellules, ce sera la caméra o_O ... ?
Sans PC, une ou plusieurs leds devraient être ajoutées pour aider ?

Pour la programmation je suis complètement largué !!
Je comprend le principe et c'est tout.

C'est un gros challenge cette idée de caméra pour des barrières de chronomètre :p ...
La caméra Open MV en résolution min. à 120 fps devrait suffire pour la précision du chrono, à 60 fps, on est en dessous de la précision du chrono.
Acheter cette caméra juste pour tester la faisabilité c'est un peu chérot non ?

Cette lentille n'apporterait pas un plus pour la couverture ... un grand angle !
Cette caméra permet les 120 fps à basse résolution, mais faut-il une carte en plus ?
 

BESQUEUT

Senior Member
Oui, comme vous l'aviez déjà dit, une couleur bleu clair par exemple ... le jour où je vois un chien de cette couleur, j'aurai très peur :ROFLMAO:
C'est surtout les intrus qu'il faut éviter.
Je verrais bien un poteau orange fluo : peu de chance qu'un gars se balade avec ça sur le dos, et si c'est le cas, il est facile à repérer et à éloigner de la barrière...
Il faudra alors faire du réglage comme avec les cellules... au lieu d'aligner les cellules, ce sera la caméra o_O ... ?
Sans PC, une ou plusieurs leds devraient être ajoutées pour aider ?
Avec un champ aussi large, il suffit de pointer en gros en direction du poteau. La camera trouvera toute seule la zone où chercher les pixels qui changent.
Pour la programmation je suis complètement largué !!
Je comprend le principe et c'est tout.

C'est un gros challenge cette idée de caméra pour des barrières de chronomètre :p ...
La caméra Open MV en résolution min. à 120 fps devrait suffire pour la précision du chrono, à 60 fps, on est en dessous de la précision du chrono.
Acheter cette caméra juste pour tester la faisabilité c'est un peu chérot non ?
Oui c'est un beau challenge. Les exemples ont l'air abordables, mais c'est sur que c'est plus difficile que le Picaxe...
Oui c'est cher, surtout si on compare à un T4 à 21 €. Mais on paye pour le code tout prêt...
Cette lentille n'apporterait pas un plus pour la couverture ... un grand angle !
Cette caméra permet les 120 fps à basse résolution, mais faut-il une carte en plus ?
Le super grand angle apporte une forte déformation et pas d'avantage par rapport à la lentille normale. Et c'est encore plus cher...
La caméra Arducam se programme comme un Arduino, mais il n'y a pas de fonction intégrée pour faire de la détection de mouvement, encore moins pour la sélection de zone. Il y a juste ce qu'il faut pour transférer vers un Raspi ou autre.
Ça peut peut-être s'ajouter, mais de toutes façons, il n'y a pas de port I/O.

Voir ce lien...
Même avec un T4 qui est monstrueusement puissant, le rafraichissement me semble bien saccadé, en tout cas inutilisable pour du chronométrage.
Si c'est le lien entre le T4 et l'écran, pas de problème.
Mais si c'est le lien entre l'Arducam et le T4, c'est rédhibitoire...

Le fait de tout faire directement avec la caméra me semble plus simple.
 
Last edited:

ddaweb

New Member
Je vais vous décevoir, mais les couleurs fluo sont souvent présentes sur les tenues sportives (training et autre) ... malheureusement les concurrents les portent :mad:

Le choix de la couleur ne sera pas une mince affaire ...
- 2 ou 3 couleurs pour l'objet de référence serait peut-être la solution
- plusieurs lignes, style code-barre ?
Je vais y réfléchir de mon côté.

Le super grand angle était plus pour couvrir toute la hauteur de la haie, 90 ° donne 2 triangles non couverts (en haut et en bas côté caméra) ... mais sans visualisation, c'est un peu difficile de s'imaginer l'impact sur la détection.
 

BESQUEUT

Senior Member
Je vais vous décevoir, mais les couleurs fluo sont souvent présentes sur les tenues sportives (training et autre) ... malheureusement les concurrents les portent :mad:

Le choix de la couleur ne sera pas une mince affaire ...
- 2 ou 3 couleurs pour l'objet de référence serait peut-être la solution
- plusieurs lignes, style code-barre ?
Je vais y réfléchir de mon côté.

Le super grand angle était plus pour couvrir toute la hauteur de la haie, 90 ° donne 2 triangles non couverts (en haut et en bas côté caméra) ... mais sans visualisation, c'est un peu difficile de s'imaginer l'impact sur la détection.
Bonne idée : un flash code en haut et en bas : ça devrait le faire : la caméra sait détecter les flash codes...
Et oui également pour le grand angle . j'avais point compris l'idée. En plus la déformation apparaît surtout sur le bord, lequel ne sera pas traité si la camera est grossièrement orientée dans la bonne direction.

En creusant la doc, il y a des pépites :
-mieux que les QRcodes, les AprilTag s qui résistent mieux aux déformations et à la distance : impec avec le grand angle dans notre cas !
- à partir de là, on restreint la résolution à la fenêtre entre les deux tags : set windowing
- encore plus fort , une fois la première image prise grand champ, et sans doute après chaque course pour réinitialiser l'alignement, on peut faire un sensor.set_windowing
du coup le volume de données à traiter est bien plus faible, donc tout est plus rapide et moins de risque de saturer le mémoire,
- reste plus qu'a mesurer le niveau de similitude entre deux images successives par rapport à un seuil.
- on peut utiliser le module I/O pour positionner une broche dès que la barriere est prête (détection des AprilTags) et une autre pour la détection du chien.La troisième broche peut servir à brancher un potar pour régler le seuil de détection. Il y a déjà des leds sur la carte pour aider au débogage.
 
Last edited:

ddaweb

New Member
Hummmm je vois que votre cerveau est en ébullition :D

Et si entre les 2 tag je laisserais tout simplement la bande réflectrice du catadioptre ... cela donne une couleur bien particulière pour la photo de référence ?

Il pourrait automatiquement prendre une photo après une détection (passage du chien) ? ... A voir lors du placement de la barrières, il y aura beaucoup de détections ... peut-être un timer min. entre 2 photos, remis à 0 après une détection durant ce timer et prendre la photo le timer bien écoulé (10 -30 sec., entre 2 chiens ce ne sera jamais aussi rapide, sauf faux départ) ?

En principe, si personne ne fait tomber la haie, elle ne bouge plus durant toute une classe (parfois plusieurs) ... la seule chose qui se passera alors : il y aura plusieurs détections durant le déplacement de la barre suivant la hauteur du chien, ou replacée si le chien la fait tomber.

Mettre un BP pour forcer une photo après réglage ?

Ce qui vous facilitera la tâche : aussi bien la caméra que la bande sont fixées à la haie avec des trou en œillet ... on rentre la tête de la vis et on redescend dans la rainure pour fixer (en léger serrage) ... donc assez solidaire avec la haie !

Je réfléchit également en fonction de vos commentaires ...

Vous parlez de ce module IO ?

On va bientôt pouvoir faire une première évaluation de prix ... looool
- Caméra : 69,00 €
- Lentille : 14.40 €
- Shield IO : 6,00 €
- Boitier étanche abritant la caméra et électronique : à voir avec la grandeur à abriter ??
- Fiche boitier pou raccorder le câble vers le chrono : je dois chercher avec le modèle sur le câble actuel ??
- Un convertisseur DC-DC 12v -> 5V ... ou adaptation du câblage si j'ai un fil de trop en amenant le 5 et le 12 V (actuellement présent) : ??

Il me semble donc que le budget avec caméra (90 €) ne devrait pas dépasser celui avec des cellules IR (entre 100 et 150 € suivant la qualité) ... c'est vraiment encourageant pour la suite.
Le reste du matériel est pratiquement identique pour les 2 versions (juste peut-être le boitier sur la haie qui serait différent) !!

Je vais de toute manière devoir refaire 2 câbles avec enrouleur pour le 2me chrono, mais je vais essayer de laisser tout 100 % comptable avec l'autre chrono ... moins de risque d'erreur, quitte à remplacer les fiches et le câble pour les barrières existantes (si que 3 connexions, mais je dois me rendre au club pour voir cela !).
Pour le Hooper, je ferai des piquets à planter compatibles avec les attaches des haies, il n'y a pas de haies, tout est au sol ... à cogiter.

Bon maintenant dodo, je reprend le boulot demain après 15 jours de congé o_O
 
Last edited:

ddaweb

New Member
Bonjour,

Je vais plutôt continuer sur mon fil, je viens de me rendre compte que je squattais un peu celui du Belge.
Un assez long compte-rendu sur la suite de mon épopée.

J'ai travaillé sur le code de mon afficheur avec son propre Picaxe 20x2 totalement indépendant durant le chronométrage.

Je suis arrivé à quelque chose qui tienne la route, avec ce cahier des charges :
- Il y a une liaison série avec le chrono mère afin de mettre à jour le temps de l'afficheur à la fin du chronométrage ... code d'identification + petit checksum
- Au démarrage du chrono mère une de ses sorties passe à 1 et le reste jusqu'à l'arrêt -> fait démarrer l'afficheur, à l'arrêt repasse à 0.
- Durant le chronométrage, l'afficheur n'affiche que les 1/10, j'efface le chiffre des 1/100
- Le chronométrage arrêté, le temps complet du chrono mère s'affiche (avec les 1/100) s'il est accepté ou alors le temps de l'afficheur lui-même mais au 1/10. Une sortie s'active si TX NOK.
- L'afficheur ne peut pas avoir un temps inférieur que le chrono mère, s'il y a une différence, le temps doit être plus élevé, max. 1/10
- Un petit LCD remplaçant l'afficheur pour test et débug : ne reste pas en définitif

Voici le code, si vous avez une idée pour l'améliorer :

C++:
;===================================================================================================================
;AFFICHEUR EXTERIEUR
;--------------------
;B.0 = commande START/STOP : 1=chrono mere est demarre -> chrono fille demarre
;Chrono mere arrete, B.0=0 -> envoi en serie le temps final : TX serie
;Afficheur LCD pour debug : Affichage 'Temps ' txtexte -> '*'=demarrage ou temps en cours - ':'=TX OK - '?'=TX NOK
;===================================================================================================================

#picaxe 20X2        'Type de Picaxe
#no_data
#no_table

;Vitesse 16 Mhz
setfreq M16
hsersetup B2400_16, %10 ' 2400 baud, inverted TXD pour afficheur OLED 133Y : LCD
settimer 64916            'reglage timer 1/100 s ... a ajuster ... augmenter = accelerer 16Mhz
;Vitesse 64 Mhz
;setfreq M64
;hsersetup B2400_64, %10 ' 2400 baud, inverted TXD pour afficheur OLED 133Y : LCD
;settimer 63041

; --------------- Initialisation configuration
dirsB=%10111100            ' B2 -> B5 = sorties : BCD + B.7 = Timeout TX temps
dirsC=%00111110            ' C1 -> C5 = sorties : afficheur actif 1 -> 5 (ne pas utiliser C.6 : IN only)

symbol chiffre=b6
symbol digit=b7
symbol decimale=b8        ' 1=affiche des decimales
symbol tx=b9            ' 1=Timeout TX temps chrono : ULN 2803 inverse
;b10 -> b16 : reception temps du chrono via TX serie
symbol checksum=b17        ' Calcul du checksum du temps recu
symbol txtexte=b18        ' Affiche le resultat du TX au LCD : ? ou :

symbol val=w13            ' Temps du chrono afficheur (fille)
symbol chrono=w14        ' Temps recu par le chrono maitre

symbol cmd=pinB.0        ' 1=START - 0=STOP
symbol txled=pinB.7        ' Led TX temps timeout
symbol LCD=C.0             ' Pin C.0 (Out) : NE PAS MODIFIER -> sortie serie afficheur LCD (HSEROUT) : 2.400 baud

; --------------- initialisation Chrono
pause 1500
hserout LCD,(254,128," Afficheur Ext. ")    'Affichage 1ere ligne
hserout LCD,(254,192," Demarrage ...  ")    'Affichage 2me ligne
pause 4000                                    'Attente demarrage complet chrono mere

txtexte=42                                            ' Affcichage "*" LCD
hserout LCD,(254,192,"Temps ",txtexte,"         ")    ' Affichage 2me ligne
decimale=1                                            ' Affichage des centiemes autorise
timer=0

; --------------- Chrono
Do
    gosub affich        ' Affichage du temps

    b10=0                ' Pas de temps du Chrono mere
    decimale=0            ' Ne pas afficher les decimales choisies dans 'gosub affich'
    tx=0                ' Etat de la led TX temps : eteindre
    txled=tx            ' Eteindre led TX
    txtexte=42            ' Affcichage "*" LCD
    chrono=0

    do                ' Boucle d'attente START
    loop while cmd=0

    timer=0

    do                        ' Chrono demarre
        val=timer            ' Lecture du temps
        if val>=chrono then
            gosub affich    ' Affichage du temps tous 1/10
            chrono=val+10
        end if
    loop while cmd=1

    val=timer        ' Lecture du temps
    ;gosub affich    ' Affichage du temps
    chrono=0

    serin [400],B.6,N9600_16,("t"),b10,b11,b12,b13,b14,b15,b16    ' TX temps du chrono
    checksum=b11+1+b12+2+b13+3+b14+4+b15+5-48
    if b10="s" and checksum=b16 then                            ' Verification envoi du temps
        chrono=b11 - 48 * 10000
        chrono=b12 - 48 * 1000 + chrono
        chrono=b13 - 48 * 100 + chrono
        chrono=b14 - 48 * 10 + chrono
        chrono=b15 - 48 + chrono
        val=chrono
        chrono=0
        txtexte=58        ' Affcichage ":" LCD
        decimale=1        ' Affichage des centiemes autorise
    else
        tx=1            ' Etat led TX temps : pas de reception d'un temps -> allumer
        txtexte=63        ' Affichage "?" LCD
    endif

    txled=tx            ' Affichage TX temps OK ou pas
loop

; --------------- Sous-routines
affich:
    if decimale=0 then
        val=1/10000*10+1*val    ' Coeficient de correction horloge
    end if

    bintoascii val, b1,b2,b3,b4,b5
    hserout LCD,(254,198,txtexte," ",b1,b2,b3,",",b4,b5," s")    ' Affichage temps -> 2m ligne

    if decimale=0 then    ' Eteindre digit : cf ci-dessous les decimales a eteindre
        ;b4=63            ' Les diziemes : 15+48
        b5=63            ' Les centiemes : 15 + 48
    end if

    digit=%00011110        ' Centiemes : C.5
        chiffre=b5-48
        gosub affchiffre
    digit=%00101110        ' Diziemes : C.4
        chiffre=b4-48
        gosub affchiffre
    digit=%00110110        ' Secondes : C.3
        chiffre=b3-48
        gosub affchiffre
    digit=%00111010        ' 10 secondes : C.2
        chiffre=b2-48
        gosub affchiffre
    digit=%00111100        ' 100 secondes : C.1
        chiffre=b1-48
        gosub affchiffre
    return

affchiffre:
    pinsB=4*chiffre        ' Chiffre en BCD sur sorties B2 -> B5 : x4 pour commencer au bit 3
    txled=tx            ' Maintien la led TX dans son etat apres le pinsB
    pinsC=digit            ' Selection du digit actif
    pause 1
    pinsC=%00111110        ' Reset commande digit : latch afficheurs
    return
Voici les résultats de mes tests, il y en a eu une flopée !!
Les conseils prodigués durant la fabrication du chrono m'ont beaucoup aidé, dont le coefficient correctif du temps.

23860

Quelqu'un pourrait m'expliquer pourquoi si j'active le GOSUB, le SERIN ne fonctionne pas ?? @PieM , tu sembles très bien connaître les communication série !

23863

Il en est de même si la pause > 200 en bas du script :

23862

Par contre, j'ai constaté qu'il valait beaucoup mieux faire un reboot du Picaxe après avoir chargé un programme ... les résultats diffères un peu sans ce reboot !

Je peux mettre le Picaxe en 64 Mhz (j'ai fait un test rapide, il va réellement 4x plus vite) ... pensez-vous que cela en vaille la peine ?
Sur la précision probablement, mais pour le fonctionnement durant + de 10h d'affilée, le gain à obtenir ?

Merci à vous qui êtes parvenus au bout :p

DDA

Edit : Je teste avec un câble Cat5e d’approximativement 13 m enroulé avec un GSM posé sur la bobine : +5v , 0v, commande et série par ce câble -> 1 paire pour chaque raccordement. Le câble définitif sera un Cat6e, tresse raccordée à la masse uniquement côté chrono, sans le +5v vu qu'il y aura une alim dans l'afficheur.
 
Last edited:

PieM

Senior Member
Quelqu'un pourrait m'expliquer pourquoi si j'active le GOSUB, le SERIN ne fonctionne pas ?
Bonjour,
A mon avis , tu fais appel à un s/prog qui fait lui même appel à plusieurs s/p et tu dois dépasser le timeout.
pour verifier tu ajoutes au timeout, une adresse qui renvoie sur une alarme sertxd ou led. SERIN [timeout,address],
Tu lui envoies les données b10 - b16 à quelle fréquence ?

Pour les 64 MHz, tu ne changes pas la précision de l'horloge interne du Pic. seulement la réactivité du programme.
Je n'ai pas trop regardé en détail les fonctions de ce programme, mais à priori rien n'empêche de recevoir ces données en tache de fond sur le scrachpad. Perso je n'aime pas trop les timeout dans les programmes...
 
Last edited:

ddaweb

New Member
Bonjour Piem,

Je vais détailler mes réponses :
1. L'appel aux sous-programmes : en effet, il y en a 2 en cascade, mais ce que je ne comprends pas c'est qu'avant le SERIN, je fais le même GOSSUB dans une boucle qui est quittée quand l'entrée de commande passe à 0 qui ne pose pas le moindre problème
Rich (BB code):
    do                    ' Chrono demarre
        val=timer            ' Lecture du temps
        if val>=chrono then
            gosub affich    ' Affichage du temps tous les 1/10
            chrono=val+10
        end if
    loop while cmd=1

    val=timer        ' Lecture du temps
    ;gosub affich    ' Affichage du temps
    chrono=0

    serin [400],B.6,N9600_16,("t"),b10,b11,b12,b13,b14,b15,b16    ' TX temps du chrono
2. La fréquence du SERIN, donc b10 -> b16 : je ne l'envoi qu'une seule fois lorsque le chrono maître s'arrête ... donc trafic tout à fait négligeable
3. SERIN [timeout,address] : J'ai une led qui s'allume via le non passage par la détection d'une communication : TX=1 ... je vais essayer ce que vous dites ce soir et donner le résultat
Rich (BB code):
    serin [400],B.6,N9600_16,("t"),b10,b11,b12,b13,b14,b15,b16    ' TX temps du chrono
    checksum=b11+1+b12+2+b13+3+b14+4+b15+5-48
    if b10="s" and checksum=b16 then        ' Verification envoi du temps
        chrono=b11 - 48 * 10000
        chrono=b12 - 48 * 1000 + chrono
        chrono=b13 - 48 * 100 + chrono
        chrono=b14 - 48 * 10 + chrono
        chrono=b15 - 48 + chrono
        val=chrono
        chrono=0
        txtexte=58        ' Affcichage ":" LCD
        decimale=1        ' Affichage des centiemes autorise
    else
        tx=1            ' Etat led TX temps : pas de reception d'un temps -> allumer
        txtexte=63        ' Affichage "?" LCD
    endif
4. Le timeout : le SERIN avec un caractère de détection attend ce fameux caractère, le timeout me permet de sortir de cette attente ... mais d'accord avec vous, les timeout n'est pas ce qu'il y a de mieux ... parfois il n'y a pas d'autre solution.
Sécuriser l'intégrité de la com a parfois un prix malheureusement.
5. Le scratchpad : je n'ai jamais réussit à le faire fonctionner, même en suivant ce que vous aviez fait, expliqué dans un de vos posts ... il doit me manquer un petit boulon quelque part, mais je ne l'ai jamais trouvé. Il est clair que cela serait mieux de pouvoir travailler en RAM.
J'en avais parlé dans l'autre fil du chrono, celui de "le belge".

@+
DDA
 

ddaweb

New Member
Un petit complément d'information concernant le GOSUB à problème : j'ai essayé de mettre un petite pause (10 -> 600) après, en me disant naïvement que le Picaxe avait un problème avec une com sur le LCD (série également) et qu'elle n'était pas encore fermée ... cela n'a rien changé.

Une chose que j'ai pensée, mais pas essayée vue que je penses que cela ne concerne que la com de programmation, lorsqu'elle est utilisée pour autre chose : disconnect.
Il me semble que cela repermet d'envoyer un programme après une autre com sur ce port.

Concernant le 64 Mhz, mit à part que tout va 4x plus vite, je n'ai pas vraiment constaté d'amélioration notable dans les résultats des temps ... je me suis dit que cela provoquerait un petit échauffement supplémentaire du Picaxe par l'augmentation de la fréquence, sans vraiment avoir des améliorations visibles ... d'où ma demande d'un autre avis.
 
Last edited:

ddaweb

New Member
Piem,

J'ai déjà une réponse à ta suggestion de faire : SERIN [timeout,address]

1. Déjà cela renvoie à une sous-routine, mais pas de RETURN possible, j'ai du faire un GOTO et revenir au début du chrono ... je me souviens maintenant avoir essayé, et d'avoir abandonné pour cela
2. Cela fonctionne un peu mieux, mais tout de même des ratés (+/- 10%), il passe bien par la sous-routine, j'activais une led sur une sortie libre
3. J'ai augmenté le temps du TIMEOUT : rien ne change
4. Je retire le fameux GOSUB et dans les 2 cas, plus de problème :oops:

Pour moi le mystère reste entier !!

Voici le code, MAIN = retour au début, avant le premier DO évidemment (j'ai du mettre une pause pour voir la led car le GOSUB au début éteignait la led) :
Rich (BB code):
    val=timer        ' Lecture du temps
    gosub affich    ' Affichage du temps
    chrono=0

    serin [400,defauttx],B.6,N9600_16,("t"),b10,b11,b12,b13,b14,b15,b16    ' TX temps du chrono
    checksum=b11+1+b12+2+b13+3+b14+4+b15+5-48
    if b10="s" and checksum=b16 then        ' Verification envoi du temps
        chrono=b11 - 48 * 10000
        chrono=b12 - 48 * 1000 + chrono
        chrono=b13 - 48 * 100 + chrono
        chrono=b14 - 48 * 10 + chrono
        chrono=b15 - 48 + chrono
        val=chrono
        chrono=0
        txtexte=58        ' Affcichage ":" LCD
        decimale=1        ' Affichage des centiemes autorise
    else
        tx=1            ' Etat led TX temps : pas de reception d'un temps -> allumer
        txtexte=63        ' Affichage "?" LCD
    endif
   
    txled=tx            ' Affichage TX temps OK ou pas
loop

; --------------- Sous-routines
defauttx:
    high C.7
    txtexte=63        ' Affichage "?" LCD
    pause 8000
    goto main
 

PieM

Senior Member
ce que je ne comprends pas c'est qu'avant le SERIN, je fais le même GOSSUB dans une boucle qui est quittée quand l'entrée de commande passe à 0 qui ne pose pas le moindre problème
Ben oui mais il n'y a pas de serin dans cette boucle.
Le timeout de 400 est de 200ms sur le picaxe à16MHz. (50ms à 64MHz!) Il faut donc que l'envoi du chrono mère sur le serin tombe sur cet intervalle !
Un petit chronogramme des opérations serait à mon avis utile pour mettre en évidence ce probleme, car il s'agit d'un pb de timing.
Disconnect permet d'utiliser le Serial In par une entrée TOR.
Pour le scratchpad, il faut définir au départ, qu'on veut recevoir les données en arriere plan par Hsersetup dont le bit0 de mode est à 1.
ensuite on surveille le hserinflag qu'on remet à 0 ainsi que le hserptr après lecture des valeurs reçues.
Il serait également possible de mettre le serin dans une interruption qui serait déclenchée par le signal cmd qui passse à 0.
 

ddaweb

New Member
Le timeout de 400 est de 200ms sur le picaxe à16MHz. (50ms à 64MHz!) Il faut donc que l'envoi du chrono mère sur le serin tombe sur cet intervalle !
Un petit chronogramme des opérations serait à mon avis utile pour mettre en évidence ce probleme, car il s'agit d'un pb de timing.
Hummmm ... oui, cela veut dire que le chrono mère va plus vite que l'écoute de l'afficheur ... l'envoi a déjà été fait ...
Avec le GOSUB, je retarde l'écoute évidemment :cool:

Voici le code du chrono maîtres, pour le basculement de la sortie de commande (C.5) et l'envoi du temps (serout) :

Code:
        low C.5                                    'Sortie chrono_start repos
        buzzer=fonctionne
        val_temps_mem= val_temps_mem/2000+1 /2 +val_temps_mem        'coefficient d'ajustement du temps pour chrono de test
        ;val_temps_mem= val_temps_mem/2000+1 /2 +val_temps_mem -1    'coefficient d'ajustement du temps pour chrono CECS
        bintoascii val_temps_mem, b1,b2,b3,b4,b5                'decomposition ascii
        hserout LCD,(254,128,"STOP... ",b1,b2,b3,",",b4,b5," s")    'affichage LCD 1ere ligne
        
        val_old8=val_old7        ; ----- Memoire des temps : FIFO
        val_old7=val_old6
        val_old6=val_old5
        val_old5=val_old4
        val_old4=val_old3
        val_old3=val_old2
        val_old2=val_old1
        val_old1=val_temps_mem    ; ----- fin du FIFO
        pause 200
        checksum=b1+1+b2+2+b3+3+b4+4+b5+5-48
        serout A.4, N9600_64,("ts",b1,b2,b3,b4,b5,checksum)        'envoi du temps en serie vers chrono afficheur
Non seulement il y a des actions entre les 2 et j'avais mis une pause pour cela ... avec ce GOSUB, il faudrait allonger cette pause du coup, style 300-400, vu les ratés ?
Je sens bien que je vais également augmenter le timeout à 800.
Dans la doc, ils parlent du timeout en ms ... mais je n'y crois pas de trop
 

ddaweb

New Member
Le seul but de ce GOSUB est d'éviter un saut des 1/10 en cas de timeout, le temps final sera de toute façon réaffiché avant l'attente d'un nouveau start.
Ce saut était visible, ce qui est inesthétique.
J'ai eu un coup de bol que le timing sois aussi bon sans cet affichage, car je n'ai pas eu de raté.

Pour un meilleur contrôle, ne serait-il pas bon d'envoyer le temps le plus près possible après le basculement de la sortie ?
 

PieM

Senior Member
Pour un meilleur contrôle, ne serait-il pas bon d'envoyer le temps le plus près possible après le basculement de la sortie ?
Ben ça me semble évident! pourquoi mettre toute cette cuisine entre low C.5 et le serout ?
D'une façon générale, je pense que ça déjà été dit, le recours à des tempos (pause et timeout) pour solutionner des problèmes c'est rajouter des problèmes aux premiers!
faute d'obtenir lui même l'info sur le chrono via un mode transparent, le µC doit être disponible en attente du serin. donc il attend et ne fait rien d'autre, ou il est à l'écoute sur interruption.
Donc ton signal fin chrono, est à relier à une interruption, qui elle va assurer le serin.
 

ddaweb

New Member
Merci @PieM

C'était bien cela, un problème de timing entre les 2 ... en mettant une pause de 350 dans le chrono maître, cela fonctionnait déjà.
Avec 300, il y avait des ratés.
J'ai mit 400 pour cette pause et un timeout de 800.

Vu que le temps est déjà à jour, ce timeout n'a plus trop d'importance ... s'il y a une réception de temps, un GOSUB suit directement pour afficher à ce moment là celui du chrono maître (vu qu'il y a un changement avec les 1/100 qui s'affichent, ce n'est pas très visible le saut de temps), autrement c'est le même temps qui est réaffiché. Dans la très grande majorité des cas, les 1/10 seront les même, dans les autres cas, ils diminuent de 1.
Avec le LCD je le vois car un caractère passe de "*" à "?" au timeout (pas de TX).

Maintenant si tu as une suggestion plus fiable de temps, n'hésite pas ;)
 

PieM

Senior Member
en mettant une pause de 350 dans le chrono maître, cela fonctionnait déjà.
Avec 300, il y avait des ratés.
J'ai mit 400 pour cette pause et un timeout de 800.
c'est un plat de nouilles futur qui va tomber en marche comme dit l'ami Besqueut
 

ddaweb

New Member
La cuisine :))) comme tu dis est le coef correctif calculé par MGU me semble-t-il et ensuite faire un FIFO des 8 derniers temps.

Ce qui est clair (en tout devrait l'être) entre les 2 est en effet cette sortie qui passe à 1 au START et retombe à 0 au STOP (ou attente 1er démarrage).
La transmission du temps se fait donc après ce passage à 0 de la sortie.

Si tu sait me donner un bout de code pour pour cette interruption avec ce qui est ci-dessus, cela m'aiderait bien.

Perso j'arrive à faire fonctionner une interruption de 0 -> 1, mais de 1 -> 0 je n'ai pas (encore) réussi, même en utilisant le SETINTFLAG et/ou HINTSETUP ... toujours avec avec SETINT.
Pour ton info, les INT1 et INT2 sont sur les broches B.0 et B.1

NB : j'étais occupé de te répondre durant tes réponses ... dérangé au GSM
 

PieM

Senior Member
Ce n'est pas la recette de cuisine qui est en cause, c'est que tu la fais au mauvais moment par rapport au low C.5!
Je regarde ton interruption...
Pour le FIFO tu en as un tout fait si tu stockes tes données dans le scratchpad.
 

ddaweb

New Member
Je penses qu'il faut prendre en compte ce fameux GOSUB qui affiche le dernier temps du chrono fille ... je ne sais pas chiffrer le temps que cela prend !
La pause sur le chrono maître est en fait pour attente que ce soit fini.

Les FIFO et action du buzzer peuvent être mis avant le low C.5 ... le chrono maître est de toute façon déjà arrêté, cela n'aura plus d'incidence sur le temps final.
L'affichage du LCD peut également être placé après le TX ... ce qui diminue la grosse soupe également, mais provoquera un tout petit saut de temps (pas trop important).
Seul le coefficient correctif doit rester, il rectifie l'erreur de l'horloge que l'on ne sait pas ajuster autrement.

Edit : Rectification, le mieux est de mettre tout après le TX ... low C.5 doit se faire le plus rapidement possible
 
Last edited:

ddaweb

New Member
Pour le FIFO tu en as un tout fait si tu stockes tes données dans le scratchpad.
Hummm ... tu m'intéresses là

Pour t'expliquer le fonctionnement de l'appel mémoire :
- On pousse sur un BP, les 2 derniers temps s'affichent tant qu'il reste enfoncé.
- On relâche brièvement le BP et renfonce, ce sont les 2 suivantes ... ainsi de suite jusque 7 et 8
- Si on relâche brièvement après le dernier, la boucle recommence.
- BP relâché un certain temps, on repasse en mode chrono
- Si BP appel mémoire et ensuite BP Start/Stop : c'est la version et adresse du chrono qui s'affiche -> lâcher Start/Stop, retour mémoire -> lâcher appel mémoire, retour chrono ... ou les 2 en même temps
 

PieM

Senior Member
Rich (BB code):
'Init ....................
hintsetup %00000010  'interrupt1 (B.0) sur front descendant
setintflags %00000010, %00000010

;dans chrono ---------------------------
if hintflag1 = 1 ;on vient de recevoir le chrono
'.......................
hintflag1 = 0
etc...

;----------------------------------------------
Interrupt:
serin B.6,N9600_16,("t"),b10,b11,b12,b13,b14,b15,b16
checksum=b11+1+b12+2+b13+3+b14+4+b15+5-48
if b10="s" and checksum=b16 then                            ' Verification envoi du temps
        chrono=b11 - 48 * 10 + b12 - 48 * 10 + b13 - 48 * 10 + b14 - 48 * 10 + b15 - 48
        val=chrono
        chrono=0
        txtexte=58        ' Affcichage ":" LCD
        decimale=1        ' Affichage des centiemes autorise
    else
        tx=1            ' Etat led TX temps : pas de reception d'un temps -> allumer
        txtexte=63        ' Affichage "?" LCD
    endif

    txled=tx            ' Affichage TX temps OK ou pas

setintflags %00000010, %00000010
return
 

ddaweb

New Member
Hummmm ... je ne sais vraiment pas comment écrire mon code.

Pour commencer, j'ai simplement écrit un code pour vérifier le hint1flag ou flag1 ... reste toujours à 0 sur le LCD, quelque soit l'état de l'entrée B.0.
Pour cela, j'ai démarré et arrêté le chrono à plusieurs reprises.

Code:
#picaxe 20X2        'Type de Picaxe
#no_data
#no_table

;Vitesse 16 Mhz
setfreq M16
hsersetup B2400_16, %10 ' 2400 baud, inverted TXD pour afficheur OLED 133Y : LCD
settimer 64916        'reglage timer 1/100 s ... a ajuster ... augmenter = accelerer 16Mhz

symbol LCD=C.0         ' Pin C.0 (Out) : NE PAS MODIFIER -> sortie serie afficheur LCD (HSEROUT) : 2.400 baud

; --------------- initialisation Chrono
pause 1500
hserout LCD,(254,128," Afficheur Ext. ")    'affichage 1ere ligne
hserout LCD,(254,192," Demarrage ...  ")    'affichage 2me ligne
pause 4000                        'Attente demarrage complet chrono mere

txtexte=42                        ' Affcichage "*" LCD
hserout LCD,(254,192,"Temps ",txtexte,"         ")    'affichage 2me ligne
decimale=1                        ' Affichage des centiemes autorise
timer=0

hintsetup %00000010  'interrupt1 (B.0) sur front descendant
setintflags %00000010, %00000010

; --------------- Chrono
do
    b1=flag1+48
    b2=hint1flag+48
    hserout LCD,(254,192," Demarrage . ",b1,"-",b2)
loop

;----------------------------------------------
Interrupt:
serin B.6,N9600_16,("t"),b10,b11,b12,b13,b14,b15,b16
checksum=b11+1+b12+2+b13+3+b14+4+b15+5-48
if b10="s" and checksum=b16 then                            ' Verification envoi du temps
        chrono=b11 - 48 * 10 + b12 - 48 * 10 + b13 - 48 * 10 + b14 - 48 * 10 + b15 - 48
        val=chrono
        chrono=0
        txtexte=58        ' Affcichage ":" LCD
        decimale=1        ' Affichage des centiemes autorise
    else
        tx=1            ' Etat led TX temps : pas de reception d'un temps -> allumer
        txtexte=63        ' Affichage "?" LCD
    endif

    txled=tx            ' Affichage TX temps OK ou pas

setintflags %00000010, %00000010
return
J'ai juste un problème avec le serin sans timeout ... si pour une raison où l'autre il n'y a pas de de réception de temps, on reste sur la ligne serin indéfiniment ... seul un reboot pour s'en sortir
 

ddaweb

New Member
Je viens de comprendre pourquoi je n'ai jamais su faire fonctionner l'interruption sur le 20x2 en utilisant setint :
20M2/20X2 seul le portC peut être utilisé, et seulement C.1 àC.5 du portC(ne concerne que le 20M2 et le 20X2, pas le 28X2) : venant d'un manuel français o_O
Etant sur B.1 à ce moment là (dieux seul sait pourquoi, un test quelconque ?) donc entrée 2 pas d'erreur pour le programme, mais C.1 est également programmée en sortie pulsée de 1 à 0.
Ici en étant à nouveau sur B.0, le programme me signale une erreur

En me mettant sur la pin C.5, l'interruption fonctionne d'abord sur le flanc montant : setint%00100000,%00100000 (start)
Ensuite sur le flanc descendant : setint%00000000,%00100000 (stop) ... ouf, j'avais donc bien compris comment faire.

Dans ce cas de figure, que vais-je gagner par rapport à suivre l'entrée ? : puisque l'interruption est appliquée entre chaque ligne du programme, pour tout de même suivre la suite du programme (quid le manuel) ... dans le cas de pulse de détection, là je dis oui évidemment.

Si je dois utiliser cette fonction, je ne le ferais que pour le stop et lire le timer vu qu'il y a quelques lignes de programme, je lis une dernère fois le timer à la sortie de la boucle (que je ne devrait plus faire car l'interruption le fera à un meilleur moment et donc moins de variation de temps en fonction du moment du stop).

J'ai également remarqué d'autres chose côté hardware, comme par exemple, le Picaxe est fort sensible au variation de tension d'alimentation durant le fonctionnement et sa tension nominale. Je suis passé de l'USB du PC vers un chargeur GSM qui est plus stable
Je n'ai pas de condo sur ma plaque de test, tension chute donc un léger rien en fonction de la consommation des leds par exemple ... je vais voir d'en ajouter un de +/- 500 µF pour absorber cela.
Celui du club a un 1000µC dans son alimentation.

Ah oui, je confirme que le serin bloque bien s'il n'y a pas de transmission -> reboot nécessaire ... le timeout est donc impératif dans ce cas.
Donc interruption ou pas, je ne crois pas que cela va changer quelque chose, le tout est de prendre une bonne marge de sécurité dans les différents temps des 2 chronos ... et si cela loupe une fois de temps en temps, le temps du chrono fille est toujours là ... faut le rendre le plus précis possible pour ces rares cas.
La commande et le TX sont dans le même câble de liaison s'il y a commande, il y a transmission (sauf problème hardware) : fiche à visser sur les 2 appareils.
 

PieM

Senior Member
Bon je crois qu'il est temps de lire enfin la doc du picaxe !!
seul le portC peut être utilisé, et seulement C.1 àC.5 du portC concerne un type d'interruption. Rien à voir avec ce que j'ai écrit !
Le hintsetup est une interruption hard sur des pins spécifiques B.0 B.1 sur un 20X2.
" serin bloque bien s'il n'y a pas de transmission " ben evidemment ! mais si c'est pour mettre un timeout qui renvoie sur un message " je n'ai rien reçu", on est bien avancé!!
En me mettant sur la pin C.5, l'interruption fonctionne d'abord sur le flanc montant : setint%00100000,%00100000 (start)
Ensuite sur le flanc descendant : setint%00000000,%00100000 (stop) ... ouf, j'avais donc bien compris comment faire.
Pas du tout!! ce type d'interruption ne fonctionne pas sur des fronts mais sur des états.
Je ne comprends pas qu'il soit aussi difficile d'envoyer quelques données d'un picaxe à un autre.
 

ddaweb

New Member
Oui, je sais que ce que tu veux faire n'a rien à voir avec le SETINT ... c'est juste le plan B.

Je penses avoir compris le principe, le tout est de le mettre en pratique avec le bon code.
Je préfèrerais d'ailleurs nettement faire fonctionner ta méthode pour mon PCB, j'y travaille donc activement et vais tester le code fait ce matin dans la journée (la nuit porte conseil ne dit-on pas !) : j'espère que ce sera bon.
Si oui, je mettrai le code afin que tu vérifies si tu veux bien et si nécessaire, donner de bons conseil d'amélioration.

" serin bloque bien s'il n'y a pas de transmission " ben evidemment ! mais si c'est pour mettre un timeout qui renvoie sur un message " je n'ai rien reçu", on est bien avancé!!
Je n'aime pas non plus ce timeout, mais comme cette situation est toujours possible pour une raison xyz, il faut la prévoir dans l'équation.
Si tout ce passe bien, comme cela le sera dans la très grande majorité des cas, il n'y a pas de timeout.
Dans ce cas malheureux, j'afficherai le temps de l'afficheur et pas celui du chrono ;)

Pas du tout!! ce type d'interruption ne fonctionne pas sur des fronts mais sur des états.
Je ne comprends pas qu'il soit aussi difficile d'envoyer quelques données d'un picaxe à un autre.
Peut-être, mais pourtant l'interruption se fait bien, et le chrono maître travaille de la sorte, le SETINT est d'ailleurs adapté en fonction du mode de fonctionnement ... mais bon cela a déjà été débattu, je ne compte pas y revenir.
La commande de l'afficheur étant un état bien défini : 1 = Start - 0 = Stop.
 

PieM

Senior Member
Peut-être, mais pourtant l'interruption se fait bien, et le chrono maître travaille de la sorte, le SETINT est d'ailleurs adapté en fonction du mode de fonctionnement ... mais bon cela a déjà été débattu, je ne compte pas y revenir.
Le fonctionnement de l'interruption du chrono maître n'a rien à voir. Donc le plan B (?!) devient le plan A ! Dont acte....
Et on afficherait un temps à peu près si on a pas reçu celui du chrono !?
Vous n'avez pas penser à tripler les picaxes pour assurer la redondance ?
 

ddaweb

New Member
Non ... je vais faire ce qu'il faut pour appliquer ta solution comme toute première solution (j'espère définitive) ... donc hintsetup + setintflags.
Non également pour la redondance :D
Oui pour afficher le temps de l'afficheur en cas de défaillance de com du chrono.
 

ddaweb

New Member
@PieM

Voilà, j'ai mis en application tes conseils et cela fonctionne à merveille ... juste du chercher un peu car l'interruption ne se faisait plus après le 1er démarrage : le setiintflags ne peut apparemment pas être dans l'interruption, une fois sorti de l'interruption c'était OK.
Je vais maintenant ajuster les temps afin de m'octroyer une marge de sécurité et ne jamais à avoir afficher le temps de l'afficheur :p

Le temps de l'afficheur n'affichera pas les centièmes, et je vais ajuster l'horloge pour avoir un temps identique au chrono au 1/10 ou au pire les 1/10 +1 : psychologiquement, le concurrent sera content d'avoir un temps plus bas au classement ;)

Comme promis, voici mon code :

Rich (BB code):
;===================================================================================================================
;AFFICHEUR EXTERIEUR
;--------------------
;B.0 = commande START/STOP : 1=chrono mere est demarre -> chrono fille demarre
;Chrono mere arrete, B.0=0 -> envoi en serie le temps final : TX serie
;Afficheur LCD pour debug : Affichage 'Temps ' txtexte -> '*'=demarrage ou temps en cours - ':'=TX OK - '?'=TX NOK
;===================================================================================================================

#picaxe 20X2        'Type de Picaxe
#no_data
#no_table

;Vitesse 16 Mhz
setfreq M16
hsersetup B2400_16, %10 ' 2400 baud, inverted TXD pour afficheur OLED 133Y : LCD
settimer 64916        'reglage timer 1/100 s ... a ajuster ... augmenter = accelerer 16Mhz
;Vitesse 64 Mhz
;setfreq M64
;hsersetup B2400_64, %10 ' 2400 baud, inverted TXD pour afficheur OLED 133Y : LCD
;settimer 63041

; --------------- Initialisation configuration
dirsB=%10111100        ' B2 -> B5 = sorties : BCD + B.7 = Timeout TX temps
dirsC=%00111110        ' C1 -> C5 = sorties : afficheur actif 1 -> 5 (ne pas utiliser C.6 : IN only)

symbol chiffre=b6
symbol digit=b7
symbol decimale=b8    ' 1=affiche des decimales
symbol tx=b9        ' 1=Timeout TX temps chrono : ULN 2803 inverse
;b10 -> b16 : reception temps du chrono via TX serie
symbol checksum=b17    ' Calcul du checksum du temps recu
symbol txtexte=b18    ' Affiche le resultat du TX au LCD : *, ? ou :

symbol val=w13        ' Temps du chrono afficheur (fille)
symbol chrono=w14        ' Temps recu par le chrono maitre et affichage tous les 1/10
symbol val_interrupt=w15

symbol cmd=pinB.0        ' 1=START - 0=STOP
symbol txled=pinB.7    ' Led TX temps timeout
symbol LCD=C.0         ' Pin C.0 (Out) : NE PAS MODIFIER -> sortie serie afficheur LCD (HSEROUT) : 2.400 baud

; --------------- initialisation Chrono
pause 1500
hserout LCD,(254,128," Afficheur Ext. ")    'affichage 1ere ligne
hserout LCD,(254,192," Demarrage ...  ")    'affichage 2me ligne
pause 4000                        'Attente demarrage complet chrono mere

txtexte=42                        ' Affcichage "*" LCD
hserout LCD,(254,192,"Temps ",txtexte,"         ")    'affichage 2me ligne
decimale=1                        ' Affichage des centiemes autorise
timer=0

hintsetup %00000010                ' Interrupt1 (B.0) sur front descendant

; --------------- Chrono
Do
    gosub affich            ' Affichage du temps
    setintflags %00000010, %00000010    ' Activation de l'interruption du STOP
    
    b10=0                    ' Pas de temps du Chrono mere
    decimale=0                ' Ne pas afficher les decimales choisies dans 'gosub affich'
    chrono=0

    do                    ' Boucle d'attente START
    loop while cmd=0
    
    timer=0
    txtexte=42                ' Affcichage "*" LCD
    tx=0                    ' Etat de la led TX temps : eteindre
    txled=tx                ' Eteindre led TX

    do                    ' Chrono demarre
        val=timer            ' Lecture du temps
        if val>=chrono then
            gosub affich    ' Affichage du temps tous les 1/10
            chrono=val+10
        end if
    loop while hint1flag=0

    txled=tx                    ' Affichage TX temps OK ou pas
    decimale=1                ' Affichage des centiemes autorise
    hint1flag=0                ' Remise à zero du flag de l'interruption
loop
;----------------------------------------------
interrupt:
    val=timer
    
    serin [800],B.6,N9600_16,("t"),b10,b11,b12,b13,b14,b15,b16
    checksum=b11+1+b12+2+b13+3+b14+4+b15+5-48
    if b10="s" and checksum=b16 then    ' Verification envoi du temps
        val=b11 - 48 * 10 + b12 - 48 * 10 + b13 - 48 * 10 + b14 - 48 * 10 + b15 - 48
        txtexte=58            ' Affcichage ":" LCD
    else
        tx=1                    ' Etat led TX temps : pas de reception d'un temps -> allumer
        txtexte=63            ' Affichage "?" LCD
    endif
return
; --------------- Sous-routines
affich:
    if decimale=0 then
        val=1/10000*10+1*val    ' Coeficient de correction horloge
    end if

    bintoascii val, b1,b2,b3,b4,b5
    hserout LCD,(254,198,txtexte," ",b1,b2,b3,",",b4,b5," s")    'affichage temps -> 2m ligne
    
    if decimale=0 then    ' Eteindre digit : cf ci-dessous les decimales a eteindre
        ;b4=63        ' Les diziemes : 15+48
        b5=63            ' Les centiemes : 15+48
    end if

    digit=%00011110        ' Centiemes : C.7
        chiffre=b5-48
        gosub affchiffre
    digit=%10001110        ' Diziemes : C.4
        chiffre=b4-48
        gosub affchiffre
    digit=%10010110        ' Secondes : C.3
        chiffre=b3-48
        gosub affchiffre
    digit=%10011010        ' 10 secondes : C.2
        chiffre=b2-48
        gosub affchiffre
    digit=%10011100        ' 100 secondes : C.1
        chiffre=b1-48
        gosub affchiffre
    return

affchiffre:
    pinsB=4*chiffre        ' Chiffre en BCD sur sorties B2 -> B5 : x4 pour commencer au bit 3
    txled=tx            ' Maintien la led TX dans son etat apres le pinsB
    pinsC=digit            ' Selection du digit actif
    pause 1
    pinsC=%00111110        ' Reset commande digit : latch afficheurs
    return
Comment fais-tu pour colorier ton code ? C'est plus facile à lire !
 
Last edited:
Top