plusieurs codes pour 1 Arduino

Bonjour,

Ayant vu le sujet :

Remplacer un Moteur DC par un Servomoteur en rotation continu
et ne voulant pas polluer le post de BadMady, je crée un nouveau sujet .
Son idée m 'intéresse beaucoup,mais je ne comprend pas comment se fait-il que dans le "AutoSteer zip"
qu'il fourni, il y a plusieurs 'bibliothèque pour une seule carte Arduino?
Comment fait-il pour que l'Arduino ( mono-tache) lise ces différents codes en mème temps ?.
Merci à vous.

Une bibliothéque est un ensemble de bouts de code faisant une tâche donnée.
En version de base, un Arduino doit gérér les pattes, gérer un afficheur LCD et gérer la liaison série (qui fait des affichages de dépannage dans le moniteur serie). Il n'est pas absurde que les bouts de code dédiés à chaque tâche soient regroupés dans un ensemble cohérent, avec des exemples spécialisés, ce qui est nécessaire à l'interfaçage avec votre code (le *.h), une documentation, et comment accomplir le travail (les *.cpp).
Ceci est très bien géré par l'IDE Arduino, sur PC /RPi (et, si l'IDE Arduino s'aperçoit que la bibliothèque ne sert à rien, il ne télécharge pas les bouts de code correspondant dans l'arduino)

Le code qui tourne sur l'Arduino (l'exécutable) est construit par le compilateur et les outils associés à partir d'un ensemble de fichiers dits "sources". Ces fichiers peuvent être du code C ou C++ écrits par la personne qui réalise le projet, mais aussi des bibliothèques qui ont été écrites par d'autres personnes (et téléchargées sur Internet ou bien incluses dans le package Arduino sur ton PC).
Lorsque tu utilises une fonction en C ou C++ (par exemple digitalRead), il est fort probable que le compilateur la remplace par un ensemble d'instructions plus bas niveau qui viennent d'un autre fichier dont tu ne soupçonnes même pas l'existence, quelque part sur ton PC...

(grillé par dbrion06...)

(grillé par dbrion06...)
Votre post est ignifugé, et vous ne l'avez pas relu avec horreur:
du fait de la qualité de votre français, vous avez introduit plein de mots clés que wikipédia se fera un plaisir d'expliquer, si besoin, ce sans ambiguité (j'aurais du employer "travail" au lieu de "tâche", par exemple: ce sont des synonymes en français courant, mais pas pour un informaticien).

Rien compris

fanny4444:
et ne voulant pas polluer le post de BadMady, je crée un nouveau sujet .

Ça c'est bien.

dbrion06:
(grillé par dbrion06...)
Votre post est ignifugé, et vous ne l'avez pas relu avec horreur:
du fait de la qualité de votre français, vous avez introduit plein de mots clés que wikipédia se fera un plaisir d'expliquer, si besoin, ce sans ambiguité (j'aurais du employer "travail" au lieu de "tâche", par exemple: ce sont des synonymes en français courant, mais pas pour un informaticien).

::slight_smile:

Je n'ai strictement rien compris à cette logorrhée

Est ce que fanny4444 sait ce qu'est une fonction C (langage) — Wikipédia ou en quoi consiste une compilationhttps://fr.wikipedia.org/wiki/C_(langage)#Des_sources_%C3%A0_l'ex%C3%A9cutable
Et voilà:
est ce que les termes utilisés , si on ne lie pas à wikipedia -qui sait être
a) clair
b) utile
c) exempt d'humour de bas niveau-

sont compréhensibles par le posteur?

Edité: je rajoute, à des fins de clarté, aux particularités de wikipédia
d) non redondant (même si ça a un rapport avec le sujet)

dbrion06:
Est ce que fanny4444 sait ce qu'est une fonction C (langage) — Wikipédia ou en quoi consiste une compilationhttps://fr.wikipedia.org/wiki/C_(langage)#Des_sources_%C3%A0_l'ex%C3%A9cutable
Et voilà:
est ce que les termes utilisés , si on ne lie pas à wikipedia -qui sait être
a) clair
b) utile
c) exempt d'humour de bas niveau-

sont compréhensibles par le posteur?

Edité: je rajoute, à des fins de clarté, aux particularités de wikipédia
d) non redondant (même si ça a un rapport avec le sujet)

C'est quoi wikipédia?

Cordialement,
bidouilleelec

Wikipedia est, hors Turquie:
a) la providence des cancres (demande massive dans certains internets cafés)Certes, vous êtes au dessus de ça,mais procurer une certaine autonomie à ceux qui demendent des renseignements n'est pas inutile

