Total-Informatique

Le blog de sablier94

RGB LED Controler

août 24th, 2012

Au commencement de mon apprentissage dans le monde Arduino, j’avais réalisé un programme qui peut changer la couleur d’une LED RGB depuis n’importe où sur internet tout en faisant un bip avertisseur. Pour changer la couleur de la led, j’ai programmé un petit exécutable pour Windows en Autoit.

Le schéma du montage (à télécharger ici) :

Schéma du montage

Pour réaliser ce montage, vous aurez besoin de :

  • Un Arduino (j’ai utilisé le UNO R3) avec une câble USB pour le relier au PC
  • Un shield Ethernet (officiel) branché au routeur
  • 3 résistances 1.1K Ω (brun-brun-rouge)
  •  1 résistance 220 Ω (rouge-rouge-brun)
  • Une LED RGB à anode commune
  • Un piezo buzzer
  • Une breadboard avec des câbles (wires) pour brancher tout ça

Montage du matériel :
Connectez le 5v à l’anode de la LED, connectez la première broche (celle qui est « isolée ») au pin 5 (ce sera la couleur rouge), la deuxième au pin 6 (bleu) et la troisième au pin 7 (vert). Connectez aussi le fil noir du piezo buzzer à la masse et le fil rouge à une résistance 220 Ω (rouge-rouge-brun) qui est elle même reliée au pin 8 de l’Arduino. Attention, les cathodes (tous les pins sauf le 5v) sont connecté avec une résistance de 1.1k Ω pour ne pas griller la led.

Changez éventuellement les adresses IP suivant la configuration de votre réseau puis uploadez le sketch (code disponible plus bas) sur votre arduino avec l’IDE 1.0.

Ensuite, pour contrôler la couleur de la LED, vous pouvez utiliser le programme en Autoit que j’ai créé et qui va envoyer des paquets UDP sur l’Arduino. L’exécutable est disponible en téléchargement ici.

N’oubliez pas que pour y accéder depuis l’extérieur (avec une IP publique), il faut ouvrir le port / IP de l’arduino sur votre routeur. Vos amis pourront contrôler la led depuis chez eux, vous entendrez des beeps et verrez la couleur changer, tout en sachant que cela vient de plusieurs kilomètres.

Le code Arduino est basé sur celui-ci, je n’ai pas rajouté beaucoup de commentaires mais le code est assez facile à comprendre. Je me suis surtout penché sur le côté software en Autoit et le protocole de communication.

/*
  Code de base : http://arduino.cc/en/Tutorial/UDPSendReceiveString
  Modifié par Sablier94
  Version 1.0
  Matériel requis : un Arduino (UNO  R3), un shield Ethernet, 3 résistances 1.1K, une LED RGB à anode commune et une breadboard.
  Instructions : Connectez le 5v à l'anode de la LED, connectez la première broche (celle qui est "isolée") au pin 5 (rouge),
  la deuxième au pin 6 (bleu) et la troisième au pin 7 (vert). Changez éventuellement les adresses IP puis uploadez ce sketch sur votre arduino.
  Vous pouvez envoyer vos commandes depuis un programme que j'ai fait en Autoit ici : http://www.total-informatique.com/fichiers/perso/sharefriends/ArduinoRGBLEDControl.exe
  N'oubliez pas que pour y accéder depuis l'extérieur (avec une IP publique), il faut ouvrir le port / IP de l'arduino sur votre routeur.
*/

#include          // needed for Arduino versions later than 0018
#include
#include          // UDP library from:  12/30/2008

int ledPinR = 5;
int ledPinG = 7;
int ledPinB = 6;

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 0, 177);

unsigned int localPort = 8888;      // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup() {
  // start the Ethernet and UDP:
  Ethernet.begin(mac,ip);
  Udp.begin(localPort);

  pinMode(ledPinR, OUTPUT);
  pinMode(ledPinG, OUTPUT);
  pinMode(ledPinB, OUTPUT);
  digitalWrite(ledPinR, HIGH);
  digitalWrite(ledPinG, HIGH);
  digitalWrite(ledPinB, HIGH);

  Serial.begin(9600);
}

void loop() {
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if(packetSize)
  {
    Serial.print("Taille du packet recu : !!)
    Serial.println(packetSize);
    Serial.print("De : !!)
    IPAddress remote = Udp.remoteIP();
    for (int i =0; i < 4; i++)
    {
      Serial.print(remote[i], DEC);
      if (i < 3)
      {
        Serial.print(".");
      }
    }
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    // read the packet into packetBufffer
    Udp.read(packetBuffer, 4); //On pourrait remplacer le 4 par UDP_TX_PACKET_MAX_SIZE
    Serial.println("Contenu :!!)
    Serial.println(packetBuffer);

    if(String(packetBuffer) == "ledo")
    {
       digitalWrite(ledPinR, HIGH);
       Serial.println("La LED est maintenant eteinte.");
       tone(8, 440, 200);
    }
    else if(String(packetBuffer) == "ledr")
    {
       digitalWrite(ledPinR, LOW);
       digitalWrite(ledPinG, HIGH);
       digitalWrite(ledPinB, HIGH);
       Serial.println("La LED est maintenant rouge.");
       tone(8, 494, 400);
    }
    else if(String(packetBuffer) == "ledg")
    {
       digitalWrite(ledPinR, HIGH);
       digitalWrite(ledPinG, LOW);
       digitalWrite(ledPinB, HIGH);
       Serial.println("La LED est maintenant verte.");
       tone(8, 554, 800);
    }
    else if(String(packetBuffer) == "ledb")
    {
       digitalWrite(ledPinR, HIGH);
       digitalWrite(ledPinG, HIGH);
       digitalWrite(ledPinB, LOW);
       Serial.println("La LED est maintenant bleue.");
       tone(8, 622, 1000);
    }
     Serial.println("");
  }
  delay(10);
}

Et le code Autoit (utilise des fonctions assez basiques, il devrait y avoir assez de texte pour comprendre le fonctionnement et le protocole utilisé) :

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_Res_Language=4108
#AutoIt3Wrapper_Run_Tidy=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include

#Region ### START Koda GUI section ###
$frmLEDControl = GUICreate("The Arduino's RGB LED Controler", 532, 141, 263, 172)
$btnBlue = GUICtrlCreateButton("Bleu", 24, 56, 105, 33, 0)
$btnGreen = GUICtrlCreateButton("Vert", 152, 56, 105, 33, 0)
$btnRed = GUICtrlCreateButton("Rouge", 280, 56, 105, 33, 0)
$lblInfos = GUICtrlCreateLabel("Cliquez sur un bouton pour changer la couleur de la LED par internet :", 24, 24, 410, 20)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$btnOff = GUICtrlCreateButton("Eteindre", 408, 56, 105, 33, 0)
$lblIP = GUICtrlCreateLabel("IP publique :", 24, 107, 63, 17)
GUICtrlSetFont(-1, 9, 400, 0, "MS Sans Serif")
$txtIP = GUICtrlCreateInput(IniRead(@TempDir & "\RGBSettings.ini", "Connexion", "IP", "77.56.130.34"), 96, 104, 97, 21)
$Label1 = GUICtrlCreateLabel("Port :", 224, 107, 29, 17)
GUICtrlSetFont(-1, 9, 400, 0, "MS Sans Serif")
$txtPort = GUICtrlCreateInput(IniRead(@TempDir & "\RGBSettings.ini", "Connexion", "Port", "8888"), 256, 104, 65, 21)
$btnSave = GUICtrlCreateButton("Valider", 352, 102, 89, 24, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
UDPStartup()

OnAutoItExitRegister("Cleanup")

$socket = UDPOpen(IniRead(@TempDir & "\RGBSettings.ini", "Connexion", "IP", "77.56.130.34"), IniRead(@TempDir & "\RGBSettings.ini", "Connexion", "Port", "8888"))
If @error <> 0 Then
   MsgBox(48, "Erreur", "Impossible de se connecter. Veuillez corriger les paramètres et relancer le programme.")
   Exit
EndIf

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit
      Case $btnGreen
         $status = UDPSend($socket, 'ledg')
         If $status = 0 Then
            GUICtrlSetData($lblInfos, "Erreur, la commande n'a pas pu être envoyée.")
            GUICtrlSetColor($lblInfos, 0x000000)
         Else
            GUICtrlSetData($lblInfos, "La LED est désormais verte.")
            GUICtrlSetColor($lblInfos, 0x009900)
         EndIf
      Case $btnRed
         $status = UDPSend($socket, 'ledr')
         If $status = 0 Then
            GUICtrlSetData($lblInfos, "Erreur, la commande n'a pas pu être envoyée.")
            GUICtrlSetColor($lblInfos, 0x000000)
         Else
            GUICtrlSetData($lblInfos, "La LED est désormais rouge.")
            GUICtrlSetColor($lblInfos, 0xFF0000)
         EndIf
      Case $btnBlue
         $status = UDPSend($socket, 'ledb')
         If $status = 0 Then
            GUICtrlSetData($lblInfos, "Erreur, la commande n'a pas pu être envoyée.")
            GUICtrlSetColor($lblInfos, 0x000000)
         Else
            GUICtrlSetData($lblInfos, "La LED est désormais bleue.")
            GUICtrlSetColor($lblInfos, 0x0000FF)
         EndIf
      Case $btnOff
         $status = UDPSend($socket, 'ledo')
         If $status = 0 Then
            GUICtrlSetData($lblInfos, "Erreur, la commande n'a pas pu être envoyée.")
            GUICtrlSetColor($lblInfos, 0x000000)
         Else
            GUICtrlSetData($lblInfos, "La LED est désormais éteinte")
            GUICtrlSetColor($lblInfos, 0x000000)
         EndIf
      Case $btnSave
         Cleanup()
         UDPStartup()
         $socket = UDPOpen(GUICtrlRead($txtIP), GUICtrlRead($txtPort))
         If @error <> 0 Then
            MsgBox(48, "Erreur", "Impossible de se connecter. Veuillez corriger les paramètres et relancer le programme.")
            Exit
         EndIf
         IniWrite(@TempDir & "\RGBSettings.ini", "Connexion", "IP", GUICtrlRead($txtIP))
         IniWrite(@TempDir & "\RGBSettings.ini", "Connexion", "Port", GUICtrlRead($txtPort))
         GUICtrlSetData($lblInfos, "Les paramètres ont correctement été enregistrés.")
         GUICtrlSetColor($lblInfos, 0x000000)
   EndSwitch

WEnd

Func Cleanup()
   UDPCloseSocket($socket)
   UDPShutdown()
EndFunc   ;==>Cleanup

Comments

4 Comments

RSS
  • Darkbatcher says on: 26 août 2012 at 9:24

     

    Salut Sablier !

    Il sont vraiment sympas tes exemples (et tout le reste d’ailleurs) 😀
    Au fait tu peux économiser deux résistance en plaçant une seule sur l’annode 😉

    @+

    • sablier94 says on: 27 août 2012 at 9:45

       

      Salut !

      Merci pour le compliment et pour ton conseil, je ne savais pas qu’on pouvait le faire =)

  • Julien says on: 18 octobre 2012 at 1:44

     

    Merci de partager toutes ces astuces et exemples !!

    Je ne comprends pas la remarque  » tu peux économiser deux résistance en plaçant une seule sur l’anode »

    ca donnerait quoi sur le schema ?
    une seule resistance au niveau du fil rouge de la LED (5V) au lieu de 3 resistances sur les 3 autres pattes ?

    Merci!

    • sablier94 says on: 21 octobre 2012 at 4:00

       

      Oui c’est ça, une seule résistance sur l’anode (5v, fil rouge de la led) permet d’arriver au même résultat.

Your email address will not be published. Required fields are marked *

*

Total-Informatique

Le blog de sablier94