ENIB 2022 - groupe B : Grande roue : Différence entre versions
(→photo du projet) |
(→Code) |
||
Ligne 28 : | Ligne 28 : | ||
==Code== | ==Code== | ||
<pre> | <pre> | ||
− | + | #include <Servo.h> | |
+ | #include<FastLED.h> | ||
+ | #define LED_PIN 5 | ||
+ | #define NUM_LEDS 10 | ||
+ | #define BRIGHTNESS 64 | ||
+ | #define LED_TYPE WS2811 | ||
+ | #define COLOR_ORDER GRB | ||
+ | CRGB leds[NUM_LEDS]; | ||
+ | #define UPDATES_PER_SECOND 100 | ||
+ | |||
+ | CRGBPalette16 currentPalette; | ||
+ | TBlendType currentBlending; | ||
+ | extern CRGBPalette16 myRedWhiteBluePalette; | ||
+ | extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM; | ||
+ | Servo esc; // create servo object to control a servo | ||
+ | int val; // variable to read value from analog pin | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | esc.attach(D7); // attaches servo on D7 to the servo object | ||
+ | |||
+ | |||
+ | delay( 3000 ); // power-up safety delay | ||
+ | FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); | ||
+ | FastLED.setBrightness( BRIGHTNESS ); | ||
+ | |||
+ | currentPalette = RainbowColors_p; | ||
+ | currentBlending = LINEARBLEND; | ||
+ | |||
+ | } | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | val = analogRead(0); // reads potentiometer value (between 0 and 1023) | ||
+ | val = map(val, 0, 1023, 0, 180); // scale it to use it with the servo (between 0 and 180) | ||
+ | esc.write(val); // sets servo position according to scaled value | ||
+ | delay(15); // waits for servo to get there | ||
+ | |||
+ | |||
+ | |||
+ | ChangePalettePeriodically(); | ||
+ | |||
+ | static uint8_t startIndex = 0; | ||
+ | startIndex = startIndex + 1; /* motion speed */ | ||
+ | |||
+ | FillLEDsFromPaletteColors( startIndex); | ||
+ | |||
+ | FastLED.show(); | ||
+ | FastLED.delay(1000 / UPDATES_PER_SECOND); | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | void FillLEDsFromPaletteColors( uint8_t colorIndex) | ||
+ | { | ||
+ | uint8_t brightness = 255; | ||
+ | |||
+ | for ( int i = 0; i < NUM_LEDS; i++) { | ||
+ | leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending); | ||
+ | colorIndex += 3; | ||
+ | } | ||
+ | } | ||
+ | // There are several different palettes of colors demonstrated here. | ||
+ | // | ||
+ | // FastLED provides several 'preset' palettes: RainbowColors_p, RainbowStripeColors_p, | ||
+ | // OceanColors_p, CloudColors_p, LavaColors_p, ForestColors_p, and PartyColors_p. | ||
+ | // | ||
+ | // Additionally, you can manually define your own color palettes, or you can write | ||
+ | // code that creates color palettes on the fly. All are shown here. | ||
+ | void ChangePalettePeriodically() | ||
+ | { | ||
+ | uint8_t secondHand = (millis() / 1000) % 60; | ||
+ | static uint8_t lastSecond = 99; | ||
+ | |||
+ | if ( lastSecond != secondHand) { | ||
+ | lastSecond = secondHand; | ||
+ | if ( secondHand == 0) { | ||
+ | currentPalette = RainbowColors_p; | ||
+ | currentBlending = LINEARBLEND; | ||
+ | } | ||
+ | if ( secondHand == 10) { | ||
+ | currentPalette = RainbowStripeColors_p; | ||
+ | currentBlending = NOBLEND; | ||
+ | } | ||
+ | if ( secondHand == 15) { | ||
+ | currentPalette = RainbowStripeColors_p; | ||
+ | currentBlending = LINEARBLEND; | ||
+ | } | ||
+ | if ( secondHand == 20) { | ||
+ | SetupPurpleAndGreenPalette(); | ||
+ | currentBlending = LINEARBLEND; | ||
+ | } | ||
+ | if ( secondHand == 25) { | ||
+ | SetupTotallyRandomPalette(); | ||
+ | currentBlending = LINEARBLEND; | ||
+ | } | ||
+ | if ( secondHand == 30) { | ||
+ | SetupBlackAndWhiteStripedPalette(); | ||
+ | currentBlending = NOBLEND; | ||
+ | } | ||
+ | if ( secondHand == 35) { | ||
+ | SetupBlackAndWhiteStripedPalette(); | ||
+ | currentBlending = LINEARBLEND; | ||
+ | } | ||
+ | if ( secondHand == 40) { | ||
+ | currentPalette = CloudColors_p; | ||
+ | currentBlending = LINEARBLEND; | ||
+ | } | ||
+ | if ( secondHand == 45) { | ||
+ | currentPalette = PartyColors_p; | ||
+ | currentBlending = LINEARBLEND; | ||
+ | } | ||
+ | if ( secondHand == 50) { | ||
+ | currentPalette = myRedWhiteBluePalette_p; | ||
+ | currentBlending = NOBLEND; | ||
+ | } | ||
+ | if ( secondHand == 55) { | ||
+ | currentPalette = myRedWhiteBluePalette_p; | ||
+ | currentBlending = LINEARBLEND; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | // This function fills the palette with totally random colors. | ||
+ | void SetupTotallyRandomPalette() | ||
+ | { | ||
+ | for ( int i = 0; i < 16; i++) { | ||
+ | currentPalette[i] = CHSV( random8(), 255, random8()); | ||
+ | } | ||
+ | } | ||
+ | // This function sets up a palette of black and white stripes, | ||
+ | // using code. Since the palette is effectively an array of | ||
+ | // sixteen CRGB colors, the various fill_* functions can be used | ||
+ | // to set them up. | ||
+ | void SetupBlackAndWhiteStripedPalette() | ||
+ | { | ||
+ | // 'black out' all 16 palette entries... | ||
+ | fill_solid( currentPalette, 16, CRGB::Black); | ||
+ | // and set every fourth one to white. | ||
+ | currentPalette[0] = CRGB::White; | ||
+ | currentPalette[4] = CRGB::White; | ||
+ | currentPalette[8] = CRGB::White; | ||
+ | currentPalette[12] = CRGB::White; | ||
+ | |||
+ | } | ||
+ | // This function sets up a palette of purple and green stripes. | ||
+ | void SetupPurpleAndGreenPalette() | ||
+ | { | ||
+ | CRGB purple = CHSV( HUE_PURPLE, 255, 255); | ||
+ | CRGB green = CHSV( HUE_GREEN, 255, 255); | ||
+ | CRGB black = CRGB::Black; | ||
+ | |||
+ | currentPalette = CRGBPalette16( | ||
+ | green, green, black, black, | ||
+ | purple, purple, black, black, | ||
+ | green, green, black, black, | ||
+ | purple, purple, black, black ); | ||
+ | } | ||
+ | // This example shows how to set up a static color palette | ||
+ | // which is stored in PROGMEM (flash), which is almost always more | ||
+ | // plentiful than RAM. A static PROGMEM palette like this | ||
+ | // takes up 64 bytes of flash. | ||
+ | const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM = | ||
+ | { | ||
+ | CRGB::Red, | ||
+ | CRGB::Gray, // 'white' is too bright compared to red and blue | ||
+ | CRGB::Blue, | ||
+ | CRGB::Black, | ||
+ | |||
+ | CRGB::Red, | ||
+ | CRGB::Gray, | ||
+ | CRGB::Blue, | ||
+ | CRGB::Black, | ||
+ | |||
+ | CRGB::Red, | ||
+ | CRGB::Red, | ||
+ | CRGB::Gray, | ||
+ | CRGB::Gray, | ||
+ | CRGB::Blue, | ||
+ | CRGB::Blue, | ||
+ | CRGB::Black, | ||
+ | CRGB::Black | ||
+ | }; | ||
</pre> | </pre> | ||
Version du 14 janvier 2022 à 13:00
Sommaire
Equipe
- Kaddah Salah El Dine
- Malherbe Julie
- Floch Louane
- La Marre Pierre
photo du projet
Que fait ce projet ?
La grande roue peut tourner dans les 2 sens, émet une musique, et est illuminée au niveau de son support
Liste des composants
Technique:
- Wemos D1 Mini x1
- servo moteur x1
- potentiomètre x1
- bandeau de led rvb adressable WS2812B x36 led
- pack son (Haut parleur; carte son ; lecteur) x1
- résistance 100 ohm x1
- interrupteur x2
Autre:
- carton
- papiers de couleur (blanc, bleu, rose)
- pics de bois
- axe cylindrique en bois
Code
#include <Servo.h> #include<FastLED.h> #define LED_PIN 5 #define NUM_LEDS 10 #define BRIGHTNESS 64 #define LED_TYPE WS2811 #define COLOR_ORDER GRB CRGB leds[NUM_LEDS]; #define UPDATES_PER_SECOND 100 CRGBPalette16 currentPalette; TBlendType currentBlending; extern CRGBPalette16 myRedWhiteBluePalette; extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM; Servo esc; // create servo object to control a servo int val; // variable to read value from analog pin void setup() { esc.attach(D7); // attaches servo on D7 to the servo object delay( 3000 ); // power-up safety delay FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); FastLED.setBrightness( BRIGHTNESS ); currentPalette = RainbowColors_p; currentBlending = LINEARBLEND; } void loop() { val = analogRead(0); // reads potentiometer value (between 0 and 1023) val = map(val, 0, 1023, 0, 180); // scale it to use it with the servo (between 0 and 180) esc.write(val); // sets servo position according to scaled value delay(15); // waits for servo to get there ChangePalettePeriodically(); static uint8_t startIndex = 0; startIndex = startIndex + 1; /* motion speed */ FillLEDsFromPaletteColors( startIndex); FastLED.show(); FastLED.delay(1000 / UPDATES_PER_SECOND); } void FillLEDsFromPaletteColors( uint8_t colorIndex) { uint8_t brightness = 255; for ( int i = 0; i < NUM_LEDS; i++) { leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending); colorIndex += 3; } } // There are several different palettes of colors demonstrated here. // // FastLED provides several 'preset' palettes: RainbowColors_p, RainbowStripeColors_p, // OceanColors_p, CloudColors_p, LavaColors_p, ForestColors_p, and PartyColors_p. // // Additionally, you can manually define your own color palettes, or you can write // code that creates color palettes on the fly. All are shown here. void ChangePalettePeriodically() { uint8_t secondHand = (millis() / 1000) % 60; static uint8_t lastSecond = 99; if ( lastSecond != secondHand) { lastSecond = secondHand; if ( secondHand == 0) { currentPalette = RainbowColors_p; currentBlending = LINEARBLEND; } if ( secondHand == 10) { currentPalette = RainbowStripeColors_p; currentBlending = NOBLEND; } if ( secondHand == 15) { currentPalette = RainbowStripeColors_p; currentBlending = LINEARBLEND; } if ( secondHand == 20) { SetupPurpleAndGreenPalette(); currentBlending = LINEARBLEND; } if ( secondHand == 25) { SetupTotallyRandomPalette(); currentBlending = LINEARBLEND; } if ( secondHand == 30) { SetupBlackAndWhiteStripedPalette(); currentBlending = NOBLEND; } if ( secondHand == 35) { SetupBlackAndWhiteStripedPalette(); currentBlending = LINEARBLEND; } if ( secondHand == 40) { currentPalette = CloudColors_p; currentBlending = LINEARBLEND; } if ( secondHand == 45) { currentPalette = PartyColors_p; currentBlending = LINEARBLEND; } if ( secondHand == 50) { currentPalette = myRedWhiteBluePalette_p; currentBlending = NOBLEND; } if ( secondHand == 55) { currentPalette = myRedWhiteBluePalette_p; currentBlending = LINEARBLEND; } } } // This function fills the palette with totally random colors. void SetupTotallyRandomPalette() { for ( int i = 0; i < 16; i++) { currentPalette[i] = CHSV( random8(), 255, random8()); } } // This function sets up a palette of black and white stripes, // using code. Since the palette is effectively an array of // sixteen CRGB colors, the various fill_* functions can be used // to set them up. void SetupBlackAndWhiteStripedPalette() { // 'black out' all 16 palette entries... fill_solid( currentPalette, 16, CRGB::Black); // and set every fourth one to white. currentPalette[0] = CRGB::White; currentPalette[4] = CRGB::White; currentPalette[8] = CRGB::White; currentPalette[12] = CRGB::White; } // This function sets up a palette of purple and green stripes. void SetupPurpleAndGreenPalette() { CRGB purple = CHSV( HUE_PURPLE, 255, 255); CRGB green = CHSV( HUE_GREEN, 255, 255); CRGB black = CRGB::Black; currentPalette = CRGBPalette16( green, green, black, black, purple, purple, black, black, green, green, black, black, purple, purple, black, black ); } // This example shows how to set up a static color palette // which is stored in PROGMEM (flash), which is almost always more // plentiful than RAM. A static PROGMEM palette like this // takes up 64 bytes of flash. const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM = { CRGB::Red, CRGB::Gray, // 'white' is too bright compared to red and blue CRGB::Blue, CRGB::Black, CRGB::Red, CRGB::Gray, CRGB::Blue, CRGB::Black, CRGB::Red, CRGB::Red, CRGB::Gray, CRGB::Gray, CRGB::Blue, CRGB::Blue, CRGB::Black, CRGB::Black };
Sources
- créer la grande roue:
https://www.lasdi.com/la-grande-roue.html
- code servo moteur:
https://raspi.tv/2018/using-wemos-d1-mini-to-control-a-brushless-motor-with-esc-and-servo-signals
- bandeau de led rvb adressable WS2812B:
https://www.raspberryme.com/guide-pour-la-bande-led-rvb-adressable-ws2812b-avec-arduino/
- bibliothèque des leds WS2812B (le code utilise l'exemple "ColorPalette" de cette bibliothèque):
https://github.com/FastLED/FastLED/archive/master.zip
- utiliser Wemos D1 Mini avec arduino:
http://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino