r le millavois Posté(e) Mars 13, 2021 Posté(e) Mars 13, 2021 Bonjour à tous je suis en 1ère STI2D, j'ai un projet à faire, je doit calculer la vitesse linéaire d'une trottinette. Pour le faire j'ai un capteur "MH-Sensor-Series" or je n'ai pas réussi de code Arduino pour cela. Pouvez vous m'aider? Merci d'avance
PPAC Posté(e) Mars 13, 2021 Posté(e) Mars 13, 2021 Salutation ! Je ne suis que débutant avec Arduino mais on sais jamais ... A tu a trouvé de la doc. sur t'on capteur avec des exemples de code Arduino ? Tu bloc sur quoi ? le codage du sketch, le montage du circuit ? Tu a quoi comme arduino un nano, Uno ... ?
r le millavois Posté(e) Mars 13, 2021 Auteur Posté(e) Mars 13, 2021 je te remercie de ta réponse rapide. j'ai une Arduino UNO branchement: VCC->+5v GND->GND(0v) D0->D2 de l'Arduino j'ai joins une datasheet que j'ai trouvée sur mon capteur j'ai écrit ce code, mais il ne fonctionne pas, aurait tu une idée? int a=0; int tempo=0; void setup() { pinMode(2,INPUT); Serial.begin(9600); } void loop() { if (digitalRead(2)==1) { a=a+1; } if(tempo>=1000) { tempo=0; a=0; } Serial.print("a="); Serial.print(a); Serial.println(" tr"); Serial.print("tempo="); Serial.print(tempo); Serial.println("ms"); Serial.println(" "); delay(100); tempo=tempo+100; } dattasheetmodule.pdf
PPAC Posté(e) Mars 13, 2021 Posté(e) Mars 13, 2021 @r le millavois le code semble mal collé ou alors vraiment incomplet ! drop plutôt le fichier ! Tu a déjà codé ? en C ou Java ? Tu a quelle niveau en codage ?
r le millavois Posté(e) Mars 13, 2021 Auteur Posté(e) Mars 13, 2021 Il y a 12 heures, PPAC a dit : @r le millavois le code semble mal collé ou alors vraiment incomplet ! drop plutôt le fichier ! Tu a déjà codé ? en C ou Java ? Tu a quelle niveau en codage ? non je viens de commencer le codage Il y a 12 heures, remibora a dit : Salut, Tu as un exemple ici. mais ce n'est pas le même capteur, fonctionne t'il de la même manière. je ne comprend pas la fonction "timeold", peut tu m'éclairer?
PPAC Posté(e) Mars 13, 2021 Posté(e) Mars 13, 2021 (modifié) Une bonne pratique ai de mettre une entête du genre : /* Petit example d'entête pour un programme arduino Fichier : monfichier.ino Version : 0 Dernière modification : 13/02/2021 Auteur : PPAC Description : .... Connexion(s) / branchement: VCC->+5v GND->GND(0v) D0->D2 de l'Arduino */ // Déclaration des variables //... // Boucle principal void loop(){ ... } Modifié (le) Mars 13, 2021 par PPAC
remibora Posté(e) Mars 13, 2021 Posté(e) Mars 13, 2021 il y a 1 minute, r le millavois a dit : ce n'est pas le même capteur, fonctionne t'il de la même manière oui puisqu'il te donne des changements d'état à chaque fois qu'un élément passe devant le détecteur. il y a 2 minutes, r le millavois a dit : timeold c'est le temps avant la tempo de 1000ms = 1s. Tu fais la conversion: nb tour/s = rpmcount / (nb de changement d'état sur ta roue codeuse / tour) / (temps) avec temps = millis() - timeold 1
PPAC Posté(e) Mars 13, 2021 Posté(e) Mars 13, 2021 (modifié) nop pas exactement le même capteur mais pour le codage il faut souvent regarder d'autre exemple pour trouver des idées / solutions / techniques ... timeold n'ai pas une fonction juste une variable ... Modifié (le) Mars 13, 2021 par PPAC
r le millavois Posté(e) Mars 13, 2021 Auteur Posté(e) Mars 13, 2021 merci pour ces précisions. donc en théorie si je téléverse ce programme ca me donne la vitesse angulaire en tr/minute? Il y a 12 heures, r le millavois a dit : merci pour ces précisions. donc en théorie si je téléverse ce programme ca me donne la vitesse angulaire en tr/minute? /* Fichier : test_RPM Version : 0 Dernière modification : 13/03/2021 Auteur : r le millavois Description : vitesse angulaire Connexion(s) / branchement: VCC->+5v GND->GND(0v) D0->D2 de l'Arduino*/ int ledPin = 13; // IR LED connected to digital pin 13 int statusPin = 12; // LED connected to digital pin 12 volatile byte rpmcount; volatile int status; unsigned int rpm; unsigned long timeold; void rpm_fun() { //Each rotation, this interrupt function is run twice, so take that into consideration for //calculating RPM //Update count rpmcount++; //Toggle status LED if (status == LOW) { status = HIGH; } else { status = LOW; } digitalWrite(statusPin, status); } void setup() { Serial.begin(9600); //Interrupt 0 is digital pin 2, so that is where the IR detector is connected //Triggers on FALLING (change from HIGH to LOW) attachInterrupt(0, rpm_fun, FALLING); //Turn on IR LED pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH); //Use statusPin to flash along with interrupts pinMode(statusPin, OUTPUT); rpmcount = 0; rpm = 0; timeold = 0; status = LOW; } void loop() { //Update RPM every second delay(1000); //Don't process interrupts during calculations detachInterrupt(0); //Note that this would be 60*1000/(millis() - timeold)*rpmcount if the interrupt //happened once per revolution instead of twice. Other multiples could be used //for multi-bladed propellers or fans rpm = 30*1000/(millis() - timeold)*rpmcount; timeold = millis(); rpmcount = 0; //Write it out to serial port Serial.println(rpm,DEC); //Restart the interrupt processing attachInterrupt(0, rpm_fun, FALLING); }
PPAC Posté(e) Mars 13, 2021 Posté(e) Mars 13, 2021 (modifié) Avec les bon PIN pour les connexions a ton capteur ... pourquoi pas ... Edit : prend bien le temps de le comprendre, plusieurs lecture , de rechercher se que tu ne comprend pas ... Modifié (le) Mars 13, 2021 par PPAC 1
r le millavois Posté(e) Mars 13, 2021 Auteur Posté(e) Mars 13, 2021 donc je dois brancher mon capteur au pin 12 c'est ca?
remibora Posté(e) Mars 13, 2021 Posté(e) Mars 13, 2021 (modifié) Si tu connectes la sortie du détecteur sur la pin 2 et que tu as 2 impulsions par tour alors tu auras la vitesse en tour/min. Les pins 12 et 13 (et tout ce qui s'y rapporte) sont inutiles dans ton cas Modifié (le) Mars 13, 2021 par remibora 1
r le millavois Posté(e) Mars 13, 2021 Auteur Posté(e) Mars 13, 2021 excusez moi mais je suis vraiment débutant dans ce domaine et je ne comprend toujours pas comment je doit brancher mon capteur
PPAC Posté(e) Mars 13, 2021 Posté(e) Mars 13, 2021 (modifié) Ba en fait là je suis moi aussi un peux dépassé ... il me faut plus de temps et de relecture pour être certain .... Puis il fraudais que tu comprenne bien ceci : //Interrupt 0 is digital pin 2, so that is where the IR detector is connected //Triggers on FALLING (change from HIGH to LOW) attachInterrupt(0, rpm_fun, FALLING); Modifié (le) Mars 13, 2021 par PPAC
remibora Posté(e) Mars 13, 2021 Posté(e) Mars 13, 2021 (modifié) Le principe ici est d'utiliser une interruption (int0 = sous-programme appelé à chaque front descendant de D2), qui va incrémenter un compteur (rpmcount) à chaque front descendant (Falling) de l'entrée D2 (l'interruption 0 est liée à cette entrée par définition de l'interruption 0): attachInterrupt(0, rpm_fun, FALLING); Modifié (le) Mars 13, 2021 par remibora 1
r le millavois Posté(e) Mars 13, 2021 Auteur Posté(e) Mars 13, 2021 donc y aurait il un code simple qui donne la vitesse en RPM en quelques lignes avec mon capteur connecté au pin 2.
PPAC Posté(e) Mars 13, 2021 Posté(e) Mars 13, 2021 Prend le temps pour chaque ligne, de bien comprendre se quelle fait ! ajoute des commentaires pour faciliter plus tard la relecture / compréhension ... même mettre un commentaire genre // ba là je comprend pas ... cela t'aidera a retrouver plus vite se que tu devras chercher dans des doc de référence.
remibora Posté(e) Mars 13, 2021 Posté(e) Mars 13, 2021 (modifié) il y a 10 minutes, r le millavois a dit : y aurait il un code simple qui donne la vitesse en RPM en quelques lignes avec mon capteur connecté au pin 2 lol, il est pas bien celui-là (sans la gestion des pins 12 et 13)? Citation void rpm_fun() { rpmcount++; //Toggle status LED } void setup() { Serial.begin(9600); //Interrupt 0 is digital pin 2, so that is where the IR detector is connected, Triggers on FALLING (change from HIGH to LOW) attachInterrupt(0, rpm_fun, FALLING); //incremente le compteur rpmcount à chaque front descendant de D2 rpmcount = 0; rpm = 0; timeold = 0; } void loop() { //Update RPM every second delay(1000); //Do not post process interrupts during calculations detachInterrupt(0); rpm = 30*1000/(millis() - timeold)*rpmcount; timeold = millis(); rpmcount = 0; //Write it out to serial port Serial.println(rpm,DEC); //Restart the interrupt processing attachInterrupt(0, rpm_fun, FALLING); } il y a 9 minutes, r le millavois a dit : quel doc de référence? celle-ci par exemple. Modifié (le) Mars 13, 2021 par remibora
PPAC Posté(e) Mars 13, 2021 Posté(e) Mars 13, 2021 (modifié) par exemple : https://www.arduino.cc/reference/en/ pour les fonctions arduino ! Oui @remiborasemble te donner une solution clé en main mais il serai judicieux de la comprendre parfaitement ! Modifié (le) Mars 13, 2021 par PPAC 1
r le millavois Posté(e) Mars 13, 2021 Auteur Posté(e) Mars 13, 2021 Il y a 11 heures, remibora a dit : donc le code qu'il m'a donné devrais fonctionner? le logiciel d'Arduino me dit que rpmcount n'est pas déclarée
PPAC Posté(e) Mars 13, 2021 Posté(e) Mars 13, 2021 (modifié) ba il fraudais que tu arrive a le déterminer toi même ! sinon tu n'aura pas appris grand chose ! @r le millavois il dois te manquer l'entête et la déclaration des variables ... Modifié (le) Mars 13, 2021 par PPAC
r le millavois Posté(e) Mars 13, 2021 Auteur Posté(e) Mars 13, 2021 j'ai essayé de rajouter int rpmcount = 0; dans la void loop pour déclarer rpmcount sauf que les erreurs s'enchaines
remibora Posté(e) Mars 13, 2021 Posté(e) Mars 13, 2021 Comme il est tard et qu'on va pas y passer la nuit, il n'y a qu'à ajouter ces 2 lignes tout en haut: int rpmcount,rpm; long timeold; 1
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant