Bonjour à toutes et tous,
Je débute dans la programmation Arduino, mon projet est de construire un véhicule autonome basé sur un arduino et un Pixhawk PX4 avec GPS et le piloter à travers de mon PC via l'application QGroundControl ou Mission planner, ceci me permettant d'avoir une télémétrie complète et un suivi sur une carte en temps réel ainsi qu'une possibilité de planifier des missions.
Pour le moment, je fais des tests avec une version basique sans le Pixhawk, donc mon véhicule est équipe de d'un arduino Mega, d'un sheld moteur arduino 2A, de 2 moteurs, un servo moteur et d'un capteur ultrason.
Le véhicule fonctionne pas trop mal.
il y aurait 2 moyens de coupler les deux systèmes
Le premier: (celui qui me semble le plus simple)
Récupérer les sorties PWM de commande moteur du PX4, les traiter et les intégrer dans le programme déjà existant.
Le second: (le plus complexe mais également le plus pro en résultat)
rajouter le module ArduPilot qui est compatible avec mes deux logiciels.
N'ayant pas franchement les compétences pour attaquer ce type de programmation, je vais m'orienter sur la première solution.
Ma question:
Je comptais utiliser les entrées analogiques pour intégrer les signaux venant du pixhawk, mais comment traiter ce signale pour avoir la proportionnalité que permet le pixhawk seul?
Je vous mets mon code actuel à disposition que vous puissiez m'aider à améliorer mon code.
//Tests robot autonome
// Déclaration de la bibliotech servo
#include <Servo.h>
//Déclaration des points de sortie
const int trigPin = 6;
const int echoPin = 5;
const int mgV=3;
const int mdV=11;
const int mgS=12;
const int mdS=13;
const int brkD=9;
const int brkG=8;
const int servoPin=7;
//Déclaration du servo
Servo cmdsonar;
// Déclaration des variables
long duration;
int distance;
int distance_a;
int distance_d;
int distance_g;
int distance_mini=50;
int distance_secu=30;
void setup() {
pinMode(trigPin, OUTPUT); // Parmettrage du triger en sortie
pinMode(echoPin, INPUT); // Parmettrage de l'echo en entrée
// Déclaration des sorties de commande des moteurs
pinMode(mgV,OUTPUT);
pinMode(mdV,OUTPUT);
pinMode(mgS,OUTPUT);
pinMode(mdS,OUTPUT);
pinMode(brkD,OUTPUT);
pinMode(brkG,OUTPUT);
// Initialisation de la position de base du servomoteur
cmdsonar.attach(servoPin);
cmdsonar.write(90);
}
void loop() {
distance_a=sonar();
// conditions d'oriantation
if(distance_a > distance_mini){
avant();
delay(300);
}else{
Stop();
get_Distance();
if(distance_g > distance_mini){
droite();
delay(200);
avant_lent();
}else if(distance_d > distance_mini){
gauche();
delay(200);
avant_lent();
}else if (distance_a < distance_mini){
arriere();
delay(200);
}else{
Stop();
}
}
}
// Définition du sonar
int sonar(){
// Mise à l'état bas de l'entrée triger
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Mise à l'état haut de l'entrée triger pour 10 us et passage à l'état bas
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Lecture de l'entrée echo
int temp = pulseIn(echoPin, HIGH);
// Calcul de la distance en fonction du temps parcouru par le son
distance= temp*0.0343/2;
return distance;
}
//Déclaration des fonctions des moteurs avec leur vitesse
void avant_lent(){
digitalWrite(mgS,HIGH);
digitalWrite(mdS,HIGH);
analogWrite(mgV,300);
analogWrite(mdV,290);
}
void avant(){
digitalWrite(mgS,HIGH);
digitalWrite(mdS,HIGH);
analogWrite(mgV,700);
analogWrite(mdV,690);
}
void arriere(){
digitalWrite(mgS,LOW);
digitalWrite(mdS,LOW);
analogWrite(mgV,-500);
analogWrite(mdV,-490);
}
void gauche(){
digitalWrite(mgS,LOW);
digitalWrite(mdS,HIGH);
analogWrite(mgV,-400);
analogWrite(mdV,400);
}
void droite(){
digitalWrite(mgS,HIGH);
digitalWrite(mdS,LOW);
analogWrite(mgV,400);
analogWrite(mdV,-400);
}
void Stop(){
digitalWrite(mgS,LOW);
digitalWrite(mdS,LOW);
analogWrite(mgV,0);
analogWrite(mdV,0);
analogWrite (brkD,HIGH);
analogWrite (brkG,HIGH);
}
//Détection de la distance
//sonar à droite
void get_Distance(){
cmdsonar.write(0);
delay(500);
int temp_d1=sonar();
cmdsonar.write(45);
delay(500);
int temp_d2=sonar();
if(temp_d1<temp_d2){
distance_d=temp_d1;
}else{
distance_d=temp_d2;
}
//sonar au centre
cmdsonar.write(90);
delay(500);
distance_a=sonar();
//sonar à gauche
cmdsonar.write(135);
delay(500);
int temp_g1=sonar();
cmdsonar.write(180);
delay(500);
int temp_g2=sonar();
if(temp_g1<temp_g2){
distance_g=temp_g1;
}else{
distance_g=temp_g2;
}
cmdsonar.write(90);
}
Merci pour votre aide