Bonjour à tous
J’ai dernièrement fait l’acquisition d’un APC220. J’ai décidé de l’utiliser avec l’adaptateur USB qui permet de faire communiquer directement l’APC220 de l’ordinateur à la carte arduino qui est équipé du deuxième APC220 .Après l’avoir configuré j’ai effectué quelques testes (Allumé une LED lorsque l’on envoie la lettre B dans le moniteur série. Par exemple ) jusque-là aucun problème de communication lorsque j’envoie les commandes via le moniteur série. J’ai donc décidé d’introduire l’utilisation de PROCESSING qui me permet d’enchainer les ordres de commande sans passer par le moniteur série.
Dans le but de commander un servomoteur (appuie sur la touche A servomoteur augmenté de 18° et appuie sur la touche B servomoteur réduit de 18°) j’ai préparé un petit programme plutôt simple
PROCESSING
// inclusion librairies utilisées
import processing.serial.*; // importe la librairie série processing
// déclaration variables
//--- variables utiles tracé vumètre
float Y_ref=220; // ordonnée de ligne de référence dessin rectangle
float largeur=50;
float hauteur=180; //180 représente 100% (0 à 9 = 10 positions)
int SendValue=0; // valeur envoyée à Arduino
float niveau=0.0; // 0% au départ
Serial MySerialPort; // variable désignant le port série
void setup(){ // fonction d'initialisation exécutée 1 fois au démarrage
size(100,250); //dimensionne la fenêtre processing à 200x200 (largeur x hauteur) // 1ère instruction de Setup
// si Size() oublié => fenêtre 100x100 par défaut --
//---- initialisation port série ---
println(Serial.list()); // liste et affiche tous les ports disponibles
// Open whatever port is the one you're using.
MySerialPort = new Serial(this, Serial.list()[1], 9600); // vérifier si c'est le bon port qui est utilisé
delay (100); // pause
background (255,255,255); // fixe la couleur du fond - format RGB
stroke(255,0,0); // fixe la couleur du trait de dessin et bordure - format RGB
//nostroke(); // Désactive trait de dessin et bordure
// dessin des 2 rectangles du niveau de démmarrage (=50%)
stroke (0); // trait de contour
fill(255,255,255); // remplissage
rect (10,Y_ref-hauteur,largeur, hauteur); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence
stroke (255,0,0); // trait de contour
fill(255,0,0); // remplissage rouge
rect (10,Y_ref-niveau,largeur, niveau); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence
//----- initialisation valeur série ----
MySerialPort.write(48); // valeur initiale 0+ 48 pour format ASCII
delay (100); // pause
}
void draw() { // fonction exécutée en boucle
//--- nb : la vitesse de rafraîchissement de l'écran est de 60 par seconde apr défaut - cf frameRate()
}
// fonction de gestion des évènements
//----- clavier --------
void keyPressed() {// cette fonction est exécutée quand un touche est appuyée...
if (keyPressed) {
if (key == 'a' || key == 'A') {
niveau=niveau+(hauteur/9); // /9 pour avoir 10 niveaux
if (niveau>=hauteur)niveau=hauteur; // ne pas dépasser hauteur
SendValue=SendValue+1; // incrémente SendValue
if (SendValue >=9) SendValue=9; // Empêche débordement variable SendValue
MySerialPort.write('A');
delay (100); // pause
}
if (key == 'b' || key == 'B') {
niveau=niveau-(hauteur/9); // /9 pour avoir 10 niveaux
if (niveau<=0)niveau=0; // ne pas dépasser 0
SendValue=SendValue-1; // décrémente SendValue
if (SendValue<=0) SendValue=0;// ne pas dépasser 0
MySerialPort.write('B');
delay (100); // pause
}
} // fin if key==coded
// dessin des 2 rectangles du niveau
stroke(0); // contour noir
fill(255,255,255); // remplissage blanc
rect (10,Y_ref-hauteur,largeur, hauteur); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence
stroke(255,0,0); // contour rouge
fill(255,0,0); // remplissage rouge
rect (10,Y_ref-niveau,largeur, niveau); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence
}
//------- souris -------
//void mousePressed() { // est appelée à chaque fois qu'un bouton de la souris est appuyé
// }
//------- gestion du port Série ------
//void serialEvent (Serial myPort) {
// } // fin gestion port série
ARDUINO
// --- Inclusion des librairies ---
#include <Servo.h> // librairie pour servomoteur
// --- Déclaration des constantes utiles ---
//--- Constantes utilisées avec le servomoteur
int angle;
const int angleMin = 0;
const int angleMax = 180;
// --- Déclaration des constantes des broches E/S numériques ---
const int broche_servo=2; // Constante pour la broche 2 AILERONS droite
// --- Déclaration des variables globales ---
int octetReception=0; // variable de stockage des valeurs reçues sur le port Série
long nombreReception=0; // variable de stockage du nombre reçu sur le port Série
long nombreReception0=0; // variable de stockage du dernier nombre reçu sur le port Série
String chaineReception=""; // déclare un objet String vide pour reception chaine
int position_servo=0;
// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---
//--- Création objet servomoteur
Servo mon_servo; // crée un objet servo pour contrôler le servomoteur AILERON droite
////////////////////////// 2. FONCTION SETUP = Code d'initialisation //////////////////////////
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme
void setup() { // debut de la fonction setup()
// --- ici instructions à exécuter 1 seule fois au démarrage du programme ---
// ------- Initialisation fonctionnalités utilisées -------
Serial.begin(9600); // initialise connexion série à 9600 bauds
// IMPORTANT : régler le terminal côté PC avec la même valeur de transmission
//--- Initialisation Servomoteur
mon_servo.attach(broche_servo, angleMin, angleMax); // attache l'objet servo à la broche de commande du servomoteur AILERON droite
// ------- Broches en sorties numériques -------
pinMode (broche_servo,OUTPUT); // Broche broche_servo AILERON droite configurée en sortie
// ------- Broches en entrées numériques -------
mon_servo.write(position_servo);
// ------- Activation si besoin du rappel au + (pullup) des broches en entrées numériques -------
// ------- Initialisation des variables utilisées -------
}
// ********************************************************************************
////////////////////////////////// 3. FONCTION LOOP = Boucle sans fin = coeur du programme //////////////////
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension
void loop()
{ // debut de la fonction loop()
static uint8_t angleCourant = 0;
// --- ici instructions à exécuter par le programme principal ---
//---- code type réception valeur sur le port série ---
if (Serial.available() > 0)
{
// si un octet en réception
octetReception=Serial.read(); // Lit le 1er octet reçu et le met dans la variable
if (octetReception=='A'){
angleCourant += (angleCourant <= angleMax) ? 10 : 0; //fait tourner de +10 Degrés le servomoteur AILERON droite
}
if (octetReception=='B' && angleCourant> angleMin){
angleCourant -= 10; // Fait tourner de -10 Degrés le servomoteur AILERON droite
}
mon_servo.write(angleCourant);
delay(200);
}
}
// ////////////////////////// Fin du programme ////////////////////
Mais c’est la que sa bloque !!!
Quand j’utilise PROCESSING + APC220 + ARDUINO = rien qui se produit
Alors que PROCESSSING + LIASON PAR CABLE + ARDUINO= sa marche
Et quand la commande est envoyé via MONITEUR SERIE de l’arduino + APC220+ ARDUINO sa fonction aussi
Enfaite des que j’utilise l’apc220 et Processing rien ne se produit.
Je met pourtant bien l’APC220, PROCESSING et L’ARDUINO sur le port COM4
J’ai lu plusieurs questions sur des forums différents qui relevait le même problème mais sur aucun forum je n’ai trouvé de réponse clair.
Quelqu’un à t-il déjà eu le même problème que moi si oui qu’a-t-il fait ??
Est-ce un problème d‘incompatibilité du à PROCESSING si oui quel logiciel peut le remplacer ?
Merci d’avance pour vos réponses
Cordialement