Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - frederic

Pages: [1] 2
1
Vos projets / ASC 712 capteur à effet hall
« le: octobre 20, 2024, 03:10:54 pm »
Bonjour,

Je vous mets à disposition un sketch pour un va et viens analogique avec démarrage et arrêt progressif.
Matériels: 1 Arduino uno, 1 L298N, 3 ASC712 

Le code est pas de moi juste apporté quelque modification et ajout, il y a certainement mieux, mais sa fonctionne très bien,
J' espère que sa peut vous servir.
Si vous avez des modifications ou des améliorations à apporter pas de problème. 

#define VERSION "1.001.006"
#define SYS_ID "ACS712 Sensor Test"
const int pin = 1;
const int pin1 = 2;
const int pin2 = 3;
int pin8 = 8;
int ena = 9;
int in1 = 8;
int in2 = 7;
int vitesse ;
int direct ;


// Sampling Parameters
const unsigned long sampleTime = 58000UL; // 58 ms
const unsigned long numSamples = 300UL;
// sample interval is in microseconds
// must be greater than 100μs, the conversion time of the internal ADC
const unsigned long sampleInterval = sampleTime/numSamples;

#define SENSITIVITY 185 // per ACS712 5A data sheet, in mv/A
#define DETECTION_MULTIPLIER 1.095 // change as necessary to improve detection accuracy
#define CALIBRATION_READS 5000

// variables to hold sensor quiescent readings
int aqv;
int aqv1;
int aqv2; 
float aqc;
float aqc1;
float aqc2;

void setup()
{
  pinMode(ena, OUTPUT); 
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(pin8,HIGH);

  TCCR1B &= 0xF8;
TCCR1B |= B00000010;
 
  float sense;
  Serial.begin(9600);
  Serial.println(String(F(SYS_ID)) + String(F(" - SW:")) + String(F(VERSION)));
  Serial.print("\n\nCalibrating the sensor at pin ");
  Serial.println(pin);
  aqv = determineVQ(pin);
  Serial.print("AQV: ");
  Serial.print(aqv, 4);
  Serial.println(" mV");
  aqc = determineCQ(pin, aqv);
  Serial.print("AQC: ");
  Serial.print(aqc, 4);
  Serial.println(" mA");
  sense = (aqc * DETECTION_MULTIPLIER) - aqc;
  Serial.print("Detection Threshold: ");
  Serial.print(sense * 1000, 4);
  Serial.println(" mA\n\n");
 
  float sense1;
  Serial.print("\n\nCalibrating the sensor at pin ");
  Serial.println(pin1);
  aqv1 = determineVQ(pin1);
  Serial.print("AQV1: ");
  Serial.print(aqv1, 4);
  Serial.println(" mV");
  aqc1 = determineCQ(pin1, aqv1);
  Serial.print("AQC1: ");
  Serial.print(aqc, 4);
  Serial.println(" mA");
  sense1 = (aqc1 * DETECTION_MULTIPLIER) - aqc1;
  Serial.print("Detection Threshold: ");
  Serial.print(sense1 * 1000, 4);
  Serial.println(" mA\n\n");
 

  float sense2;
  Serial.print("\n\nCalibrating the sensor at pin ");
  Serial.println(pin2);
  aqv2 = determineVQ(pin2);
  Serial.print("AQV2: ");
  Serial.print(aqv2, 4);
  Serial.println(" mV");
  aqc2 = determineCQ(pin2, aqv2);
  Serial.print("AQC2: ");
  Serial.print(aqc, 4);
  Serial.println(" mA");
  sense2 = (aqc2 * DETECTION_MULTIPLIER) - aqc2;
  Serial.print("Detection Threshold: ");
  Serial.print(sense2 * 1000, 4);
  Serial.println(" mA\n\n");
  delay(5000);


}

