Bonsoir tout le monde!
Je viens vers vous pour vous présenter un problème afin d'avoir d'autres avis, et d'en trouver la cause.
Contexte:
Je fabrique un aéroglisseur, avec deux turbines (sur relais), un servomoteur, ainsi qu'un jetcat pour la propulsion.
On a un mode manuel (joystick controlant le servo, potentiomètre controlant le jetcat, et boutons poussoirs controlant les deux relais)
Egalement un mode RC avec un flysky ia10b, les controles sont similaires.
Quand le switch est en mode manuel, on bouge le joystick de gauche à droite par exemple, cela fonctionne.
Quand on fait plusieurs aller-retours, le code plante, l'arduino affiche une led rouge, puis redémarre.
J'ai d'abord pensé à un débordement de tampon, mais cela me parait étrange.
Je ne comprends pas vraiment d'ou peut venir le problème, et ne sait pas dire si il est hardware ou dans le code.
Voici le code, avec deux boucles while dans la loop (une pour mode manuel, une mode RC)
schema_2.pdf (681,6 Ko)
Je joins également le schéma, si quelque chose vous sauterait aux yeux
#include <Arduino.h>
#include <Servo.h>
// relais 1/2
#define BP1 30
#define BP2 31
// manuel/rc
#define Switch 29
#define Pot A8
// servomoteur
#define JoyX A9
#define JoyY A10
#define ServoPIN 2
#define Jetcat 3
// relais
#define R1 35
#define R2 36
// joystick droite; axe x
#define CH1 43
// joystick droite; axe y
#define CH2 42
// joystick gauche; axe y
#define CH3 41
// joystick gauche; axe x
#define CH4 40
// interrupteur perte signal
#define CH5 39
//
#define CH6 38
Servo Servomoteur;
Servo CtrlJetcat;
int centreJoystick = 512;
int minJoystick = 0;
int maxJoystick = 1024;
int minPotentiometre = 918;
int maxPotentiometre = 639;
int CH_Joystick_1Y = 3;
int CH_Joystick_2X = 2;
int CH_Joystick_2Y = 1;
int CH_Ping = 5;
// int seuil rc
void setup()
{
// définition des broches
pinMode(BP1, INPUT_PULLUP);
pinMode(BP2, INPUT_PULLUP);
pinMode(Switch, INPUT_PULLUP);
pinMode(Pot, INPUT);
pinMode(JoyX, INPUT);
pinMode(JoyY, INPUT);
pinMode(ServoPIN, OUTPUT);
pinMode(Jetcat, OUTPUT);
pinMode(R1, OUTPUT);
pinMode(R2, OUTPUT);
Servomoteur.attach(ServoPIN);
CtrlJetcat.attach(Jetcat);
CtrlJetcat.writeMicroseconds(0);
digitalWrite(R1, LOW);
digitalWrite(R2, LOW);
pinMode(CH1, INPUT);
pinMode(CH2, INPUT);
pinMode(CH3, INPUT);
pinMode(CH4, INPUT);
pinMode(CH5, INPUT);
pinMode(CH6, INPUT);
Serial.begin(9600);
}
// return true si le switch n'est pas actif(mode manuel)
bool swich()
{
return (digitalRead(Switch) == HIGH);
}
void actionBP1(bool etat)
{
if (etat)
{
Serial.println("relai 1");
digitalWrite(R1, HIGH);
}
else
{
digitalWrite(R1, LOW);
}
}
void actionBP2(bool etat)
{
if (etat)
{
Serial.println("relai 2");
digitalWrite(R2, HIGH);
}
else
{
digitalWrite(R2, LOW);
}
}
int joystickX()
{
return (analogRead(JoyX));
}
int potentiometre()
{
return (analogRead(Pot));
}
// return true si pressé
bool isBP1()
{
return (digitalRead(BP1) == LOW);
}
// return true si pressé
bool isBP2()
{
return (digitalRead(BP2) == LOW);
}
void setJetcat(int valeur, int min, int max)
{
CtrlJetcat.writeMicroseconds(map(valeur, min, max, 800, 2200));
}
void setServo(int valeur, int min, int max, int servo_min, int servo_max )
{
Servomoteur.write(map(valeur, min, max, servo_min, servo_max));
}
int readChannel(byte channelInput, int minLimit, int maxLimit, int defaultValue)
{
int ch = pulseIn(channelInput, HIGH, 30000);
if (ch < 100)
return defaultValue;
return map(ch, 1000, 2000, minLimit, maxLimit);
}
void loop()
{
// mode manuel
while (!swich())
{
Serial.println("----Mode manuel----");
Serial.print("potentiometre: ");
Serial.println(potentiometre());
Serial.print("joystick :");
Serial.println(joystickX());
if (joystickX() > 500){
setServo(joystickX(), 500, maxJoystick, 90, 180);
}
else if (joystickX() < 460){
setServo(joystickX(), minJoystick, 460, 0, 90);
}
else{
Serial.println("servo off");
Servomoteur.write(90);
}
setJetcat(potentiometre(), minPotentiometre, maxPotentiometre);
actionBP1(isBP1());
actionBP2(isBP2());
delay(100);
}
// mode RC
while (swich())
{
delay(300);
Serial.println("----Mode RC----");
// ici boucle while du ping
//gauche
int Joystick_1Y = readChannel(CH3, -100, 100, 0);
//droite
int Joystick_2X = readChannel(CH2, -100, 100, 0);
int Joystick_2Y = readChannel(CH1, -100, 100, 0);
//ping
int Ping = readChannel(CH_Ping, -100, 100, 0);
Serial.print("Joysitck gauche Y: ");
Serial.println(Joystick_1Y);
Serial.print("Joysitck droit X: ");
Serial.println(Joystick_2X);
Serial.print("Joysitck droit Y: ");
Serial.println(Joystick_2Y);
Serial.print("PING: ");
Serial.println(Ping);
if (Joystick_2X > 15)
{
// a voir si on inverse droite et gauche
actionBP1(true);
actionBP2(false);
}
else if (Joystick_2X < -15)
{
actionBP2(false);
actionBP2(true);
}
else
{
actionBP1(false);
actionBP2(false);
}
// a voir si on inverse haut et bas
if (Joystick_2Y > 15)
{
setServo(Joystick_2Y, 15 , 100, 90, 180);
}
else if (Joystick_2Y < -15)
{
setServo((-Joystick_2Y),-15 , -100, 0, 90);
}
else{
Serial.println("servo off");
Servomoteur.write(90);
}
if (Joystick_1Y > 15)
{
actionBP1(false);
actionBP2(false);
setJetcat(Joystick_1Y, 15, 100);
}
else if (Joystick_1Y < -15)
{
actionBP1(true);
actionBP2(true);
}
}
}