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