void loop(){
   

  float current = readCurrent(pin, aqv);
  bool occupied = current > (aqc * DETECTION_MULTIPLIER);

 
 
  Serial.print("Current Sensed:");
  Serial.print(current * 1000,1);
  Serial.print(" mA\t\t");
  Serial.print("The block1 is ");
  if(occupied){ if (direct == 1){
   for (vitesse = 255; vitesse >=30; vitesse -=5)
    {analogWrite(ena,vitesse);
    delay(50);
    }
    digitalWrite(in1, 0); 
    digitalWrite(in2, 1);
    for (vitesse = 30; vitesse <=255; vitesse +=5)
    {analogWrite(ena,vitesse);
    delay(50);
    }
    //digitalWrite(in1, 1); 
    //digitalWrite(in2, 0);
    Serial.println("occupied");
   
  }
  direct = 2;
    Serial.println("occupied");
   
  } else {
    Serial.println("not occupied");
  }

float current1 = readCurrent1(pin1, aqv1);
  bool occupied1 = current1 > (aqc1 * DETECTION_MULTIPLIER);
 
  Serial.print("Current Sensed1:");
  Serial.print(current1 * 1000,1);
  Serial.print(" mA\t\t");
  Serial.print("The block2 is ");
  if(occupied1){
    Serial.println("occupied");
   
  } else {
    Serial.println("not occupied");
  }

  float current2 = readCurrent2(pin2, aqv2);
  bool occupied2 = current2 > (aqc2 * DETECTION_MULTIPLIER);

  Serial.print("Current Sensed2:");
  Serial.print(current2 * 1000,1);
  Serial.print(" mA\t\t");
  Serial.print("The block3 is ");
  if(occupied2){if (direct == 2){
   for (vitesse = 255; vitesse >=30; vitesse -=5)
    {analogWrite(ena,vitesse);
    delay(50);
    }
    digitalWrite(in1, 1); 
    digitalWrite(in2, 0);
    for (vitesse = 30; vitesse <=255; vitesse +=5)
    {analogWrite(ena,vitesse);
    delay(50);
    }
    //digitalWrite(in1, 1); 
    //digitalWrite(in2, 0);
    Serial.println("occupied");
   
  }
  direct = 1;
  } else {
    Serial.println("not occupied");
  }
 
 /*
if (essai == 1) {
    if (test == 1) {
      digitalWrite(0, HIGH);
*/
 
  delay(100);
 
}

//////////////////////////////////////////
// ACS712 Current Sensor Functions
//////////////////////////////////////////
float readCurrent(int PIN, float adc_zero)
{
  float currentAcc = 0;
  unsigned int count = 0;
  unsigned long prevMicros = micros() - sampleInterval ;
  while (count < numSamples)
  {
    if (micros() - prevMicros >= sampleInterval)
    {
      float adc_raw = (float) analogRead(PIN) - adc_zero;
      adc_raw /= SENSITIVITY; // convert to amperes
      currentAcc += (adc_raw * adc_raw);
      ++count;
      prevMicros += sampleInterval;
    }
  }
  //https://en.wikipedia.org/wiki/Root_mean_square
  float rms = sqrt((float)currentAcc / (float)numSamples);
  return rms;
}

float readCurrent1(int PIN, float adc_zero1)
{
  float currentAcc = 0;
  unsigned int count = 0;
  unsigned long prevMicros = micros() - sampleInterval ;
  while (count < numSamples)
  {
    if (micros() - prevMicros >= sampleInterval)
    {
      float adc_raw1 = (float) analogRead(PIN) - adc_zero1;
      adc_raw1 /= SENSITIVITY; // convert to amperes
      currentAcc += (adc_raw1 * adc_raw1);
      ++count;
      prevMicros += sampleInterval;
    }
  }
  //https://en.wikipedia.org/wiki/Root_mean_square
  float rms1 = sqrt((float)currentAcc / (float)numSamples);
  return rms1;
}

float readCurrent2(int PIN, float adc_zero2)
{
  float currentAcc = 0;
  unsigned int count = 0;
  unsigned long prevMicros = micros() - sampleInterval ;
  while (count < numSamples)
  {
    if (micros() - prevMicros >= sampleInterval)
    {
      float adc_raw2 = (float) analogRead(PIN) - adc_zero2;
      adc_raw2 /= SENSITIVITY; // convert to amperes
      currentAcc += (adc_raw2 * adc_raw2);
      ++count;
      prevMicros += sampleInterval;
    }
  }
  //https://en.wikipedia.org/wiki/Root_mean_square
  float rms2 = sqrt((float)currentAcc / (float)numSamples);
  return rms2;
}
//////////////////////////////////////////
// Calibration
// Track Power must be OFF during calibration
//////////////////////////////////////////

int determineVQ(int PIN) {
  float VQ = 0;
  //read a large number of samples to stabilize value
  for (int i = 0; i < CALIBRATION_READS; i++) {
    VQ += analogRead(PIN);
    delayMicroseconds(sampleInterval);
  }
  VQ /= CALIBRATION_READS;
  return int(VQ);
}

