Générer un signal carré (traceur Arduino)

Bonjour à tous,

Je souhaiterai avoir votre aide car j’ai essayé de générer un signal carré en utilisant une led sous arduino mais je n’y parviens pas. Lorsque j’ouvre le traceur, j’obtiens un signal triangulaire.
Ce code me permet d’allumer et d’éteindre une led chaque seconde mais ce qui m’intéresse vraiment c’est l’état de cette led (HIGH ou LOW) sous forme de signal.

Je fais ce code dans le but final de pouvoir générer un signal de commande pour un gradateur (cf. https://forum.arduino.cc/index.php?topic=454394.0) mais pour l’instant je suis encore dans la phase ou je tente juste de générer un signal carré.

Voici mon code :

int led=13;
int state=0;
int i=0;

void setup() {
Serial.begin(9600);
pinMode(led, OUTPUT);
}

void loop() {
 while(true){
   if(i==0){
     digitalWrite(led,LOW);
     delay(1000);
     state=0;
     i=1;
   }
   Serial.println(state);
   if(i==1){
     digitalWrite(led,HIGH);
     delay(1000);
     state=1;
     i=0;
   }
   Serial.println(state);

}
}

Je joins également le signal que j’ai obtenu dans le traceur. Je pensais obtenir un signal carré…

signal triangulaire.jpg

Nom d'une pipe au bout de 23 posts tu ne mets toujours pas le code entre balises !

Je ne sais pas si tu es bien conscient que de ne pas respecter les règles du forum n'est pas le meilleur moyen pour avoir de l'aide.

Pour être respecté il faut être respectable.

Tu génères bien un signal carré. D’ailleurs tu dois le voir la LED est soit allumée (pendant 1s), soit éteinte (pendant 1s) et elle ne prend jamais de valeur intermédiaire.

Simplement, tu envoies dans le terminal des suites de 10101010. Lorsque tu fais tracer cela tu obtiens une dent de scie. Et c’est normal. Pose les points sur un papier et trace un trait qui les relie et auras aussi une dent de scie.
Si tu veux un signal carré, il faut envoyer 110011001100 vers le terminal.
Mais de toutes les façons, tu n’auras pas un vrais signal carré dans la mesure où l’échelle horizontale n’est pas le temps mais le numéro de l’échantillon. Du coup il y a le même écart entre 2 valeurs quelque soit le temps qui les sépares.

Tes 2 variables i et state font la même chose donc tu peux en supprimer une.
loop() est une boucle infinie donc ce n’est pas la peine de mettre un while(true) dans loop()

int led = 13;
int state = 0;

void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
}

void loop() {

  if (state == 0) {
    state = 1;
    Serial.println(state);
    digitalWrite(led, state);
    delay(1000);
    Serial.println(state);
  }
  if (state == 1) {
    state = 0;
    Serial.println(state);
    digitalWrite(led, state);
    delay(1000);
    Serial.println(state);
  }
}

Ensuite le code peut être grandement simplifié

int led = 13;
int state = 0;

void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
}

void loop() {
  state = !state;
  Serial.println(state);
  digitalWrite(led, state);
  delay(1000);
  Serial.println(state);
}

PS: tu noteras au passage que lorsqu’on utilise les balises code (bouton </> de la fenêtre d’édition) le code est plus présentable

hello
le même en fréquence modifiable

unsigned long deb = 0;
unsigned long fin = 0;

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop()
{
  deb = millis();
  while (fin - deb < 400)
  {
    fin = millis();
    digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
    Serial.println(digitalRead(LED_BUILTIN));
  }
  deb = millis();
  while (fin - deb < 400)
  {
    fin = millis();                    // wait for a second
    digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
    Serial.println(digitalRead(LED_BUILTIN));
  }
}

Pas de soucis pour les balises, la prochaine fois je saurai! :-)

Merci pour vos réponses. Je voudrais en fait générer un signal de commande pour un gradateur (ampoule). Ma commande se ferait par angle de phase, donc avec un retard sur mon signal de commande.

Est-ce que ce signal en dent de scie peut fonctionner comme signal de commande ou faut-il nécessairement un signal carré? Car en cours lorsque l'on parlait de signaux de commande, on utilisait des signaux carrés.

rbnyc: Pas de soucis pour les balises, la prochaine fois je saurai! :-)

Tu sais, tu n'es pas obligé d'attendre la prochaine fois, tu peux éditer ton premier post :wink: ;)

une fois que tu auras mis les balises
tu pourras allez voir la fonction tone() ICI

Merci je vais aller voir ça :-)