IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Lidar et Lidar TF 03


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    Par défaut Lidar et Lidar TF 03
    Bonjour,

    concernant mon idée de radar avec le capteur ULtra son Sick...
    j'ai trouvé un Radar Lidar.... étanche et pas cher...
    il utilise comme protocole de com:Interface de communication : UART / RS485 / IO.
    on peux faire un truc avec un arduino nano?
    le modele c'est le TF 03 ( descriptif sur amazon)

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    Je suppose que c'est ce modèle (on le trouve moins cher en chine sur eBay (164€ au lieu de 239€) mais délais de livraisons un peu longs)
    Nom : Lidar.png
Affichages : 766
Taille : 97,9 Ko

    Je ne connais pas ce module, mais j'ai trouvé une documentation

    Si vous prenez un TF03-100 il est en mode série par défaut en TTL (et peut supporter un mode CAN par configuration)
    le TF03-100 RS485/RS232 serait celui qui supporte le RS485/RS232.

    ==> avec votre Arduino il faut prendre le premier, un TF03-100 "tout court" et connecter les pins 1 (Vcc), 5 (Rx), 6 (Tx) et 7 (GND). Il s'alimente en 5V et nécessite 180mA donc on peut l'alimenter directement depuis la broche 5V d'un Arduino.

    Par défaut il communique à 115200 bauds et envoie 100 trames par seconde - c'est assez élevé et on sera ennuyé (perte de trames) si on utilise SoftwareSerial comme avec le GPS (qui n'était qu'à 9600 bauds). Il faudra donc le connecter sur le port série matériel de l'Arduino, ce qui veut dire une petite manipulation lors de l'installation du logiciel: il faudra débrancher (ou isoler) le TF-03. Ça peut se faire en prévoyant des cavaliers qui connecteront les pins 0 et 1 au Tx/Rx du TF03-100.

    Quand on charge le soft, on enlève les cavaliers, puis on les remet pour l'usage. A priori ce n'est pas super contraignant, on ne fait cela qu'une seule fois.

    Ça veut dire aussi qu'on ne peut plus utiliser la console Série comme sortie de debug - sauf à bidouiller un peu, on pourrait ne pas connecter le Tx de l'Arduino au TF03-100 et le garder pour la communication avec la console série si on n'a pas besoin d'envoyer de commandes de configuration à ce module.

    Sinon il faut prendre un Arduino qui aurait 2 ports séries hardware comme une MEGA (mais c'est gros) ou d'autres type MKR ou ESP32 mais ils sont en 3.3V et il faudrait rajouter une adaptation de tension sur les lignes de communication.

    Sur la page de DFRobot ils ont même une bibliothèque pour gérer le protocole (communication en binaire)...

    Bref, si ces bibliothèques sont robustes, ce n'est pas difficile à construire

  3. #3
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    Citation Envoyé par Stantedy Voir le message
    bon on s'y colle...?
    comment ca ce passe pour les beep...? au fur a mesure, les beep deviennent de plus en plus rapprochés?
    sur le petit nano vous arrivez donc a faire tourner l'animal?
    Salut - oui pour les beeps on peut les faire en fonction de la distance: plus la distance est courte, plus les beeps sont rapprochés et en dessous d'une certaine distance ça beep en continu et au dessus d'une certaine distance, ça ne beep pas.

    Oui un Nano va gérer cela sans problème. Je n'ai pas besoin du module pour développer le code, ça n'a pas l'air compliqué, essayez cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    const byte buzzPin = 8;
    const unsigned int toneFreq = 500;
    const unsigned int maxDistanceBeep = 1000;  // in cm. Start beeping if distance less than 10m
    const unsigned int minDistanceBeep =   40;  // in cm. continuous beep if distance less than 40cm
     
    uint16_t distance = 2 * maxDistanceBeep;
     
    // very crude TF03-100 reading interface based on https://acroname.com/sites/default/files/assets/tf03_product_manual_v0.4_en.pdf
    //  protocol: receive at 115200 bauds 8N1, (100Hz by default)
    //    Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
    //    0x59  0x59  dLSB  dMSB  xxxx  xxxx  xxxx  xxxx  cksum
    //  with Low 8 bits of cksum = Byte0 + Byte2 +... + Byte7
     
    enum : byte {START0, START1, DLOW, DHIGH, BYTE4, BYTE5, BYTE6, BYTE7, CKSUM} parserState = START0;
     
    bool acquisition() {
      static uint16_t d = 0;
      static byte checksum  = 0 ;
      bool acquired = false;
     
      int rec = Serial.read();
      if (rec != -1) {
        uint16_t wordReceived = rec & 0xFF;
        switch (parserState) {
          case START0:
            if (wordReceived == 0x59) parserState = START1;
            break;
     
          case START1:
            if (wordReceived == 0x59) {
              d = 0;
              checksum  = 0x59 + 0x59;
              parserState = DLOW;
            }
            else parserState = START0;
            break;
     
          case DLOW:
            d = wordReceived;
            checksum  += wordReceived;
            parserState = DHIGH;
            break;
     
          case DHIGH:
            d |= (wordReceived << 8);
            checksum  += wordReceived;
            parserState = BYTE4;
            break;
     
          case BYTE4:
            checksum  += wordReceived;
            parserState = BYTE5;
            break;
     
          case BYTE5:
            checksum  += wordReceived;
            parserState = BYTE6;
            break;
     
          case BYTE6:
            checksum  += wordReceived;
            parserState = BYTE7;
            break;
     
          case BYTE7:
            checksum  += wordReceived;
            parserState = CKSUM;
            break;
     
          case CKSUM:
            if (wordReceived == checksum) {
              distance = d;
              acquired = true;
            }
            parserState = START0;
            break;
        }
      }
      return acquired;
    }
     
    void audioFeedback(uint16_t d)
    {
      static uint32_t lastTrigger;
     
      if (d > maxDistanceBeep) noTone(buzzPin);
      else if (d < minDistanceBeep) tone(buzzPin, toneFreq);
      else {
        if (millis() - lastTrigger >= d) {
          tone(buzzPin, toneFreq, 30);
          lastTrigger = millis();
        }
      }
    }
     
     
    void setup() {
      Serial.begin(115200);
      pinMode(buzzPin, OUTPUT);
      pinMode(LED_BUILTIN, OUTPUT);
    }
     
    void loop() {
      acquisition();
      audioFeedback(distance);
    }
    il n'y a pas besoin de librairies tierces, le protocole est simple donc je le lis directement.

    Vous chargez le code sur la Nano sans matériel accroché

    - Vous connectez un buzzer sur la pin 8, c'est défini au début du code avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const byte buzzPin = 8;
    - Vous connectez les 4 broches du Lidar: (cf documentation)
    Nom : doc.png
Affichages : 707
Taille : 198,5 Ko

    (en pratique la connexion "Brown --> 1 (Tx)" n'est pas utilisée car on n'envoie jamais rien au module donc la connexion n'est pas obligatoire)

    Vous alimentez le tout. ATTENTION si alimentation par USB, ne pas ouvrir la console série de l'IDE Arduino.

    Si je ne me suis pas trompé, vous pointez le Lidar vers un mur et:
    - à plus de 10m pas de bruit
    - entre 10m et 40cm des beeps de plus en plus rapprochés
    - sous 40cm un beep continu


    Curieux de savoir si ça fonctionne

    (Si vous avez un Arduino Mega sous la main, je peux modifier la version pour qu'on puisse faire du debug)

  4. #4
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    Par défaut Jay M
    Salut Jay

    est ce qu'on peux "corser" les choses....

    allez j'explique...

    Note: je base tout le systeme (Alarme, Gps et ce petit dernier) qu'il n'y a quasiment aucun câblage sur le bateau, tout au plus une alim pour ce qui est gourmand en énergie...
    ET du super petit....

    situation physique du matériel:

    - radar a l'arriere
    -on/off de mise en service du radar au poste pilote (milieu du bateau)

    le on/off ce fait sans fil. (ca c'est facile et super fiable)

    j'ai besoin du beep a coté du pilote

    qu'est qu'on fait, une communication TXD/RXD sans fil entre de Lidar et l'arduino? ou uniquement pour le Beep? ou alors un mega beep (genre camion des éboueurs)

    pourquoi: le Lidar est IP67 donc pas de soucis mais par contre l'arduino c'est autre chose....

    pour les distances: on commence a beeper lent a 10 m
    entre les 2 on accelere au fur et a mesure (enfin ci c'est possible!)
    et Beep continu arrivé a 3 metres

  5. #5
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    Salut

    Il faudrait voir si vous voulez du étanche (peut être immergé longtemps IP 68) ou juste résistant aux intempéries (IP66 ou IP67). En IP67 vous résistez aux poussières, aux paquets de mer et à une immersion courte jusqu’à 1m (quand le produit est neuf, les joints ayant tendance à s’abîmer dans le temps).

    Celui que vous avez choisi est IP67 donc devrait aller. Ensuite son cône reste très directif. Faudrait voir si le Module Sonar XL-MaxSonar-WRCA1 n’est pas moins focused

  6. #6
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    Par défaut Jay M
    oui celui que j'attend c'est surtout pour faire des test (on a cette chance d'avoir des bateaux sous la main!!!)
    IP 67 est largement suffisant... c'est surtout la distance et etre sur que l'annimal parle Arduino! ils ont une chier de modele qui ce ressemble tous !

    ah oui j'ai fait des test avec un ensemble tx/rx 433Mhz pour le report des beep(je me suis servi du Lidar)...
    ca marche bien sans latence, bon j'ai fait ca a "la v'la comme j'te pousse" sortie arduino en attaque entrée data du TX... et en sortie du RX une led serie avec une 470ohms

    le buzzer est deseperant malgrés un pilotage par transistor... donc faut que je trouve une combine pour que ca couine un peux plus... mais alim en 3.6v...

  7. #7
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    pour les distances min et max, il suffit de modifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const unsigned int maxDistanceBeep = 1000;  // in cm. Start beeping if distance less than 10m
    const unsigned int minDistanceBeep =   40;  // in cm. continuous beep if distance less than 40cm
    ce sont les valeurs en cm

    Pour l'instant j'utilise la valeur de la distance (en cm) pour faire une pause entre deux beeps (en ms).

    par exemple à 4m (400cm) il y a 400ms entre 2 beeps. c'est la ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        if (millis() - lastTrigger >= d) {
    qui dit que si le temps écoulé en ms depuis le dernier beep est plus grand que la valeur de la distance alors on re-beep.

    Le "silence" entre deux beep est donc linéairement proportionel à la distance. Si on veut faire un truc plus chiadé que du bête linéaire, faut mettre une petite formule de calcul qui dit combien attendre en ms en fonction de la distance d

    Pour le plus "corsé":

    le on/off ce fait sans fil. (ca c'est facile et super fiable)
    Vous êtes en Infra rouge ou en radio ? (en radio je pense que vous risque de prendre toutes les perturbations électromagnétiques des moteurs, ça risque de ne pas être fiable pour une communication soutenue à 115200 bauds)

    ce serait simple de modifier le code pour qu'une PIN envoie une impulsion à chaque fois qu'un BEEP doit avoir lieu. Si vous savez relayer cette impulsion sans fil vers votre central pour que le beep soit là bas, c'est envisageable. possible ?

  8. #8
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    Par défaut Jay M
    oui on est d'accord... (je savais deja qu'on allez l’être...)

    je me démerde a juste transmettre le signal du beep et je chiade le coffret pour l'arduino...

  9. #9
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    c'est surtout la distance et etre sur que l'annimal parle Arduino! ils ont une chier de modele qui ce ressemble tous !
    s’ils parlent sur voie série alors c’est similaire à ce qu’on a déjà. Si c’est une tension faut soigner l’alimentation (ADC pas toujours super précis). Si c’est en PWM c’est un plus pénible

    Pour le buzzer vous avez un étage d’amplification? Faudrait booster la tension en entrée du transistor sinon regarder des composants plus actifs (j’ai vu cela - Keyestudio 8002B Power Amplifier Module Speaker Buzzer, mais jamais testé)

  10. #10
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    Par défaut Jay M
    oui apparemment c'est du serie...

    chez Maxbotix le fabriquant je crois j'ai trouvé ca:https://www.maxbotix.com/documents/A...r_AN_Chain.ino

  11. #11
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    Citation Envoyé par Stantedy Voir le message
    oui apparemment c'est du serie...

    chez Maxbotix le fabriquant je crois j'ai trouvé ca:https://www.maxbotix.com/documents/A...r_AN_Chain.ino
    Dans le lien que vous donnez ils ne lisent pas en série, mais en tension analogique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void read_sensor(){
      //Used to read in the analog voltage output that is being sent by the XL-MaxSonar device.
      //Scale factor is (Vcc/1024) per centimeter. A 5V supply yields ~4.9mV/cm for standard range sensors
      anVolt1 = analogRead(anPin1);
      anVolt2 = analogRead(anPin2);
      anVolt3 = analogRead(anPin3);
    }
    il semble que les modules sont configurables, faudrait voir comment

    EDIT: j'ai trouvé la datasheet du constructeur, il n'y a rien à configurer il y a juste différentes pins avec différentes informations.
    Nom : doc.png
Affichages : 246
Taille : 217,0 Ko
    ils disent
    Pin 5-Serial Output: The MB736X sensors have an RS232 data format (with 0V to Vcc levels) and the MB738X sensors have a TTL outputs. The output is an ASCII capital “R”, followed by four ASCII character digits representing the range in millimeters, followed by a carriage return (ASCII 13). The maximum range reported is 4999 mm (5-meter models) or 9998 mm (10-meter models). A range value of 5000 or 9999 corresponds to no target being detected in the field of view.
    The serial data format is 9600 baud, 8 data bits, no parity, with one stop bit (9600-8-N-1). Because the data is presented in a binary data format, the serial output is most accurate .
    il faut s'assurer de prendre un MB738X sinon il faudra en plus un convertisseur RS232

    ils disent aussi qu'il faut que l'alimentation soit "clean"
    Typically adding a 100uF capacitor at the sensor between the V+ and GND pins will correct most power related electrical noise issues

  12. #12
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    Le lecteur est configuré en 10Hz, donc vous ne lisez que 10 fois par seconde. si vous allez vite effectivement ça peut ne pas être suffisant.
    Il faudrait lire la doc pour voir ce qu'il retourne s'il est trop proche ou trop loin (9999 dans les 2 cas ?)

    on va avoir du mal à gérer plusieurs ports séries en parallèle. On peut utiliser 2 capteurs en même temps si on lit le second en analogique. Ce sera sans doute moins précis qu'une valeur numérique émise "en clair"

  13. #13
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    Par défaut Jay M
    j'ai peux etre une idée...mais j'ai besoin de votre savoir ....

    mais d'abord une question: en analogique on a des données Brut et rapide?
    si oui....

    imaginons, l'arduino lis les données distances du capteur en analogiques
    on defini 6 paliers 8;7;6;5;4;3m a chaque palier on active une sortie de l'arduino .... (enfin si c'est possible!)

  14. #14
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    Par défaut Jay M
    a moins que l'arduino ne soit capable de gérer ces paliers au niveau du buzzer... a ce moment la on a plus qu'a transmettre l’info a 2 endroit ...

    en gros: a 8metres- beep toutes les 6 secondes admettons
    arrivé a 7 metres beep toutes les 5 secondes
    puis 6 puis 5 puis 4metres ...etc etc...

  15. #15
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Bonjour,
    Citation Envoyé par Jay M Voir le message
    Pour le plus "corsé":

    Vous êtes en Infra rouge ou en radio ? (en radio je pense que vous risque de prendre toutes les perturbations électromagnétiques des moteurs, ça risque de ne pas être fiable pour une communication soutenue à 115200 bauds)
    Excellente remarque, oui il y aura potentiellement des problèmes de compatibilité électromagnétique et il faut savoir que les bandes ISM qu'utilisent les petits modules radio (433MHz, 868MHz, 2,4GHz, ...) sont très chargés.

    Les télécommandes de portails ou autres bips, la vidéo surveillance, les fours à micro ondes, les alarmes, le bluetooth, le Wifi, etc sont dans les bandes ISM. On pourrait très bien imaginer qu'un téléphone, avec le bluetooth activé, dans la poche de quelqu'un aux commandes du bateaux puisse rompre la communication 2.4GHz d'un petit module nrf24l01nrf.

    Ce serait problématique car pas de bip en reculant amènerait à un choc.

    Pour avoir conçu des systèmes avec de la sûreté de fonctionnement le cas du radar de recul qu'on croit fonctionner alors que non est très embêtant car il causera presque systématiquement un accident puisqu'on s'y fie (on aura tendance à moins regarder et plus écouter pour juger de la distance). En sûreté de fonctionnement on amène dans le soft la notion de diagnostic et mode dégradé, c'est à dire que le Arduino prévient la personne aux commandes que le radar est inopérant et le pilote comprend qu'il doit ouvrir les yeux à la place de ses oreilles.

  16. #16
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    OK

    donc la pin du buzzer devient une pin qui indique s'il faut faire un beep.
    - LOW = pas de beep
    - HIGH = beep

    donc pour qu'il n'y ait qu'une seule impulsion (et pas un PWM sur la pin du buzzer) vous pouvez essayez le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    const byte buzzPin = 8;
    const unsigned int toneFreq = 500;
    const unsigned int maxDistanceBeep = 1000;  // in cm. Start beeping if distance less than 10m
    const unsigned int minDistanceBeep =   40;  // in cm. continuous beep if distance less than 40cm
     
    uint16_t distance = 2 * maxDistanceBeep;
     
    // very crude TF03-100 reading interface based on https://acroname.com/sites/default/files/assets/tf03_product_manual_v0.4_en.pdf
    //  protocol: receive at 115200 bauds 8N1, (100Hz by default)
    //    Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8
    //    0x59  0x59  dLSB  dMSB  xxxx  xxxx  xxxx  xxxx  cksum
    //  with Low 8 bits of cksum = Byte0 + Byte2 +... + Byte7
     
    enum : byte {START0, START1, DLOW, DHIGH, BYTE4, BYTE5, BYTE6, BYTE7, CKSUM} parserState = START0;
     
    bool acquisition() {
      static uint16_t d = 0;
      static byte checksum  = 0 ;
      bool acquired = false;
     
      int rec = Serial.read();
      if (rec != -1) {
        uint16_t wordReceived = rec & 0xFF;
        switch (parserState) {
          case START0:
            if (wordReceived == 0x59) parserState = START1;
            break;
     
          case START1:
            if (wordReceived == 0x59) {
              d = 0;
              checksum  = 0x59 + 0x59;
              parserState = DLOW;
            }
            else parserState = START0;
            break;
     
          case DLOW:
            d = wordReceived;
            checksum  += wordReceived;
            parserState = DHIGH;
            break;
     
          case DHIGH:
            d |= (wordReceived << 8);
            checksum  += wordReceived;
            parserState = BYTE4;
            break;
     
          case BYTE4:
            checksum  += wordReceived;
            parserState = BYTE5;
            break;
     
          case BYTE5:
            checksum  += wordReceived;
            parserState = BYTE6;
            break;
     
          case BYTE6:
            checksum  += wordReceived;
            parserState = BYTE7;
            break;
     
          case BYTE7:
            checksum  += wordReceived;
            parserState = CKSUM;
            break;
     
          case CKSUM:
            if (wordReceived == checksum) {
              distance = d;
              acquired = true;
            }
            parserState = START0;
            break;
        }
      }
      return acquired;
    }
     
    void audioFeedback(uint16_t d)
    {
      static uint32_t lastTrigger;
     
      if (d > maxDistanceBeep) digitalWrite(buzzPin, LOW); // pin LOW = pas de beep
      else if (d < minDistanceBeep) digitalWrite(buzzPin, HIGH); // pin HIGH = beep continu
      else {
        if (millis() - lastTrigger >= d) { // impulsion de 30ms sur la pin de sortie quand on doit faire un beep
          digitalWrite(buzzPin, HIGH);
          delay(30);
          digitalWrite(buzzPin, LOW);
          lastTrigger = millis();
        }
      }
    }
     
     
    void setup() {
      Serial.begin(115200);
      pinMode(buzzPin, OUTPUT);
      pinMode(LED_BUILTIN, OUTPUT);
    }
     
    void loop() {
      acquisition();
      audioFeedback(distance);
    }

  17. #17
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    Par défaut Jay M
    Bonjour Jay

    pour le renvois de beep j'ai trouvé ca... (ca consomme que dalle en veille ...)

    https://fr.aliexpress.com/item/32728...c00f8lbqa&mp=1

  18. #18
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    Les RF 433 Mhz ne se valent pas tous... en superhétérodyne c'est mieux mais ça reste pour du bidouillage où la notion de risque est limitée. (aucune garantie de distribution du message) Et comme le rappelle @Vincent - fréquence encombrée et perturbée.

    Sa remarque sur le mode dégradé est aussi bonne, dans mon code pour le moment il n'y a aucune alerte en cas d'erreur - c'est rajoutable sans trop de difficulté (par exemple alerte si pas de communication cohérente pendant plus d'une seconde - faut juste définir à quoi ressemble l'alerte)

    sinon un gros beep de camion poubelle ça peut avoir du bon

  19. #19
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    Par défaut Jay M
    Re...

    la fenetre de detection sur le Lidar est parametrable?

    je m'explique: le bateau equipé fait 5M de large

    donc la detection doit ce faire dans une fenetre de 5 m de Large, sur 10metres de long et sur en gros de la surface de l'eau a 2m de haut
    tout ca est parametrable dans le code?

  20. #20
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    Par défaut Jay M
    Bonjour Jay

    2 questions...

    j'ai vu qu'on pouvez mettre les arduino en mode sommeil...
    d’après vous qu'est qui est mieux couper l'alim ou indiquer via une Pin de se mettre en "sommeil"?

    concernant le Lidar et le renvoi du Beep...
    si on l'arduino Nano renvois l'info Beep Lidar et éventuellement un Beep pour le mode dégrader via un module Lora en 868Mhz a un petit arduino Micro...?
    car il serait bien (car je n'y avais pas pensé) de pouvoir envoyer le même beep a 2 endroit différents (certain bateau sont équipé de deux poste pilote (un principal et un en Fly Bridge a l’extérieur)...
    çà deviens compliqué mon histoire ...

    Ps: Bon Dimanche

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/05/2024, 11h11
  2. Réponses: 3
    Dernier message: 22/05/2020, 19h30
  3. [Débutant] I2c - NI 8451 - Lidar Lite v3 - write to register
    Par RT team dans le forum MATLAB
    Réponses: 0
    Dernier message: 28/02/2018, 10h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo