Go Down

Topic: réguler 220v grace à l'arduino (Read 4517 times) previous topic - next topic

et bien tout est dit là: http://arduino.cc/forum/index.php/topic,33490.0.html

ce qui change dans la carte 4 in / 4 dimmers i2c est qu'elle fait appel à un ATTiny2313, sans lib ni bootloader arduino, faute de mémoire suffisant. Mais ça ne change rien au code et au hardware. Une première version du soft ainsi que les sources kicad sont dispos sur le dépot hardware et software du projet xplduino)

Je ne suis pas moi même un expert en électronique, mais je pense que c'est tout à fait accessible pour la plupart des arduinautes ;)
La partie soft peu paraitre rédhibitoire car ça fait appel aux interruptions, mais lu calmement c'est tout à fait compréhensible.

Gromain
"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

barbudor

BOnsoir

Le schéma du kit Velleman fait bien apparaitre un opto-coupleur, donc le circuit est bien isolé.

- Il y a une résistance ajustable qui permet de régler la gamme d'entrée.
Apparemment on peut utiliser une commande 0..5V au lieu de 0..12V qui est la gamme maximale : Voir section 23 page 10 :
- De même il semble qu'il y ait un filtrage en sortie de l'opto coupleur.

Donc il semble bien qu'on puisse utiliser directement une sortie PWM d'Arduino pour piloter cet équipement.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Bonsoir,

Bien vu Barbudor, a mon avis effectivement il y a moyen de l'utiliser directement sur l'arduino.

Quand je l'aurais en main je vous dirai...

Pouvez vous m'aider pour mon code c# svp?

je suis bloqué je ne sais pas comment envoyer la requette a l'arduino.

Code: [Select]

byte[] data = new byte[1];

private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            byte pwm;
            pwm = Convert.ToByte(slider1.Value);
            _scl.Send(data, 0, 1);
        }


et voici mon code arduino

///////////////Décalration du Pin 9/////////////////
byte Csharp;
int PwmLed = 9;

Dans mon void setup :
void setup()
{//////////////////////Mise en sortie du PIN PWM 9///////////////
  pinMode(PwmLed, OUTPUT);
}

Code: [Select]
////////////////Variateur de tension au PIN PWM 9////////////////////     

if (client.available() > 0) {
      Csharp = client.read();
      client.println(Csharp,DEC);
      analogWrite(PwmLed, int(Csharp));
     ///////////////////////////////////////////////////////////////////////


Merci

barbudor

Euh, là je crois que ca va être un peut short

De quel type est _scl ?
C'est un Socket ? TCP ? UDP ?
Comment est-il créé ?

Idem, l'extrait de code Arduino est un peu court.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Désolé, voici mon code c#

Code: [Select]
public partial class Gestion : Window
    {

        Socket _scl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        byte[] data = new byte[1];

        public Gestion()
        {
            InitializeComponent();

            try
            {

                _scl.Connect(System.Net.IPAddress.Parse("192.168.1.177"), 1337);

            }

            catch (Exception ex)
            {

                MessageBox.Show(ex.Message);
            }
       
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            try
            {

                byte[] Message = Encoding.ASCII.GetBytes("9"); // Allumer la cuisine

                int OctetsEnvoyes = _scl.Send(Message);

            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

            }
        }

        private void button6_Click(object sender, RoutedEventArgs e)
        {
            try
            {

                byte[] Message = Encoding.ASCII.GetBytes("n");// Eteindre la cuisine

                int OctetsEnvoyes = _scl.Send(Message);

            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

            }
        }

        private void button2_Click(object sender, RoutedEventArgs e)
        {
            try
            {

                byte[] Message = Encoding.ASCII.GetBytes("1");// allumer le salon

                int OctetsEnvoyes = _scl.Send(Message);

            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

            }
        }

        private void button7_Click(object sender, RoutedEventArgs e)
        {
            try
            {

                byte[] Message = Encoding.ASCII.GetBytes("2");// Eteindre le salon

                int OctetsEnvoyes = _scl.Send(Message);

            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

            }
        }

        private void button3_Click(object sender, RoutedEventArgs e)
        {
            try
            {

                byte[] Message = Encoding.ASCII.GetBytes("7"); //Allumer la salle de bain

                int OctetsEnvoyes = _scl.Send(Message);

            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

            }
        }

        private void button8_Click(object sender, RoutedEventArgs e)
        {
            try
            {

                byte[] Message = Encoding.ASCII.GetBytes("8"); //Eteindre la salle de bain

                int OctetsEnvoyes = _scl.Send(Message);

            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

            }
        }

        private void button4_Click(object sender, RoutedEventArgs e)
        {
            try
            {

                byte[] Message = Encoding.ASCII.GetBytes("3");// allumer la chambre 1

                int OctetsEnvoyes = _scl.Send(Message);

            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

            }
        }

        private void button9_Click(object sender, RoutedEventArgs e)
        {
            try
            {

                byte[] Message = Encoding.ASCII.GetBytes("4");// Eteindre la chambre 1

                int OctetsEnvoyes = _scl.Send(Message);

            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

            }
        }

        private void button5_Click(object sender, RoutedEventArgs e)
        {
            try
            {

                byte[] Message = Encoding.ASCII.GetBytes("5");// allumer l'entrée

                int OctetsEnvoyes = _scl.Send(Message);

            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

            }
        }

        private void button10_Click(object sender, RoutedEventArgs e)
        {
            try
            {

                byte[] Message = Encoding.ASCII.GetBytes("6");// éteindre l'entrée

                int OctetsEnvoyes = _scl.Send(Message);

            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

            }
        }

        private void button11_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            byte pwm;
            pwm = Convert.ToByte(slider1.Value);
            _scl.Send(data, 0, 1);
        }
    }
}