b) un moyen simple, rapide de profiter d'un savoir verifié, sans fines plaisanteries (est ce que les auteurs de ces "fines" "plaisanteries " les trouvent drôles: je n'ai aucune expertise dans le domaine -traduire "c'est vous l'expert") et hors sujets....
c) un moyen de traduire du jargon technique qui n'a pou seul but que de maintenir dans une sujetion celui qui demande de l'information (voir le texte que votre mulot a savamment copié collé pour avoir un exemple de ce que sait faire wikipedia: on peut cliquer ... ou lire)
Du fait que wikipedia a fait (et continue de faire) de gros efforts en éléctronique et informatique, j'estime que 75% -estimation charitable- des posts de ce blog seraient avantageusement résolus par un renvoi à wikipédia.... (et, par ailleurs, wikipédia est très fiable et correctement sourcé en géographie du Moyen Orient, et utilisable en histoire récente dans cette région; mais ça, c'est hors sujet, même si c'est élogieux)

Bonjour,
Merci pour votre aide.

( et merci à 68tjs :
et ne voulant pas polluer le post de BadMady, je crée un nouveau sujet .
Ça c'est bien.)
j'ai lu les conseils des modérateurs, et essayé de faire au mieux...

Si AutoSteer.ino est bien un programme, avec ( #include "MMA8452Q.h"

//It says 1015 but is used for both the ADS1015 and the ADS1115
#include "ADS1015.h"

//For I2C communication
#include <Wire.h>)

Comment construit il son code pour qu'il ait accès aux autres éléments de la bibliothèque ?

ADS1015.ccp
ADS1015.h
MMA8452Q.cpp
MMA8452Q.h

Et surtout où placer ces 2 petits programmes
PID.ino
et
Relays.ino
Dans son programme ?

Doit-il tout recopier en haut de son code ?,
comme cela :

/*!
    @file     Adafruit_ADS1015.cpp
    @author   K.Townsend (Adafruit Industries)
    @license  BSD (see license.txt)

    Driver for the ADS1015/ADS1115 ADC

   etc....................
}
//-puis :
/**************************************************************************/
/*!
    @file     Adafruit_ADS1015.h
    @author   K. Townsend (Adafruit Industries)
    @license  BSD (see license.txt)

  jusqu'à:

  Adafruit_ADS1115(uint8_t i2cAddress = ADS1015_ADDRESS);

 private:
};


//puis  

/******************************************************************************
SparkFun_MMA8452Q.cpp
SparkFun_MMA8452Q Library Source File
Jim Lindblom @ SparkFun Electronics
Original Creation Date: June 3, 2014
https://github.com/sparkfun/MMA8452_Accelerometer

    etc....
[
   jusqu'à  :
	//cz = (float) z / (float)(1<<11) * (float)(scale);
}

//puis : 

/******************************************************************************
SparkFun_MMA8452Q.h
SparkFun_MMA8452Q Library Header File
Jim Lindblom @ SparkFun Electronics
Original Creation Date: June 3, 2014
https://github.com/sparkfun/MMA8452_Accelerometer

This file prototypes the MMA8452Q class, implemented in SFE_MMA8452Q.cpp. In
addition, it defines every register in the MMA8452Q.

Development environment specifics:
	IDE: Arduino 1.0.5
	Hardware Platform: Arduino Uno

	**Updated for Arduino 1.6.4 5/2015**

This code is beerware; if you see me (or any other SparkFun employee) at the
local, and you've found our code helpful, please buy us a round!

Distributed as-is; no warranty is given.
******************************************************************************/

#ifndef MMA8452Q_h
#define MMA8452Q_h

#include <Arduino.h>

///////////////////////////////////
// MMA8452Q Register Definitions //
///////////////////////////////////
enum MMA8452Q_Register {
	STATUS_MMA8452Q  = 0x00,

     etc.... 

       jusqu'à :
	byte readRegister(MMA8452Q_Register reg);
    void readRegisters(MMA8452Q_Register reg, byte *buffer, byte len);
};

#endif

//---------------------------------------------------------------------------
// ET OU ECRIT-IL CES MORCEAUX DE CODE ?  


void calcSteeringPID(void) 
  {
  
    //Proportional
    pValue = Kp * steerAngleError *Ko;   
         
       etc.. 
  
       jusqu'à :
 
    //else bitClear(PORTB, 2); 
    //if (bitRead(relay,6)) bitSet(PORTC, 4); //analog Pin A4
    //else bitClear(PORTC, 4); 
    //if (bitRead(relay,7)) bitSet(PORTC, 5); //Analog Pin A5
    //else bitClear(PORTC, 5); 
  }
 



// avant d'ecrire la "The 3.3v version" , ou incus dans la  "The 3.3v version", et alors où ?

//-----------------------------------------------------------

//The 3.3v version
#include "MMA8452Q.h"

//It says 1015 but is used for both the ADS1015 and the ADS1115
#include "ADS1015.h"

//For I2C communication
#include <Wire.h>

//##########################################################################################################
//### Setup Zone 

     etc...

     jusqu'à

    minPWMValue = Serial.read();                 //read the minimum amount of PWM for instant on
    
		maxIntegralValue = Serial.read()*0.1;   //
		steerSensorCounts = Serial.read();      //
	}
}

