Aller au contenu

Mes projets en cours


supaii
 Share
Abonnés 8

Messages recommandés

  • Administrators

dis ça me fait penser à un truc : tu pourrais ajouter deux options dans la BARREX :

1. un indicateur de consommation

2 un équivalent du TemperHum pour moduler les RC automatiquement en fonction de l'humidité

Lien à poster
Partager sur d’autres sites
  • Réponses 73
  • Created
  • Dernière réponse

Top Posters In This Topic

  • 3 weeks later...
  • 7 months later...
  • Avexiens

Le projet [glow=red]5[/glow] est sur le finich...


Une petite description:

Réalisation d'un boite à flat motorisée sur une TS80/480 (triplet).

Les contraintes:

- fonctionnement sous linux (Ubuntu via RPI/Tinkerboard)

- emcombrement réduit

- prix low cost

- 12V ou 5V


Pour commencer, j'etait parti sur un fonctionnement sur raspberry (via servo blaster), mais le flat sera restreint à ce type architecture. :(((

Puis j'ai laisser tomber ce system quelque mois quand il ne fonctionnait que sur un RPI3B+ (raspberry) mais pas sur ma tinkerboard (format identique à un raspberry).


Mais un beau jour je suis tomber sur un code sur github à ce sujet, exploitant le driver d'Aniltak (FlipFlat d'Optec).

Super, j'était parti sur un arduino uno, et ça fonctionne comme le FlatMan (celui sans motorisation), il ne me restait que le code du servo à réaliser, mais trop dur pour moi.

