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....
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
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
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.
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é
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...
C’est franchement sympa comme projet. J’ai pris le temps de tout lire et je m’incline. Un grand bravo.
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...)
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.
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.
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)
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 Je vous passe le code (c'est pas de moi mais de ChatGPT ) et voici le résultat (je rappelle que je n'utilise que les 2voies gaz et direction du vehicule)
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 !
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); } }