Le système Arduino

L’espace pour parler de tout ce qui concerne l’électronique embarquée
Répondre
Avatar de l’utilisateur
laurent0091
Messages : 187
Inscription : 06 mars 2011 00:00
Localisation : Essone (91)
Contact :

Le système Arduino

Message par laurent0091 »

Bonjour à tous,
voici ce nouveau post pour vous présenter un système dont certains avaient déjà parlé, le concept Arduino.

Arduino c'est quoi?
Basée sur la technologie des microcontroleur Amtel, le communauté Arduino à développer des cartes qu'il est possible d'assembler ou d'acheter toute faites

C'est cher?
non, il est possible de commencer pour environ 20€

Oui mais le reste est payant?
et non, basée sur une licence open-source (comme Linux pour ceux qui connaissent) le logiciel de programmation est donc libre au téléchargement et à l'utilisation.

La programmation c'est dur?
Pas du tout, basée sur un mélange de c et C++, ce langage est facilement accessible même aux débutants. Pour une personne ayant un peu fait de Basic une journée est suffisante pour faire ses premiers programmes.

Et pour le modélisme c'est adaptée?
Ah oui c'est adapté au modélisme, il existe même une librairie pour utiliser les servo-moteur. L'avantage des librairie c'est de faciliter la programmation tout en rendant le programme plus lisible.

Bon convaincu.... alors on y va.

Pour ne pas déroger à la règle, un peu de lecture est quand même nécessaire. ci-dessous les liens important pour conprendre ce concept et son langage, en plus il y a de nombreux exemples.

Le choix de la carte :
Pour ma part j'ai acheté deux type des cartes, les containtes étaient le prix et la taille.

Mon premier achat fut l'Arduino Nano, elle est à 25€, ce n'est pas très chère pour basculer dans le monde du numérique. En plus le port USB est inclu sur cette carte.
ça c'est des avantages fondamental d'Arduino, une connexion directe sur USB, plus de carte de programmation à acheter ou monter sois-même avec à chaque changement de système d'exploitation la carte qui n'était plus compatible.
En plus le logiciel fonctionne sous Windows, Mac ou Linux, là plus d'excuses....

Petit descriptif de la carte :
Microcontroleur : ATmega328
Alimentation : 5V
Tension d'entrée : 7-12V
E/S numériques : 14
Entrés analogiques : 8
Sorties PWM : 6
Courant max E/S : 40 mA
Mémoire programme : 32 K
Mémoire EEprom : 1 K
Mémoire vive (RAM) : 2 K
Horloge : : 16 MHz
USB : oui
Dimensions : 18 x 43 mm

