Le but : fabriquer un Ball & Beam (déplacement d'une balle de ping-pong sur une barre horizontale) ou bien un rééquilibre d'une balle de ping-pong pendu au bout d'un fil comme doit le faire un grutier avec sa charge par exemple.
+ un bargraph à 8 leds via un registre à décalage (74HC595) pour indiquer la position de la balle,
+ 2 leds (jaune variante en fonction de la distance, rouge pour indiquer "hors capteur")
+ 1 led RGB qui varie sa couleur en fonction de la distance
+ 1 servo pour contrôler la position de la balle...
+ un contrôle de l'alimentation externe (accu)
Une question me bloque un peu : où devrais-je placer le plus judicieusement possible un delay() et de quelle valeur, pour que tout ait le temps de bien fonctionner ?
Par exemple, j'ai lu que le capteur Sharp nécessitait 36ms pour bien fonctionner correctement ...!
Il me semble que Le Deuligne et les CAN aussi demandent un petit delay pour faire correctement leur travail !?
Sachant que je voudrais aussi l'affichage de l'heure en temps réel bien sûr
Il faut aussi que je comprenne si je peux utiliser les pins 9,10,11 (utilisés je crois bien par le shield Mémoire) pour piloter la led RGB !?
- Code: Tout sélectionner
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include <Wire.h> // librairie I2C
#include "RTClib.h" // gestion de l'Heure
#include <Deuligne.h> // gestion du LCD Deuligne I2C Snootlab
// Object initialization
Deuligne lcd;
RTC_DS1307 RTC;
const int voltNow = A2; // pin réservée pour surveiller la tension de l'accu...
const int sensorPin = A3; // select the input pin for the SHARP GP2D120 ( capteur de distance IR )
const int servoBal = 5; // select the pin for the SERVO (PWM) ( pour le balancier )
const int Jaune = 3; // select the pin for the LED JAUNE (PWM) ( intensité varie avec la distance captée )
const int Rouge = 2; // select the pin for the LED ROUGE ( objet trop loin ! )
// RGB LED leads connected to PWM pins ( la couleur varie avec la distance captée )
const int RED_LED_PIN = 9;
const int GREEN_LED_PIN = 10;
const int BLUE_LED_PIN = 11;
int rgb_colors[3];
int redIntensity;
int greenIntensity;
int blueIntensity;
// variable to store the value coming from the sensor
int sensorValue = 0;
//The 74HC595 uses a serial communication link which has three pins ( bargraphe indicateur de la position de la balle de ping-pong )
int data = 4;
int clock = 7;
int latch = 8;
void setup () {
Wire.begin();
RTC.begin();
lcd.init(); // LCD panel initializatino
if (! RTC.isrunning()) {
lcd.print("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(__DATE__, __TIME__));
}
pinMode(Rouge, OUTPUT); // LED indiquant une trop grande distance
pinMode(data, OUTPUT); // bargraph de visualisation de la position de la balle de ping-pong
pinMode(clock, OUTPUT);
pinMode(latch, OUTPUT);
}
void loop () {
AffHeure();
sensorValue = map(analogRead(sensorPin), 0, 1023, 0, 255);
AffDist(sensorValue);
BarGraph(sensorValue);
getRGB(sensorValue, 0xff, 0xff, rgb_colors);
redIntensity = rgb_colors[0];
greenIntensity = rgb_colors[1];
blueIntensity = rgb_colors[2];
// Display the requested color
analogWrite(RED_LED_PIN, 255-redIntensity);
analogWrite(GREEN_LED_PIN, 255-greenIntensity);
analogWrite(BLUE_LED_PIN, 255-blueIntensity);
}
// ***** les fonctions *******
void BarGraph(int sensorV) { // BarGraph de 8 leds avec le 74HC595 en fonction du capteur IR GP2D120
byte ledCharSet[7] = {B11000000,B01100000,B00110000,B00011000,B00001100,B00000110,B00000011};
int allume = map(sensorV, 0, 255, 0, 7);
digitalWrite(latch, LOW);
shiftOut(data, clock, MSBFIRST, allume);
digitalWrite(latch, HIGH);
}
void AffDist(int sensor) { // affichage de la valeur du capteur de distance IR GP2D120 + les 2 LEDs
lcd.setCursor(0, 1);
lcd.print("Dist ");
lcd.setCursor(6, 1);
lcd.print(sensor);
if (sensor>254) {
digitalWrite(Rouge,HIGH); // allume la led ROUGE = distance trop grande
}
else
{
digitalWrite(Rouge,LOW); // �teind la led ROUGE
analogWrite(Jaune, sensor); // intensit� de la led JAUNE proportionnelle � la distance (sensor)
}
}
void getRGB(int hue, int sat, int val, int colors[3]) {
// (from http://www.kasperkamperman.com/blog/arduino/arduino-programming-hsb-to-rgb/)
/* convert hue, saturation and brightness ( HSB/HSV ) to RGB
The dim_curve is used only on brightness/value and on saturation (inverted).
This looks the most natural.
*/
// val = dim_curve[val];
// sat = 255-dim_curve[255-sat];
int r;
int g;
int b;
int base;
if (sat == 0) { // Acromatic color (gray). Hue doesn't mind.
colors[0]=val;
colors[1]=val;
colors[2]=val;
} else {
base = ((255 - sat) * val)>>8;
switch(hue/60) {
case 0:
r = val;
g = (((val-base)*hue)/60)+base;
b = base;
break;
case 1:
r = (((val-base)*(60-(hue%60)))/60)+base;
g = val;
b = base;
break;
case 2:
r = base;
g = val;
b = (((val-base)*(hue%60))/60)+base;
break;
case 3:
r = base;
g = (((val-base)*(60-(hue%60)))/60)+base;
b = val;
break;
case 4:
r = (((val-base)*(hue%60))/60)+base;
g = base;
b = val;
break;
case 5:
r = val;
g = base;
b = (((val-base)*(60-(hue%60)))/60)+base;
break;
}
colors[0]=r;
colors[1]=g;
colors[2]=b;
}
}
void AffHeure () { // affichage de l'heure en haut � droite du LCD
lcd.setCursor(0, 0);
DateTime now = RTC.now();
lcd.print(now.day(), DEC);
lcd.print('/');
if (now.month()<10) lcd.print('0');
lcd.print(now.month(), DEC);
lcd.setCursor(8, 0);
lcd.print(now.hour(), DEC);
lcd.print(":");
if (now.minute()<10) lcd.print('0');
lcd.print(now.minute(), DEC);
lcd.print(":");
if (now.second()<10) lcd.print('0');
lcd.print(now.second( ), DEC);
}
merci à tous
@+
