[RESOLU] Signal PWM modifiable sur MDUINO

bonjour à tous,

J’ai déjà quelques petits projets à mon actif avec des arduino uno, mais cette fois ci je m’attaque à plus gros, avec un PLC MDUINO 58+ (à base d’arduino MEGA 2560).

Aujourd’hui je bloque sur une variable, peut être que je manque de recul sur mon code…et d’expérience.

Je le partage avec vous:

/*
MDUINO PLC FOR IPG1200

*/



//20180515 - Test com TCP Server OK (PLCethernetMESO.ino)
//20180522 - Programmation E/S --> reste signal PWM pour mode pulsé (PIN A1/A2 de l'intterface XP2) et chaine sécu (PLCethernetIPG1200.ino)


// Include files.
#include <SPI.h>
#include <Ethernet2.h>
#include <MDUINO.h>
#include <IS.h>

// Enter a MAC address for your controller below
byte mac[] = { 0x90, 0xA2, 0xDA, 0x11, 0x3C, 0x51 };

// IP Configuration.
IPAddress ip(192,168,33,110);
IPAddress gateway(192,168,33,254);
IPAddress subnet(255, 255, 252, 0);

// Create a server listening on the given port.
EthernetServer server(6900);



bool ttl = false; // booleenne ttl pulse
int TTLState = LOW;
unsigned long previousMillis = 0; // will store last time TTL was updated
float OnTime = 500; // milliseconds of pulse width
float OffTime = 500; // milliseconds of off-time

void setup()
{
  // Start serial communication with the given baud rate.
  Serial.begin(9600);

  // Initialize the Ethernet shield.
  Ethernet.begin(mac, ip, gateway, subnet);

  server.begin();

  // Print status.
  printServerStatus();

  //Set OUTPUTS / INPUTS
  pinMode(Q0_0, OUTPUT);
  pinMode(Q0_1, OUTPUT);
  pinMode(Q0_2, OUTPUT);
  pinMode(Q0_3, OUTPUT);
  pinMode(Q0_4, OUTPUT);
  pinMode(Q0_5, OUTPUT);
  pinMode(Q0_6, OUTPUT);
  pinMode(Q0_7, OUTPUT);
  pinMode(Q1_0, OUTPUT);
  pinMode(Q1_1, OUTPUT);
  pinMode(Q1_2, OUTPUT);
  pinMode(Q1_3, OUTPUT);
  pinMode(Q1_4, OUTPUT);
  pinMode(Q1_5, OUTPUT);
  pinMode(Q1_6, OUTPUT);
  pinMode(Q1_7, OUTPUT);
  pinMode(Q2_0, OUTPUT);
  pinMode(Q2_1, OUTPUT);
  pinMode(Q2_2, OUTPUT);
  pinMode(Q2_3, OUTPUT);
  pinMode(A2_5, OUTPUT);
  pinMode(Q2_6, OUTPUT);
 
  
  //MDUINO PIN
  digitalWrite(Q0_0, LOW);
  digitalWrite(Q0_1, LOW);
  digitalWrite(Q0_2, LOW);
  digitalWrite(Q0_3, LOW);
  digitalWrite(Q0_4, LOW);
  digitalWrite(Q0_5, LOW);
  digitalWrite(Q0_6, LOW);
  digitalWrite(Q0_7, LOW);
  digitalWrite(Q1_0, LOW);
  digitalWrite(Q1_1, LOW);
  digitalWrite(Q1_2, LOW);
  digitalWrite(Q1_3, LOW);
  digitalWrite(Q1_4, LOW);
  digitalWrite(Q1_5, LOW);
  digitalWrite(Q1_6, LOW);
  digitalWrite(Q1_7, LOW);
  digitalWrite(Q2_0, LOW);
  digitalWrite(Q2_1, LOW);
  digitalWrite(Q2_2, LOW);
  digitalWrite(Q2_3, LOW);
  analogWrite(A2_5, LOW);
  digitalWrite(Q2_6, LOW);

  
}

void loop()
{
  // Listen for incoming client requests.
  EthernetClient client = server.available();
  if (!client)
  {
    trigger();
    return;
  }

  Serial.println("Client connected");

  String request = readRequest(&client);


  String command = readCommand(&request);
  executeRequest(&client, &request);

  // Close the connection.
  //client.stop();

  Serial.println("Client disconnected");
}

// Read the request line,
String readRequest(EthernetClient* client)
{
  String request = "";

  // Loop while the client is connected.
  while (client->connected())
  {
    // Read available bytes.
    while (client->available())
    {
      // Read a byte.
      char c = client->read();

      // Print the value (for debugging).
      Serial.write(c);

      // Exit loop if end of line.
      if ('\n' == c)
      {
        return request;
      }

      // Add byte to request line.
      request += c;
    }
  }
  return request;
}

