gehelem

Un flip flat pour 4 sous

Recommended Posts

@olivier1986 tu me dis de relier la masse de mon alimentation 5V avec le GND de l arduino, mais de faire alimentation de l ardiuino via usb?

 en gros j enleve le fil + de mon alim 5V qui arive sur le RAW de l arduino?

Share this post


Link to post
Share on other sites

@olivier,

vu, merci.

Share this post


Link to post
Share on other sites

@supaii non, pas le 5v! Juste les masses:

le gnd de ton alim doit arriver sur ton gnd arduino.

si j’ai compris, en mettant le +5v de l’alim sur RAW tu alimentes tout en 5V, ca c’est bon! Mais les masses doivent etre communes.

tu peux voir sur mes images d’essais que c’est ce que je fais!

Share this post


Link to post
Share on other sites

@olivier1986c'est ce que j ai, mon alim fournit pour le servi, led et arduino. Mais obliger de debrancher puis rebrancher pour que ça soit détecté par indi.

 

peut être le "delay" dans le code, que tu avais ajouter pour éviter le reset sur l'arduino(uno/nano).

 

/*
What: LEDLightBoxAlnitak - PC controlled lightbox implmented using the
    Alnitak (Flip-Flat/Flat-Man) command set found here:
  http://www.optecinc.com/astronomy/pdf/Alnitak Astrosystems GenericCommandsR3.pdf

Who:
    Created By: Jared Wellman - jared@mainsequencesoftware.com

When:
    Last modified:  2013/May/05


Typical usage on the command prompt:
Send     : >S000\n      //request state
Recieve  : *S19000\n    //returned state

Send     : >B128\n      //set brightness 128
Recieve  : *B19128\n    //confirming brightness set to 128

Send     : >J000\n      //get brightness
Recieve  : *B19128\n    //brightness value of 128 (assuming as set from above)

Send     : >L000\n      //turn light on (uses set brightness value)
Recieve  : *L19000\n    //confirms light turned on

Send     : >D000\n      //turn light off (brightness value should not be changed)
Recieve  : *D19000\n    //confirms light turned off.
*/

#include <EEPROM.h>
int position_cap;


#include <Servo.h>
Servo myservo;

volatile int ledPin = 11;
volatile int servoPin = 9;      // the pin that the servo signal is attached to, needs to be a PWM pin.
int brightness = 0;

enum devices
{
    FLAT_MAN_L = 10,
    FLAT_MAN_XL = 15,
    FLAT_MAN = 19,
    FLIP_FLAT = 99
};

enum motorStatuses
{
    STOPPED = 0,
    RUNNING
};

enum lightStatuses
{
    OFF = 0,
    ON
};

enum shutterStatuses
{
    UNKNOWN = 0, // ie not open or closed...could be moving
    CLOSED,
    OPEN
};


int deviceId = FLIP_FLAT;
int motorStatus = STOPPED;
int lightStatus = OFF;
int coverStatus = EEPROM.get(position_cap,coverStatus);


const int impulsion_min=450;
const int impulsion_max=2500;
int relai=7;

void setup()
{
    
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  pinMode(servoPin, OUTPUT);
  pinMode(relai, OUTPUT);
  analogWrite(ledPin, 0);
  digitalWrite(relai, LOW);
  myservo.write(0);
  myservo.attach(9,impulsion_min,impulsion_max);
  
}

void loop()
{
  handleSerial();
}


void handleSerial()
{
  delay(100);
  if( Serial.available() >= 5 )  // all incoming communications are fixed length at 6 bytes including the \n
  {
    char* cmd;
    char* data;
    char temp[10];
    
    int len = 0;

    char str[20];
    memset(str, 0, 20);
    
    // I don't personally like using the \n as a command character for reading.  
    // but that's how the command set is.
  //  Serial.readBytesUntil('\n', str, 20);
  Serial.readBytes( str, 5);

    cmd = str + 1;
    data = str + 2;
    
    // useful for debugging to make sure your commands came through and are parsed correctly.
    if( false )
    {
      sprintf( temp, "cmd = >%s%s;", cmd, data);
      Serial.println(temp);
    }
    


    switch( *cmd )
    {
      /*
        Ping device
            Request: >P000\n
            Return : *Pii000\n
                id = deviceId
      */
      case 'P':
          sprintf(temp, "*P%d000\n", deviceId);
          Serial.print(temp);
          break;

      /*
        Open shutter
            Request: >O000\n
            Return : *Oii000\n
                id = deviceId

            This command is only supported on the Flip-Flat!
      */
      case 'O':
          sprintf(temp, "*O%d000\n", deviceId);
          SetShutter(OPEN);
          EEPROM.put(position_cap,OPEN);
          Serial.print(temp);
          break;


      /*
        Close shutter
            Request: >C000\n
            Return : *Cii000\n
                id = deviceId

            This command is only supported on the Flip-Flat!
      */
      case 'C':
          sprintf(temp, "*C%d000\n", deviceId);
          SetShutter(CLOSED);
          EEPROM.put(position_cap,CLOSED);
          Serial.print(temp);
          break;

      /*
        Turn light on
            Request: >L000\n
            Return : *Lii000\n
                id = deviceId
      */
      case 'L':
          sprintf(temp, "*L%d000\n", deviceId);
          Serial.print(temp);
          lightStatus = ON;
          analogWrite(ledPin, brightness);
          break;

      /*
        Turn light off
            Request: >D000\n
            Return : *Dii000\n
                id = deviceId
      */
      case 'D':
          sprintf(temp, "*D%d000\n", deviceId);
          Serial.print(temp);
          lightStatus = OFF;
          analogWrite(ledPin, 0);
          break;

      /*
        Set brightness
            Request: >Bxxx\n
                xxx = brightness value from 000-255
            Return : *Biiyyy\n
                id = deviceId
                yyy = value that brightness was set from 000-255
      */
      case 'B':
          brightness = atoi(data);    
          if( lightStatus == ON )
              analogWrite(ledPin, brightness);
              sprintf( temp, "*B%d%03d\n", deviceId, brightness );
          Serial.print(temp);
        break;

      /*
        Get brightness
            Request: >J000\n
            Return : *Jiiyyy\n
                id = deviceId
                yyy = current brightness value from 000-255
      */
      case 'J':
        sprintf( temp, "*J%d%03d\n", deviceId, brightness);
        Serial.print(temp);
        break;
      
      /*
        Get device status:
            Request: >S000\n
            Return : *SidMLC\n
                id = deviceId
                M  = motor status( 0 stopped, 1 running)
                L  = light status( 0 off, 1 on)
                C  = Cover Status( 0 moving, 1 closed, 2 open)
      */
      case 'S':
        sprintf( temp, "*S%d%d%d%d\n",deviceId, motorStatus, lightStatus, EEPROM.get(position_cap,coverStatus));
        Serial.print(temp);
        break;

      /*
        Get firmware version
            Request: >V000\n
            Return : *Vii001\n
                id = deviceId
      */
      case 'V': // get firmware version
          sprintf(temp, "*V%d001\n", deviceId);
          Serial.print(temp);
          break;
    }    

    while( Serial.available() > 0 )
        Serial.read();
            

  }
}

void SetShutter(int val)
{
  if( val == OPEN && coverStatus != OPEN )
  {
    for (int angle = 25; angle <= 55; angle+=1) 
    {
      myservo.write (angle);
      delay (70);
    } 
    myservo.write (115);
    for (int angle = 115; angle <= 145; angle+=1) 
    {
      myservo.write (angle);
      delay (70);
    } 
    coverStatus = OPEN;
    // TODO: Implement code to OPEN the shutter.
  }
  else if( val == CLOSED && coverStatus != CLOSED )
  {
    for (int angle = 145; angle > 115; angle-=1) 
    {
      myservo.write (angle);
      delay (70);
    }   
    myservo.write (55);  
    for (int angle = 55; angle > 25; angle-=1) 
    {
      myservo.write (angle);
      delay (70);
    } 
    coverStatus = CLOSED;
    // TODO: Implement code to CLOSE the shutter
  }
  else
  {
    // TODO: Actually handle this case
    coverStatus = val;
    }
    
} 

 

Share this post


Link to post
Share on other sites

J'avais eu pas mal de probleme niveau alimentation pour un arduino tout en utilisant le port USB...

 

Le 5V de l'alimentation tu le mets directement sur le pin Vin de l'arduino?

Il me semble qu'il faut l'alimenter en 6,5V minimum à cause de la chute de tension du convertisseur.

 

Et au contraire, si tu mets le 5V de ton alim directement sur le pin 5V de l'arduino, là cette tension risque de se "mélanger" avec le 5V de l'USB et poser problème

Share this post


Link to post
Share on other sites

le truc c'est que c'est un arduino micro pro et je n'en ai pas.. surement que @gehelem pourra répondre.

je ne pense pas que cela vienne du delay car Gilles l'utilise et ca fonctionne...

Share this post


Link to post
Share on other sites
Il y a 1 heure, olivier1986 a dit :

@supaii du nouveau?

est-il possible de voir ton montage en action?

Euh en whatsapp, ca te va? mp moi

Share this post


Link to post
Share on other sites
Le 23/05/2019 à 10:51, olivier1986 a dit :

le truc c'est que c'est un arduino micro pro et je n'en ai pas.. surement que @gehelem pourra répondre.

je ne pense pas que cela vienne du delay car Gilles l'utilise et ca fonctionne...

salut

désolé j'ai un peu déserté le truc... ça va revenir après les RAP

Donc :

J'ai aussi des soucis lorsque j'alimente en externe

ça me fait des merdes au branchement comme vous sur mon "promicro"

j'ai l'impression que c'est congénital aux Arduino, quels qu'ils soient.

la seule solution serait de carrément faire sauter l'alim de l'usb, et ne garder que GND V+ et V-

bref... on est pas sortis de l'auberge.

En attendant ça marchouille comme ça, ça va partir en Auvergne en l'état.

 

Autre truc, je confirme avoir l'intention d'abandonner le hack du servo.

Je vais le remettre dans son état d'origine, j'ai plus d'inconvénients que d'avantages à le bidouiller comme je l'ai fait.

 

@+

Share this post


Link to post
Share on other sites

