Aller au contenu

Un flip flat pour 4 sous


gehelem

Messages recommandés

bon.

l'imprimante 3D a chauffé, je mettrai des photos quand j'aurai pris des photos.

 

Là je suis parti sur le code arduino,

Et bin mes amis qu'est-ce que c'est chiant de lire le potar à la volée pour arrêter le moteur !

à tous les coups, je dépasse et bim, je pars en boucle.

Chiant et dangeureux, moche et dégueu.

 

IMG_00931.jpg

IMG_00941.jpg

  • J'aime 1
  • Gné? 1
Lien vers le commentaire
Partager sur d’autres sites

il y a 34 minutes, JMDSomme a dit :

Yes.... sauf que là moi j'ai décroché depuis des lustres !

Il y a un tuto sur les scripts de sgp ? un truc pour piger le langage et tenter des choses ?

 

 

Ce ne sont pas des scripts SGP ! Ce sont des scripts VBS (Visual Basic Script de Microsoft) qu'il est possible de lancer avec SGP, de la même manière qu'un ".exe".

 

Si tu veux regarder un peu à quoi ça ressemble : https://tahe.developpez.com/web/vbscript/

 

Gehelem sait peut-être quelle(s) commande(s) envoyer pour activer une sortie de l'Arduino à partir d'un PC.

Lien vers le commentaire
Partager sur d’autres sites

il y a 9 minutes, Discret68 a dit :

Gehelem sait peut-être quelle(s) commande(s) envoyer pour activer une sortie de l'Arduino à partir d'un PC.

franchement, s'il s'agit d'aller lire et écrire sur le port série en vbs, ça ne doit pas être bien compliqué, rien qu'à voir ce que donne gogole

https://www.google.fr/search?q=read+and+write+to+serial+port+using+vbscript&oq=read+and+write+to+serial+port+using+vbscript&aqs=chrome..69i57.10655j0j4&sourceid=chrome&{google:instantExtendedEnabledParameter}{google:omniboxStartMarginParameter}ie=UTF-8

http://forums.trossenrobotics.com/showthread.php?2180-Serial-Port-in-VBScript

Edit :

il faut un script par action, c'est ça ?

Edit 2

Rien que là :

https://forum.arduino.cc/index.php?topic=345466.0

on trouve ça :

Révélation

Const ForReading = 1
Const ForWriting = 2

'------------------------------------------------------------------------------------------------
' open USB serial port (COMx);
'
' If the serial monitor in Arduino IDE is open, you will get an "access denied" error.
' Just make sure that the serial monitor is closed (so bytes are not sent by the arduino board).
'------------------------------------------------------------------------------------------------

Set fso = CreateObject("Scripting.FileSystemObject")
Set com = fso.OpenTextFile("COM7:9600,N,8,1", ForWriting)


'---------------------------------------------
' read content of text file line by line;
' write line to COMx;
'---------------------------------------------

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\docs\quotes.txt", ForReading)

MsgBox("Ready to write file content to COM")

Do While objFile.AtEndOfStream <> True
'---------------------------------------------------------------------------------------------------------
' read 10 characters at a time; arduino serial buffer cannot take more than 32 characters;
' writing a character to eeprom takes about 11 ms (assuming that there is no serial.prints in the loop);
' therefore, after each batch of 10 chars sent to COM, we should wait no less than 110 ms;
' we use 200 to have a margin of safety;
'---------------------------------------------------------------------------------------------------------
strChars = objFile.Read(10)
com.Write(strChars)
WScript.Sleep(200)
Loop

objFile.Close
com.Close()

MsgBox("Finished writing to COM")

 

Qu'on pourrait transformer en ça pour ouvrir

Const ForWriting = 2
Set fso = CreateObject("Scripting.FileSystemObject")
Set com = fso.OpenTextFile("COM7:9600,N,8,1", ForWriting)
com.Write(">O000")
com.Close()

et ça pour fermer 

Const ForWriting = 2
Set fso = CreateObject("Scripting.FileSystemObject")
Set com = fso.OpenTextFile("COM7:9600,N,8,1", ForWriting)
com.Write(">C000")
com.Close()

évidement, il faut changer le "COM7", hein...

Lien vers le commentaire
Partager sur d’autres sites

il y a 3 minutes, JMDSomme a dit :

oui, on peut ajouter des scripts avant une action de sgp, ou après, ça permet d'enrichir la liste des actions disponibles  dans le sequencer

bon, bin c'est plié

tu peux essayer les deux commandes que je viens d'éditer dans mon message précédent

tu te fais un "open.vbs" dans lequel tu copies/colles + modif COM7

pareil pour "close.vbs", et roule ma poule

Lien vers le commentaire
Partager sur d’autres sites

il y a 7 minutes, Discret68 a dit :

Que signifie les paramètres ">O000" et ">C000" sur l'Arduino ? O pour Open et C pour Close ? Et les 3 zéros ? Le numéro de port sur lequel on veut intervenir ?

Ce sont les commandes explicitées dans le pdf qui est donné au début du code arduino

Lien vers le commentaire
Partager sur d’autres sites

il y a une heure, gehelem a dit :

bon, bin c'est plié

tu peux essayer les deux commandes que je viens d'éditer dans mon message précédent

tu te fais un "open.vbs" dans lequel tu copies/colles + modif COM7

pareil pour "close.vbs", et roule ma poule

Euuuuh, je veux bien sortir la lulu et  brancher le PC  u il y a SGP mais pas certain de comprendre ce que je suis censé faire, d'autant que mon COM 7 est déjà utilisé et que... je n'ai rien derrière pour acueillir une commande (pas reçu l'arduino, et pas encore bidouillé l'écran à flat) .. J'ai pas tout pigé là..

Lien vers le commentaire
Partager sur d’autres sites

Il y a 2 heures, gehelem a dit :

Ce sont les commandes explicitées dans le pdf qui est donné au début du code arduino

 

J'aurais apprécié une réponse plus claire car je ne vois pas à quel pdf tu fais allusion !!!! et au début du code Arduino !!!! Pas plus !!

Lien vers le commentaire
Partager sur d’autres sites

Il y a 3 heures, gehelem a dit :

Oui pardon @Discret68 c'est bien à ce pdf que je faisais référence

 

Là effectivement, j'y vois un peu plus clair. Néanmoins, ne connaissant pas du tout l'Arduino (je suis sur du RPI), ce type de commande permet-il d'activer les sorties (au choix) de l'Arduino ? Car je vois que ça vient de chez Alnitak, donc, nécessité de compléments, soft ou hard ?

L'idéal serait une commande qui permet d'activer/désactiver une sortie pilotée par un PC sans avoir recours à trop de ressources annexes.

Lien vers le commentaire
Partager sur d’autres sites

Il y a 3 heures, Discret68 a dit :

L'idéal serait une commande qui permet d'activer/désactiver une sortie pilotée par un PC sans avoir recours à trop de ressources annexes

Pour le flipflat ou pour autre chose ?

Lien vers le commentaire
Partager sur d’autres sites

Il y a 7 heures, gehelem a dit :

Pour le flipflat ou pour autre chose ?

Pour les 2 mon capitaine.

je suppose que sur l’arduino, il y a un certain nombre de pins qui sont utilisables en entrée ou en sortie tout ou rien.

Comme il est possible de connecter des cartes relais sur l’arduino, il serait possible d’activer/désactiver des relais à partir d’un script VBS sur PC en choisissant un relais parmi ceux qui sont connectés.

 

Carte relais pour arduino https://fr.aliexpress.com/item/4-channel-relay-module-4-channel-relay-control-board-with-optocoupler-Relay-Output-4-way-relay/32649659086.html?spm=a2g0w.search0104.8.4.17583977n5qI19&transAbTest=ae803_4

Lien vers le commentaire
Partager sur d’autres sites

Démarré sur la simple motorisation d'un couvercle... on en est arrivé au contrôle du couvercle, +  le choix de deux positions d'intensité de l'écran flat !

J'oubliais... le script qui va bien sur sgp pour déclencher le "flat calibration wizard" et ensuite, juste après, récupérer la valeur d'expo, la rentrer dans la case temps d'expo de la séquence... puis enfin lancer les flats.

:tilt:

Si ce truc aboutit je tire mon chapeau... et j'attrape le fer à souder dès qu'on me le dit !

 

Bon, rien que pouvoir commander l'ouverture, la fermeture et le niveau d'éclairage ce serait vraiment très cool, même s'il faut le faire "hors automatismes de sgp".... avec les doigts sur le clavier, à l'ancienne...

 

Lien vers le commentaire
Partager sur d’autres sites

