Light painting : Différence entre versions
 (→documentation)  | 
				|||
| Ligne 8 : | Ligne 8 : | ||
</html>  | </html>  | ||
| − | ==  | + | ==Réalisation==  | 
| + | liste du matériel :  | ||
| + | * Module de carte SD  | ||
| + | * carte SD  | ||
| + | * arduino  | ||
| + | * ruban de 60 LEDs adressable : WDS2812B, néopixel  | ||
| + | * un bouton poussoir  | ||
| + | [[Fichier:PixelStickMontage.JPG|300px]]  | ||
| + | [[Fichier:Fichier:PixelStickVuedensemble.JPG|300px]]  | ||
| + | [[Fichier:PixelStickPremierePhoto.JPG|300px]]  | ||
| + | |||
| + | code :  | ||
| + | <pre>  | ||
| + | ////////////////////  | ||
| + | //   PIXELSTICK   //  | ||
| + | ////////////////////  | ||
| + | |||
| + | /*  | ||
| + |  *   | ||
| + |                                        +-----+  | ||
| + |                             +----------| USB |----------+  | ||
| + |                             |          +-----+          |  | ||
| + |       SCK module carte SD - | [X]D13/SCK    MISO/D12[X] | - MISO du module carte   | ||
| + |    VCC du module carte SD - | [X]3.3V       MOSI/D11[X]~| - MOSI du module carte SD     | ||
| + |                             | [ ]V.ref    _   SS/D10[ ]~|      | ||
| + |                             | [ ]A0     / N \     D9[ ]~|      | ||
| + |                             | [ ]A1   /   A   \   D8[ ] |      | ||
| + |                             | [ ]A2   \   N   /   D7[ ] |      | ||
| + |                             | [ ]A3     \ 0 /     D6[X]~| - Ruban de led     | ||
| + |                             | [ ]A4/SDA           D5[ ]~|      | ||
| + |                             | [ ]A5/SCL           D4[X] | - broche CS du module carte SD     | ||
| + |                             | [ ]A6          INT1/D3[ ]~|      | ||
| + |                             | [ ]A7          INT0/D2[X] | - broche bouton     | ||
| + |                             | [ ]5V              GND[ ] |       | ||
| + |                             | [ ]RST             RST[ ] |      | ||
| + |                             | [ ]GND 5V MOSI GND TX1[ ] |      | ||
| + |                             | [ ]Vin [ ] [ ] [ ] RX1[ ] |     | ||
| + |                             |        [ ] [ ] [ ]        |  | ||
| + |                             |        MISO SCK RST       |  | ||
| + |                             | NANO-V3                   |  | ||
| + |                             |___________________________|  | ||
| + | |||
| + |              ______________________________  | ||
| + |             |        SD CARD  _____________|  | ||
| + |            -|[ ]GND   MODULE |         /     | ||
| + |  VCC       -|[ ]3,3V  [XXX]  |       / |  | ||
| + |            -|[ ]5V      =    |     /   |  | ||
| + |  broche 4  -|[ ]CS      =    |    |    |  | ||
| + |  broche 11 -|[ ]MOSI    =    |    |    |  | ||
| + |  broche 13 -|[ ]SCK .   =    |     \   |  | ||
| + |  broche 12 -|[ ]MISO    =    |       \ |  | ||
| + |  GND       -|[ ]GND     =    |_________\___  | ||
| + |             |______________________________|    | ||
| + | |||
| + | |||
| + | Matériel :  | ||
| + | - Module de carte SD  | ||
| + | - carte SD  | ||
| + | - arduino  | ||
| + | - ruban de 60 Leds adressables : WDS2812B, néopixel  | ||
| + | - un bouton poussoir  | ||
| + | |||
| + | Fortement inspiré de pixelstick par Lucas Berbesson for LA FABRIQUE DIY  | ||
| + | LICENSE MIT  | ||
| + | Voir https://github.com/LucasBerbesson/pixelstick  | ||
| + | |||
| + | Schéma de l'Arduino en ASCII-ART CC-By http://busyducks.com/ascii-art-arduinos  | ||
| + | Sous licence CC-By-Sa (http://creativecommons.org/licenses/by-nc-sa/3.0/)  | ||
| + | */  | ||
| + | /*  | ||
| + |    ___  | ||
| + |  / ___ \  | ||
| + | |_|   | |  | ||
| + |      /_/   | ||
| + |      _   ___   _   | ||
| + |     |_| |___|_| |_  | ||
| + |          ___|_   _|  | ||
| + |         |___| |_|  | ||
| + | Les petits Débrouillards - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/  | ||
| + | */  | ||
| + | #include <SPI.h>  | ||
| + | #include <SD.h>  | ||
| + | #include <Adafruit_NeoPixel.h>  | ||
| + | // Parameter 1 = number of pixels in strip  | ||
| + | // Parameter 2 = pin number (most are valid)  | ||
| + | // Parameter 3 = pixel type flags, add together as needed:  | ||
| + | //   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)  | ||
| + | //   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)  | ||
| + | //   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)  | ||
| + | //   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)  | ||
| + | |||
| + | // Broche "data" pour les données du ruban de Led  | ||
| + | #define brocheLED 6  | ||
| + | // Broche CS de la carte SD  | ||
| + | #define brocheSD 4  | ||
| + | |||
| + | int brocheBouton = 2;  | ||
| + | //bool playAnimation = true;  | ||
| + | int positionDuFichier = 0;  | ||
| + | int nombreDeFichiers = 0;  | ||
| + | bool Animation = true;  | ||
| + | String nomDuFichier[10];  | ||
| + | File root;  | ||
| + | File dataFile;  | ||
| + | String nomDuFichierCourant = "";  | ||
| + | |||
| + | int nombreDeLED = 60;  | ||
| + | Adafruit_NeoPixel strip = Adafruit_NeoPixel(nombreDeLED, brocheLED, NEO_GRB + NEO_KHZ800);  | ||
| + | |||
| + | void setup() {  | ||
| + |  Serial.begin(115200);  | ||
| + |  pinMode(13, OUTPUT);  | ||
| + |  pinMode(brocheBouton, INPUT_PULLUP);  | ||
| + |  strip.begin();  | ||
| + |  strip.show();  | ||
| + |  setupSDcard();  | ||
| + |  delay(100);  | ||
| + | }  | ||
| + | |||
| + | void loop() {  | ||
| + |   if (digitalRead(brocheBouton) == LOW) {  | ||
| + |      digitalWrite(13,HIGH);  | ||
| + |      positionDuFichier++;  | ||
| + |      Serial.println(positionDuFichier);  | ||
| + |      delay(100);  | ||
| + |      digitalWrite(13,LOW);  | ||
| + |    }  | ||
| + |   delay(500);  | ||
| + |    Serial.print("envois du fichier");  | ||
| + |    if ( positionDuFichier >= nombreDeFichiers) {  | ||
| + |     positionDuFichier = 0;  | ||
| + |    }  | ||
| + |    SendFile(nomDuFichier[positionDuFichier]);  | ||
| + |    ClearStrip();  | ||
| + | |||
| + | }  | ||
| + | |||
| + | |||
| + | void setupSDcard() {  | ||
| + |  pinMode(brocheSD, OUTPUT);  | ||
| + | |||
| + |  while (!SD.begin(brocheSD)) {  | ||
| + |    Serial.println("échec de l'initialisation de carte SD ! ");  | ||
| + |    delay(500);  | ||
| + |  }  | ||
| + |  Serial.println("la carte SD est initialisée ");  | ||
| + |  delay(1000);  | ||
| + |  root = SD.open("/");  | ||
| + |  Serial.println("Exploration des fichiers ");  | ||
| + |  delay(500);  | ||
| + |  GetFileNamesFromSD(root);  | ||
| + | }  | ||
| + | |||
| + | // Cette fonction liste les fichiers de la carte SD  | ||
| + | void GetFileNamesFromSD(File dir) {  | ||
| + |  int fileCount = 0;  | ||
| + |  String nomDuFichierCourant = "";  | ||
| + |  while(1) {  | ||
| + |    File entry =  dir.openNextFile();  | ||
| + |    if (! entry) {  | ||
| + |      // no more files / plus de fichier  | ||
| + |      nombreDeFichiers = fileCount;  | ||
| + |      Serial.println("nombre de fichiers ");  | ||
| + |      Serial.println(fileCount);  | ||
| + |    entry.close();  | ||
| + |      break;  | ||
| + |    }  | ||
| + |    else {  | ||
| + |        nomDuFichierCourant = entry.name();  | ||
| + |        if (nomDuFichierCourant.endsWith(".TXT")) { //seulement les fichiers .txt  | ||
| + |          if(nomDuFichierCourant.startsWith("_")){      // Si la carte SD est utilisée sur mac, le système ajoute des fichiers "sidecar".  | ||
| + |           // Ils débutent par le caractère _, et ils ne doivent pas être pris en compe.  | ||
| + |          }else{  | ||
| + |            nomDuFichier[fileCount] = entry.name();  | ||
| + |            fileCount++;  | ||
| + |          }  | ||
| + |        }  | ||
| + |    }  | ||
| + |    entry.close();  | ||
| + |  }  | ||
| + | }  | ||
| + | |||
| + | // Cette fonction fait clignoter la première led et lance les animations.  | ||
| + | void SendFile(String Filename) {  | ||
| + |  char temp[14];  | ||
| + |  Animation = true;  | ||
| + |  Filename.toCharArray(temp,14);  | ||
| + |  Serial.println(Filename);  | ||
| + |  dataFile = SD.open(temp);  | ||
| + |  // Si le fichier est accessible, l'envoyer au ruban de led  | ||
| + |  if (dataFile) {  | ||
| + |    int i = 0;  | ||
| + |    int red, green, blue;  | ||
| + |    strip.setPixelColor(1,255,255,255);  | ||
| + |    strip.show();  | ||
| + |    delay(500);  | ||
| + |    strip.setPixelColor(1,0,0,0);  | ||
| + |    strip.show();  | ||
| + |    delay(500);  | ||
| + |    strip.setPixelColor(1,255,255,255);  | ||
| + |    strip.show();  | ||
| + |    delay(500);  | ||
| + |    strip.setPixelColor(1,0,0,0);  | ||
| + |    strip.show();  | ||
| + |    delay(2000);  | ||
| + |    while(dataFile.available() && Animation){  | ||
| + | |||
| + |      if (digitalRead(brocheBouton) == LOW) {  | ||
| + |        Animation = false;  | ||
| + |        break;  | ||
| + |        delay(100);  | ||
| + |      }  | ||
| + |      if (i == (nombreDeLED)) {  | ||
| + |        i=0;  | ||
| + |        strip.show();  | ||
| + |        delay(120);  | ||
| + |        }  | ||
| + |      red = dataFile.parseInt();  | ||
| + |      green = dataFile.parseInt();  | ||
| + |      blue = dataFile.parseInt();  | ||
| + |      strip.setPixelColor(i, red, green, blue);  | ||
| + |      i++;  | ||
| + |    }  | ||
| + |    Serial.print("Fermeture du fichier ");  | ||
| + |    dataFile.close();  | ||
| + |  } else {  | ||
| + |    Serial.print("Erreur de lecture ");  | ||
| + |    setupSDcard();  | ||
| + |    return;  | ||
| + |    }  | ||
| + |  }  | ||
| + | |||
| + | // Cette fonction éteint toute les leds du pixelstick  | ||
| + | void ClearStrip() {  | ||
| + |  int x;  | ||
| + |  for(x=0;x<nombreDeLED;x++) {  | ||
| + |    strip.setPixelColor(x, 0);  | ||
| + |  }  | ||
| + |  strip.show();  | ||
| + | }  | ||
| + | </pre>  | ||
==documentation==  | ==documentation==  | ||
Version du 20 octobre 2019 à 21:01
présentation
Peindre avec la lumière ! Ici il s'agit d'utiliser des leds pilotées par un micro-controleur pour créer des images.
Réalisation
liste du matériel :
- Module de carte SD
 - carte SD
 - arduino
 - ruban de 60 LEDs adressable : WDS2812B, néopixel
 - un bouton poussoir
 