@gehelem j ai testé tout à l heure plus de problème. Je pense que c était un problème de connection de l usb

Share this post


Link to post
Share on other sites

Sur le myfocuser il y a un petit condensateur dans le schéma pour éviter les merdouilles quand on branche l alimentation.

Share this post


Link to post
Share on other sites

Bonjour,

 

Je vous propose ce bout de code pour ouvrir et fermer le panneau: J'y ai inclus une accélération et une décélération à l'aide de la fonction sinus.

L'ouverture démarre doucement puis passe par un max de vitesse avant de ralentir pour la fermeture. On règle la vitesse et l'accélération avec le paramètre    "delay (25);" et le facteur multiplicatif (le 6) de  " dangle=1+int(sin(angle*pi/180)*6);".

Avec un délai de 25 et un facteur de 6, j'ai un mouvement régulier sans saccade.

 

Révélation

void SetShutter(int val)
{
  if( val == OPEN && coverStatus != OPEN )
  {
    angle=myservo.read();
    do {
     myservo.write (angle);
     delay (25);
     dangle=1+int(sin(angle*pi/180)*6);
     angle=angle+dangle;
    } while (angle<180);
    coverStatus = OPEN;
    myservo.write (180);
    coverStatus = OPEN;
  }    
  else if( val == CLOSED && coverStatus != CLOSED )
  {
    angle=myservo.read();
    do {
     myservo.write (angle);
     delay (30);
     dangle=1+int(sin(angle*pi/180)*6);
     angle=angle-dangle;
    } while (angle>0);
    myservo.write (0);
    coverStatus = CLOSED;
  }
  else
  {
    // TODO: Actually handle this case
    coverStatus = val;
  }

 

Share this post


Link to post
Share on other sites

Merci @ursus

Intéressant, je vais tester ça...

Share this post


Link to post
Share on other sites

On doit pouvoir faire encore mieux. J essaierai avec une autre fonction mathématique qu j ai en tête. 

 

Share this post


Link to post
Share on other sites
Posted (edited)

Bonjour tout le monde,

 

Quelle surprise et plaisir de tomber sur ce fil de discutions par hasard en faisant une recherche sur INDIDUINO pour essayer de comprendre comment interfacer mon flip flat arduino avec INDI.

 

Et oui, comme vous, je suis en train de réaliser un flip flat à base d’arduino nano pour ma TOA-130.

Je tiens à préciser pour certains qu’il est plus compliqué et sophistiqué de ceux que j’ai pu voir sur ce fil. Mais bon il est destiné à un poste fixe et j’assume tant qu’il rempli mon cahier des charges conséquent. Et puis je ne vous cache pas que j’avais envie de découvrir les méandres de la programmation et les possibilités de ce micro-contrôleur. Alors j’en ai un peu rajouté

 

Je vais donc profiter de ce fil pour vous présenter mon projet, en l’état, histoire de partager avec vous nos expériences, idées et solutions.

 

Je tiens aussi à préciser que je n’ai aucune compétence en programmation n’y en électronique à part savoir manier le fer à souder. Je me suis donc aidé en glanant toutes ces compétences sur internet via des forums et tutos.

 

Mon cahier des charges :

 

  • Ouvrir et fermer un couvercle en locale ou en remote.
  • Le couvercle doit être étanche à la poussière et à la lumière pour pouvoir faire des darks.
  • Le couvercle doit être équipé d’une source lumineuse réglable en intensité pour faire des flats.
  • En position ouvert, l’intérieur du couvercle doit être protégé de l’humidité et surtout d’éventuels insectes qui viendraient perturber les flats par leur présence.
  • Le système doit être rapidement démontable pour une éventuelle sortie nomade.
  • Le couvercle doit pouvoir se refermer automatiquement en cas de coupure de courant.

 

Les difficultés rencontrées :

 

L’auto-reset :

Je me suis rapidement rendu compte qu’à chaque communication via le port série/usb entre l’ordi et l’arduino nano, ce dernier faisait un reset dévastateur quand les servos étaient restés en position capot ouvert. En effet, mon cahier des charges m’impose l’utilisation de trois servos. Un « servotranslation » qui sert à translater le capot le long de l’axe du tube pour le boucher ou déboucher hermétiquement. Un « servocapot » qui sert à orienter le capot de 180° à l’opposé et un « servorotation » qui sert à replier le capot afin de le protéger. Les séquences d’ouverture et de fermeture doivent impérativement respecter un certain ordre dans les commandes de chaque servo pour éviter tout contact et détérioration matériel.

Or le reset provoque une réinitialisation de la position de chaque servo, en même temps, à leur position d’origine inscrite dans le setup et si par malheur le capot était resté en position ouverte avant le reset, c’est la cata. Je n’ai pas trouvé de solution logiciel pour régler ce problème. J’ai donc fait une recherche pour éviter cet auto-reset du nano et j’ai trouvé une solution hardware qui consiste à dessouder un micro condensation situé sous le PCB de l’arduino. Reste un reset lors du branchement du cable usb dont je n’ai pas trouvé de solution matériel. Donc, pour éviter que le capot reste en position ouverte sans le savoir, j’ai fait une sécurité qui consiste à fermer le capot lorsque qu’il y à une coupure d’alimentation. Cela nécessite une ou deux piles 9v, un relais et un gros condensateur. Du coup, je ne peux plus débrancher le flip-flat en position ouvert sans qu’il se referme automatiquement. Or, pour le démontage, je souhaiterais qu’il reste en position ouvert qui protège l’intérieur du capot. J’ai donc rajouté un bouton supplémentaire « Park » qui donne l’ordre d’ouvrir le capot et qui condamne  le relais « sécu » pour empêcher l’alimentation de secours de s’activer. En lisant ce fil de discussion, j’ai trouver l’idée de mettre un relais pour couper l’alimentation des servos, lorsqu’ils ne sont pas en fonctionnement, très bonne. Je l’ai donc rajouté.  Me voilà, à priori, bien protégé du reset intempestif.

Ah… J’oubliais: Comme l’alimentions secours est constituée de piles et comme j’ai quatre led pour indiquer la puissance d’éclairage du panneau EL lorsqu’il est commandé en local, j’en ai profité pour en faire un voltmètre qui mesure l’état de ces piles.

 

La vitesse des servo:

Pour préserver un peu le mécanique, il fallait ralentir la vitesse des servos. J’ai donc trouvé un bout de code qui permet de régler cette vitesse aux petits oignons.

 

La variation lumineuse du panneau EL:

Le fournisseur du panneau EL propose un variateur 12v à mettre en amont de l’onduleur. Je m’était dit qu’en remplaçant son potentiomètre par un potentiomètre digital commandé par l’arduino devrait faire l’affaire. Mais bon, plutôt que d’avoir plusieurs modules branchés les uns derrière les autre, je me suis dit que de fabriquer ce variateur et l’intégrer au shield serait plus élégant. Après recherches, j’ai trouvé une solution assez simple avec un empli op et un transistor de puissance. Ca marche plutôt bien mais j’ai du rajouter un condensateur pour éviter le flicking à certaines valeurs et ce condensateur modifie la tension de sortie du régulateur de commande du panneau EL. Ce qui a pour conséquence de rendre le réglage de puissance du panneau non linéaire. Pas très grave, il suffit de tâtonner dans le programme pour trouver les bonnes valeurs afin d’avoir quatre niveaux de puissance bien répartis.

 

La communication via le port série/usb:

Comme je n’y connais rien en programmation, cela n’a pas été une mince affaire mais je m’en suis sortie grâce à internet. J’ai réussit à faire des scripts python qui me permettent de commander le Flip flat. Mais le plus gros boulot qui me reste à faire. C'est d’intégrer le code dans mon programme pour le rendre compatible avec INDI. D’ou ma présence sur ce fl de discussion.

 

Voilà donc ce à quoi cela va ressembler :

 

J’aurais bien aimé pouvoir faire une animation de l’ouverture et la fermeture mais je ne sais pas le faire. J’utilise Freecad pour la modélisation.

 

1049023185_Flipflatferm.thumb.png.5ae0f6ecb9d2958c3d3c39568f66f3df.png

 

1342821429_Flipflatdemiouvert.thumb.png.099c67f7b715d4711b098a1c3ee07b9f.png

 

1994928285_Flipflatouvert.thumb.png.b0bd746fc027046defd04f0f6431a6d6.png

 

Voilà le schéma réalisé sur EasyEDA:

 

Schematic_Flip-flat-4_Flip-flat-4_20190616185154.png

 

Et le PCB toujours réalisé sur EasyEDA:

 

PCB.thumb.png.55e4f043179f783966acde2b47807145.png

 

Le code:

 

Révélation

#include <Arduino.h>
#include <Servo.h>
 
 
Servo ServoCapot;
Servo ServoRotation;
Servo ServoTranslation;
const int btn_capot = A0;
const int btn_voltmetre = A2;
const int btn_ELpan = A1;
const int btn_park = A5;
const int ctc_capot_ouvert = A3;
const int ctc_capot_ferme = A4;
const int led_1 = 4;
const int led_2 = 5;
const int led_3 = 6;
const int led_4 = 7;
const int ELpan = 3;
const int relais_ELpan = 13;
const int relais_secu = 8;
const int relais_servo = 12;

int AngleServoCapot= 0;
int AngleServoRotation= 137;
int AngleServoTranslation= 47;
int reception;
int compte_btn_ELpan = 0; // le nombre qui sera incrémenté et décrémenté
int etat_btn_ELpan = LOW; // lecture de l'état des boutons (un seul à la fois donc une variable suffit)
int etatprecedent_btn_ELpan = LOW; // état relâché par défaut
int real_vin(); // Variable de la tension mesuré par le voltmetre
const byte BROCHE_CAPTEUR_VIN = A7; // Le numéro de broche analogique pour la mesure de la tension en VIN
const float COEFF_PONT_DIVISEUR_VIN = 1.95; // Coefficient diviseur du pont de résistance et étalonnage du volmètre
String commande;
 


    
void setup()
{
    Serial.begin(115200);
    Serial.flush();
    
    ServoCapot.attach(9, 500, 2475); // init pin
    ServoRotation.attach(10, 500, 2475); // init pin
    ServoTranslation.attach(11, 500, 2475); // init pin
    ServoCapot.write(AngleServoCapot);
    ServoRotation.write(AngleServoRotation);
    ServoTranslation.write(AngleServoTranslation);
    
    pinMode(btn_capot,INPUT);     
    pinMode(btn_voltmetre,INPUT);
    pinMode(btn_ELpan, INPUT);
    pinMode(btn_park, INPUT);
    pinMode(ctc_capot_ouvert, INPUT);
    pinMode(ctc_capot_ferme, INPUT);    
    pinMode(led_1, OUTPUT);
    pinMode(led_2, OUTPUT);
    pinMode(led_3, OUTPUT);
    pinMode(led_4, OUTPUT);
    pinMode(ELpan, OUTPUT);
    pinMode(relais_ELpan, OUTPUT);
    pinMode(relais_secu,OUTPUT);   
    pinMode(relais_servo,OUTPUT);   
    attachInterrupt(digitalPinToInterrupt(2), secu, FALLING); // Fonction de détection d'une entrée peu importe ou en est le programme. Utile pour la détection de chute de tension.
    
}
 
unsigned int analogReadReference(void) // Mesure la référence interne à 1.1 volts
{
  
// Elimine toutes charges résiduelles
#if defined(__AVR_ATmega328P__)
  ADMUX = 0x4F;
#elif defined(__AVR_ATmega2560__)
  ADCSRB &= ~(1 << MUX5);
  ADMUX = 0x5F;
#elif defined(__AVR_ATmega32U4__)
  ADCSRB &= ~(1 << MUX5);
  ADMUX = 0x5F;
#endif
  delayMicroseconds(5);
  
// Sélectionne la référence interne à 1.1 volts comme point de mesure, avec comme limite haute VCC
#if defined(__AVR_ATmega328P__)
  ADMUX = 0x4E;
#elif defined(__AVR_ATmega2560__)
  ADCSRB &= ~(1 << MUX5);
  ADMUX = 0x5E;
#elif defined(__AVR_ATmega32U4__)
  ADCSRB &= ~(1 << MUX5);
  ADMUX = 0x5E;
#endif
  delayMicroseconds(200);
  
  ADCSRA |= (1 << ADEN); // Active le convertisseur analogique -> numérique
  
  ADCSRA |= (1 << ADSC); // Lance une conversion analogique -> numérique
  
  while(ADCSRA & (1 << ADSC)); // Attend la fin de la conversion
  
  return ADCL | (ADCH << 8); // Récupère le résultat de la conversion
}
void loop() 
{           
 
// Traitement série pour communiquer via l'interface série de l'arduino ou via des srypts python.
   while (Serial.available() > 0)
    {
    reception = Serial.read();
    commande += char(reception);
    delay(5);
    }
 
   if (commande != "") // Si la commande est différente de rien, on execute la routine "traitementserial"
    {
    traitementserial();
    }
// Ouverture Fermeture capot    
   if((digitalRead(btn_capot) == HIGH) && (digitalRead(ctc_capot_ouvert) == HIGH) && (digitalRead(btn_park) == LOW))
    {
    fermeture(); 
    }
   if((digitalRead(btn_capot) == HIGH) && (digitalRead(ctc_capot_ferme) == HIGH) && (digitalRead(btn_park) == LOW))
    {
      
    ouverture();
    }
    if((digitalRead(btn_park) == HIGH) && (digitalRead(ctc_capot_ferme) == HIGH))
    {
      
    ouverture();
    }
  
    if (digitalRead(relais_secu)==(HIGH))
      {  
        if (digitalRead(ctc_capot_ouvert) == HIGH)
        {
      fermeture();
      }
      if(digitalRead(ctc_capot_ferme) == HIGH)
    {
      
    delay(1000);    
    digitalWrite(relais_secu,LOW);
    }
      
      }
  

// ELpan
    etat_btn_ELpan = digitalRead(btn_ELpan);
   if (etat_btn_ELpan != etatprecedent_btn_ELpan) // si l'état du bouton a changé
      {
      if (etat_btn_ELpan == HIGH) // et qu'il est haut (= on appuie dessus)
        {
        compte_btn_ELpan++; // on incrémente le compteur
        if (compte_btn_ELpan > 4) // sauf s'il a dépassé 4...
          {
           compte_btn_ELpan = 0; // ...auquel cas on le réinitialise
          }
       }
    
      }
       
     progELpan(); // on execute progELpan
    etatprecedent_btn_ELpan = etat_btn_ELpan; // et on stocke l'atat du bouton pour le prochain tour
   
     
// Voltmetre
    if (digitalRead(btn_voltmetre) == HIGH)
      {
        delay(100);
      voltmetre(); // On execute volmetre
      }
    else
      {
      analogWrite(led_1,0);
      analogWrite(led_2,0);
      analogWrite(led_3,0);
      analogWrite(led_4,0);
      }
} 
void ouverture() // Routine ouverture capot
{ 
 
 
  if (compte_btn_ELpan >= 1)
          {
           
  analogWrite(led_1,0);
  analogWrite(led_2,0);
  analogWrite(led_3,0);
  analogWrite(led_4,0);
  analogWrite(ELpan,0);
  digitalWrite(relais_ELpan,LOW);
  Serial.println("EL panel éteind");  
  }
    digitalWrite(relais_servo,HIGH);
       delay(500); 
  while(!(((AngleServoTranslation)==(137))))
      {
      ServoTranslation.write((AngleServoTranslation) + (1)); 
      AngleServoTranslation += 1;
      delay(20);//_delay(0.02);
      }
       
   delay(1000);//_delay(1);
        
   while(!(((AngleServoCapot)==(180))))
      {
      ServoCapot.write((AngleServoCapot) + (1)); 
      AngleServoCapot += 1;
      delay(20);//_delay(0.02);
      }
        
   delay(1000);//_delay(1);
   while(!(((AngleServoRotation)==(47))))
      {
       ServoRotation.write((AngleServoRotation) - (1)); 
       AngleServoRotation += -1;
       delay(20);//_delay(0.02);
      }
        delay(500); 
         if (digitalRead(ctc_capot_ouvert) == HIGH)
          {
            digitalWrite(relais_servo,LOW);
      Serial.println("Capot ouvert");
          }
     
}
 
 void fermeture() // Routine fermeture capot 
  { 
  // compte_btn_ELpan = 0; 
     digitalWrite(relais_servo,HIGH);
       delay(500); 
   while(!(((AngleServoRotation)==(137))))
        {
            ServoRotation.write((AngleServoRotation) + (1)); 
            AngleServoRotation += 1;
            delay(20);// _delay(0.02);
        }
        delay(1000);//_delay(1);
        while(!(((AngleServoCapot)==(0))))
        {
            ServoCapot.write((AngleServoCapot) - (1));
            AngleServoCapot += -1;
            delay(20);// _delay(0.02);
        }
        delay(1000);//_delay(1);
        while(!(((AngleServoTranslation)==(47))))
        {
            ServoTranslation.write((AngleServoTranslation) - (1));
            AngleServoTranslation += -1;
            delay(20);// _delay(0.02);
        }
          delay(500); 
           if (digitalRead(ctc_capot_ferme) == HIGH)
          {
            digitalWrite(relais_servo,LOW);
      Serial.println("Capot fermé");
          }
      
    }
 
 void traitementserial() // Routine traitement série
{
  if (commande == "ouverture")
  {
    ouverture();
  }
 else if (commande == "fermeture")
  {
    fermeture();
  }
  if ((commande == "elpan1") && (digitalRead(ctc_capot_ferme) == HIGH))
  {
    compte_btn_ELpan = 1;
    Serial.println("EL panel allumé à 25%");
     }
  if ((commande == "elpan2") && (digitalRead(ctc_capot_ferme) == HIGH))
  {
    compte_btn_ELpan = 2;
    Serial.println("EL panel allumé à 50%");
     }
     if ((commande == "elpan3") && (digitalRead(ctc_capot_ferme) == HIGH))
  {
    compte_btn_ELpan = 3;
    Serial.println("EL panel allumé à 75%");
     }
     if ((commande == "elpan4") && (digitalRead(ctc_capot_ferme) == HIGH))
  {
    compte_btn_ELpan = 4;
    Serial.println("EL panel allumé à 100%");
     }
    if (((commande == "elpan1")||(commande == "elpan2")||(commande == "elpan3")||commande == ("elpan4")) && (digitalRead(ctc_capot_ouvert) == HIGH))
   {
    Serial.println("Impossible, capot ouvert");
  }
  
  if (commande == "elpanoff")
  {
    compte_btn_ELpan = 0;
    Serial.println("EL panel éteint");
  }
    commande = "";
}
void progELpan() // Routine éclairage EL panel
{
   if ((compte_btn_ELpan >= 1) && (AngleServoTranslation == 47))
        {
        digitalWrite(relais_ELpan,HIGH); // on allume le relai
        }
      else 
        {
        digitalWrite(relais_ELpan,LOW); // on eteind le relai
        } 
 //     if (compte_btn_ELpan == 0)
 // {
  //  analogWrite(led_1,0);
   // analogWrite(led_2,0);
   // analogWrite(led_3,0);
   // analogWrite(led_4,0);
   // analogWrite(ELpan,0);
 // }
      if ((compte_btn_ELpan == 1) && (digitalRead(ctc_capot_ferme) == HIGH))
  {
    analogWrite(led_1,255);
    analogWrite(led_2,0);
    analogWrite(led_3,0);
    analogWrite(led_4,0);
    analogWrite(ELpan,27);
  }
     if ((compte_btn_ELpan == 2) && (digitalRead(ctc_capot_ferme) == HIGH))
  {
    analogWrite(led_1,255);
    analogWrite(led_2,255);
    analogWrite(led_3,0);
    analogWrite(led_4,0);
    analogWrite(ELpan,50);
  }
     if ((compte_btn_ELpan == 3) && (digitalRead(ctc_capot_ferme) == HIGH))
  {
    analogWrite(led_1,255);
    analogWrite(led_2,255);
    analogWrite(led_3,255);
    analogWrite(led_4,0);
    analogWrite(ELpan,90);
  }
    if ((compte_btn_ELpan == 4) && (digitalRead(ctc_capot_ferme) == HIGH))
  {
    analogWrite(led_1,255);
    analogWrite(led_2,255);
    analogWrite(led_3,255);
    analogWrite(led_4,255);
    analogWrite(ELpan,255);
  }
 
}
void voltmetre() // Routine voltmetre
{
 
  // Mesure la tension en VIN et la référence interne à 1.1 volts
  unsigned int raw_vin = analogRead(BROCHE_CAPTEUR_VIN);
  unsigned int raw_ref = analogReadReference();
  
  // Calcul de la tension réel avec un produit en croix
  float real_vin = ((raw_vin * 1.1) / raw_ref) * COEFF_PONT_DIVISEUR_VIN;
  
         if (real_vin >= 6)
  {
    analogWrite(led_1,255);
    analogWrite(led_2,0);
    analogWrite(led_3,0);
    analogWrite(led_4,0);
  }
       if (real_vin >= 7)
  {
    analogWrite(led_1,255);
    analogWrite(led_2,255);
    analogWrite(led_3,0);
    analogWrite(led_4,0);
   }
    if (real_vin >= 😎
  {
    analogWrite(led_1,255);
    analogWrite(led_2,255);
    analogWrite(led_3,255);
    analogWrite(led_4,0);
   }
   if (real_vin >= 9)
  {
    analogWrite(led_1,255);
    analogWrite(led_2,255);
    analogWrite(led_3,255);
    analogWrite(led_4,255);
   }
  
 
  /* Affichage */
  Serial.println(real_vin, 3);
  delay(1000);
}
void secu() // Secu fermeture automatique si coupure de courant
  
    {  
       if (digitalRead(btn_park) == LOW)
  {
    digitalWrite(relais_secu,HIGH);
  }
    
 
    }
    

 

 

Voilà, vous savez tout.

 

Comme je le disais plus haut, le plus gros qu’il me reste à faire est d’intégrer le code de communication série INDI avec le miens. Et là, je dois dire que ça coince un peu.

 

Alors, au plaisir d’échanger avec vous pour trouver nos solutions.

 

 

Edited by Fabrice Teissier
  • J'aime 1

Share this post


Link to post
Share on other sites

Je ne sais pas comment vous faites pour insérer des images visibles directement dans vos réponses ni comment vous faites pour masquer le code.

Je suis preneur pour rendre mon post plus sexy 😉

Merci d'avance...

Share this post


Link to post
Share on other sites

Bonjour, Pour le code masqué,  il faut utiliser le tag "révélation" (l’œil) , puis à l’intérieur utiliser le tag "code" (les tags sont en haut de l'éditeur de message).

Pour les images, plusieurs solutions:

- En choisir une dans sa galerie

- Voir en bas de l'éditeur du message, "choisir les fichiers"  ou utiliser le menu "insérer un autre média"

Sinon pour le code "série/Indi" c'est où que tu coince ?

Yves.

il y a 30 minutes, Fabrice Teissier a dit :

Je ne sais pas comment vous faites pour insérer des images visibles directement dans vos réponses ni comment vous faites pour masquer le code.

Je suis preneur pour rendre mon post plus sexy 😉

Merci d'avance...

 

Yves.

Share this post


Link to post
Share on other sites
Posted (edited)

Bonjour Yves !

 

Merci pour les tuyaux ! Mon poste est bien plus sexy maintenant 🙂

 

Concernant le code, c'est toute la partie communication série avec INDI. Je voudrais rendre mon code compatible avec le driver INDI déjà existant du flip flat Alnitak. Mais là... Mes compétences sont vraiment légères. Je ne comprends pas bien comment communique ce driver avec l'arduino. Je ne comprends pas tout le code du driver 😰

 

Du genre :

Révélation

Typical usage on the command prompt:
Send     : >S000\n      //request state
Recieve  : *S19000\n    //returned state
Send     : >B128\n      //set brightness 128
Recieve  : *B19128\n    //confirming brightness set to 128
Send     : >J000\n      //get brightness
Recieve  : *B19128\n    //brightness value of 128 (assuming as set from above)
Send     : >L000\n      //turn light on (uses set brightness value)
Recieve  : *L19000\n    //confirms light turned on
Send     : >D000\n      //turn light off (brightness value should not be changed)
Recieve  : *D19000\n    //confirms light turned off.

 

 

ou :

Révélation

enum devices
{
    FLAT_MAN_L = 10,
    FLAT_MAN_XL = 15,
    FLAT_MAN = 19,
    FLIP_FLAT = 99
};
enum motorStatuses
{
    STOPPED = 0,
    RUNNING
};
enum lightStatuses
{
    OFF = 0,
    ON
};
enum shutterStatuses
{
    UNKNOWN = 0, // ie not open or closed...could be moving
    CLOSED,
    OPEN
};

 

 

Et la partie serial 😱 :

Révélation

void handleSerial()
{
  delay(100);
  if( Serial.available() >= 5 )  // all incoming communications are fixed length at 6 bytes including the \n
  {
    char* cmd;
    char* data;
    char temp[10];
    
    int len = 0;
    char str[20];
    memset(str, 0, 20);
    
    // I don't personally like using the \n as a command character for reading.  
    // but that's how the command set is.
  //  Serial.readBytesUntil('\n', str, 20);
  Serial.readBytes( str, 5);
    cmd = str + 1;
    data = str + 2;
    
    // useful for debugging to make sure your commands came through and are parsed correctly.
    if( false )
    {
      sprintf( temp, "cmd = >%s%s;", cmd, data);
      Serial.println(temp);
    }
    

    switch( *cmd )
    {
      /*
        Ping device
            Request: >P000\n
            Return : *Pii000\n
                id = deviceId
      */
      case 'P':
          sprintf(temp, "*P%d000\n", deviceId);
          Serial.print(temp);
          break;
      /*
        Open shutter
            Request: >O000\n
            Return : *Oii000\n
                id = deviceId
            This command is only supported on the Flip-Flat!
      */
      case 'O':
          sprintf(temp, "*O%d000\n", deviceId);
          SetShutter(OPEN);
          EEPROM.put(position_cap,OPEN);
          Serial.print(temp);
          break;

      /*
        Close shutter
            Request: >C000\n
            Return : *Cii000\n
                id = deviceId
            This command is only supported on the Flip-Flat!
      */
      case 'C':
          sprintf(temp, "*C%d000\n", deviceId);
          SetShutter(CLOSED);
          EEPROM.put(position_cap,CLOSED);
          Serial.print(temp);
          break;
      /*
        Turn light on
            Request: >L000\n
            Return : *Lii000\n
                id = deviceId
      */
      case 'L':
          sprintf(temp, "*L%d000\n", deviceId);
          Serial.print(temp);
          lightStatus = ON;
          break;
      /*
        Turn light off
            Request: >D000\n
            Return : *Dii000\n
                id = deviceId
      */
      case 'D':
          sprintf(temp, "*D%d000\n", deviceId);
          Serial.print(temp);
          lightStatus = OFF;
          analogWrite(ledPin, 0);
          break;
      /*
        Set brightness
            Request: >Bxxx\n
                xxx = brightness value from 000-255
            Return : *Biiyyy\n
                id = deviceId
                yyy = value that brightness was set from 000-255
      */
      case 'B':
          brightness = atoi(data);    
          if( lightStatus == ON )
          analogWrite(ledPin, brightness);
          sprintf( temp, "*B%d%03d\n", deviceId, brightness );
          Serial.print(temp);
        break;
      /*
        Get brightness
            Request: >J000\n
            Return : *Jiiyyy\n
                id = deviceId
                yyy = current brightness value from 000-255
      */
      case 'J':
        sprintf( temp, "*J%d%03d\n", deviceId, brightness);
        Serial.print(temp);
        break;
      
      /*
        Get device status:
            Request: >S000\n
            Return : *SidMLC\n
                id = deviceId
                M  = motor status( 0 stopped, 1 running)
                L  = light status( 0 off, 1 on)
                C  = Cover Status( 0 moving, 1 closed, 2 open)
      */
      case 'S':
        sprintf( temp, "*S%d%d%d%d\n",deviceId, motorStatus, lightStatus, EEPROM.get(position_cap,coverStatus));
        Serial.print(temp);
        break;
      /*
        Get firmware version
            Request: >V000\n
            Return : *Vii001\n
                id = deviceId
      */
      case 'V': // get firmware version
          sprintf(temp, "*V%d001\n", deviceId);
          Serial.print(temp);
          break;
    }    
    while( Serial.available() > 0 )
        Serial.read();
            
  }
}

 

 

Edited by Fabrice Teissier

Share this post


Link to post
Share on other sites

Bonjour, le driver indi en question c'est celui-ci "indi_flipflat " ?

Yves.

Share this post


Link to post
Share on other sites

@Fabrice Teissier pfiou !!! magnifique programme !!

c'est quoi que tu piges pas dans le code arduino ?

Share this post


Link to post
Share on other sites

@gehelem Bah... Toute la partie "void handleSerial()"

 

Par exemple :

 /*
        Set brightness
            Request: >Bxxx\n
                xxx = brightness value from 000-255
            Return : *Biiyyy\n
                id = deviceId
                yyy = value that brightness was set from 000-255
      */
      case 'B':
          brightness = atoi(data);    
          if( lightStatus == ON )
          analogWrite(ledPin, brightness);
          sprintf( temp, "*B%d%03d\n", deviceId, brightness );
          Serial.print(temp);
        break;
      /*
        Get brightness
            Request: >J000\n
            Return : *Jiiyyy\n
                id = deviceId
                yyy = current brightness value from 000-255
      */

Je ne comprends pas bien la façon de programmer.

 

/* c'est quoi ?

Il y a du texte derrière qui ne semble pas être du programme comme : "Set brightness" ou "xxx = brightness value from 000-255"

Et puis le Request: >Bxxx\n ou Return : *Biiyyy\n et id = deviceId

Ou encore sprintf( temp, "*B%d%03d\n", deviceId, brightness );

 

Cela me fait beaucoup d'inconnus pour si peu de lignes 😥

 

 

Share this post


Link to post
Share on other sites
il y a 24 minutes, Fabrice Teissier a dit :

/* c'est quoi ?

 

C'est du C/C++ 

le "/*" signifie "début de commentaire"

et "*/" "fin de commentaire"

les autres trucs des du formatage de texte pour les commandes série

Tu retrouves ces commandes dans le protocole décrit par Alnitak

 

 

Share this post


Link to post
Share on other sites
Posted (edited)

Merci !

En fait, je regardais le programme avec un logiciel de notes qui ne différentie pas le code des annotations.

Maintenant, en utilisant directement l'éditeur de l'arduino, c'est beaucoup plus clair.

 

En me documentant sur le web, j'ai pu comprendre un peu mieux le programme. Je butais sur des fonctions tels que enum, switch et case.

 

J'ai donc copié la partie nécessaire à la communication série en prenant en compte les nouvelles variables, je l'ai adapté à mon programme et fait des essais avec le soft Mac proposé sur le site d'Optec pour piloter le Flip flat en USB directement à partir du Mac.

 

https://rti-zone.org/macosx_flatmancontrol.php

 

Et là... Bonne surprise, ça marche presque bien. Je récupère les status du Flip flat, j'arrive à ouvrir et fermer le capot mais en revanche, je n'arrive pas à allumer ou éteindre le panneau EL et encore moins à régler l'intensité lumineuse.

J'ai essayer de placer ma commande du relais et celle du panneau à différentes positions dans les parties du code correspondant aux commande d'éclairage mais sans succès.

J'ai aussi essayé de passé outre mon système de panneau lumineux en essayant simplement d'allumer une des quatre led branchées à l'arduino mais ça ne marche pas non plus.

 

Si quelqu'un a une idée, voilà mon code :

Révélation

 

#include <Arduino.h>
#include <Servo.h>
 
 
Servo ServoCapot;
Servo ServoRotation;
Servo ServoTranslation;

const int btn_capot = A0;
const int btn_voltmetre = A2;
const int btn_ELpan = A1;
const int btn_park = A5;
const int ctc_capot_ouvert = A3;
const int ctc_capot_ferme = A4;

const int led_1 = 4;
const int led_2 = 5;
const int led_3 = 6;
const int led_4 = 7;
const int ELpan = 3;

const int relais_ELpan = 13;
const int relais_secu = 8;
const int relais_servo = 12;


int AngleServoCapot= 0;
int AngleServoRotation= 137;
int AngleServoTranslation= 47;
int reception;
int compte_btn_ELpan = 0; // le nombre qui sera incrémenté et décrémenté
int etat_btn_ELpan = LOW; // lecture de l'état des boutons (un seul à la fois donc une variable suffit)
int etatprecedent_btn_ELpan = LOW; // état relâché par défaut
int real_vin(); // Variable de la tension mesuré par le voltmetre

const byte BROCHE_CAPTEUR_VIN = A7; // Le numéro de broche analogique pour la mesure de la tension en VIN
const float COEFF_PONT_DIVISEUR_VIN = 1.95; // Coefficient diviseur du pont de résistance
String commande;

 //Alnitak
 
 int brightness = 0;

enum devices
{
  FLAT_MAN_L = 10,
  FLAT_MAN_XL = 15,
  FLAT_MAN = 19,
  FLIP_FLAT = 99
};

enum motorStatuses
{
  STOPPED = 0,
  RUNNING
};

enum lightStatuses
{
  OFF = 0,
  ON
};

enum coverStatuses
{
  UNKNOWN = 0, // ie not open or closed...could be moving
  CLOSED,
  OPEN
};


int deviceId = FLIP_FLAT;
int motorStatus = STOPPED;
int lightStatus = OFF;
int coverStatus = UNKNOWN;

    
void setup()
{
    Serial.begin(9600);
    
    ServoCapot.attach(9, 500, 2475); // init pin
    ServoRotation.attach(10, 500, 2475); // init pin
    ServoTranslation.attach(11, 500, 2475); // init pin

    ServoCapot.write(AngleServoCapot);
    ServoRotation.write(AngleServoRotation);
    ServoTranslation.write(AngleServoTranslation);
    
    pinMode(btn_capot,INPUT);     
    pinMode(btn_voltmetre,INPUT);
    pinMode(btn_ELpan, INPUT);
    pinMode(btn_park, INPUT);
    pinMode(ctc_capot_ouvert, INPUT);
    pinMode(ctc_capot_ferme, INPUT);    
    pinMode(led_1, OUTPUT);
    pinMode(led_2, OUTPUT);
    pinMode(led_3, OUTPUT);
    pinMode(led_4, OUTPUT);
    pinMode(ELpan, OUTPUT);
    pinMode(relais_ELpan, OUTPUT);
    pinMode(relais_secu,OUTPUT);   
    pinMode(relais_servo,OUTPUT);   

    attachInterrupt(digitalPinToInterrupt(2), secu, FALLING);
    
}
 
unsigned int analogReadReference(void) // Mesure la référence interne à 1.1 volts
{
  
// Elimine toutes charges résiduelles
#if defined(__AVR_ATmega328P__)
  ADMUX = 0x4F;
#elif defined(__AVR_ATmega2560__)
  ADCSRB &= ~(1 << MUX5);
  ADMUX = 0x5F;
#elif defined(__AVR_ATmega32U4__)
  ADCSRB &= ~(1 << MUX5);
  ADMUX = 0x5F;
#endif
  delayMicroseconds(5);
  
// Sélectionne la référence interne à 1.1 volts comme point de mesure, avec comme limite haute VCC
#if defined(__AVR_ATmega328P__)
  ADMUX = 0x4E;
#elif defined(__AVR_ATmega2560__)
  ADCSRB &= ~(1 << MUX5);
  ADMUX = 0x5E;
#elif defined(__AVR_ATmega32U4__)
  ADCSRB &= ~(1 << MUX5);
  ADMUX = 0x5E;
#endif
  delayMicroseconds(200);

  
  ADCSRA |= (1 << ADEN); // Active le convertisseur analogique -> numérique
  
  ADCSRA |= (1 << ADSC); // Lance une conversion analogique -> numérique
  
  while(ADCSRA & (1 << ADSC)); // Attend la fin de la conversion
  
  return ADCL | (ADCH << 8); // Récupère le résultat de la conversion
}

void loop() 
{           
  if (digitalRead(ctc_capot_ouvert) == HIGH)
  {
    coverStatus = OPEN; 
    }
     if (digitalRead(ctc_capot_ferme) == HIGH)
  {
    coverStatus = CLOSED; 
    }

    handleSerial();

// Ouverture Fermeture capot    
   if((digitalRead(btn_capot) == HIGH) && (digitalRead(ctc_capot_ouvert) == HIGH) && (digitalRead(btn_park) == LOW))
    {
    fermeture(); 
    }
   if((digitalRead(btn_capot) == HIGH) && (digitalRead(ctc_capot_ferme) == HIGH) && (digitalRead(btn_park) == LOW))
    {
      
    ouverture();
    }
    if((digitalRead(btn_park) == HIGH) && (digitalRead(ctc_capot_ferme) == HIGH))
    {
      
    ouverture();
    }
  
    if (digitalRead(relais_secu)==(HIGH))
      {  
        if (digitalRead(ctc_capot_ouvert) == HIGH)
        {
      fermeture();
      }
      if(digitalRead(ctc_capot_ferme) == HIGH)
    {
      
    delay(1000);    
    digitalWrite(relais_secu,LOW);
    }
      
      }
  
 

// ELpan
    etat_btn_ELpan = digitalRead(btn_ELpan);
   if (etat_btn_ELpan != etatprecedent_btn_ELpan) // si l'état du bouton a changé
      {
      if (etat_btn_ELpan == HIGH) // et qu'il est haut (= on appuie dessus)
        {
        compte_btn_ELpan++; // on incrémente le compteur
        if (compte_btn_ELpan > 4) // sauf s'il a dépassé 4...
          {
           compte_btn_ELpan = 0; // ...auquel cas on le réinitialise
          }
       }
    
      }
       
     progELpan(); // on execute progELpan
    etatprecedent_btn_ELpan = etat_btn_ELpan; // et on stocke l'atat du bouton pour le prochain tour
   
     
// Voltmetre
    if (digitalRead(btn_voltmetre) == HIGH)
      {
        delay(100);
      voltmetre(); // On execute volmetre
      }
    else
      {
      analogWrite(led_1,0);
      analogWrite(led_2,0);
      analogWrite(led_3,0);
      analogWrite(led_4,0);
      }
} 

void ouverture() // Routine ouverture capot
{ 
 
 
  if (compte_btn_ELpan >= 1)
          {
           
  analogWrite(led_1,0);
  analogWrite(led_2,0);
  analogWrite(led_3,0);
  analogWrite(led_4,0);
  analogWrite(ELpan,0);
  digitalWrite(relais_ELpan,LOW);
  Serial.println("EL panel éteind");  
  }
    digitalWrite(relais_servo,HIGH);
       delay(500); 
  while(!(((AngleServoTranslation)==(137))))
      {
      ServoTranslation.write((AngleServoTranslation) + (1)); 
      AngleServoTranslation += 1;
      delay(20);//_delay(0.02);
      }
       
   delay(1000);//_delay(1);
        
   while(!(((AngleServoCapot)==(180))))
      {
      ServoCapot.write((AngleServoCapot) + (1)); 
      AngleServoCapot += 1;
      delay(20);//_delay(0.02);
      }
        
   delay(1000);//_delay(1);

   while(!(((AngleServoRotation)==(47))))
      {
       ServoRotation.write((AngleServoRotation) - (1)); 
       AngleServoRotation += -1;
       delay(20);//_delay(0.02);
      }
        delay(500); 
         if (digitalRead(ctc_capot_ouvert) == HIGH)
          {
            digitalWrite(relais_servo,LOW);
      Serial.println("Capot ouvert");
          }
     
}
 
 void fermeture() // Routine fermeture capot 
  { 
  // compte_btn_ELpan = 0; 
     digitalWrite(relais_servo,HIGH);
       delay(500); 
   while(!(((AngleServoRotation)==(137))))
        {

            ServoRotation.write((AngleServoRotation) + (1)); 
            AngleServoRotation += 1;
            delay(20);// _delay(0.02);

        }

        delay(1000);//_delay(1);

        while(!(((AngleServoCapot)==(0))))
        {

            ServoCapot.write((AngleServoCapot) - (1));
            AngleServoCapot += -1;
            delay(20);// _delay(0.02);

        }

        delay(1000);//_delay(1);

        while(!(((AngleServoTranslation)==(47))))
        {

            ServoTranslation.write((AngleServoTranslation) - (1));
            AngleServoTranslation += -1;
            delay(20);// _delay(0.02);

        }
          delay(500); 
           if (digitalRead(ctc_capot_ferme) == HIGH)
          {
            digitalWrite(relais_servo,LOW);
      Serial.println("Capot fermé");
          }
      
    }
 
void handleSerial()
{
  if( Serial.available() >= 5 )  // all incoming communications are fixed length at 6 bytes including the \n
  {
    char* cmd;
  char* data;
    char temp[10];
    
    int len = 0;

    char str[20];
    memset(str, 0, 20);
    
  // I don't personally like using the \n as a command character for reading.  
  // but that's how the command set is.
    Serial.readBytesUntil('\n', str, 20);

  cmd = str + 1;
  data = str + 2;
  
  // useful for debugging to make sure your commands came through and are parsed correctly.
    if( false )
    {
      sprintf( temp, "cmd = >%s%s;", cmd, data);
      Serial.println(temp);
    } 
    


    switch( *cmd )
    {
    /*
    Ping device
      Request: >P000\n
      Return : *Pii000\n
        id = deviceId
    */
      case 'P':
      sprintf(temp, "*P%d000\n", deviceId);
      Serial.print(temp);
      break;

      /*
    Open shutter
      Request: >O000\n
      Return : *Oii000\n
        id = deviceId
      This command is only supported on the Flip-Flat!
    */
      case 'O':
      sprintf(temp, "*O%d000\n", deviceId);
      ouverture();
      Serial.print(temp);
      break;


      /*
    Close shutter
      Request: >C000\n
      Return : *Cii000\n
        id = deviceId
      This command is only supported on the Flip-Flat!
    */
      case 'C':
      sprintf(temp, "*C%d000\n", deviceId);
      fermeture();
      Serial.print(temp);
      break;

    /*
    Turn light on
      Request: >L000\n
      Return : *Lii000\n
        id = deviceId
    */
      case 'L':
      sprintf(temp, "*L%d000\n", deviceId);
      Serial.print(temp);
      analogWrite(led_4, brightness);
      lightStatus = ON;
     
      
      break;

    /*
    Turn light off
      Request: >D000\n
      Return : *Dii000\n
        id = deviceId
    */
      case 'D':
      sprintf(temp, "*D%d000\n", deviceId);
      Serial.print(temp);
      lightStatus = OFF;
      analogWrite(led_4, 0);
      break;

    /*
    Set brightness
      Request: >Bxxx\n
        xxx = brightness value from 000-255
      Return : *Biiyyy\n
        id = deviceId
        yyy = value that brightness was set from 000-255
    */
      case 'B':
      brightness = atoi(data);    
      if( lightStatus == ON )  
      sprintf( temp, "*B%d%03d\n", deviceId, brightness );
      Serial.print(temp);
      analogWrite(led_4, brightness);  
        break;

    /*
    Get brightness
      Request: >J000\n
      Return : *Jiiyyy\n
        id = deviceId
        yyy = current brightness value from 000-255
    */
      case 'J':
        sprintf( temp, "*J%d%03d\n", deviceId, brightness);
        Serial.print(temp);
        break;
      
    /*
    Get device status:
      Request: >S000\n
      Return : *SidMLC\n
        id = deviceId
        M  = motor status( 0 stopped, 1 running)
        L  = light status( 0 off, 1 on)
        C  = Cover Status( 0 moving, 1 closed, 2 open)
    */
      case 'S': 
        sprintf( temp, "*S%d%d%d%d\n",deviceId, motorStatus, lightStatus, coverStatus);
        Serial.print(temp);
        break;

    /*
    Get firmware version
      Request: >V000\n
      Return : *Vii001\n
        id = deviceId
    */
      case 'V': // get firmware version
      sprintf(temp, "*V%d001\n", deviceId);
      Serial.print(temp);
      break;
    }    

  while( Serial.available() > 0 )
    Serial.read();

  }
}

void progELpan() // Routine éclairage EL panel
{
   if ((compte_btn_ELpan >= 1) && (AngleServoTranslation == 47))
        {
        digitalWrite(relais_ELpan,HIGH); // on allume le relai
        }
      else 
        {
        digitalWrite(relais_ELpan,LOW); // on eteind le relai
        } 
      if (compte_btn_ELpan == 0)
  {
    analogWrite(led_1,0);
    analogWrite(led_2,0);
    analogWrite(led_3,0);
    analogWrite(led_4,0);
    analogWrite(ELpan,0);
  }
      if ((compte_btn_ELpan == 1) && (digitalRead(ctc_capot_ferme) == HIGH))
  {
    analogWrite(led_1,255);
    analogWrite(led_2,0);
    analogWrite(led_3,0);
    analogWrite(led_4,0);
    analogWrite(ELpan,27);
  }
     if ((compte_btn_ELpan == 2) && (digitalRead(ctc_capot_ferme) == HIGH))
  {
    analogWrite(led_1,255);
    analogWrite(led_2,255);
    analogWrite(led_3,0);
    analogWrite(led_4,0);
    analogWrite(ELpan,50);
  }
     if ((compte_btn_ELpan == 3) && (digitalRead(ctc_capot_ferme) == HIGH))
  {
    analogWrite(led_1,255);
    analogWrite(led_2,255);
    analogWrite(led_3,255);
    analogWrite(led_4,0);
    analogWrite(ELpan,90);
  }
    if ((compte_btn_ELpan == 4) && (digitalRead(ctc_capot_ferme) == HIGH))
  {
    analogWrite(led_1,255);
    analogWrite(led_2,255);
    analogWrite(led_3,255);
    analogWrite(led_4,255);
    analogWrite(ELpan,255);
  }
 
}

void voltmetre() // Routine voltmetre
{
 
  // Mesure la tension en VIN et la référence interne à 1.1 volts
  unsigned int raw_vin = analogRead(BROCHE_CAPTEUR_VIN);
  unsigned int raw_ref = analogReadReference();
  
  // Calcul de la tension réel avec un produit en croix
  float real_vin = ((raw_vin * 1.1) / raw_ref) * COEFF_PONT_DIVISEUR_VIN;
  
         if (real_vin >= 6)
  {
    analogWrite(led_1,255);
    analogWrite(led_2,0);
    analogWrite(led_3,0);
    analogWrite(led_4,0);
  }
       if (real_vin >= 7)
  {
    analogWrite(led_1,255);
    analogWrite(led_2,255);
    analogWrite(led_3,0);
    analogWrite(led_4,0);
   }
    if (real_vin >= 8)
  {
    analogWrite(led_1,255);
    analogWrite(led_2,255);
    analogWrite(led_3,255);
    analogWrite(led_4,0);
   }
   if (real_vin >= 9)
  {
    analogWrite(led_1,255);
    analogWrite(led_2,255);
    analogWrite(led_3,255);
    analogWrite(led_4,255);
   }
  
 
  /* Affichage */
  Serial.println(real_vin, 3);
  delay(1000);
}

void secu() // Secu fermeture automatique si coupure de courant
  
    {  
       if (digitalRead(btn_park) == LOW)
  {
    digitalWrite(relais_secu,HIGH);
  }
    
 
    }
    

 

 

Par ailleurs, j'ai trouvé des trucs bizarres dans le code original concernant trois variables qui ne sont pas écrites de la même manière dans la partie setup et dans loop :

Dans la partie enum, il y a motorStatuses, lightStatuses et coverStatuses.

Et dans le programme, elles sont écrites motorStatus, lightStatus et coverStatus.

Est-ce normal ?

 

Merci pour votre aide...

 

Edited by Fabrice Teissier

Share this post


Link to post
Share on other sites

Bonjour, dans votre code, dans les routine "void progELpan"  et "void handleSerial()" entre autre, vous utilisez souvent la fonction "analogWrite()", je pencherais plus sur la fonction "digitalWrite()", surtout quand vous voulez piloté un relais ou une sortie en tout ou rien, "analogWrite()" est à utiliser si vous décidez d'utiliser la sortie en mode PWM pour faire varier un éclairage par exemple.

Attention également, la moindre fonction "digitalRead()" ou digitalWrite'), sur une sortie piloté en PWM  annule le mode PWM.

 

Après bien sur, les sorties de l'arduino utilisées en tout ou rien ne peuvent pas piloter directement une forte puissance, il faut passer par un module de puissance. Cette remarque ne concerne pas la sortie pour piloter la broche de commande d'un servo-moteur, car celle ci ne consomme quasiment aucun courant.

 

Comme vous utiliser la bibliothèque "Servo.h", il ne faut pas utiliser analogueWrite(), pour piloter un servo moteur, mais les commandes suivantes attach(), detach(), write(), un petit exemple de code

Révélation

// petit programme arduino pour piloter un servo-moteur

#înclude <Servo.h>

// broche 5, sortie digital, mon_servo, on pilote un servo-moteur de radiocomande
  
servo mon_servo; // on crée la variable mon_servo

void setup()
{
  mon_servo.attach(5); // on définit la sortit utilisée pour piloter le servo
  mon_servo.write(0); // on force la position du servo sur 0°
}

Void loop()
{
  mon_servo.write(36); // on régle le servo sur 36°
  delay(200); // un petit délai (commande pas forcément nécéssaire suivant comment est fait le programme, là c'est un exemple !) 
  // etc....
}

 

 

Pour les variables "motorStatuses", "lightStatuses" et "coverStatuses" écrites différemment dans le code c'est normal, car dans un cas c'est une variables, dans l'autre c'est une énumération qui représente la valeur à écrire dans la variable, ce sont deux choses différentes si j'ai compris votre code.

 

Une bonne habitude à prendre en programmation arduino, enfin c'est comme ça que je fait, en début de code en commentaire mettre les entrées-sorties utilisés, exemple:

//  a1, entré analogique, ea_temp, capteur température.

// broche 3, sortit digitale, sd_ecl, pilotage relais éclairage.

// broche 4, entrée digitale , ed_fch, fin de course haut

// etc...

Histoire de savoir quel broches est utilisé, dans quel sens, le nom de la variable qui la représente  et qu'elle est sa fonction, c'est plus simple par la suite pour détecter une erreur dans le reste du code.

Yves.

 

il y a une heure, Fabrice Teissier a dit :

Et là... Bonne surprise, ça marche presque bien. Je récupère les status du Flip flat, j'arrive à ouvrir et fermer le capot mais en revanche, je n'arrive pas à allumer ou éteindre le panneau EL et encore moins à régler l'intensité lumineuse.

J'ai essayer de placer ma commande du relais et celle du panneau à différentes positions dans les parties du code correspondant aux commande d'éclairage mais sans succès.

J'ai aussi essayé de passé outre mon système de panneau lumineux en essayant simplement d'allumer une des quatre led branchées à l'arduino mais ça ne marche pas non plus.

 

 

Par ailleurs, j'ai trouvé des trucs bizarres dans le code original concernant trois variables qui ne sont pas écrites de la même manière dans la partie setup et dans loop :

Dans la partie enum, il y a motorStatuses, lightStatuses et coverStatuses.

Et dans le programme, elles sont écrites motorStatus, lightStatus et coverStatus.

Est-ce normal ?

 

Merci pour votre aide...

 

Yves.

 

Share this post


Link to post
Share on other sites

Ayé ! J'ai trouvé !

 

Pour essayer de comprendre ce qui se passe, j'ai supprimé une à une toutes les parties de mon programme qui s'occupe des commandes en local avec les boutons. Et quand je supprime la partie concernant la commande du panneau EL, cela fonctionne très bien en remote. J'ai donc un conflit entre ma programmation de la commande en local du panneau avec celle de la commande en remote.

Plus qu'à trouver...

Share this post


Link to post
Share on other sites
Posted (edited)

Voila ! J'ai enfin réussit à assembler le code de commandes séries Alnitak avec le mien.

J'ai donc accès à toutes les commandes en local avec des boutons et en remote avec les softs Optec, INDI et ascom.

J'ai même testé mon Flip flat avec Ekos dans KStars et ça a marché nickel à part un petit message de "time out" que j'aimerais bien régler.

Je dis que ça a marché parce que je n'y arrive plus. En fait, ma config est un peu particulière. N'ayant pas encore de Nafabox, et étant sur Mac, j'utilise VirtualBox pour émuler un PC sous Linux sur lequel j'ai installé une image disque Nafabox compatible. Lors du premier essai, j'ai réussi à faire reconnaitre la liaison USB de mon Arduino Flip flat avec la Virtual machine et donc par Eko/INDI. J'étais presque impressionné que ça fonctionne du premier coup.

Seulement voilà, je n'y arrive plus. INDI ne voit plus ma connection USB Arduino. J'ai essayé plein de trucs dans les settings VirtualBox sans succès.

Et je n'arrive pas à ouvrir le "Serial port assistant" dans Ekos. Si quelqu'un a une idée, je suis preneur.

 

En attendant, voilà le code de mon Flip flat Arduino compatible Alnitak :

 

Révélation

 

#include <Arduino.h>
#include <Servo.h>
 
 
Servo ServoCapot;
Servo ServoRotation;
Servo ServoTranslation;

const int btn_capot = A0;//Bouton de commande d'ouverture et fermeture du capot
const int btn_voltmetre = A2;//Bouton pour vérifier l'état des plies
const int btn_ELpan = A1;//Bouton de commande du panneau lumineux
const int btn_park = A5;//Switch d'ouverture neutralisant la sécu de fermeture auto pour démontage
const int ctc_capot_ouvert = A3;//Contacteur de position ouvert
const int ctc_capot_ferme = A4;//Contacteur de position fermé

const int led_1 = 4;//Visu du niveau du panneau lumineux en commande local et niveau de piles
const int led_2 = 5;
const int led_3 = 6;
const int led_4 = 7;
const int ELpan = 3;//Panneau lumineux

const int relais_ELpan = 13;//Relais d'alimentation du panneau lumineux
const int relais_secu = 8;//Relais d'alimentation secours par les piles
const int relais_servo = 12;//Relais d'alimentation des servos


int AngleServoCapot= 0;
int AngleServoRotation= 137;
int AngleServoTranslation= 47;
int reception;
int compte_btn_ELpan = 0; // le nombre qui sera incrémenté et décrémenté
int etat_btn_ELpan = LOW; // lecture de l'état des boutons (un seul à la fois donc une variable suffit)
int etatprecedent_btn_ELpan = LOW; // état relâché par défaut
int real_vin(); // Variable de la tension mesuré par le voltmetre

const byte BROCHE_CAPTEUR_VIN = A7; // Le numéro de broche analogique pour la mesure de la tension en VIN
const float COEFF_PONT_DIVISEUR_VIN = 1.95; // Coefficient diviseur du pont de résistance
String commande;


 //Alnitak init
int brightness = 0;

enum devices
{
  FLAT_MAN_L = 10,
  FLAT_MAN_XL = 15,
  FLAT_MAN = 19,
  FLIP_FLAT = 99
};

enum motorStatuses
{
  STOPPED = 0,
  RUNNING
};

enum lightStatuses
{
  OFF = 0,
  ON
};

enum coverStatuses
{
  UNKNOWN = 0, // ie not open or closed...could be moving
  CLOSED,
  OPEN
};


int deviceId = FLIP_FLAT;
int motorStatus = STOPPED;
int lightStatus = OFF;
int coverStatus = UNKNOWN;

    
void setup()
{
    Serial.begin(9600);
    
    ServoCapot.attach(9, 500, 2475); // init pin
    ServoRotation.attach(10, 500, 2475); // init pin
    ServoTranslation.attach(11, 500, 2475); // init pin

    ServoCapot.write(AngleServoCapot);
    ServoRotation.write(AngleServoRotation);
    ServoTranslation.write(AngleServoTranslation);
    
    pinMode(btn_capot,INPUT);     
    pinMode(btn_voltmetre,INPUT);
    pinMode(btn_ELpan, INPUT);
    pinMode(btn_park, INPUT);
    pinMode(ctc_capot_ouvert, INPUT);
    pinMode(ctc_capot_ferme, INPUT);    
    pinMode(led_1, OUTPUT);
    pinMode(led_2, OUTPUT);
    pinMode(led_3, OUTPUT);
    pinMode(led_4, OUTPUT);
    pinMode(ELpan, OUTPUT);
    pinMode(relais_ELpan, OUTPUT);
    pinMode(relais_secu,OUTPUT);   
    pinMode(relais_servo,OUTPUT);   

    attachInterrupt(digitalPinToInterrupt(2), secu, FALLING);
    
}
 
unsigned int analogReadReference(void) // Mesure la référence interne à 1.1 volts
{
  
// Elimine toutes charges résiduelles
#if defined(__AVR_ATmega328P__)
    ADMUX = 0x4F;
#elif defined(__AVR_ATmega2560__)
    ADCSRB &= ~(1 << MUX5);
    ADMUX = 0x5F;
#elif defined(__AVR_ATmega32U4__)
    ADCSRB &= ~(1 << MUX5);
    ADMUX = 0x5F;
#endif
    delayMicroseconds(5);
  
// Sélectionne la référence interne à 1.1 volts comme point de mesure, avec comme limite haute VCC
#if defined(__AVR_ATmega328P__)
    ADMUX = 0x4E;
#elif defined(__AVR_ATmega2560__)
    ADCSRB &= ~(1 << MUX5);
    ADMUX = 0x5E;
#elif defined(__AVR_ATmega32U4__)
    ADCSRB &= ~(1 << MUX5);
    ADMUX = 0x5E;
#endif
    delayMicroseconds(200);

  
  ADCSRA |= (1 << ADEN); // Active le convertisseur analogique -> numérique
  
  ADCSRA |= (1 << ADSC); // Lance une conversion analogique -> numérique
  
  while(ADCSRA & (1 << ADSC)); // Attend la fin de la conversion
  
  return ADCL | (ADCH << 8); // Récupère le résultat de la conversion
}

void loop() 
{           
if (digitalRead(ctc_capot_ouvert) == HIGH)
    {
    coverStatus = OPEN; 
    }
    
if (digitalRead(ctc_capot_ferme) == HIGH)
    {
    coverStatus = CLOSED; 
    }

handleSerial();

// Ouverture Fermeture capot  en local 
if((digitalRead(btn_capot) == HIGH) && (digitalRead(ctc_capot_ouvert) == HIGH) && (digitalRead(btn_park) == LOW))
    {
    fermeture(); 
    }
    
if((digitalRead(btn_capot) == HIGH) && (digitalRead(ctc_capot_ferme) == HIGH) && (digitalRead(btn_park) == LOW))
    {    
    ouverture();
    }
    
if((digitalRead(btn_park) == HIGH) && (digitalRead(ctc_capot_ferme) == HIGH))
    {      
    ouverture();
    }

 // Fermeture automatique en cas de coupure de courant 
if (digitalRead(relais_secu)==(HIGH))
    {  
     if (digitalRead(ctc_capot_ouvert) == HIGH)
        {
        fermeture();
        }
        
     if(digitalRead(ctc_capot_ferme) == HIGH)
        {    
        delay(1000);    
        digitalWrite(relais_secu,LOW);
        }    
    }
  
 

// ELpan : control local du panneau EL
etat_btn_ELpan = digitalRead(btn_ELpan);

if (etat_btn_ELpan != etatprecedent_btn_ELpan) // si l'état du bouton a changé
    {
    if (etat_btn_ELpan == HIGH) // et qu'il est haut (= on appuie dessus)
        {
        compte_btn_ELpan++; // on incrémente le compteur
        if (compte_btn_ELpan > 5) // sauf s'il a dépassé 5...
            {
            compte_btn_ELpan = 0; // ...auquel cas on le réinitialise
            }
        }
    }
    
progELpan(); // on execute progELpan
etatprecedent_btn_ELpan = etat_btn_ELpan; // et on stocke l'atat du bouton pour le prochain tour 
         

 
// Voltmetre : control local du niveau des piles 9v
if (digitalRead(btn_voltmetre) == HIGH)
    {
     delay(100);
     voltmetre(); // On execute volmetre
    }
    
else
    {
     analogWrite(led_1,0);
     analogWrite(led_2,0);
     analogWrite(led_3,0);
     analogWrite(led_4,0);
    }
} 

void ouverture() // Routine ouverture capot
{ 
if (compte_btn_ELpan >= 1)// Si le panneau EL est allumé
    {
    compte_btn_ELpan = 0; // On l'éteind          
    analogWrite(led_1,0);
    analogWrite(led_2,0);
    analogWrite(led_3,0);
    analogWrite(led_4,0);
    analogWrite(ELpan,0);
    digitalWrite(relais_ELpan,LOW);
    Serial.println("EL panel éteind");  
    }
  
digitalWrite(relais_servo,HIGH);
delay(500); 
  
while(!(((AngleServoTranslation)==(137))))
    {
    ServoTranslation.write((AngleServoTranslation) + (1)); 
    AngleServoTranslation += 1;
    delay(20);//_delay(0.02);//Réglage de la vitesse du servo
    }
       
delay(1000);//_delay(1);
        
while(!(((AngleServoCapot)==(180))))
    {
    ServoCapot.write((AngleServoCapot) + (1)); 
    AngleServoCapot += 1;
    delay(20);//_delay(0.02);//Réglage de la vitesse du servo
    }
        
delay(1000);//_delay(1);

while(!(((AngleServoRotation)==(47))))
    {
    ServoRotation.write((AngleServoRotation) - (1)); 
    AngleServoRotation += -1;
    delay(20);//_delay(0.02);//Réglage de la vitesse du servo
    }
    
delay(500); 
  
if (digitalRead(ctc_capot_ouvert) == HIGH)
    {
    digitalWrite(relais_servo,LOW);
    Serial.println("Capot ouvert");
    } 
}
 
 void fermeture() // Routine fermeture capot 
{ 
digitalWrite(relais_servo,HIGH);
delay(500); 
  
while(!(((AngleServoRotation)==(137))))
    {
    ServoRotation.write((AngleServoRotation) + (1)); 
    AngleServoRotation += 1;
    delay(20);// _delay(0.02);//Réglage de la vitesse du servo
    }

delay(1000);//_delay(1);

while(!(((AngleServoCapot)==(0))))
    {
    ServoCapot.write((AngleServoCapot) - (1));
    AngleServoCapot += -1;
    delay(20);// _delay(0.02);//Réglage de la vitesse du servo
    }

delay(1000);//_delay(1);

while(!(((AngleServoTranslation)==(47))))
    {
    ServoTranslation.write((AngleServoTranslation) - (1));
    AngleServoTranslation += -1;
    delay(20);// _delay(0.02);//Réglage de la vitesse du servo
    }
    
delay(500); 
  
if (digitalRead(ctc_capot_ferme) == HIGH)
    {
    digitalWrite(relais_servo,LOW);
    Serial.println("Capot fermé");
    }    
}
 
void handleSerial() // Communication serie protocol Alnitak
{
if( Serial.available() >= 5 )  // all incoming communications are fixed length at 6 bytes including the \n
    {
    char* cmd;
    char* data;
    char temp[10];   
    int len = 0;
    char str[20];
    memset(str, 0, 20);
    Serial.readBytesUntil('\n', str, 20);  
    cmd = str + 1;
    data = str + 2;
    
    if( false ) // useful for debugging to make sure your commands came through and are parsed correctly.
       {
       sprintf( temp, "cmd = >%s%s;", cmd, data);
       Serial.println(temp);
       } 

    switch( *cmd )
       {
      case 'P':// Ping device
      sprintf(temp, "*P%d000\n", deviceId);
      Serial.print(temp);
      break;

      case 'O': // Open shutter
      sprintf(temp, "*O%d000\n", deviceId);
      Serial.print(temp);
      coverStatus = OPEN; 
      analogWrite(ELpan,0);
      digitalWrite(relais_ELpan,LOW);
      lightStatus = OFF;
      ouverture();      
      break;

      case 'C':// Close shutter
      sprintf(temp, "*C%d000\n", deviceId);
      Serial.print(temp);
      coverStatus = CLOSED;
      fermeture();     
      compte_btn_ELpan = 0;
      break;

      case 'L':// Turn light on
      sprintf(temp, "*L%d000\n", deviceId);
      Serial.print(temp);
      compte_btn_ELpan = 5;
      digitalWrite(relais_ELpan,HIGH);
      lightStatus = ON; 
      break;

      case 'D':// Turn light off
      sprintf(temp, "*D%d000\n", deviceId);
      Serial.print(temp);
      lightStatus = OFF;
      compte_btn_ELpan = 0;
      break;

      case 'B':// Set brightness
      brightness = atoi(data);    
      if( lightStatus == ON )  
      sprintf( temp, "*B%d%03d\n", deviceId, brightness );
      Serial.print(temp);
      analogWrite(ELpan,brightness);
      break;

      case 'J':// Get brightness
      sprintf( temp, "*J%d%03d\n", deviceId, brightness);
      Serial.print(temp);
      break;
      
      case 'S':// Get device status
      sprintf( temp, "*S%d%d%d%d\n",deviceId, motorStatus, lightStatus, coverStatus);
      Serial.print(temp);
      break;

      case 'V': // get firmware version
      sprintf(temp, "*V%d001\n", deviceId);
      Serial.print(temp);
      break;
        }    

    while( Serial.available() > 0 )
    Serial.read();

     }
}

void progELpan() // Routine éclairage EL panel
{
if ((compte_btn_ELpan >= 1) && (digitalRead(ctc_capot_ferme) == HIGH))
     {
     digitalWrite(relais_ELpan,HIGH); // on allume le relai
     }
     
else 
     {
     digitalWrite(relais_ELpan,LOW); // on eteind le relai
     } 
     
if (compte_btn_ELpan == 0)
     {
     analogWrite(led_1,0);
     analogWrite(led_2,0);
     analogWrite(led_3,0);
     analogWrite(led_4,0);
     analogWrite(ELpan,0);
     digitalWrite(relais_ELpan,LOW); // on eteind le relai  
     } 

if ((compte_btn_ELpan == 1) && (digitalRead(ctc_capot_ferme) == HIGH))
     {
     analogWrite(led_1,255);
     analogWrite(led_2,0);
     analogWrite(led_3,0);
     analogWrite(led_4,0);
     analogWrite(ELpan,27);
     }
     
if ((compte_btn_ELpan == 2) && (digitalRead(ctc_capot_ferme) == HIGH))
     {
     analogWrite(led_1,255);
     analogWrite(led_2,255);
     analogWrite(led_3,0);
     analogWrite(led_4,0);
     analogWrite(ELpan,50);
     }
     
if ((compte_btn_ELpan == 3) && (digitalRead(ctc_capot_ferme) == HIGH))
     {
     analogWrite(led_1,255);
     analogWrite(led_2,255);
     analogWrite(led_3,255);
     analogWrite(led_4,0);
     analogWrite(ELpan,90);
     }
     
if ((compte_btn_ELpan == 4) && (digitalRead(ctc_capot_ferme) == HIGH))
     {
     analogWrite(led_1,255);
     analogWrite(led_2,255);
     analogWrite(led_3,255);
     analogWrite(led_4,255);
     analogWrite(ELpan,255);
     }
     
if (compte_btn_ELpan == 5)
     {
     analogWrite(ELpan,brightness);//
     }   
}

void voltmetre() // Routine voltmetre
{
// Mesure la tension en VIN et la référence interne à 1.1 volts
unsigned int raw_vin = analogRead(BROCHE_CAPTEUR_VIN);
unsigned int raw_ref = analogReadReference();
  
// Calcul de la tension réel avec un produit en croix
float real_vin = ((raw_vin * 1.1) / raw_ref) * COEFF_PONT_DIVISEUR_VIN;
  
if (real_vin >= 6)
     {
     analogWrite(led_1,255);
     analogWrite(led_2,0);
     analogWrite(led_3,0);
     analogWrite(led_4,0);
     }
     
if (real_vin >= 7)
     {
     analogWrite(led_1,255);
     analogWrite(led_2,255);
     analogWrite(led_3,0);
     analogWrite(led_4,0);
     }
     
if (real_vin >= 8)
     {
     analogWrite(led_1,255);
     analogWrite(led_2,255);
     analogWrite(led_3,255);
     analogWrite(led_4,0);
     }
     
if (real_vin >= 9)
     {
     analogWrite(led_1,255);
     analogWrite(led_2,255);
     analogWrite(led_3,255);
     analogWrite(led_4,255);
     }
  
/* Affichage */
Serial.println(real_vin, 3);
delay(1000);
}

void secu() // Secu fermeture automatique si coupure de courant 
{  
if (digitalRead(btn_park) == LOW)
     {
     digitalWrite(relais_secu,HIGH);
     }
}
    

 

 

Edited by Fabrice Teissier

Share this post


Link to post
Share on other sites

Bonjour, aucune idée, sauf d'aller acheter au plus vite une Tinker-Board, bon ok c'est plus cher qu'un raspbery pi3 mais c'est plus performant et plus sur pour notre utilisation.

Sinon une piste pour ton problème de port série, voir si le port-série existe et tenter de faire un "sudo  chmod 666 /dev/ttyACM0" , et ne pas se focaliser pour l'instant sur le "time out", car la simul à c'est limite.

Yves.

Share this post


Link to post
Share on other sites
Posted (edited)

@Alarcon yves Merci !

 

Oui, j'aimerais bien avoir une petite Nafabox sur TinkerS, mais en attendant, pour me faire la main gratuitement au monde Linux, la VirtualBox est une bonne solution, d'autant que j'ai réussi à faire marcher mon Flip flat dessus.

 

J'ai essayé la commande que tu m'as donné et j'ai eu ça comme réponse :

chmod: impossible d'accéder à '/dev/ttyACM0': Aucun fichier ou dossier de ce type
 

Edited by Fabrice Teissier

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now