Quelques explications :
La carte peut être alimenté de 7 à 12v et intègre un régulateur de tension 5V. Un avantage, on peut la brancher directement sur un accu.
Les entrées/sorties numériques sont au nombre de 14 ce qui est à mon avis plus que suffisant. Sur ces 14 E/S, 6 peuvent être utilisées en mode PWM (très utile pour faire varier la luminosité d'une LED).
Il y a aussi 8 entrées analogiques, c'est sur ces entrées que seront connectés les capteurs.

Pour faire vos premières armes il vous faut quelques équipements comme :
Une platine d'essais, des straps, des Led protégés par une résistance,un ou deux bouton poussoir et intérupteur.

Nous sommes parés pour notre premier essai.
Afin de vérifiier le bn fonctionnement de ma carte et du programme, j'ai fait comme à chaque fois le test de la LED qui clignote. Cela permet de valider toute la chaine de programmation.

J'ai ensuite testé quelques fonctions indispensable pour le modélisme qui sont :

récupération d'un signal sur une voie du récepteur et analyse de celui-ci.
Action on/off sur une sortie, dans mon cas allumage d'une LED suivant une certaine condission; Après il est possible d'y coupler transistor pour actionner un relais.
Utilisation d'un sero-moteur, c'est à dire mettre le palonier du moteur dans un angle prédéfini suivant un résulat reçu.

Une fois ces trois fonctions de base il est possible d'imaginer les possibilités qui s'ouvrent à nous....

Une fois le montage déterminer il ne reste plus qu'à se mettre au clavier.

Tout ce qui est précédé de "//" dans le programme ne set que de commantaire, vous allez voir qu'il ne reste pas grand chose de programme utilisé.

Définition du programme :

Code : Tout sélectionner

// --- Programme Arduino ---
// par TOTO - 03/07/2012
// --- Le programme ---
// Commute deux LED suivant position inter-radio
// fait varier l'angle d'un servo suivant position inter-radio

// --- Fonctionnalités ---
// Utilise Inter-radio 
// Utilise 2 LED
// Utilise 1 servomoteur

// --- Connexions du circuit ---
// INTER sur D2
// LED1 sur D3
// LED2 sur D4
// SERVO1 sur D5


Cette première partie n'est là qu'a titre d'information mais permet de cibler le fonctionnement du programme ainsi que les lignes utilisées.


Entêtes déclaratives :

Code : Tout sélectionner

//**************** Entête déclarative *******
// --- Librairies utilisées ---
#include <Servo.h> // librairie pour servomoteur
// --- Déclaration des constantes ---
//const int POS_MIN = 550; // largeur impulsion pour position 0° servomoteur 
//const int POS_MAX = 2330; // largeur impulsion pour position 180° servomoteur
const int POS_MIN = 1120; // largeur impulsion pour position 45° servomoteur 
const int POS_MAX = 2240; // largeur impulsion pour position 135° servomoteur

// --- constantes des broches ---
const int INTER = 2; // declaration constante de broche inter-radio 
const int LED1 = 3; // declaration constante broche LED1 position milieu
const int LED2 = 4; // declaration constante broche LED2 position haute
const int S1 = 5; // declaration constante broche servo1

// --- Déclaration des variables globales ---
int MLI_INTER = 0; // variable MLI inter radio
int PULS_S1 = 0; // variable pour angle de servo1

// --- Déclaration des objets ---
Servo servo1; // crée un objet servo pour contrôler le servomoteur
Librairie utilisée :
Comme indiqué plus haut il est possible avec Arduino de faire appel à de nombreuses librairies. Par chance, la librairie "Servo.h" existe.
La ligne "include" fait appel à cette librairie pour ce programme.

Déclaration des constantes :
POS_MIN et POS_MAX sont associés a des valeurs fixes.

Constantes de broches :
Cela permet d'associer un nom à une valeur de broches, améliorant la compréhension du programme lorsque l'on fait appel à une broche.

Déclarations des variables globales :
Cette partie permet de nommer les variables qui seront utilisées dans le déroulement du programme.
MLI_INTER stock la variable représentant la largeur d'impulsion sur la voie du récepteur.
PULS_S1 stock la variable représentant la largeur d'impulsion qui sera envoyé au Servo.

Déclaration des objets :
Cette partie permet de nommer et d'associer un objet qui sera reconnu par une librairie. Dans notre cas, "Servo1" sera reconnue par la librairie "Servo.h"


Code d'initialisation :

Code : Tout sélectionner

//**************** FONCTION SETUP = Code d'initialisation *****
// Exécutée en premier et 1 seule fois, au démarrage du programme
void setup() { // debut de la fonction setup()
// --------Attachement des objets--------
servo1.attach(S1, POS_MIN, POS_MAX); // attache l'objet servo1 à la broche d5

// ------- Broches en entrée ------- 
pinMode(INTER, INPUT); // broche en entrée vers l'interrupteur

// ------- Broches en sortie ------- 
pinMode(LED1, OUTPUT); // broche en sortie vers LED1
pinMode(LED2, OUTPUT); // broche en sortie vers LED2
pinMode(S1, OUTPUT); // broche en sortie vers servo1
// ------- Activation d'état initial des sorties numériques ------- 
digitalWrite(LED1, 0); // mise à 0 de LED1 au démarrage
digitalWrite(LED2, 0); // mise à 0 de LED2 au démarrage
servo1.write(1440); // mise en position centrale de servo1 au démarrage

// ------- Activation du rappel au + interne des broches en entrée si nécessaire -------

} // fin de la fonction setup()
// ********************************************************************************
Attachement des objets :
Dans cet exemple, l'ojet "servo1" est associé à la broche "S1" (5) avec comme valeur min et max, 1120 et 2240.

Broches en entrée :
La broche "INTER" (D2) est déclarée en entrée.

Broches en sortie :
La broche "LED1" (D3) est déclarée en sortie.
La broche "LED2" (D4) est déclarée en sortie.
La broche "S1" (D5) est déclarée en sortie.

Activation d'état initial des sorties numériques :
Afin de stabiliser l'état des sorties au démarrage de la carte Arduino, des valeurs initiales sont déterminées.

Activation du rappel au + interne :
Lorsqu'une Entrée numérique est utilisée avec un bouton poussoir par exemple, il est nécessaire d'activer une résistance interne afin de fixer la broche au +5V.
Ce rappel au "+" permet de fixer la aleur de la broche et ainsi éviter un état aléatoire.
Dans notre cas, aucun rappel car aucun bouton poussoir utilisé sur une Entrée numérique.

Boucle de programme principal :

Code : Tout sélectionner

// ********************************************************************************
//*************** FONCTION LOOP = Boucle sans fin = coeur du programme *************
// Exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension
void loop(){ // debut de la fonction loop()
// --- Programme principal --- 
// acquisition conversion analogique numérique (100µs env.) 
//sur broche analogique indiquée - résultat 10bits (0-1023)
MLI_INTER = pulseIn(INTER, HIGH); // capture de la variable position inter-radio 
if (MLI_INTER < 1300) //--- si inter-radio en bas ---
{
digitalWrite(LED1, 0); // LED1 à 0
digitalWrite(LED2, 0); // LED2 à 0
servo1.write(1120); // servo1 en position basse
}
else if (MLI_INTER > 1700) //--- si inter-radio en haut ---
{ 
digitalWrite(LED1, 1); // LED1 à 1
digitalWrite(LED2, 1); // LED2 à 2
servo1.write(2240); // servo1 en position haute
}
else //--- si inter-radio au milieu ---
{
digitalWrite(LED1, 1); // LED1 à 1
digitalWrite(LED2, 0); // LED2 à 0
servo1.write(1440); // servo1 en position milieu 
} 
}// fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************
// --- Fin programme ---
Comme mentionné dans le programme, cette boucle s'exécute indéfiniment tant que l'Arduino est sous tension, c'est le coeur de notre programme.
La première ligne utilise la commande "pulsein" permettant de "capturer" dans la variable MLI_INTER le temps (en µs) de la largeur d'impulsion sur la voie du récepteur en position haute.
Cette largeur d'impulsion est comparée avec la fonction "if, else if, else".
Suivant le résultat de la comparaison, les sorties associées aux LED sont mise à 0 ou 1 et la largeur d'impulsion générée sur le servo est adapté à l'angle désiré.

L'explication de ce programme est maintenant terminée, et si l'on enlève les commentaires (en vert), on s'apperçoit que le programme ne comporte que très peu de lignes, 19 au total!!
En plus le fait d'avoir une librairie "Servo" permet de mettre en place le composant sans une grande connaissance en programmation.

Voilà cette première présentation est terminé et j'espère quelle vous donnera envie de découvrir le monde Arduino.
La facilité de mise en oeuvre des capteurs nous permet de facilement ajouter des options de controle comme par exemple, la correction d'assiette, le contrôle de l'alimentation, des modes fail-save évolués, etc...
Vous pouvez retrouver un article complet de cette présentation sur mon site. Vous pourez y découvrir une carte à "compétence" identique encore plus réduite. c'est cette carte qui me servira en production.
http://diopter.fr/index.php/technique/s ... me-arduino

Ci-dessous quelques photos pour vous présenter les cartes :

La carte Arduino nano V3, comme on peut le voir elle intègre un port USB.
Image

Les deux cartes, Arduino Nano V3 et Arduino Pro mini 5V autour d'une pièce d'1€, on ne peut pas dire que c'est très encombrant.
Image

L'Arduino nano V3 en pleine action sur son module de test.
Image

Laurent
Avatar de l’utilisateur
coaxial
Messages : 3673
Inscription : 23 janv. 2010 19:35
Localisation : saint orens 31

Re: Le système Arduino

Message par coaxial »

Ah ça démare fort la :Up: Je suis allé sur ta page , j'ai rien compris ............................................ c'est normal je regarde les images







:jesors:
Moins je réfléchis plus fort et plus j'agis moins vite
Les bons crus font les bonnes cuites => Pierre Dac .
.... la simplicité est-ce bien la plus simple solution ..........?
La femme est l'avenir de l'homme .
Avatar de l’utilisateur
Cassiope34
Messages : 352
Inscription : 15 avr. 2010 14:42
Localisation : Montpellier

Re: Le système Arduino

Message par Cassiope34 »

EXCELLENT Laurent :Up: :Up:
Mille fois plus didactique, complet et intéressant que ce que nous avions su faire à l'époque ou Geeks et moi en avions parlé.

Et tu as déjà en tête un petit (ou gros) cahier des charges de ce que tu voudrais lui faire faire dans le soum à l'arduino ?

@+
Devise Shadocks :
"Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Avatar de l’utilisateur
laurent0091
Messages : 187
Inscription : 06 mars 2011 00:00
Localisation : Essone (91)
Contact :

Re: Le système Arduino

Message par laurent0091 »

Bonsoir Cassiope34,
pour le moment je fais des essais et j'ai acheté un capteur (ADXL335) pour faire des essais de correction d'assiette.
Après j'ai en projet une carte qui pourrait être universelle avec des options que l'utilisateur pourrait mettre en service suivant les besoins du modèle.
On pourrait imaginer, un contrôle de la tension d'alimentation, une correction d'assiette, un contrôle de la profondeur max, et pourquoi pas une tenue d'immersion, un fail-save intégré bien que j'aime avoir des système dissociés pour la sécurité.
la liste n'est pas exhaustive et on peut ajouter des relais pour actionner lumière ou autre, capteur d'humidité, contrôle des barres avant.

Si vous avez des idées dites le moi...

Laurent
Avatar de l’utilisateur
Cassiope34
Messages : 352
Inscription : 15 avr. 2010 14:42
Localisation : Montpellier

Re: Le système Arduino

Message par Cassiope34 »

J'avais posé un peu la même question dans ce post, et seul coaxial et patjabix ont répondus...

As-tu vu le post de philippeg ?

J'y présente une carte qui semble bien intéressante pour 30€ tout compris seulement.
De plus elle gère bien sûr l'axe Y des gyros (l'axe vertical) qui sert un peu d'auto-level, mais ne maintient pas l'altitude (profondeur) à proprement parlé, elle corrige son changement si l'ordre ne vient pas du pilote...
Elle surveille aussi l'accu bien entendu.

