Bonjour, tout est dans le titre, dans le cadre du projet, je voulais savoir si dans l'absolue il etait possible de faire communiquer 12 arduino gérant chacun 6 sorties pwm à 15hz.
Merci d'avance pour vos réponses.
Bien cordialement
Adrien
Bonjour, tout est dans le titre, dans le cadre du projet, je voulais savoir si dans l'absolue il etait possible de faire communiquer 12 arduino gérant chacun 6 sorties pwm à 15hz.
Merci d'avance pour vos réponses.
Bien cordialement
Adrien
Dans l'absolu, oui.
Dans la pratique on se demande bien pourquoi vous avez besoin de 12 arduino pour gérer 72 sorties à 15Hz...
(d'ailleurs qu'entendez vous vraiment par "pwm à 15hz" ?)
Dans l'idée j'aurai besoins de gérer 72 buses de pulverisation, pour tenir une pression constante mais en faisant varier le débit, et par 15hz j'entend 15 periodes par seconde avec variation de 0 a 100% de la période, pour comme dit précédemment maintenir une pression en variant le debit. Apres la base 15hz c'est juste pour une question de mecanique, ou moins de 15hz ne garantie plus une pulverisation correcte, et plus de 15hz serait trop rapide et userai trop vite les electrovannes
Bonsoir calgar
Tu peux faire ça avec un UNO et 5 PCA9685, sauf qu'il ne descendent pas au-dessous de 24 Hz.
Autrement tu pourrai faire communiquer tes Mega avec un bus i2C.
Cordialement
jpbbricole
tu précises bien "MEGA" donc tu disposes de 3 UART (en fait 4 avec celui destiné à la communication USB avec le PC) qui peuvent te permettre de créer une daisy-chain (voire 2 en croisant les flux), ainsi que du SPI et de l'I²C : si ça ne suffit pas pour faire communiquer plusieurs machines ...
même en n'utilisant que les PWM en 16 bits, tu en trouveras déjà 12 par carte : il ne t'en faudra donc que 6 ... et si des PWM en 8 bits te suffisent ça en fait 3 de plus par carte, donc 5 cartes au total (12+3=15; 72/15=4.8 donc 5)
ce n'est pas rapide, et si la précision n'est pas primordiale ça peut être géré par logiciel sur des sorties "normales" : on en arrive à 2 cartes seulement, mais ça demande une programmation qui va gérer chaque changement d'état "à la main" en fonction d'une horloge (issue par exemple de millis() )
Oui j'ai oublié de préciser que je comptais utiliser des mega car j'ai vu qu'on pouvait arriver à 15,3hz ce qui est pile ce que je veux.
Apres j'ai oublier de preciser que les 72 buses devait pouvoir être commutées on/off indépendamment l'une de l'autre
quel est le rapport avec une Mega ? tu peux aussi créer une PWM à 150 kHz comme à 1/4 de Hz si tu veux : c'est toi qui décides, suivant tes réglages de Pre-Scaler et de comptage maxi
Bonsoir calgar
Tu aurais avantage à utiliser des ESp32 comme l'ESP32 Wroom, tu as plus de canaux disponibles réglable depuis 1Hz.
Ils pourraient communiquer ou par i2C ou ESP-Now.
Merci pour vos reponse je vais regarder ça de plus près
Ok j’avais en idée le PCA9685 (on trouve à pas cher des cartes 16 canaux) mais il ne peut pas descendre en dessous d’environ 24 Hz. Sa limite basse est imposée par son horloge interne et par le diviseur de fréquence minimal. Obtenir 15 Hz avec ce composant n’est donc pas possible.
Si je comprends bien le cas d’usage, le timing d’application des changement de duty cycle ou la synchronisation entre les 72 voies n’est pas un facteur critique (c’est très difficile d’obtenir une synchronisation parfaite dans une architecture distribuée) puisque chaque vanne est gérée indépendamment et vous n’êtes sans doute pas à 2ms près si la vanne 1 ne change pas exactement en même temps que la vanne 17.
Si les électrovannes peuvent être suffisamment distantes et protégées électromagnétiquement, Je rejoins @jpbbricole sur l’idée de partir avec des ESP32 et une communication radio entre un maître et des esclaves.
Par exemple un ESP32 présente une interface utilisateur (écran, site web local,…) et cette interface sert à envoyer les commandes aux esclaves - chaque ESP32 génère localement ses PWM - et vous acceptez que les mise à jour des consignes ne soient pas strictement simultanées.
Cinq modules ESP32, chacun avec 16 canaux PWM, couvrent 72 voies en laissant 8 voies de marge + un ESP32 maître pour ne pas mélanger les rôles (au prix où ça coûte :) )
Prévoyez des drivers MOSFET si les courants sont élevés et dimensionnez l’alimentation pour supporter le courant d’appel simultané des vannes et ajoutez une diode de roue libre ou un snubber selon la nature des vannes. Protégez cela dans un boîtier métallique pour éviter le bruit électromagnétique.
Côté radio il y a du choix, WiFi, esp-now, LoRa,… tout dépend de votre configuration sur le terrain. Si la radio est un souci vous pouvez aussi créer un réseau câblé ethernet pour les modules, ça évite les soucis de perturbation radio mais faut passer du fil.
oui, on peut faire une petite classe et un polling. Si la fréquence reste assez basse, ça peut le faire.
On pourrait améliorer un peu la performance si on utilisait les registres au lieu de digitalWrite()
class PWM {
private:
uint8_t pin;
float rapportCyclique;
float freq;
unsigned long periode;
unsigned long tempsOn;
unsigned long tempsOff;
unsigned long dernierMillis;
bool etat;
void recalculerTemps() {
tempsOn = periode * rapportCyclique / 100;
tempsOff = periode - tempsOn;
}
public:
PWM(uint8_t p, float rc = 50.0, float fHz = 15.0) {
pin = p;
rapportCyclique = rc;
freq = fHz;
periode = 1000 / freq;
etat = false;
dernierMillis = 0;
recalculerTemps();
}
void begin() {
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
}
void reglerRapportCyclique(float rc) {
if (rc < 0) rc = 0;
if (rc > 100) rc = 100;
rapportCyclique = rc;
recalculerTemps();
}
void tick() {
unsigned long maintenant = millis();
if (etat && maintenant - dernierMillis >= tempsOn) {
digitalWrite(pin, LOW);
etat = false;
dernierMillis = maintenant;
}
else if (!etat && maintenant - dernierMillis >= tempsOff) {
digitalWrite(pin, HIGH);
etat = true;
dernierMillis = maintenant;
}
}
};
PWM sorties[] = {
{2}, // Pin 2, par défaut rapport Cyclique50% , 15 Hz
{3, 25}, // Pin 3, rapport Cyclique 25% et par défaut 15 Hz
{4, 30, 20}, // Pin 4, rapport Cyclique 30% , fréquence 20 Hz
};
void setup() {
for (auto &s: sorties) s.begin();
}
void loop() {
for (auto &s: sorties) s.tick();
}
c'est exactement mon post#5 ... mais j'écris peut-être à l'encre sympathique ?