@Cedric02700 j'ai un truc du commerce (tambour rouge polygonal, oublié la marque...) je n'aurai aucun souci à le modifier (réduire, doubler la diffusion/ plexi etc..)  moi ce que j'attends c'est la synthèse que Gehelem et Olivier vont nous pondre à la suite de cette discuss, partie logiciel, code, électronique:  là je ne sais qu'appliquer les recettes quand elles sont bien faites expliquées.... genre "arduino pour les nuls" 

Sinon je sais dessiner, couper, coller, souder, imprimer... 

 

 

 

 

  • J'aime 1
Lien vers le commentaire
Partager sur d’autres sites

J'ai avancé sur ma maquette perso, j'ai fini l'implantation des composants sur ma plaque d'essais à bandes sur le dessin.

reste plus qu'à soudé en vrai et essayer!!

 

Mais j'ai hâte de voir ce que nous concocte @gehelem ça devrait être intéressant, je pense juste qu'il attend son driver L298P! Moi je vais rester sur ma version avec un MOFSET pour la partie puissance puisque je reste en 12V sur mon ruban led monochrome. Et comme tout fonctionne simplement je vai spas m'embêter à faire plus compliqué!

 

edit: J'ai relu un peu les post d'avant et je reviens sur l'utilisation à distance de relais via arduino.

Je ne peux pas vraiment traiter le sujet sur Windows car je reste sur une base linux avec KSTARS/EKOS et tout se fait sans problème, il y a même un driver indiduino qui permet l'utilisation d'un arduino comme une carte ipx800.

Par contre, je sais qu'il y a un sujet sur les bricolage que j'ai moi même appliqué qui permet de contrôler une carte relais en réseau local.

Le gars dont j'ai pu le pseudo a même fait un programme Windows pour piloter les entrée sorties de l'arduino, car en fait un arduino ce n'est ni plus ni moins qu'une carte avec des entrées et des sorties!!

On doit donc pouvoir, via un script vb a mettre dans SGP, piloter via le réseau les sorties de 2 relais qu'on allumeraient ou éteindraient en fonction de la puissance lumineuse désirée, et donc en finalité en fonction du filtre utilisé.

Là ça dépasse mes compétences car je ne fais pas de Vb mais je suis sur que c'est possible!!..

 

edit 1: lien du sujet pour les relais à distance via le réseau local:

 

Modifié par olivier1986
  • Merci / Quelle qualité! 1
Lien vers le commentaire
Partager sur d’autres sites

Le 06/05/2019 à 14:53, JMDSomme a dit :

zavez bossé un peu ce week end ?  🙂

Nada.

Possible que ça avance le WE prochain, je suis célibataire 

 

Dites

pour vos histoires de relais, ce serait dommage de repartir avec encore un autre montage, il suffit juste d'assigner une seconde sortie de l'arduino pour  switcher la puissance sur notre montage actuel

avec une petite carte 2 relais à 4€ ça suffirait...

  • J'aime 1
Lien vers le commentaire
Partager sur d’autres sites

il y a 19 minutes, gehelem a dit :

Dites

pour vos histoires de relais, ce serait dommage de repartir avec encore un autre montage, il suffit juste d'assigner une seconde sortie de l'arduino pour  switcher la puissance sur notre montage actuel

avec une petite carte 2 relais à 4€ ça suffirait...

C’est ce que j’écrivais un peu plus haut, mais quel type de commande doit on envoyer à partir d’un PC pour activer un des relais connecté à l’arduino ?

A partir de là, on peut transcrire la commande dans un script VBS.

Lien vers le commentaire
Partager sur d’autres sites

il y a 15 minutes, Discret68 a dit :

C’est ce que j’écrivais un peu plus haut, mais quel type de commande doit on envoyer à partir d’un PC pour activer un des relais connecté à l’arduino ?

A partir de là, on peut transcrire la commande dans un script VBS.

Notre arduino est programmé pour causer Alnitak :

Les commandes sont explicitées en commentaire dans le code.

On peut se contenter de détourner les actions en disant si la luminosité demandée est inférieure à 128 on active pas la sortie xx et si supérieure on active xx

Le relais qui switch la puissance est donc commandé en tout ou rien par cette sortie.

Tout = luminosité max

Rien = luminosité réduite avec une petite résistance ou autre truc élégant et raffiné.

Non ?