et mon code arduino

Code: [Select]
#include <SPI.h>
#include <Ethernet.h>

/* Détails technique de la connexion ethernet */
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1, 177 };
byte gateway[] = { 192,168,1, 1 };

// Attachement d'un objet "server" sur le port 1337
Server server(1337);

///////////////Décalration du Pin 9/////////////////
byte Csharp;
int PwmLed = 9;

void setup()
{
  // Configuration de la ethernet shield et du server
  Ethernet.begin(mac, ip, gateway);
  server.begin();

  // Mise en sortie de la broche avec notre led (par défaut éteinte)
  pinMode(2, OUTPUT); // Salon
  digitalWrite(2, LOW);

  pinMode(3, OUTPUT); // Chambre 1
  digitalWrite(3, LOW);
 
  pinMode(5, OUTPUT);// Entrée
  digitalWrite(5, LOW);
 
  pinMode(6, OUTPUT);// Salle de bain
  digitalWrite(6, LOW);
 
  pinMode(7, OUTPUT); // Cuisine
  digitalWrite(7, LOW);
 
  //////////////////////Mise en sortie du PIN PWM 9///////////////
  pinMode(PwmLed, OUTPUT);
}

void loop()
{
  // Attente de la connexion d'un client
  Client client = server.available();
  if (client && client.connected()) {

    // si le client nous envoi quelque chose
    if (client.available() > 0) {

      // On regarde ce que le client nous demande
      switch(client.read()){
      case '1': // allumer le salon
        digitalWrite(2, HIGH);
        break;
      case '2': // éteindre le salon
        digitalWrite(2, LOW);
        break;
       
        case '3': // allumer la chambre 1
        digitalWrite (3, HIGH);
        break;
        case '4': // éteindre la chambre 1
        digitalWrite(3, LOW);
        break;
       
        case '5': // allumer l'entrée
        digitalWrite (5, HIGH);
        break;
        case '6': // éteindre l'entrée
        digitalWrite(5, LOW);
        break;
       
        case '7': // allumer la salle de bain
        digitalWrite (6, HIGH);
        break;
        case '8': // éteindre la salle de bain
        digitalWrite(6, LOW);
        break;
       
        case '9': // allumer la cuisine
        digitalWrite (7, HIGH);
        break;
        case 'n': // éteindre la cuisine
        digitalWrite(7, LOW);
        break;
       
      /*  case '11': // allumer la chambre 1
        digitalWrite (3, HIGH);
        break;
        case '12': // éteindre la chambre 1
        digitalWrite(3, LOW);
        break;
      */
     
      ////////////////Variateur de tension au PIN PWM 9/////////////////////
      if (client.available() > 0) {
      Csharp = client.read();
      client.println(Csharp,DEC);
      analogWrite(PwmLed, int(Csharp));
     ///////////////////////////////////////////////////////////////////////
    }
    }
  }
}
}

Heloderma-kris

Salut j'utilise exactement ce système :
perso je me suis juste fait une petite interface avec un ampli OP en multiplicateur de tension :
l'arduino nous sort une tension par le PWM qui est variable entre 0 et 5V il sufit donc de fair un montage intermediaire pour sortire du 0 10V qui est de plus compatible avec les driver led dimable et les ballaste dimable
sa fonctione trés bien !
http://www.youtube.com/watch?v=pqeB7TapdC8
http://www.youtube.com/watch?v=zzFkW6QfpCc

si joint le schema!


barbudor

Ta boucle loop est a revoir
Tu travailles en TCP, mode connecté or tu attaque ta loop() par redemander une nouvelle connection.
Et puis tu n'es pas en v1.0.1
Mets toi a jour

Ceci devrait être plus correct :

Code: [Select]


// client en global
EthernetClient client;
boolean isClientConnected = false;

void loop()
{
  if ( client.connected() )
  {
    isClientConnected = true;
    if ( client.available() )
    {
      char c = client.read();
      ///// analyse de c, traitement
    }
  }
  else if ( isClientConnected )
  {
    Serial.println( "Client deconnecte" );
    isClientConnected = false;
  }
  else
  {
    client = server.available();
  }
}