A ce stade, il conviendra dans un observatoire avec un écran led sur un mur, mais pas à du nomade... :(

Quand vient un post sur webastro à ce sujet , deux trois ligne de code plus tard et ca bouge [renversant]

mais cet arduino est gros, trop gros pour etre mis sur le par-buée de ma lunette (taille d'une carte de crédit).

Je decide donc de prendre, un arduino pro micro et de faire ma propre carte electronique.(alimentée en 5V)

Quelques jours plus tard et quelques soudures, le premier test est fonctionel. hop on part sur la 3D, on imprime et on retest -bavardage- tout est OK.


Pour Les fournitures:

un servomoteur 20kg 270° mais un 180° fonctionne aussi, tout dépend de l'angle d'ouverture que vous voulez.

Ainsi que son bras.

Pour la partie eclairage, les leds et la connection

Le mosfet qui sert à controler, sur 255 pas, la luminosité de la lumière.

La prisede l alimentation en 5V.

et l'Arduino.


Maintenant, je vais changer la bande de led qui n'est pas tip top en diffusion avec le plexi blanc que j 'ai, j'ai commandé ceci, on vera bien... (pour du narrowband, ce n'est pas assez pluissant à mon gout , mais pas tester)


Le 3D est adaptable à différente lunette il faut juste me donner le diamètre du par-buée (celui qui à envie de s'en faire un). fixation par tyrap ou scratch (en fonction du poids)

3d.jpg


4-vue.jpg


coupe de la partie eclairage:

coupe.jpg


Le code pour l'arduino (à copier)

 

/*
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;
   }

} 

 

PS: normalement il doit fonctionner sous windows via sharpcap et autres (test à faire) [ding dong]


la différence de prix est significative 500$ contre 50€ à tout casser




Image de la réalisation

DSC-0264.jpg

DSC-0262.jpg

DSCPDC-0001-BURST20190517071405024.jpg

Lien à poster
Partager sur d’autres sites
  • 1 month later...
  • 1 month later...
  • Avexiens

Juste un petit retour, j ai monté les leds neopixels et ca va beaucoup mieux.

les flat ont été fait avec le panneau régler sur 10 en termes de luminosité (sur 255, ça laisse de la marge por le narrow :)).


voici le rendu, en fausse couleur biensur, sur un stack de dix flats en luminance.

Capture3.jpg

Lien à poster
Partager sur d’autres sites
  • Administrators

cool...

on va peut etre te passer un commande rémunérée chez CPAFO ^^

sinon pour tes flat, n'hesite pas a mettre la purée question lux, histoire d'avoir un bon RSB. car sur l'image que tu nous montre, j'ai l'impressions qu'il y a du bruit

Lien à poster
Partager sur d’autres sites
  • Avexiens

hum...

Frédo, pour la calibration; avec le comportement des CMOS actuels, je penche plutôt pour la realisation de DarkFlat.

La soustraction des offsets étant parfois problématique sur les lumières.


Ceci dit, s'il s'agit juste d'analyser les flats alors oui une simple soustraction de l'offset fera l'affaire.

+1 avec fredo sur le bruit dans l'image en fausse couleur.

Lien à poster
Partager sur d’autres sites
  • Avexiens

Merci pour ces retours.


J'ai soustrait avec pixelmath, mais pas de grande différence sur le bruit (surement que j'ai mal fait la soustraction). Est-ce le bon procédé?


pour info à -10°(pour 40000ADU sur 65M):

-10 flats en L pour une durée de 0.02 secondes par flat

-10 flats en R pour une durée de 0.1 secondes par flat

-10 flats en V pour une durée de 0.06 secondes par flat

-10 flats en B pour une durée de 0.04 secondes par flat


Si je comprend bien soit je fait des darks avec le temps expos correspondant pour chaque serie de flats et/ou j'augmente la luminosité du panneau pour être au plus proche de l'exposition d'un offset (50µs pour ma cam, soit 0.00005s)?

J'avoue être un peu étonné de ce bruit.


J'ai mis un empilement de bias et la série en luminance (Brute) dans le -asso.org/filerun/#/HOME/Images/Supaii%20(olivier)/test_flat'>nuage avex , si vous avez le temps...

Lien à poster
Partager sur d’autres sites
  • Administrators

si tu es en dessous de la secondes les dark lfat ne sont absolument pas nécessaire, surtout a -10°C.

il faut plus de flat

apres tout ça ne te coute rien... fais en 50....

Lien à poster
Partager sur d’autres sites
  • Avexiens

Nous avons ici mélangé 2 sujets :(


Pour limiter le bruit des flats il n’y a que la réduction statistique qui peut aider.


Le problème des bias avec les capteurs à faibles niveau de bruit, c’est que leurs soustractions peut nous amener dans des valeurs négatives (sur des Lumières)!

Il y a 2 solutions, ajout d’un pedestal dans PI ou darkflat.

Le rôle du darkflat c’est de supprimer l’operation de soustraction du bias pour calibrer en une seule passe.


Oui, le darkflat ce sont des poses de darkflat au même condition que la prise de flats.

Lien à poster
Partager sur d’autres sites
  • Administrators

je ne pige pas. est tu entrain de dire qu'un darflat peu avoir des valeur plus faible qu'un offset ? (d’autant qu'en théorie (mais ça commence à etre ancien) je crois me souvenir qu'il faut soustraire les offset des dark, fusse t'il des darkflat....

Lien à poster
Partager sur d’autres sites
  • Avexiens

Non Frédo, le bias n’est jamais au dessus des flats. En revanche, avec le faible bruit de ces caméras il arrive assez couramment qu’il passe au dessus des lights.

Voilà pourquoi on fait du darkflat de nos jours :)

Lien à poster
Partager sur d’autres sites
  • Avexiens

je ne pige pas. est tu entrain de dire qu'un darflat peu avoir des valeur plus faible qu'un offset ? (d’autant qu'en théorie (mais ça commence à etre ancien) je crois me souvenir qu'il faut soustraire les offset des dark, fusse t'il des darkflat....

 

Oui pour un darkflat à ces faibles vitesses ce n'est pas complètement improbable.


Pour ce qui est de la soustraction, dans le cas ou l'on réalise des darkflats, on peut s'affranchir de la soustraction des offsets.

Les offsets seront mécaniquement éliminés avec les darkflats, lors de la calibration des flats.

Lien à poster
Partager sur d’autres sites
  • Avexiens

Ajout du dernier code pour le flipflat, suit au changement des leds par des neopixels.


Bibliothèque "servo.h" changée pour "Adafruit_TiCoServo.h" (compatibilité avec bibli pour neopixel)

Ajout bibiothèque "Adafruit_NeoPixel.h" pour neopixel

 

[spoil]/*

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


//#include

//Servo myservo;

#include

Adafruit_TiCoServo myservo;


#include

int position_cap;


volatile int ledPin = 6; // the pin that the LED is attached to, needs to be a PWM pin.

volatile int servoPin = 10; // the pin that the servo signal is attached to, needs to be a PWM pin.

int brightness = 0;

const int closeAngle=0; //25 // Angle of the servo when the cap is close

const int openAngle=60; //45 // Angle of the servo when the cap is open

const int slowAngle=30; // Angle of the servo for approach to close/open


// How many NeoPixels are attached to the Arduino?

#define NUMPIXELS 61 // Popular NeoPixel ring size

// Paramètre 1 = Le nombre de NéoPixels chainés

// Paramètre 2 = No de broche de données (Sur votre Arduino, la plupart convient)

// Paramètre 3 = Type de pixel (flags/drapeaux), a combiner ensemble en fonction du besoin:

// NEO_KHZ800 flux de données à 800 KHz (plupart des NéoPixel basé sur les LEDs w/WS2812)

// NEO_KHZ400 flux de données à 400 KHz (Pour les Pixels classiques 'v1' FLORA (pas les V2) pilotés par WS2811)

// NEO_GRB Pixels sont raccordés en flux de donnée GRB (GRB=Green,Red,Blue=Vert,Rouge,Bleu - la plupart des produits NéoPixel)

// NEO_RGB Pixels sont raccordés en flux de donnée RGB (RGB=Red,Green,Blue=Rouge,Vert,Bleu - Pixels FLORA v1, pas la v2)

Adafruit_NeoPixel pixels(NUMPIXELS, ledPin, NEO_GRB + NEO_KHZ800);


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

//analogWrite(ledPin, 0);

myservo.write(closeAngle);

myservo.attach(servoPin,500,2500);

pixels.begin();

pixels.show(); // Initialise tous les pixels à 'off' (éteint)

}


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

// The first NeoPixel in a strand is #0, second is 1, all the way up

// to the count of pixels minus one.

for(int i=0; i

// pixels.Color() takes RGB values, from 0,0,0 up to 255,255,255

// Here we're using a moderately bright green color:

pixels.setPixelColor(i, pixels.Color(255, 255, 255));

pixels.setBrightness(brightness);

pixels.show(); // Send the updated pixel colors to the hardware.

}

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

pixels.clear(); // Set all pixel colors to 'off'

pixels.show(); // Send the updated pixel colors to the hardware.

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

for(int i=0; i

// pixels.Color() takes RGB values, from 0,0,0 up to 255,255,255

// Here we're using a moderately bright green color:

pixels.setPixelColor(i, pixels.Color(255, 255, 255));

pixels.setBrightness(brightness);

pixels.show(); // Send the updated pixel colors to the hardware.

}

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

// TODO: Implement code to OPEN the shutter.

}

else if( val == CLOSED && coverStatus != CLOSED )

{

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;

// TODO: Implement code to CLOSE the shutter

}

else

{

// TODO: Actually handle this case

coverStatus = val;

}


}[/spoil]

Lien à poster
Partager sur d’autres sites
  • Avexiens

et pour vous amusez, mais en numérique.

https://www.tinkercad.com/things/1MRkbfWHVks


Code à rentrer dans le moniteur serie:

https://www.optecinc.com/astronomy/catalog/alnitak/resources/Alnitak_GenericCommandsR4.pdf


example :

>OOOOCR ouvre le capot

>COOOCR ferme le capot

etc...

Lien à poster
Partager sur d’autres sites
  • 4 weeks later...
  • 7 months later...
Le 29/03/2018 à 16:37, frédogoto a dit :

impressionnant :)

tu as prévu un systeme pour régler la tension de la courroie ou pas du tout ?

voici pour commencer une page d'un site belge bien connu des possesseurs de Pl1-m et autres

 

Lien à poster
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier 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.

 Share
  • En ligne récemment   0 membre est en ligne

    Aucun utilisateur enregistré regarde cette page.


×
×
  • Créer...

Information importante

Conditions générales