Problème sifflement carte Arduino - transistor
J'ai essayé de pousser plus loin mon dispositif d'éclairage interactif ( plusieurs spots à LED alimentés en 12V et déclenchés par plusieurs capteurs ultrasons correspondants)
Cela fonctionne lorsque j'ordonne à mes spots de passer de LOW à HIGH.
Pour avoir un effet plus chouette j'aimerais que mes spots s'allume en "fade" en incrémentant leur valeur d'intensité jusqu'à 255.
Pour ce faire j'ai rajouté 1 transistor Mofset irf540n par spot. Je pense les avoir bien branché avec résistance de 10kOhm et tout...
Quand je lance mon programme (que je vous mets en dessous), j'ai un sifflement qui semble provenir de la carte Arduino Mega, les effets sur les spots semblaient marcher et puis après ça commence à clignoter et faire n'importe quoi...
J'ai bien peur de faire une connerie!
Est-ce que les transistors ne correspondent pas?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
#include <NewPing.h>
#define SONAR_NUM 3 // nombre de sensors
#define MAX_DISTANCE 150 // maximum distance in cm
#define PING_INTERVAL 33 // millisecondes entre les pings des sensors
/* Creation des variables pour les capteurs */
unsigned long pingTimer[SONAR_NUM];
unsigned int cm[SONAR_NUM]; // range les distances de chaque ping
uint8_t currentSensor = 0; // permet de determiner quel sensor est actif
NewPing sonar[SONAR_NUM] = { NewPing( 48, 49, MAX_DISTANCE), NewPing( 46, 47, MAX_DISTANCE), NewPing( 44, 45, MAX_DISTANCE) }; // trigger pin, echo pin, distance maximale pour déclencher un ping
/* Creation des variables pour les leds */
#define LED_NUM 3 // nombre de leds
const int LED[LED_NUM] = { 3, 5, 6 } ; // on déclare un tableau contenant les constantes des broches
int etat_led[LED_NUM];
// variable qui peut changer
/* variables pour le temps de pause des LEDs*/
unsigned long previousMillis[LED_NUM];
unsigned long delaiAleatoire;
void setup() {
Serial.begin(9600); // bauds
// delai et random
delaiAleatoire = random(1000, 8000);
// leds
for (uint8_t i = 0 ; i <= LED_NUM ; i++) {
pinMode(LED[i], OUTPUT);
}
pingTimer[0] = millis() + 75; // premier ping a 75millisecondes (millis est le temps depuis lequel le programme est lancé.)
for (uint8_t i = 1; i < SONAR_NUM; i++) {
/* mise en place pour lancer chaque sensor. index i du sensor : sa valeur par défaut est de 1,
on contrôle qu'elle soit inferieure au nombre de sensors et puis on veut l'incrementer */
pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL; // on détermine le moment auquel chaque capteur enverra un ping
}
}
void loop() {
for (uint8_t i = 0; i < SONAR_NUM; i++) { // créer la boucle pour tous les sensors
if (millis () >= pingTimer[i]) { // le moment ou pas de lancer un ping pour le sensor en question
pingTimer[i] += PING_INTERVAL * SONAR_NUM; //mise en place du prochain moment ou le sensor enverra un ping
if (i == 0 && currentSensor == SONAR_NUM - 1) oneSensorCycle();
sonar[currentSensor].timer_stop();
currentSensor = i;
cm[currentSensor] = 0;
sonar[currentSensor].ping_timer(echoCheck);
}
}
}
void echoCheck() {
if (sonar[currentSensor].check_timer()) {
cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM; /* US_ROUNDTRIP_CM = 340 */
}
}
void oneSensorCycle() { // j'extrais les résultats après un cycle de ping complet et en fait quelque chose
unsigned long currentMillis = millis();
for (uint8_t i = 0 ; i < SONAR_NUM ; i++) {
if (etat_led[i] < 256 && cm[i] < 30 && cm[i] > 5) {
etat_led[i] = etat_led[i] + 1;
}
else if (etat_led[i] > 0 && (currentMillis - previousMillis[i] >= delaiAleatoire)) {
previousMillis[i] = currentMillis;
etat_led[i] = etat_led[i] - 1;
}
analogWrite (LED[i], etat_led[i]);
}
} |