code :
////////////////////
//   PIXELSTICK   //
////////////////////
/*
 * 
                                       +-----+
                            +----------| USB |----------+
                            |          +-----+          |
      SCK module carte SD - | [X]D13/SCK    MISO/D12[X] | - MISO du module carte 
   VCC du module carte SD - | [X]3.3V       MOSI/D11[X]~| - MOSI du module carte SD   
                            | [ ]V.ref    _   SS/D10[ ]~|    
                            | [ ]A0     / N \     D9[ ]~|    
                            | [ ]A1   /   A   \   D8[ ] |    
                            | [ ]A2   \   N   /   D7[ ] |    
                            | [ ]A3     \ 0 /     D6[X]~| - Ruban de led   
                            | [ ]A4/SDA           D5[ ]~|    
                            | [ ]A5/SCL           D4[X] | - broche CS du module carte SD   
                            | [ ]A6          INT1/D3[ ]~|    
                            | [ ]A7          INT0/D2[X] | - broche bouton   
                            | [ ]5V              GND[ ] |     
                            | [ ]RST             RST[ ] |    
                            | [ ]GND 5V MOSI GND TX1[ ] |    
                            | [ ]Vin [ ] [ ] [ ] RX1[ ] |   
                            |        [ ] [ ] [ ]        |
                            |        MISO SCK RST       |
                            | NANO-V3                   |
                            |___________________________|
         
             ______________________________
            |        SD CARD  _____________|
           -|[ ]GND   MODULE |         /   
 VCC       -|[ ]3,3V  [XXX]  |       / |
           -|[ ]5V      =    |     /   |
 broche 4  -|[ ]CS      =    |    |    |
 broche 11 -|[ ]MOSI    =    |    |    |
 broche 13 -|[ ]SCK .   =    |     \   |
 broche 12 -|[ ]MISO    =    |       \ |
 GND       -|[ ]GND     =    |_________\___
            |______________________________|  
 
Matériel :
- Module de carte SD
- carte SD
- arduino
- ruban de 60 Leds adressables : WDS2812B, néopixel
- un bouton poussoir
Fortement inspiré de pixelstick par Lucas Berbesson for LA FABRIQUE DIY
LICENSE MIT
Voir https://github.com/LucasBerbesson/pixelstick
Schéma de l'Arduino en ASCII-ART CC-By http://busyducks.com/ascii-art-arduinos
Sous licence CC-By-Sa (http://creativecommons.org/licenses/by-nc-sa/3.0/)
*/
/*
   ___
 / ___ \
|_|   | |
     /_/ 
     _   ___   _ 
    |_| |___|_| |_
         ___|_   _|
        |___| |_|
Les petits Débrouillards - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/
*/
#include <SPI.h>
#include <SD.h>
#include <Adafruit_NeoPixel.h>
// Parameter 1 = number of pixels in strip
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
// Broche "data" pour les données du ruban de Led
#define brocheLED 6
// Broche CS de la carte SD
#define brocheSD 4
int brocheBouton = 2;
//bool playAnimation = true;
int positionDuFichier = 0;
int nombreDeFichiers = 0;
bool Animation = true;
String nomDuFichier[10];
File root;
File dataFile;
String nomDuFichierCourant = "";
int nombreDeLED = 60;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(nombreDeLED, brocheLED, NEO_GRB + NEO_KHZ800);
void setup() {
 Serial.begin(115200);
 pinMode(13, OUTPUT);
 pinMode(brocheBouton, INPUT_PULLUP);
 strip.begin();
 strip.show();
 setupSDcard();
 delay(100);
}
void loop() {
  if (digitalRead(brocheBouton) == LOW) {
     digitalWrite(13,HIGH);
     positionDuFichier++;
     Serial.println(positionDuFichier);
     delay(100);
     digitalWrite(13,LOW);
   }
  delay(500);
   Serial.print("envois du fichier");
   if ( positionDuFichier >= nombreDeFichiers) {
    positionDuFichier = 0;
   }
   SendFile(nomDuFichier[positionDuFichier]);
   ClearStrip();
}
void setupSDcard() {
 pinMode(brocheSD, OUTPUT);
 while (!SD.begin(brocheSD)) {
   Serial.println("échec de l'initialisation de carte SD ! ");
   delay(500);
 }
 Serial.println("la carte SD est initialisée ");
 delay(1000);
 root = SD.open("/");
 Serial.println("Exploration des fichiers ");
 delay(500);
 GetFileNamesFromSD(root);
}
// Cette fonction liste les fichiers de la carte SD
void GetFileNamesFromSD(File dir) {
 int fileCount = 0;
 String nomDuFichierCourant = "";
 while(1) {
   File entry =  dir.openNextFile();
   if (! entry) {
     // no more files / plus de fichier
     nombreDeFichiers = fileCount;
     Serial.println("nombre de fichiers ");
     Serial.println(fileCount);
   entry.close();
     break;
   }
   else {
       nomDuFichierCourant = entry.name();
       if (nomDuFichierCourant.endsWith(".TXT")) { //seulement les fichiers .txt
         if(nomDuFichierCourant.startsWith("_")){      // Si la carte SD est utilisée sur mac, le système ajoute des fichiers "sidecar".
          // Ils débutent par le caractère _, et ils ne doivent pas être pris en compe.
         }else{
           nomDuFichier[fileCount] = entry.name();
           fileCount++;
         }
       }
   }
   entry.close();
 }
}
// Cette fonction fait clignoter la première led et lance les animations.
void SendFile(String Filename) {
 char temp[14];
 Animation = true;
 Filename.toCharArray(temp,14);
 Serial.println(Filename);
 dataFile = SD.open(temp);
 // Si le fichier est accessible, l'envoyer au ruban de led
 if (dataFile) {
   int i = 0;
   int red, green, blue;
   strip.setPixelColor(1,255,255,255);
   strip.show();
   delay(500);
   strip.setPixelColor(1,0,0,0);
   strip.show();
   delay(500);
   strip.setPixelColor(1,255,255,255);
   strip.show();
   delay(500);
   strip.setPixelColor(1,0,0,0);
   strip.show();
   delay(2000);
   while(dataFile.available() && Animation){
     if (digitalRead(brocheBouton) == LOW) {
       Animation = false;
       break;
       delay(100);
     }
     if (i == (nombreDeLED)) {
       i=0;
       strip.show();
       delay(120);
       }
     red = dataFile.parseInt();
     green = dataFile.parseInt();
     blue = dataFile.parseInt();
     strip.setPixelColor(i, red, green, blue);
     i++;
   }
   Serial.print("Fermeture du fichier ");
   dataFile.close();
 } else {
   Serial.print("Erreur de lecture ");
   setupSDcard();
   return;
   }
 }
// Cette fonction éteint toute les leds du pixelstick
void ClearStrip() {
 int x;
 for(x=0;x<nombreDeLED;x++) {
   strip.setPixelColor(x, 0);
 }
 strip.show();
}
documentation
- Sur wikipédia : https://fr.wikipedia.org/wiki/Light_painting
 - Pochoir de lightpainting à Brest : https://www.posethelight.com/quest-ce-que-le-pochoir-lumineux-en-light-painting/
 - 35 photos d'artistes de lightpainting : http://www.marevueweb.com/photographies/light-painting/
 - Voir également le projet HP19 : Roger, Gérard, Bernard réalisé dans le cadre du Hackathon pédagogique 2019 de la ville de Brest à l'IMT Atlantique.
 - Le pixelstick sur github : https://github.com/LucasBerbesson/pixelstick
 - Sur Instructable : https://www.instructables.com/id/Arduino-Pixel-Stick/
 - site commercial pixelstick : http://thepixelstick.com/index.html
 - Avec un raspberry pi chez Adafruit : https://learn.adafruit.com/dotstar-pi-painter
 - Un autre : https://learn.adafruit.com/light-painting-with-raspberry-pi
 - Avec un arduino chez Adafruit : https://learn.adafruit.com/neopixel-painter
 