Merci coaxial pour le lien vers la notice française (et donc à Tolwin pour l'avoir écrite :Up: )
Il y a aussi ce Manuel pour la carte précédente, et qui montre différentes affectations des moteurs ou servos suivant l'utilisation.

Pour revenir au projet de Laurent, pour corriger l'assiette avec l'ADXL335 (accéléromètre 3 axes), je pense qu'il te faudra faire intervenir les formules de gestion du PID qui est une sorte de calcul générique de correction de contrôle, utilisée dans tous ce genre d'application comme le segway (le code se trouve vers le milieu de la page), et autre contrôles d'équilibre.
Mais ces codes existent "tout fait" (pour pouvoir s'en inspirer et éviter de réécrire tout), ne serait-ce que pour les copies de Segway, ou le code pour la première carte de contrôle des quadricoptère.

Pour ceux qui seraient vraiment curieux d'en comprendre plus sur l'Arduino et même s'y frotter un peu je ne peux que conseiller cet excellent bouquin : Arduino, maîtrisez sa programmation et ses cartes d'interface (shields) qu'on peut facilement trouver ailleurs bien sûr.

Bon courage Laurent.

@+
Dernière modification par Cassiope34 le 23 juil. 2012 12:50, modifié 1 fois.
Devise Shadocks :
"Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Avatar de l’utilisateur
laurent0091
Messages : 187
Inscription : 06 mars 2011 00:00
Localisation : Essone (91)
Contact :

Re: Le système Arduino

Message par laurent0091 »

Bonjour Cassiope34,

Pour la correction d'assiette j'utilise cette carte toute faite que l'on branche directement à l'Ardiono.
Image

Pour le moment je vais la faire fonctionner comme mon pendule actuel (rustique mais efficace). C'est à dire angle de correction programmée dans un sens et dans l'autre suivant un angle seuil de déclenchement. Ce n'est pas progressif mais ça fonctionne très bien, en tout cas sur mon modèle (vitesse lente de navigation) et en plus ça fait moins travailler les servos.
Pour le bouquin c'est celui là que j'ai acheté...

Laurent
Avatar de l’utilisateur
coaxial
Messages : 3673
Inscription : 23 janv. 2010 19:35
Localisation : saint orens 31

Re: Le système Arduino

Message par coaxial »

Le plus du plus en plus

de la correction assiette/profondeur pour les IP , serait de pouvoir envoyer le signal prof imposée via un trim de la radio indépendant du manche des barres de plongée qui lui garderait la priorité .
- la correction agirait donc indépendemment sur les barres avant et/ou arrière selon le besoin.
- pour la profondeur en statique un circuit sur capteur de pression différentiel , soit 2 prise de mesure une au-dessus du pont en pression atmo , une en dessous du soum pour la pression de réf en surface , ensuite l'arduino calcule le besoin de balaster selon la valeur demandée au trim d'immersion !



simple :mrgreen: enfin c'est une idée jetée un peu en vrac la , je viens de lacher les pinceaux et je vais au boulot , en attendant que les pièces pour le chantier arrivent :!:
Moins je réfléchis plus fort et plus j'agis moins vite
Les bons crus font les bonnes cuites => Pierre Dac .
.... la simplicité est-ce bien la plus simple solution ..........?
La femme est l'avenir de l'homme .
Avatar de l’utilisateur
laurent0091
Messages : 187
Inscription : 06 mars 2011 00:00
Localisation : Essone (91)
Contact :

Re: Le système Arduino

Message par laurent0091 »

Bonjour,
je me suis déjà penché sur le tenue d'immersion, (pour moi la correction d'assiette et la tenu d'immersion sont indépendants) et je regarde la sensibilité des capteurs. Le problème c'est qu'il sont généralement fabriqués pour répondre aux besoins "atmosphérique" donc généralement avec la pression qui diminue avec l'altitude. Nous c'est le contraire, et généralement on arrive à la saturation du capteur à environ 1,5m pour la série des MPX (facile à trouver et pas cher).
J'ai regardé le mpx5100AP qui est déjà amplifié et qui pourrait être exploitable directement sur une entrée analogique de l'Arduino. Cela donnerait une sécurité à 1,5 m environ et une sensibilité au cm. c'est cette dernière qui me semble légère mais bon il faut essayer et voir ce que ça donne. Il ne reste plus qu'à avoir un peu de temps...

Laurent
Avatar de l’utilisateur
Cassiope34
Messages : 352
Inscription : 15 avr. 2010 14:42
Localisation : Montpellier

Re: Le système Arduino

Message par Cassiope34 »

Uniquement pour la mise au point de ton système Laurent, un truc qui serait bien utile il me semble, serait les petits modules Emetteur 434Mhz à 3.5€ (portée env.100m) raccordés à l'arduino et installé dans une petite bouée qui permettraient de transmettre à un autre Arduino+LCD+Recepteur 434Mhz (à 3.5€ aussi) près de toi pour visualiser en temps réel les infos dont tu aurais besoin (valeurs des capteurs, etc).
Vas savoir, ça pourrait même transmettre à 1,5m sous l'eau ;)
Un tutoriel de ce système très très simple : TUTORIEL Émetteur - Récepteur 434MHz

@+
Devise Shadocks :
"Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Avatar de l’utilisateur
laurent0091
Messages : 187
Inscription : 06 mars 2011 00:00
Localisation : Essone (91)
Contact :

Re: Le système Arduino

Message par laurent0091 »

Bonjour,
pour le moment je ne veux pas compliquer le système, que les fonctions de base fonctionnent ça sera déjà pas mal. Il faut donc valider les fonctionnalités de base, déterminer un standard pour la carte (dimension, connectiques, etc...) et normaliser les entrées pour les options à venir. Il ne faut pas changer la carte à chaque option rajoutée. En plus il faut mettre en place un système pour valider la mise en service ou non des options (système de straps, roue codeuse) pour que l'utilisateur est le moyen de maîtriser la carte sans mettre les doigts dans le programme. Pour que le concept soit viable à long terme, il faut que les bases soient solides...

Laurent
Répondre