Bonjour,
Pour assurer le brassage d'un aquarium d'eau de mer 2 pompes sont montées chacune sur un bras pivotant actionné par un servo de modélisme, voir Osillateur Neo3+.
Chaque oscillateur balaye un angle qui doit être paramétrable (mais peut être hardcodé, disons 90° pour fixer les idées : impulsions entre 1,25 et 1,75 ms) en un temps paramétrable aussi, par exemple 60 secondes pour un aller/retour.
Pour cela j'utilisais un PIC programmé mais il ne fonctionne plus, j'ai pensé qu'un Arduino pourrait le faire, le hic est que je ne connais rien à cet environnement.
Pouvez-vous m'aider à concevoir et réaliser ce petit projet ?
Complément d'info : il doit exister une petite différence d'angle ou de durée entre les 2 oscillateurs afin qu'ils ne se retrouvent pas systématiquement dans la même position lors de chaque aller/retour.
Merci pour ta réponse mais je n'ai pas programmé le PIC, je l'ai acheté déjà programmé.
Je ne connais absolument rien de la programmation Arduino, j'ignore comment faire une boucle pour incrémenter/décrémenter l'angle à un rythme donné.
J'ignore même comment écrire un programme et le transférer sur l'Arduino !
Où puis-je trouver la librairie Servo ?
Il ne faudrait pas non plus que la solution Arduino coûte plus cher que le contrôleur Neo3+ : 109€ + port.
La librairie ce trouve grâce au gestionnaire de librairie fournis avec le logiciel de conception de programme d'Arduino.
Pour bien commencer avec Arduino, un tour sur le site d'Eskimon est un bon début.
Je crois qu'il explique comment installer le logiciel, faire des programmes et les transférer sur ton Arduino.
Un Arduino® Nano original coute dans les 20€, pour le même prix, tu peux aussi avoir un nano ESP32 avec une connectivité WIFI.
Il existe aussi des clones encore moins cher.
Si tu as déjà le système de support et les servos commandes, ainsi que les câbles futaba, il manquera qu'une alimentation, mais tu peux utiliser celle d'un smartphone.
Après ce que tu gagne en argent, tu le perdra bien évidement au centuple en temps
Merci, j'ai toujours téléchargé l'IDE.
J'ai tout le matériel : servos, câbles et alimentation 5V, manque juste un Arduino :
où me conseilles-tu d'acheter lequel ?
J'ai commencé à écrire le logiciel :
XXX = AVG (avant gauche) ou ARD (arrière droit)
XXXstep est la direction du mouvement (+1 ou -1)
XXXpos est la position du servo
quand la position atteint 45 ou 135 on inverse le sens
on écrit la position dans chacun des servos puis on attend une seconde et on recommence
un des servos va jusque 134 au lieu de 135 pour introduire un décalage, voir description du projet dans le premier message
#include <Servo.h>
Servo ServoAVG;
Servo ServoARD;
boolean AVGstep = 1;
boolean ARDstep = 1;
int AVGpos = 90;
int ARDpos = 90;
void setup() {
// put your setup code here, to run once:
ServoAVG.attach(10, 1000, 2000);
ServoARD.attach(11, 1000, 2000);
}
void loop() {
if((AVGpos == 45) || (AVGpos == 135))
{
AVGstep = - AVGstep; // Inverser le sens en fin de course
}
if((ARDpos == 45) || (ARDpos == 134))
{
ARDstep = - ARDstep; // Inverser le sens en fin de course
}
AVGpos = AVGpos + AVGstep;
ServoAVG.write(AVGpos);
ARDpos = ARDpos + ARDstep;
ServoARD.write(ARDpos);
delay(1000);
}
Remarques bienvenues mais j'ai déjà une erreur de compilation :
c:\users\rcl\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\bin../lib/gcc/avr/7.3.0/../../../../avr/bin/ar.exe: unable to rename 'C:\Users\RCL\AppData\Local\Temp\arduino\sketches\4A2A9B04A75CF2343E1421124F7AF327\core\core.a'; reason: Permission denied
Merci, j'ai modifié.
Une idée pour le message d'erreur ?
En faisant tourner l'IDE en mode admin l'erreur n'apparaît plus : doit-il toujours tourner en mode admin ?
Essaie ce code (pas testé mais je pense que cela devrait fonctionner). Tu peux donner un temps différent pour le pas de chaque servo.
#include <Servo.h>
Servo ServoAVG;
Servo ServoARD;
int AVGstep = 1;
int ARDstep = 1;
int AVGpos = 90;
int ARDpos = 90;
unsigned long tAVG;
unsigned long tARD;
const unsigned long TIMESTEPAVG = 1000; // durée d'un pas servo AVG
const unsigned long TIMESTEPARD = 950; // durée d'un pas servo ARD
const int DEBUTAVG = 45;
const int FINARG = 135;
const int DEBUTARD = 45;
const int FINARD = 135;
// gestion mouvements servo AVG
void bougeAVG(void){
if((AVGpos <= DEBUTATRG) || (AVGpos >= FINARG))
{
AVGstep = - AVGstep; // Inverser le sens en fin de course
}
AVGpos = AVGpos + AVGstep;
ServoAVG.write(AVGpos);
}
// gestion mouvements servo ARD
void bougeARD(void){
if((ARDpos <= DEBUTARD) || (ARDpos >= FINARD))
{
ARDstep = - ARDstep; // Inverser le sens en fin de course
}
ARDpos = ARDpos + ARDstep;
ServoARD.write(ARDpos);
}
void setup(void){
ServoAVG.attach(10, 1000, 2000);
ServoAVG.write(DEBUTAVG);
ServoARD.attach(11, 1000, 2000);
ServoARD.write(DEBUTARD);
tAVG = millis();
tARD = millis();
}
void loop(void){
unsigned long t = millis(); // mémorise le temps courant
if((t - tAVG) > TIMESTEPAVG){ // si le délai TIMESTEPAVG s'est écoulé
tAVG = t; // on mémorise le moment ou on a bougé
bougeAVG();
}
if((t - tARD) > TIMESTEPARD){ // si le délai TIMESTEPARD s'est écoulé
tARD = t; // on mémorise le moment ou on a bougé
bougeARD();
}
}
/home/remi_arduino/Bureau/Programmation/Projets Arduino/projets en cours/test_forum.ino/test_forum.ino.ino: In function 'void setup()':
/home/remi_arduino/Bureau/Programmation/Projets Arduino/projets en cours/test_forum.ino/test_forum.ino:39:20: error: 'DEBUTAVG' was not declared in this scope
ServoAVG.write(DEBUTAVG);
^~~~~~~~
/home/remi_arduino/Bureau/Programmation/Projets Arduino/projets en cours/test_forum.ino/test_forum.ino.ino:39:20: note: suggested alternative: 'DEBUTARD'
ServoAVG.write(DEBUTAVG);
^~~~~~~~
DEBUTARD
Multiple libraries were found for "Servo.h"
Used: /home/remi_arduino/Arduino/libraries/Servo
Not used: /home/remi_arduino/.arduino15/libraries/Servo
exit status 1
Compilation error: 'DEBUTAVG' was not declared in this scope
Ce n'est pas nécessaire puisqu'on décale d'un degré à chaque aller/retour.
Supposons qu'au départ les 2 pompes font tourner l'eau dans le même sens.
Après 90 allers/retours elles vont se retrouver en opposition, et il faudra 90 minutes supplémentaires pour qu'elles se retrouvent à nouveau dans le même sens.
En d'autres termes il faut 3 heures pour retrouver la position initiale des 2 pompes.
Inutilement trop compliqué.
Par contre au lieu d'écrire les 2 servos puis d'attendre 1 seconde, ce qui fait qu'ils vont tirer du courant en même temps, il vaudrait mieux écrire un servo, attendre 1/2 seconde, écrire l'autre, attendre 1/2 seconde.
Comment peut-on insérer une image sur ce forum afin de vous montrer de quoi il s'agit ?
Il n'est pas inutilement compliqué, il est non bloquant, ce qui une bonne pratique de codage, et cela lui permet éventuellement de faire autre chose en plus de la gestion de tes servos.
C'est justement ce que fait le code que je t'ai proposé puisqu'il utilise 2 temps différents pour les servos.
Maintenant, tu fais ce que tu veux.
Tu pourrais regarder du côté de la bibliothèque VarSpeedServo, elle permet de travailler en mode bloquant ou non bloquant, de régler la vitesse et de créer des séquence.
C'est étonnant que des fichiers ont été créer avec l'utilisateur admin, si tu as instaalé et utilisé uniquement l'utilisateur RCL.
Si tu es limité dans l'intensité fournis par ton alimentation, sinon cela ne change pas grand chose.
C'est toi qui voit la façon dont tu veux déterminer chaque angle.
Il en reste qu'avoir un code non bloquant, permet une facilité de modification future, si cela devait arriver.
Et souvent un code plus facile à lire, lorsque celui-ci finalement à subit beaucoup d'itération.
Après c'est ton programme comme l'indique @fdufnews, les participants essaye de te donner les meilleurs conseilles pour ton projet, c'est à toi de faire le trie qui t'arrange le plus.