C'est cela qui me pose problème, Comment structurer tout cela
Je pensais que pour écrire un programme, on met les déclarations de bibliothèque en début, et ensuite le code du programme avec setup et loop, mais ici , il y a plusieurs bibliothèques ( ce qui n'est pas gênant , on les déclare en début, mais aussi 2 petits bouts de code ( où les écrire, qu'en faire ?) et des fichiers .h et.ccp (sont-ils connus de l'Arduino,sont-ils déjà inclus dans les bibliothèques citées , sans que leur texte apparaisse ? ou faut il les rajouter explicitement, et alors où ?)

Merci pour votre patience
Cordialement

Un conseil lit le message épinglé "Règles du forum francophone" et suis le lien vers "Zeste de savoir".
Tu y trouvera les tutos d'Eskimon qui sont ce qui se fait de mieux en français. Tu acquerra de très bonne bases tant en programmation qu'en utilisation de composants électroniques.
Lis aussi les autres messages comme "Faire un nouveau messages avec les balises" pour présenter correctement le code dans le texte.

Pour ta question un environnement de développement intégré (EDI en français ou IDE en anglais) automatise certaines opérations.
En particulier l'EDI connait les emplacements réservés pour les bibliothèques dont celui réservé à l'utilisateur.
Ce qui fait que si tu déposes les bibliothèques au bon endroit l'EDI saura les retrouver automatiquement.

Une bibliothèque c'est 2 fichiers au minimum : le fichier *.h et le (ou les) fichier *.cpp.
A partir du moment ou tu écris #include<machin.h> l'EDI cherchera dans ses emplacements spécialisés le fichier machin.cpp

Et surtout où placer ces 2 petits programmes
PID.ino
et
Relays.ino
Dans son programme ?

Il n'est pas possible d'insérer directement un fichier ino dans un autre fichier ino car il y aura duplication des fonctions setup() et loop().

Il faut fusionner les setup() en vérifiant qu'il n'y aura pas de conflit et créer un nouveau loop() qui sera la fusion "intelligente" des deux loop().
Difficile d'en dire plus car chaque cas est particulier.

L'essentiel est de bien comprendre ce que fait chaque programme. Si c'est bien maîtrisé il suffira de faire appel au bon sens.

Si cela coince à la compilation tu obtiendra un message d'erreur. Il faut le lire, en général c'est assez clair et s'il manque une bibliothèque le message d'erreur le dira.
Si tu ne le comprends pas il faut poster ton code entier (avec les balise code --> l’icône </> ) et la totalité du message d'erreur.

Dernier point : ne cherches pas à tout faire en même temps, avance progressivement c'est le meilleur moyen pour avancer vite.

Merci,
Je vais travailler tout cela.
Bonne journée

Vous avez deux problèmes
a) mettre des bibliothèques; comme vous le dites, il suffit, si c'est bien installé, de mettre

#include <MMA8452Q>
#include <ADS1015.h> en t^te de votre programme.
Si (c'est une configuration provisoire) ces deux bibliothèques ne servent pas, l'editeur de lien ne générera pas un executable trop gros (il ne prend que ce qui est nécessaire)

b) mélanger deux (ou plus: mieux vaut sérier les problèmes) scripts arduino, chacun ayant son "setup", et son "loop" (ce sont des noms reservés, et vous ne pouvez pas avoir les mêmes noms de fonction) .

b1) Très souvent, "setup()" contient de quoi initialiser un équipement -vous pouvez le garder- et gére la ligne série -fait double emploi avec un autre setup... il faut choisir entre les deux.
Une fois que les deux "setups" n'ont pas de doublons, un des deux setup() doit être renommé -disons en setupSuiv() et le restant doit appeler setupSuiv et continuer de s'appeler setup
void setup() {
......
setupSuiv();
}

b2) Le melange de deux loop() est un peu plus compliqué; en particulier, il faut s'assurer qu'il n'y a pas de "delays() " bloquants, menant quasi sûrement à des comprotements bizarres. Avant de mélanger, vous devriez lire l'exemple (15 lignes) de blinkWithoutDelay, livré avec l'IDE Arduino et retirer les délais(remplacer par des tests non bloquants) dans les deux "loop() " à mélanger; en passant, vous comprendrez comment des deux "loop()" marchent....