(J'ai donné deux exemples vbs un peu plus haut, aucune idée si ça marche en vrai mais vous pouvez essayer...)

 

Edit 

La commande pour fixer la luminosité à 128 c'est 

>B128\n

Lien vers le commentaire
Partager sur d’autres sites

Bon bé madame est couchée alors 10 min devant moi!! je vous met le code arduino pour avoir 2 valeurs de puissances avec 2 sorties sur l'arduino.

comme le dit Gilles pas besoin de faire plus puisqu'on a déjà tout!

 

le code:


 

Révélation

 

/*
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 <Servo.h>
Servo myservo;

#include <EEPROM.h>
int position_cap;

volatile int ledPin   = 11;      // the pin that the LED is attached to, needs to be a PWM pin.
volatile int ledPinHigh =5;
volatile int servoPin = 9;      // the pin that the servo signal is attached to, needs to be a PWM pin.
int brightness = 0;
const int closeAngle=0;        // Angle of the servo when the cap is close
const int openAngle=180;        // Angle of the servo when the cap is open
const int slowAngle=30;         // Angle of the servo for approach to close/open
int relais=7;

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);

void setup()
{
  // initialize the serial communication:
  Serial.begin(9600);
  // initialize the ledPin as an output:
  pinMode(ledPin, OUTPUT);
  pinMode(ledPinHigh, OUTPUT);
  pinMode(servoPin, OUTPUT);
  pinMode(relais, OUTPUT);
  digitalWrite(relais, LOW);
  analogWrite(ledPin, 0);
  myservo.write(closeAngle);
  myservo.attach(servoPin,450,2500);  
}

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;
          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 )
            if (brightness <= 150)
          {
            analogWrite(ledPinHigh, 0);
            analogWrite(ledPin, 100);
          }
          else if (brightness > 150)
          {
            analogWrite(ledPin, 0);
            analogWrite(ledPinHigh, 255);
          }
          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 )
  {
    digitalWrite(relais, HIGH);
    for (int angle = closeAngle; angle <= closeAngle + slowAngle; angle+=1)
    {
      myservo.write (angle);
      delay (70);
    }
    myservo.write (openAngle - slowAngle);
    for (int angle = openAngle - slowAngle; angle <= openAngle; angle+=1)
    {
      myservo.write (angle);
      delay (70);
    }
    coverStatus = OPEN;
    digitalWrite(relais, LOW);
    // TODO: Implement code to OPEN the shutter.
  }
  else if( val == CLOSED && coverStatus != CLOSED )
  {
    digitalWrite(relais, HIGH);
    for (int angle = openAngle; angle > openAngle - slowAngle; angle-=1)
    {
      myservo.write (angle);
      delay (70);
    }   
    myservo.write (closeAngle + slowAngle);  
    for (int angle = closeAngle + slowAngle; angle > closeAngle; angle-=1)
    {
      myservo.write (angle);
      delay (70);
    }
    coverStatus = CLOSED;
    digitalWrite(relais, LOW);
    // TODO: Implement code to CLOSE the shutter
  }
  else
  {
    // TODO: Actually handle this case
    coverStatus = val;
  }
 
}

 

 

Bon, donc pas beaucoup de ligne en plus!!

En revanche, vous aller devoir définir vos besoin!! dans le code présenté ma condition est la suivante:

Si luminosité <= 150 alors on allume à faible puissance (c'est le pin 11 ici) et dans le cas ou la luminosité > 150 alors pleine puissance (pin 5 ici). Après à vous de voir ce que vous préferez.

Pour ce faire dans le 1er cas je limite la sortie à une valeur de 100 sur les 255 possible (environ 40% de puissance) et dans le second cas je mets à fond avec les 255 (100%)

la encore à vous de juger.

 

Il restera alors, et ca ptet que SGP peut le faire, lors de la programmation des flats, si tu mets ta série LRVB avec une valeur inférieure à celle choisie il lancera valeur faible ou bien dans l'autre cas, en SHO il lancera a valeur max, je sais pas si je suis clair ^^

 

edit, avec une image c'est mieux:

le fil vert c'est la basse puissance, le bleu la haute!! alors c'est pas forcément super propre, voir si vaut mieux pas mettre un relais mais la chui fatigué!! en tout cas ça marche comme cela pour le moment ^^

 

sgp.jpg

Modifié par olivier1986
  • Merci / Quelle qualité! 1
Lien vers le commentaire
Partager sur d’autres sites

@JMDSomme pas de soucis je peux expliquer ;)

 

sur le schéma avec la plaque d'essais tu peux voir ceci:

 

- a gauche il y a une alim type labo qui représente ton alim du panneau led, donc soit un simple transfo 12V, une pile 9V ou 1.5V ... bref c'est ta source de courant pour ton panneau led, ruban ....

j'ai volontairement choisi de passer par une alim externe car chaque sortie de l'arduino ne supporte que 40mA mais il est conseillé 20mA. avec 200mA en tout et pour tout.

 

- le +12V de cette alim va sur la led, qui elle représente ton panneau flat, le ruban ..... (il faut se rappeler que l'image que je représente est "juste" un modèle pour vérifier les fonctionnement du code). la résistance est ici de 200 ohm pour les tests mais en fonction du  système de flat que tu choisiras elle pourra soit varier soit disparaître (par exemple, moi je n'en aurai pas besoin avec mon ruban led qui fonctionne sur du +12V en direct)

 

- à la sortie de la led on rentre sur le MOFSET. C'est lui qui joue le role d'interrupteur du panneau flat, ruban ...

sa branche de commande est relié au pin 11 de l'arduino pour la puissance basse et à la 5 pour la puissance haute. Comme on utilise une sortie avec PWM on module sa sortie qui peut varier entre 0 et 255 qui correspondent à 0 ou 100% d'allumage. 

Dans le code on a bloqué les sorties aux valeurs désirées. Par exemple, ici j'ai arbitrairement choisi 100 (soit 40%) en niveau bas et 255 (100%) en niveau haut.

Du coup il n'y a plus de variation possible de l'écran flat puisqu'il est figé par 2 valeurs.

 

Pour le relais si tu as des problèmes de compréhension je peux aussi expliquer.

 

Dis moi déjà si tu comprends mieux :)

Modifié par olivier1986
  • Merci / Quelle qualité! 1
Lien vers le commentaire
Partager sur d’autres sites

Il y a 2 heures, olivier1986 a dit :

@JMDSomme pas de soucis je peux expliquer

 

sur le schéma avec la plaque d'essais tu peux voir ceci:

 

- a gauche il y a une alim type labo qui représente ton alim du panneau led, donc soit un simple transfo 12V, une pile 9V ou 1.5V ... bref c'est ta source de courant pour ton panneau led, ruban ....

j'ai volontairement choisi de passer par une alim externe car chaque sortie de l'arduino ne supporte que 40mA mais il est conseillé 20mA. avec 200mA en tout et pour tout.

 

- le +12V de cette alim va sur la led, qui elle représente ton panneau flat, le ruban ..... (il faut se rappeler que l'image que je représente est "juste" un modèle pour vérifier les fonctionnement du code). la résistance est ici de 200 ohm pour les tests mais en fonction du  système de flat que tu choisiras elle pourra soit varier soit disparaître (par exemple, moi je n'en aurai pas besoin avec mon ruban led qui fonctionne sur du +12V en direct)

 

- à la sortie de la led on rentre sur le MOFSET. C'est lui qui joue le role d'interrupteur du panneau flat, ruban ...

sa branche de commande est relié au pin 11 de l'arduino pour la puissance basse et à la 5 pour la puissance haute. Comme on utilise une sortie avec PWM on module sa sortie qui peut varier entre 0 et 255 qui correspondent à 0 ou 100% d'allumage. 

Dans le code on a bloqué les sorties aux valeurs désirées. Par exemple, ici j'ai arbitrairement choisi 100 (soit 40%) en niveau bas et 255 (100%) en niveau haut.

Du coup il n'y a plus de variation possible de l'écran flat puisqu'il est figé par 2 valeurs.

 

Pour le relais si tu as des problèmes de compréhension je peux aussi expliquer. 

 

Dis moi déjà si tu comprends mieux

 

Je débute aussi en Arduino. Me suis fait les montages du kit débutant.

Si j'ai bien compris, sur ton schéma, le 5V n'est connecté à rien (il alimente rien ou j'ai loupé qq chose?

Le MOFSET est un type de transistor? J'ai bien capté?

 

Le Lu-5-R est un relais?

 

Bon, une fois que tout marche sur la plaque, il faut le souder. Un truc particulier pour le faire proprement?

 

Merci de votre travail.

Lien vers le commentaire
Partager sur d’autres sites

@ursus Erreur sur l'image, en fait le +5V est caché par son propre fil que j'ai déplacé sans faire exprès... le +5V de l'arduino est relié au +5V du servo moteur!!

Le MOFSET est un type de transistor oui, mais il est plus "rapide" et donc plus adapté à la fonction interrupteur.

je t'invite à lire ces excellentes pages pour les transistors et MOFSET.

https://openclassrooms.com/fr/courses/2778161-programmez-vos-premiers-montages-avec-arduino/3285333-le-moteur-a-courant-continu-partie-1-transistors-et-sorties-pwm

 

Le LU-5-R est bien un relais, un SPDT (comprend par la simple relais). su le schéma qui suit j'ai mis un DPDT donc double relais!

 

Dans un starter kit tu as tout ce qu'il faut pour faire ce projet.

 

Pour souder les plaques à bandes bakélites rien de spécial, je suis pas soudeur pro mais jamais eu de pb avec ce type, on chauffe bien la patte du composant et le cuivre puis on dépose l'étain qui monte par capillarité sur la patte. On coupe ensuite l’excès de la patte du composant.

 

J'ai modifié le schéma du coup et ajouté un relais pour la commande de la puissance basse ou haute! ca me parait être plus propre pour éviter tout retour vers l'arduino ^^

 

 

sgp2.jpg

 

code à utiliser:

Révélation

 

/*
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 <Servo.h>
Servo myservo;

#include <EEPROM.h>
int position_cap;

volatile int ledPin   = 11;      // the pin that the LED is attached to, needs to be a PWM pin.
volatile int ledPinHigh =5;
volatile int servoPin = 9;      // the pin that the servo signal is attached to, needs to be a PWM pin.
int brightness = 255;
const int closeAngle=0;        // Angle of the servo when the cap is close
const int openAngle=180;        // Angle of the servo when the cap is open
const int slowAngle=30;         // Angle of the servo for approach to close/open
int relais=7;
int relais_flat=12;

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);

void setup()
{
  // initialize the serial communication:
  Serial.begin(9600);
  // initialize the ledPin as an output:
  pinMode(ledPin, OUTPUT);
  pinMode(ledPinHigh, OUTPUT);
  pinMode(servoPin, OUTPUT);
  pinMode(relais, OUTPUT);
  pinMode(relais_flat, OUTPUT);
  digitalWrite(relais, LOW);
  analogWrite(ledPin, 0);
  myservo.write(closeAngle);
  myservo.attach(servoPin,450,2500);  
}

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);
          digitalWrite(relais_flat, HIGH);
          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);
          digitalWrite(relais_flat, LOW);
          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 )
            if (brightness <= 150)
          {
            analogWrite(ledPinHigh, 0);
            analogWrite(ledPin, 100);
          }
          else if (brightness > 150)
          {
            analogWrite(ledPin, 0);
            analogWrite(ledPinHigh, 255);
          }
          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 )
  {
    digitalWrite(relais, HIGH);
    for (int angle = closeAngle; angle <= closeAngle + slowAngle; angle+=1) 
    {
      myservo.write (angle);
      delay (70);
    } 
    myservo.write (openAngle - slowAngle);
    for (int angle = openAngle - slowAngle; angle <= openAngle; angle+=1) 
    {
      myservo.write (angle);
      delay (70);
    } 
    coverStatus = OPEN;
    digitalWrite(relais, LOW);
    // TODO: Implement code to OPEN the shutter.
  }
  else if( val == CLOSED && coverStatus != CLOSED )
  {
    digitalWrite(relais, HIGH);
    for (int angle = openAngle; angle > openAngle - slowAngle; angle-=1) 
    {
      myservo.write (angle);
      delay (70);
    }   
    myservo.write (closeAngle + slowAngle);  
    for (int angle = closeAngle + slowAngle; angle > closeAngle; angle-=1) 
    {
      myservo.write (angle);
      delay (70);
    } 
    coverStatus = CLOSED;
    digitalWrite(relais, LOW);
    // TODO: Implement code to CLOSE the shutter
  }
  else
  {
    // TODO: Actually handle this case
    coverStatus = val;
  }
  
}

 

 

Modifié par olivier1986
Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation !

Vous pouvez répondre maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous pour poster avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.