float executeRequest(EthernetClient* client, String* request)
{
  String command = readCommand(request);
  float n = readParam(request);
  if (command == "IPG") //LASER REQUEST IPG 1200W --> 121=ON, 120=OFF
  {
    if (n == 121)
    {
      digitalWrite(Q0_0, HIGH);
    }
    if (n == 120)
    {
      digitalWrite(Q0_0, LOW);
    }
  }
  else if (command == "EMI") //EMMISSION ON 1=ON, 0=OFF
  {
    if (n == 1)
    {
      ttl = true;
    }
    if (n == 0)
    {
      ttl = false;
    }
  }
else if (command == "PUL") //SET PULSE WIDTH (milliseconds)
  {
    if (n <= 10)
    {
      float OnTime = n;
      Serial.println(OnTime);
    }
    else 
    {
      Serial.println("pulse too long");
      ttl = false;
    }

  }
else if (command == "REP") //SET REP RATE (milliseconds)
  {
    const float OffTime = (((1/n)*1000)-OnTime);
    Serial.println(OffTime);
    return OffTime;
  }
}

// Read the command from the request string.

String readCommand(String* request)
{
  String commandString = request->substring(0, 3); //lit le 1er digit seulement
  return commandString;
}


// Read the parameter from the request string.
float readParam(String* request)
{
  String commandString = request->substring(3, 6); //lit les 3 digits après les lettres
  return (commandString.toFloat()); //converti la chaine en entier et retourne la valeur
}




void sendResponse(EthernetClient* client, String response)
{
  // Send response to client.
  client->println(response);

  // Debug print.
  Serial.println("sendResponse:");
  Serial.println(response);
}








void trigger()
{
  if (ttl == true)

    {
      // check to see if it's time to change the state-------------------------------------------TRIGGER------------------------------------------
      Serial.println(OnTime);
      Serial.println(OffTime);
    
      unsigned long currentMillis = millis();
      if((TTLState == HIGH) && (currentMillis - previousMillis >= OnTime))
      {
        TTLState = LOW; // Turn it off
        previousMillis = currentMillis; // Remember the time
        digitalWrite(Q2_6, TTLState); // Update the actual LED
      }
      else if ((TTLState == LOW) && (currentMillis - previousMillis >= OffTime))
      {
        TTLState = HIGH; // turn it on
        previousMillis = currentMillis; // Remember the time
        digitalWrite(Q2_6, TTLState); // Update the actual LED
      }
    }
    else if (ttl == false)
    {
     digitalWrite(Q2_6, LOW); 
    }
}













void printServerStatus()
{
  Serial.print("Server address:");
  Serial.println(Ethernet.localIP());
}

Le but est de piloter une source laser depuis cet automate.

Tout est ok, sauf un signal à envoyer, que je souhaite moduler en fréquence et rapport cyclique…
du coup j’ai créé un signal sur Q2_6 avec un temps actif (OnTime) et un temps off (OffTime).

Ce temps haut et temps bas doit être à durée variable et j’envoie les infos via trames TCP (le MDUINO est en TCPServer et reçoit, lit les trames sans problème)
Si j’envoie le mot: PUL0.1 la valeur OnTime doit passer à 0.1ms
Si j’envoie le mot REP1000 la valeur OffTime doit passer à (1/1000)*1000-OnTime soit ici 0.9ms

La communication série m’indique bien que les trames sont reçues…Pourtant si je rentre PUL0.1 puis ensuite REP1000 je me rend compte qu’il n’a pas mémorisé ma valeur de 0.1ms sur OnTime…et pareil pour OffTime, il ne mémorise pas la valeur…

Du coup mon signal TTL créé n’est pas avec le rapport cyclique souhaité, ni fréquence…
il reste quoi qu’il arrive avec les valeurs données au départ:

float OnTime = 500; // milliseconds of pulse width
float OffTime = 500; // milliseconds of off-time

Voyez vous où se situe mon problème svp?

Merci par avance pour votre aide. :wink:

(NOTA: J’ai allégé les parties du code inutiles ici)

Résolu, j’étais pas bien réveillé…

fallait prendre un peu de recul ^^

solution pour info:

else if (command == "PUL") //SET PULSE WIDTH (milliseconds)
  {
    if (n <= 10)
    {
      OnTime = n;
      Serial.println(OnTime);
      return OnTime;
    }
    else 
    {
      Serial.println("pulse too long");
      ttl = false;
    }