Projet PLS : Programmable Lighting System

Discussion dans 'Discussion Technique' créé par sawblade, 9 Février 2026.

  1. sawblade

    sawblade membre
    Membre du personnel MODERATEUR

    Inscrit:
    7 Novembre 2009
    Messages:
    11 837
    J'aime reçus:
    16 558
    Donc, montage repris en fonction sur la breadboard:
    Au passage on pourrait voir , si la photo était moins "artistique":
    - que l'Arduino est maintenant alimenté lui aussi par le BEC, plus par le port USB du PC
    - que l'on capte les 2 canaux CH1 et CH2, maintenant

    Je ferai un schéma propre quand ça sera plus avancé. Là on est vraiment en mode brouillon....

    [​IMG]
     
  2. sawblade

    sawblade membre
    Membre du personnel MODERATEUR

    Inscrit:
    7 Novembre 2009
    Messages:
    11 837
    J'aime reçus:
    16 558
    En version définitive, j'image les fils raccourcis au maximum, l'arduino ,le uln2803A et la carte du RX montés en sandwich, les signaux et alim repiqués sur le RX directement par soudure sur les point de soudure des broches. Donc un truc quand meme compact
     
  3. sawblade

    sawblade membre
    Membre du personnel MODERATEUR

    Inscrit:
    7 Novembre 2009
    Messages:
    11 837
    J'aime reçus:
    16 558
    Dans la foulée, j'ai modifié le code.
    - Déjà, j'ai supprimé des phénomènes d'oscillation que j'avais sur la fonction LED_STOP (clignotements intempestifs de la led STOP). Il suffit de conditionner l'allumage des led STOP a un passage suffisamment long de la voie des gaz en arrière pour éviter les clignotement intempestifs (valeur arbitraire de 0.10sec pour l'instant) et c'est réglé.
    - Ensuite, j'ai rajouté la fonction WARNING (je ne veux pas de CLIGNOS). Pour cela, l'arduino surveille la condition suivante:
    - SI gaz en arrière ET direction a droite PENDANT 3sec, ALORS la sortie dédiée aux WARNING clignote toutes les 0.5sec
    - SI la condition se reproduit , on désactive la sortie (mode impulsionnel TOGGLE)
    - SI rien, la sortie reste dans l'état précédent

    voici la vidéo test:
    https://youtube.com/shorts/epYH42E7oMM?feature=shared
     
    benjiv, Mud_master et deamoncrack aiment ça.
  4. Mud_master

    Mud_master membre

    Inscrit:
    31 Août 2021
    Messages:
    3 948
    J'aime reçus:
    12 620
    Ah oui effectivement, d'une simplicité enfantine :hihi::hihi::hihi::hihi:
     
    sawblade apprécie ceci.
  5. cactuszebest

    cactuszebest membre

    Inscrit:
    9 Décembre 2009
    Messages:
    485
    J'aime reçus:
    512
    Ce qui est bien, c'est qu'en minimisant les composants, tu pourras a terme realiser ton propre PCB en integrant directement l'atmega sans devoir utiliser un arduino complet.
    D'ailleurs c'est plus simple que cela en a l'air.
     
    sawblade apprécie ceci.
  6. sawblade

    sawblade membre
    Membre du personnel MODERATEUR

    Inscrit:
    7 Novembre 2009
    Messages:
    11 837
    J'aime reçus:
    16 558
    Et c'est pas exclu qu'à terme, ça finisse pas comme ça (y)
     
  7. sawblade

    sawblade membre
    Membre du personnel MODERATEUR

    Inscrit:
    7 Novembre 2009
    Messages:
    11 837
    J'aime reçus:
    16 558
    C'est le bazar comme ça , mais en vrai, y a que 4fils entre l'arduino et la voiture.
     
  8. MadDog

    MadDog membre

    Inscrit:
    23 Mars 2021
    Messages:
    155
    J'aime reçus:
    258
    Un peu comme celui de LaneBoys RC.
    https://github.com/laneboysrc/rc-light-controller
     
    sawblade apprécie ceci.
  9. sawblade

    sawblade membre
    Membre du personnel MODERATEUR

    Inscrit:
    7 Novembre 2009
    Messages:
    11 837
    J'aime reçus:
    16 558
    Oui.

    Mais ce n'est pas l'idée de ce projet précis.
    Le but ici, c'est vraiment de se baser sur un arduino, et de faire un truc à la fois personnalisé et accessible à n'importe qui. Ce n'est que de la logique, et l'aide de chatgpt pour la sémantique
    Pas de calcul, pas de choix de composants, pas de création de circuit imprimé
     
    #29 sawblade, 13 Février 2026
    Dernière édition: 13 Février 2026
  10. deamoncrack

    deamoncrack membre

    Inscrit:
    7 Mars 2022
    Messages:
    2 654
    J'aime reçus:
    9 464
    D'autant qu'en faisant faire les PCB par une boite comme JLCPCB ça vaut pas très cher, et comme ils fonctionnent par lots (le mini est de 10 pièces je crois) tu pourras fournir les membres du forum, par exemple... :humhum::D
     
  11. sawblade

    sawblade membre
    Membre du personnel MODERATEUR

    Inscrit:
    7 Novembre 2009
    Messages:
    11 837
    J'aime reçus:
    16 558
    Tu y crois, toi :D
     
    deamoncrack apprécie ceci.
  12. benjiv

    benjiv membre

    Inscrit:
    4 Janvier 2015
    Messages:
    5 552
    J'aime reçus:
    8 096
    C’est franchement sympa comme projet. J’ai pris le temps de tout lire et je m’incline. Un grand bravo.
     
    deamoncrack et sawblade aiment ça.
  13. sawblade

    sawblade membre
    Membre du personnel MODERATEUR

    Inscrit:
    7 Novembre 2009
    Messages:
    11 837
    J'aime reçus:
    16 558
    Merci beaucoup. Mais je n'ai pas tant de mérite. L'idée est vraiment de partager ça avec, et d'essayer de le rendre accessible.
    C'est d'ailleurs la raison pour laquelle il y a pas mal d'explication, et pas de code (pas encore...)
     
    benjiv apprécie ceci.
  14. benjiv

    benjiv membre

    Inscrit:
    4 Janvier 2015
    Messages:
    5 552
    J'aime reçus:
    8 096
    Je vais essayer de suivre. Et de participer si je peux.
    En fait ça me motive grave ce genre de projet. J’aime bien bidouiller de la puce du fil et un bout de code via des interfaces basiques.

    Ça doit me rappeler mes débuts en informatique avec mon Atari. :hihi::hihi:
     
    sawblade et deamoncrack aiment ça.
  15. Patcha

    Patcha membre

    Inscrit:
    29 Mars 2022
    Messages:
    15
    J'aime reçus:
    21
    je termine juste de lire le sujet, beau petit projet.
    tu peux aussi l'alimenter par la pin30 Vin, la tension d'entrée est alors comprise entre 7V et 15V.
    ( j'ai un nano alimenté directement depuis une batterie lipo en 3S)
    le problème est double en faisant comme ca.
    tes LED ne vont pas apprécier la surtension.
    tes sorties du nano ne vont pas apprécier la surintensité.(30mA par sortie grand max et un total de 240mA pour l'arduino)

    bon courage pour la suite, je vais suivre.
     
    sawblade apprécie ceci.
  16. sawblade

    sawblade membre
    Membre du personnel MODERATEUR

    Inscrit:
    7 Novembre 2009
    Messages:
    11 837
    J'aime reçus:
    16 558
    Pour la 1ere remarque, c'est plus simple pour moi d'utiliser la tension du bec: tout est câblé au même 2
    Quand à la deuxième, l'uln2803a peut faire passer jusqu'à 500mA en 50v, donc plus de soucis. Quand aux leds, à priori pas de soucis
    Je rajouterai une résistance uniquement pour l'éclairage réduit des feux arrière (quand pas de fonction stop)
     
  17. sawblade

    sawblade membre
    Membre du personnel MODERATEUR

    Inscrit:
    7 Novembre 2009
    Messages:
    11 837
    J'aime reçus:
    16 558
    Salut les copains, après une longue pause, j'ai repris ce petit montage

    Au programme:
    - rajouter une commande pour les phares
    - asservir à cette commande le servo de levée/descente des optiques
    - pas de mise au propre pour l'instant (ni pour le cablage, ni pour le code), tout est cablé a l'arrache, avec des fils de reprise sur les bornier d'origine (ce qui me pose regulierement des soucis, bien evidemment...)

    la commande de warning fonctionnant plutot bien, je fais la meme chose (mais volant a gauche cette fois) pour les phares:
    - une sortie de l'arduino fait commuter un sortie de l'ULN2803a pour les led des phares
    - une sortie directe de l'arduino envoie un signal pwm "qui va bien" sur le fil de signal du micro servo des blocs optiques, les +5V et 0V du servo etant pris depuis la prise servo d'origine sur la prise de BIND du RX
    Simple mais bordelique a la mise en service. faut que je trouve une façon propre de cables tout ça a la fin (n)

    Je vous passe le code (c'est pas de moi mais de ChatGPT :D) et voici le résultat (je rappelle que je n'utilise que les 2voies gaz et direction du vehicule)

     
    benjiv apprécie ceci.
  18. sawblade

    sawblade membre
    Membre du personnel MODERATEUR

    Inscrit:
    7 Novembre 2009
    Messages:
    11 837
    J'aime reçus:
    16 558
    La suite, quand je serai motivé :
    - differencier l'intensité des feux de position arrieres / feux stop (j'ai deja une idée, en mode gros flemmard...)
    - trouver une solution pour différencier une commande de stop d'une marche arriere (j'aurais voulu par la meme occasion rajouter les feux de recul, mais ils sont absents sur le vehicule, juste des leds blanche derriere un plastique rouge, donc l'effet est pas terrible... c'est mieux sur la mx5 d'ailleurs)
    - touver une solution de rangement qui passe sous la carrosserie, la place est comptée a cette échelle !
     
    RVB42 apprécie ceci.
  19. sawblade

    sawblade membre
    Membre du personnel MODERATEUR

    Inscrit:
    7 Novembre 2009
    Messages:
    11 837
    J'aime reçus:
    16 558
    Vu que j'ai pas le courage d'attaquer la soudure, je vous colle ici le code, dans l'état ou il est actuellement. on peut faire plus court, plus lisible, plus efficace, mais moi ca me va pour l'instant.Y aurait des bricoles à faire (faire correspondre les entrées de l'arduino avec le numéro de voie du RX, créer des fonctions et ensuite les appeler lors de la loop...) . A voir plus tard...
    Si besoin d'explications , n'hésitez pas, mais ne vous attendez pas a des reponses trop pointues, ce n'est pas le but. Je cherche a rester simple, accessible aux débutants comme moi

    C'est parti!

    #include <Servo.h>

    //=====================================================
    // ENTREES
    //=====================================================
    const byte ch2Pin = 2;
    const byte ch1Pin = 3;

    //=====================================================
    // SORTIES
    //=====================================================
    const byte outputD4 = 4;
    const byte outputD6 = 6;
    const byte outputD7 = 7;
    const byte servoPin = 8;

    //=====================================================

    Servo servo;

    //=====================================================
    // CONSTANTES
    //=====================================================

    const int SEUIL_BAS = 1400;
    const int SEUIL_HAUT = 1600;

    const unsigned long TEMPS_D4 = 50;
    const unsigned long TEMPS_TOGGLE = 3000;
    const unsigned long TEMPS_CLIGNOT = 500;

    //=====================================================
    // D4
    //=====================================================

    unsigned long d4Timer = 0;

    //=====================================================
    // D6
    //=====================================================

    bool d6Enable = false;
    bool d6State = false;

    unsigned long d6Timer = 0;
    unsigned long d6Blink = 0;

    bool d6WaitingRelease = false;

    //=====================================================
    // D7 / D8
    //=====================================================

    bool d78Enable = false;

    unsigned long d78Timer = 0;

    bool d78WaitingRelease = false;

    //=====================================================

    void setup()
    {
    pinMode(ch1Pin, INPUT);
    pinMode(ch2Pin, INPUT);

    pinMode(outputD4, OUTPUT);
    pinMode(outputD6, OUTPUT);
    pinMode(outputD7, OUTPUT);

    digitalWrite(outputD4, LOW);
    digitalWrite(outputD6, LOW);
    digitalWrite(outputD7, LOW);

    servo.attach(servoPin);

    // Position repos du servo
    servo.write(0);
    }

    //=====================================================

    void loop()
    {
    unsigned long now = millis();

    //-------------------------------------------------
    // Lecture radio
    //-------------------------------------------------

    unsigned long ch2 = pulseIn(ch2Pin, HIGH, 25000);
    unsigned long ch1 = pulseIn(ch1Pin, HIGH, 25000);


    //-------------------------------------------------
    // D4
    //-------------------------------------------------

    if (ch2 > 0 && ch2 < SEUIL_BAS)
    {
    if (d4Timer == 0)
    d4Timer = now;

    if (now - d4Timer >= TEMPS_D4)
    digitalWrite(outputD4, HIGH);
    }
    else
    {
    d4Timer = 0;
    digitalWrite(outputD4, LOW);
    }


    //-------------------------------------------------
    // TOGGLE D6
    //-------------------------------------------------

    if (ch2 > 0 &&
    ch1 > 0 &&
    ch2 < SEUIL_BAS &&
    ch1 < SEUIL_BAS)
    {
    if (d6Timer == 0)
    d6Timer = now;

    if (!d6WaitingRelease &&
    now - d6Timer >= TEMPS_TOGGLE)
    {
    d6Enable = !d6Enable;
    d6WaitingRelease = true;
    }
    }
    else
    {
    d6Timer = 0;
    }

    if (ch2 > SEUIL_BAS &&
    ch1 > SEUIL_BAS)
    {
    d6WaitingRelease = false;
    }


    //-------------------------------------------------
    // Clignotement D6
    //-------------------------------------------------

    if (d6Enable)
    {
    if (now - d6Blink >= TEMPS_CLIGNOT)
    {
    d6Blink = now;

    d6State = !d6State;

    digitalWrite(outputD6, d6State);
    }
    }
    else
    {
    d6State = false;
    digitalWrite(outputD6, LOW);
    }


    //-------------------------------------------------
    // TOGGLE D7 + SERVO
    // CONDITION : D2 < 1400 ET D3 = 0
    //-------------------------------------------------

    if (ch2 > 0 &&
    ch2 < SEUIL_BAS &&
    ch1 == 0)
    {
    if (d78Timer == 0)
    d78Timer = now;

    if (!d78WaitingRelease &&
    now - d78Timer >= TEMPS_TOGGLE)
    {
    d78Enable = !d78Enable;
    d78WaitingRelease = true;
    }
    }
    else
    {
    d78Timer = 0;
    }


    // Réarmement du toggle
    if (!(ch2 > 0 &&
    ch2 < SEUIL_BAS &&
    ch1 == 0))
    {
    d78WaitingRelease = false;
    }


    //-------------------------------------------------
    // SORTIES D7 + SERVO D8
    //-------------------------------------------------

    if (d78Enable)
    {
    digitalWrite(outputD7, HIGH);

    // Servo position repos 0°
    servo.write(180);
    }
    else
    {
    digitalWrite(outputD7, LOW);

    // Servo position 100%
    servo.write(0);
    }
    }
     

Partager cette page