Fait de mémoire, je n'ai pas l'arduino avec moi pour vérifier

Ca serait plus simple de le faire en UDP qu'en TCP surtout si tu restes sur réseau local.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

#22
Oct 17, 2012, 03:54 pm Last Edit: Oct 17, 2012, 07:04 pm by moonshine972 Reason: 1
Bonjour et merci de vos réponses,

Mon problème vien également du code c# je ne sais pas comment envoyer ma requette a l'aide de ma Slider.
Pouvez vous m'aider svp?

Heloderma-kris,

As tu posté les plans?

barbudor,

ton bout de code c'est pour savoir letat de ma connexion?

Heloderma-kris

si c'est le plan pour l'interface 0-10v oui tu l'a en desous de mon premier poste avec les valeur des resistance et des condensateur.

Merci Heloderma-kris j'etais pas connecté c'est pour ca.

Je coince sur mon code c#, vous pouvez m'aider svp?

Merci

Code: [Select]
private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            byte pwm;
            pwm = Convert.ToByte(slider1.Value);
            data[0] = pwm;
            byte[] test = pwm;
            int OctetsEnvoyes = _scl.Send(test);
        }

barbudor

#25
Oct 17, 2012, 09:39 pm Last Edit: Oct 17, 2012, 10:08 pm by barbudor Reason: 1
1) Pour s'interfacer avec le kit Velleman tu n'a pas besoin de montage 0..10V ni de filtre. Relis mon post précédant

2) Mon code est pour te monter le principe d'une boucle correcte pour gérer l'état de connexion et de déconnexion.

3) Pour envoyer des valeurs liées à une scroll-bar en C# il faut surcharger les fonctions associées, essentiellement
- Scroll : méthode qui est appellée pendant que le slider bouge

par exemple :
Code: [Select]
        private void mascrollbar_Scroll(object sender, ScrollEventArgs e)
        {
            // la nouvelle valeur est dans e.NewValue;
        }


Pour créer la surcharge :
- Aller dans le designer
- Cliquer avec le bouton droit sur la scrollbar et choisir propriétés
- Dans la fenêtre propriétés on voit généralement les valeurs.
- Pour voir les fonctions, cliquer en haut de la fenêtre sur la petite icone en forme d'éclair
- Double cliquer à droite de "Scroll"
- Une nouvelle fonction similaire à celle ci-dessus va être créé
- Dans cette fonction envoyer ton message de valeur

4) Corollaire : il va falloir que tu améliore ton protocole pour transmettre des messages plus complexes
Comme indiqué précédemment, tu aurait du commencer en UDP au lieu de TCP, c'est plus simple.

EDIT
5) Désolé , nos posts se sont croisés :
Code: [Select]
byte[] test = { pwm };
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Bonjour Barbudor,

Merci pour ton aide mais au bord du pin9 je n'ai aucune tension qui varie.

Pourtant je n'ai pas de message d'erreur d'ou penses tu que sa peut venir?

Merci

barbudor

Est-ce que tu reçois les paquets UDP ? --> Serial.print

Est-ce que tu passe bien dans les bonnes lignes de code ?  --> Serial.print

Que veux tu dire par : "je n'ai aucune tension qui varie." ?
As tu lu ceci : http://arduino.cc/en/Reference/AnalogWrite et as tu compris ce qu'est une sortie PWM ?
Quote
Writes an analog value (PWM wave) to a pin. Can be used to light a LED at varying brightnesses or drive a motor at various speeds. After a call to analogWrite(), the pin will generate a steady square wave of the specified duty cycle until the next call to analogWrite() (or a call to digitalRead() or digitalWrite() on the same pin). The frequency of the PWM signal is approximately 490 Hz.


Le signal de sortie sur une broche PWM n'est pas une tension variable mais un signal rectangulaire a rapport cyclique variable.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Je ne sais pas comment vérifier si je reçois mes paquets Udp.

Que veux tu dires " si je passes bien dans les bonnes lignes de code?"

D'après mes recherches le PIN 9 permettaient de faire varier une tension de 0 à 5 volts.

C'est le PIN 9 (PWM) que j'aurais utilisé pour le module VELLEMAN K8064, comme ça j'aurais pu faire varier ma tension sur mes ampoules.

Dans mon code C# j'utilise un Slider et grâce a lui j'aurais pu augmenter ou diminuer ma tension.


patg_

C'est un truc que j'ai du mal à comprendre ça, pourquoi avoir appelé analogWrite() une fonction qui ne génère pas une tension analogique!
Ca porte sérieusement à confusion.
pwmWrite() aurait été infiniment plus clair.

C'est d'ailleurs dommage que l'Arduino ne soit pas capable de générer une tension analogique sans un bricolage à base de PWM+filtre RC en sortie.
Mes Arduineries: http://breizhmakers.over-blog.com/

Go Up