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 à 12: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