int determineVQ1(int PIN) {
  float VQ1 = 0;
  //read a large number of samples to stabilize value
  for (int i = 0; i < CALIBRATION_READS; i++) {
    VQ1 += analogRead(PIN);
    delayMicroseconds(sampleInterval);
  }
  VQ1 /= CALIBRATION_READS;
  return int(VQ1);
}

int determineVQ2(int PIN) {
  float VQ2 = 0;
  //read a large number of samples to stabilize value
  for (int i = 0; i < CALIBRATION_READS; i++) {
    VQ2 += analogRead(PIN);
    delayMicroseconds(sampleInterval);
  }
  VQ2 /= CALIBRATION_READS;
  return int(VQ2);
}

float determineCQ(int pin, float aqv) {
  float CQ = 0;
  // set reps so the total actual analog reads == CALIBRATION_READS
  int reps = (CALIBRATION_READS / numSamples);
  for (int i = 0; i < reps; i++) {
    CQ += readCurrent(pin, aqv);
  }
  CQ /= reps;
  return CQ;
}

float determineCQ1(int pin1, float aqv1) {
  float CQ1 = 0;
  // set reps so the total actual analog reads == CALIBRATION_READS
  int reps1 = (CALIBRATION_READS / numSamples);
  for (int i = 0; i < reps1; i++) {
    CQ1 += readCurrent(pin1, aqv1);
  }
  CQ1 /= reps1;
  return CQ1;
}

float determineCQ2(int pin2, float aqv2) {
  float CQ2 = 0;
  // set reps so the total actual analog reads == CALIBRATION_READS
  int reps2 = (CALIBRATION_READS / numSamples);
  for (int i = 0; i < reps2; i++) {
    CQ2 += readCurrent(pin2, aqv2);
  }
  CQ2 /= reps2;
  return CQ2;
}

2
Aide / Re : Un gestionnaire en C++ pour votre réseau (1)
« le: mars 04, 2024, 02:53:29 pm »
bonjour,

Voici une image de l' avancement du TCO.
Chaque pavé est identifié dans sa zone.

salutation
frederic

3
Aide / Re : Un gestionnaire en C++ pour votre réseau (1)
« le: mars 01, 2024, 04:06:00 pm »
je vous remercie,
Je regarde tous ça et reviens vers vous.
Merci pour votre aide

cordialement
frederic

4
Aide / Re : Un gestionnaire en C++ pour votre réseau (1)
« le: février 24, 2024, 03:42:49 pm »
salut Pierre,
Voici le réseau en processing,
j' ai déjà fabriqué le TCO physique sur base d' un Arduino méga qui pilote les servomoteurs soi par les boutons soi par le bus série avec les commandes 'a' et 'A' pour l' aiguillage "A" lol j' ai fais simple.
Je pense utiliser un autre méga pour la traction avec des L298N et des modules IR pour la détection.
L' alim est une ancienne alim PC ATX pour le 12 V et le 5 V(ventilé, protection surcharge et court-circuit).
Es que sa te semble bien?
Es que sa te semble réalisable?

amicalement
frederic

5
Aide / Re : Un gestionnaire en C++ pour votre réseau (1)
« le: février 23, 2024, 05:41:44 pm »
super merci Pierre,
je vais pouvoir avancer,

si j' adapte  le programme. à mon ovale je pourrai le gérer ?
et gérer les alimentations de voie exemple L298N et des servo sg90s pour les aiguillages?
ou
tu me conseil  un autre programme je suis très débutant lol

en tout cas merci d' avoir pris du temps pour me répondre et m' aider

amicalement
frederic

6
Aide / Re : Un gestionnaire en C++ pour votre réseau (1)
« le: février 23, 2024, 04:18:28 pm »
re
le fait de mettre des retraits sa va créer la zone automatiquement?

7
Aide / Re : Un gestionnaire en C++ pour votre réseau (1)
« le: février 23, 2024, 03:48:34 pm »
salut Pierre59

je suis dans l' article :Un gestionnaire en C++ pour votre
réseau, dans l' exemple:
TCOlocodrome version v4
je cherche comment plusieurs pavés forme une zone par exemple la zone 3 "z3"
pour une gestion traction analogique

aimablement
frederic

8
Aide / Re : Un gestionnaire en C++ pour votre réseau (1)
« le: février 23, 2024, 03:14:02 pm »
si j' ai compris je donne un nom a chaque pavé (pz1a,3,pz1b)
ensuite je dis  que
z0 = pz1a,3
z1 = pz1b
dans l' onglet composants
et j' ai mon canton

amicalement
frederic

9
Aide / Un gestionnaire en C++ pour votre réseau (1)
« le: février 23, 2024, 02:52:12 pm »
Bonjour,

J' essaie de faire un TCO en utilisant les articles "processing" et "Un gestionnaire en C++ pour votre réseau " qui sont super bien expliqué, je ne trouve pas comment créer ou déclarer une "zone" j' aimerais exemple :

z0 3 pavés  (zone de roulement)
z1 un pavé "signal"(zone d' arrêt)
ainsi de suite
se qui me ferais un "canton"

amicalement
frederic

10
Vos projets / Re : TCO bp + ordi
« le: février 15, 2024, 06:55:49 pm »
Dominique
Je pars pas lol
Peut-être que mon projet peux servir
amicalement
Frederic

11
Vos projets / Re : TCO bp + ordi
« le: février 15, 2024, 05:54:47 pm »
re à tous,
Ayant résolut mon problème du départ :donné un ordre depuis l'ordi pour commuté un aiguillage.

Cette discutions pourra est fermé.

Merci à tous, pour tout ses infos et le partage de vos projets, sa laisse à réfléchir pour la suite.

Cordialement
Frédéric

12
Vos projets / Re : TCO bp + ordi
« le: février 15, 2024, 05:07:01 pm »
voici le TCO virtuel du réseau HO pas encore finis pour plus tard!

13
Vos projets / Re : TCO bp + ordi
« le: février 14, 2024, 06:13:24 pm »
Dominique ,
C' est superbe et bien pensé, pour mon projet perso je ne dis pas non,

Pour le projet de mon ami trop compliqué et sa va me prends trop de temps, en parallèle de la gestion, je vais construire son réseau HO (pose des voies fabrication, des supports servomoteur, câblage).
Il est plus tout jeune lol .

Je voudrais dans un premier temps:

lui faire un ovale double voie avec une gare pour qui puissent faire rouler ses trains.
les inversions de courant seront gérer par des relais piloté par le TCO en fonction de l' itinéraire.
L'alim traction sera 2 potentiomètres combiné à 2 L298N un pour chaque ovale.
Le TCO virtuel aura les même fonctions que le physique.
Je vais revenir au plus simple parce que je voie tout se que j' ai encore à apprendre, une fois se pallier atteint j' envisagerais la suite.
j' ai déjà dessiner le TCO complet de son réseau en processing que je garde précieusement et en refaire un avec uniquement l' ovale avec la gare.

J' ai aussi mon réseau N 400m de voie, 100 aiguillages, 140 itinéraires, 5 gares (d'on 2 caché)qui lui fonctionne mais pas terminé, de plus il manque tout la voie unique (faux métrique en N) pour que je puissent faire de la déco,
Qui est géré par ordinateur.
mes vidéos:
https://www.youtube.com/@lendanstoutsesetats5016

Il faut que je soi réaliste les journées ne fond que 24 h.

Grace à vous tous, le Train miniature est en train de prendre une autre dimension, et les outils que vous arrivé à convertir pour cette magnifique passion son magistral.

14
Vos projets / Re : TCO bp + ordi
« le: février 14, 2024, 04:16:35 pm »
je ne sais plus par quoi commencé le projet en entier ou la première étape du projet?


15
Vos projets / Re : TCO bp + ordi
« le: février 14, 2024, 02:09:03 pm »
je suis en train de repenser le projet,
ne serait il pas mieux de recommencer le projet depuis le début de commencé une nouvelle discutions en prennent en compte vos idées et en avançant étape par étape (je crois avoir compris "vouloir allez trop vite").
Si je prends les organes que je vais avoir besoin pour le projet:
1 ordi (bus USB).
1 Arduino pour chaque chose (1 pour servo moteur,1 pour TCO,1 pour communication entre ordi et exemple bus I2C,etc.
1 TCO physique.
1 TCO virtuel (moniteur série pour commencé).
1 bus pour relier tout les éléments.
qu'en pensez-vous?
   
Frédéric

Pages: [1] 2