Variateur 220V

De Centre de Ressources Numériques - Labomedia
Révision de 19 mars 2015 à 06:36 par Mushussu (discussion | contributions) (Script Arduino)

(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à : navigation, rechercher

Description du projet

Réaliser un variateur 220V pouvant être piloté par une platine Arduino via une liaison série.

Matériel utilisé

  • Ordinateur avec Arduino et Processing installé
  • Platine Arduino Duemilanove
  • Cable USB
  • Montage réalisé
  • Une charge résistive (lampe, radiateur …)

Montage électronique

alternative textuelle
Liste des pièces
Nom Référence Quantité

Résistance

150K 1W

2

Résistance

330 1W

1

Résistance

270 1/4W

1

Résistance

120 1/4W

1

Diode de redressement

1N4007

4

Triac

BT139-600

1

Optocoupleur

MOC3021M

1

Optocoupleur

6N138

1

Attention.svg Lors du branchement sur le réseau 220V, risque de mort, il est nécessaire de prendre toute les précautions pour éviter que des pièces métalliques entrent en contact avec le montage.

Pour le bon fonctionnement du montage il faut bien faire attention de relier le circuit de gâchette du triac entre le pin 2 (Main terminal 2) et le pin 3 (Gate) du triac.

Script Arduino

unsigned int tempo = 0;
boolean flag = false;

void setup(){
  pinMode(7, OUTPUT); // Le port digital 7 est configuré en sortie pour envoyer l'information au MOC3021
  Serial.begin(9600);
  attachInterrupt(0, zeroDetect, CHANGE); // L'interruption est gérée sur le port digital 2
}

void loop(){
  if (Serial.available() > 0) {
    tempo = 9600 - Serial.read() * 35; // Calcul la temporisation dans la demi-phase 
  }
}

void zeroDetect() {
  noInterrupts();
  if (flag) { // Permet de gérer le bon changement de l'interruption 
    flag = false;
  } else {
    flag = true;
    delayMicroseconds(tempo); // Attente sur la demi-phase courante
    digitalWrite(7, HIGH);
    delayMicroseconds(50); // Durée nécessaire pour que le triac s'amorce
    digitalWrite(7, LOW);
  }
  interrupts();
}

Le script peut être amélioré. Il faudrait bien distinguer la gestion de l'interruption lors du passage à zéro du secteur, calibrer automatiquement l'intervalle du passage à zéro.

Script Processing

import processing.serial.*;

Serial portSerie;  // Crée un objet de la classe Serial
int val;        // Donnée envoyée par le port série
PFont font;

void setup() 
{
  size(200, 600);
  String nomPort = Serial.list()[0];
  portSerie = new Serial(this, nomPort, 9600);
  fill(0);
  stroke(255 ,0 ,0);
  font = loadFont("HelveticaNeue-36.vlw"); 
  textFont(font);
}

void draw() {
  background(255);
  rect(50, 50, 100, 500);
  if (sourisSurRect() == true) {  // Teste si la souris est au-dessus du rectangle
    val = (mouseY - 50)*255/500;
    portSerie.write(val);
  }
  line(50, (val*500/255 + 50), 150,  (val*500/255 + 50));
  text(val, 50, 590);
}

boolean sourisSurRect() { // Teste si la souris est au-dessus du rectangle
  return ((mouseX >= 50) && (mouseX <= 150) && (mouseY >= 50) && (mouseY <= 550));
}

Archive du projet