Go Down

Topic: [résolu] afficheur couleur et librairie servo (Read 3075 times) previous topic - next topic

dje996

Mar 06, 2012, 06:05 pm Last Edit: Mar 11, 2012, 12:06 am by dje996 Reason: 1
Bonjour,

Je suis nouveau dans l'utilisation de l'arduino et j'essaie de réaliser un montage sur un voiture RC électrique et un capteur de distance afin de rendre cette dernière autonome.

Pour comprendre et m'aider dans mon project, je me suis procuré un afficheur TFT 240 x320 avec  adaptateur pour écran MI0283QT2 décrit sur le sit:http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.MaterielAffichageAdaptateurMI0283QT-2.


Je veux afficher différentes valeurs de variable sur l'écran afin de mieux voir le déroulement de mon programme et corriger mes erreurs. Cependant dès que je déclare l'objet dans mon programme
Code: [Select]
"Servo mon_servo;  // crée un objet servo pour contrôler le servomoteur" et que je compile mon écran s'éteint :~.

Voila je ne comprend pas se qui se passe. C'est ce que mon écran déconne ou un problème avec les librairies?
Ayant fait plusieurs  test c'est vraiment quand je déclare mon servo que sa plante.

Si quelqu'un à une idée je le remercie de m'en faire part.

skywodd

Bonjour,

Je connait bien l'écran dont tu parle, ayant fouiné dans le code de la partie affichage je sait quelle n'utilise pas de timer pour fonctionner.
Donc théoriquement la lib servo ne devrait pas poser de probléme ...

Peut tu nous détaillez ton câblage, et poster le code qui marche (sans Servo) ainsi que celui qui ne marche pas ?
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

dje996

Merci pour ton aide.

Voila pour mon petit programme j'ai rajouté la "easy card" de EASY ROBOTICS pour brancher un joypad sur A0 et A1,  le servo sur la broche 3. Sur adaptateur pour écran MI0283QT2 les broches 7,8,9,11,12,13 sont utilisé, les autres sont repliées car elles ne servent pas (sauf erreur).

voici mon code:
Code: [Select]
/*se programme affiche a l'écran des variables que l'on peut selectionner et modifier leur valeur*/

// /////////////////////////////// 1. Entête déclarative ///////////////////////
// A ce niveau sont déclarées les librairies incluses, les constantes, les variables, les objets utiles...

// --- Déclaration des constantes ---

// --- Inclusion des librairies ---

#include <MI0283QT2.h> // librairie de l'afficheur TFT MI0283QT2
// Avant utilisation, il faut installer manuellement cette librairie
// dans le dossier <Libraries> du dossier Arduino

#include <Servo.h> // librairie pour servomoteur

int modif_variable(int mesure, int variable);// prototype fonction pour la modification de valeur d'une variable par joypad X

// --- Déclaration des constantes utiles ---

// --- Déclaration des constantes des broches E/S numériques ---

const int broche_servo=3; // Constante pour la broche

// --- Déclaration des constantes des broches analogiques ---
const int JoypadY=0; //declaration constante de broche analogique
const int JoypadX=1; //declaration constante de broche analogique

// --- Déclaration des variables globales ---

int mesure_bruteX=0;// Variable pour acquisition résultat brut de conversion analogique numérique
int mesure_bruteY=0;// Variable pour acquisition résultat brut de conversion analogique numérique
int ligne_active=3;
float mesuref=0.0;// Variable pour calcul résultat décimal de conversion analogique numérique

int POS_MINI=700;
int POS_MAX=2300;
int angleServo=1500;



// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---

MI0283QT2 lcd; // création d'un objet de type MI0283QT2 appelé lcd
Servo mon_servo;  // crée un objet servo pour contrôler le servomoteur

// ////////////////////////// 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 ------- 

  //initialisation écran MI0283QT2  240x320 pixels
  lcd.init(4); //spi-clk = Fcpu/4
  lcd.clear(RGB(255,255,255)); // efface ecran en blanc

  //configuration écran MI0283QT2  240x320 pixels - après calibrage touchpad
  lcd.setOrientation(270); // configure orientation afficheur en degrés : 0,90,180,270
  // Par défaut 0 = point 0,0 en regard connecteur USB

  lcd.clear(RGB(255,255,255)); // efface ecran en blanc
  lcd.led(40); // fixe luminosité



  // ------- Broches en sorties numériques ------- 
pinMode (broche_servo,OUTPUT); // Broche broche_servo configurée en sortie
  // ------- Broches en entrées numériques ------- 

  // ------- Activation si besoin du rappel au + (pullup) des broches en entrées numériques ------- 

  // ------- Initialisation des variables utilisées ------- 

} // fin de la fonction setup()
// ********************************************************************************

////////////////////////////////// 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()

mon_servo.attach(broche_servo, POS_MINI, POS_MAX);  // attache l'objet servo à la broche de commande du servomoteur avec calibrage auto
  // --- ici instructions à exécuter par le programme principal ---

  lcd.drawText(0, 0, "menu de configuration", 1, noir, blanc); // affiche message


  mesure_bruteY=analogRead(JoypadY);
  lcd.drawText(0,10, "valeur brute joypad Y =", 1, bleu, blanc); // affiche message
  lcd.drawText(190,10, "    ", 1, bleu, blanc); // affiche message
  lcd.drawText(190,10,mesure_bruteY , 1, rouge, blanc); // affiche message

  mesure_bruteX=analogRead(JoypadX);
  lcd.drawText(0,20, "valeur brute joypad X =", 1, bleu, blanc); // affiche message
  lcd.drawText(190,20, "    ", 1, bleu, blanc); // affiche message
  lcd.drawText(190,20,mesure_bruteX , 1, rouge, blanc); // affiche message


if (mesure_bruteY > 600)
  {
    ligne_active--;
    delay(500);
  }
 
  else if (mesure_bruteY <400)
  {
    ligne_active++;
    delay(500);
  }
 
  if (ligne_active ==4)
  {ligne_active = 1;}
  else if (ligne_active ==0)
  {ligne_active=3;}

 
  lcd.drawText(0,40, "ligne active =", 1, bleu, blanc); // affiche message
  lcd.drawText(190,40, "    ", 1, bleu, blanc); // affiche message
  lcd.drawText(190,40,ligne_active,1,rouge, blanc); // affiche message
 
 
  lcd.drawText(0,60, "POS MINI (us)=", 1, bleu, blanc); // affiche message
  lcd.drawText(190,60, "    ", 1, bleu, blanc); // affiche message
  lcd.drawText(190,60,POS_MINI,1,rouge, blanc); // affiche message

  lcd.drawText(0,70, "POS MAX (us)=", 1, bleu, blanc); // affiche message
  lcd.drawText(190,70, "    ", 1, bleu, blanc); // affiche message
  lcd.drawText(190,70,POS_MAX,1,rouge, blanc); // affiche message

  lcd.drawText(0,80, "angle actuel (us)=", 1, bleu, blanc); // affiche message
  lcd.drawText(190,80, "    ", 1, bleu, blanc); // affiche message
  lcd.drawText(190,80,angleServo,1,rouge, blanc); // affiche message


if (ligne_active ==1)
{lcd.drawText(0,60, "POS_MINI=", 1, blanc,bleu); // affiche message

POS_MINI=modif_variable(mesure_bruteX, POS_MINI);
}

else if (ligne_active ==2)
{lcd.drawText(0,70, "POS_MAX =", 1, blanc,bleu); // affiche message

  POS_MAX=modif_variable(mesure_bruteX, POS_MAX);
}

else if (ligne_active ==3)
{lcd.drawText(0,80, "angle actuel(us)=", 1, blanc, bleu); // affiche message
angleServo=map(JoypadX,0,1024,POS_MINI,POS_MAX);
//mon_servo.writeMicroseconds(angleServo);
 
}

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************


// modification de la valeur d'une variable par joypad X
int modif_variable(int mesure, int variable)
{
 
  if (mesure > 950)
  { delay (00);
    variable = variable +100;   }

  else if (mesure > 700)
  {delay (00);
    variable = variable +10;  }

  else if (mesure > 530)
  {delay (00);
    variable = variable +1;  }

  else if (mesure < 100)
  {delay (00);
    variable = variable -100;  }

  else if (mesure < 300)
  { delay (00);
    variable = variable -10;  }

  else if (mesure< 500)
  {    delay (00);
        variable = variable -1;  }
       
  return variable;
}


donc dès que je supprime la ligne
Code: [Select]
mon_servo.attach(broche_servo, POS_MINI, POS_MAX);  , sous VOID LOOP en mettant // l'écran reste allume sinon l'écran est noir. En appuyant sur reset l'écran initialise, puis les variable s'affiche 1 seconde puis s'éteint.

voila j'ai regardé encore une fois mais je ne vois pas se qui cloche.

skywodd

Servo.attach() c'est comme Serial.begin() ça doit être mis dans SETUP, pas dans loop.
Déplace la ligne et regarde ce que ça fait.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

dje996

même en déplaçant la ligne
Code: [Select]
mon_servo.attach(broche_servo, POS_MINI, POS_MAX); c'est le même problème.
j'ai essayé avec une autre carte arduino UNO pas mieux.

sans plus de résultat j'ai pris le code de cette page:
http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoExpertTFTGraphiqueCouleur240x320CouleurArcEnCiel
puis en ajoutant :
#include <Servo.h>
const int broche_servo=3; // Constante pour la broche
Servo mon_servo;  // crée un objet servo pour contrôler le servomoteur

dans VOID LOOP:
mon_servo.attach(broche_servo);

problème identique quand je supprime mon_servo.attach(broche_servo); sa marche, sinon écran noir.

Si tu me dit que sa ne devrait pas posé de problème entre le servo et l'écran, il se pourrait que sa vienne de mon écran. Peut être défectueux  ?? =(
mais je n'en possède qu'un seul.  :~ et sur le sit http://www.watterott.com il n'y en a plus  =(




fdufnews

Code: [Select]
On boards other than the Mega, use of the library disables analogWrite() (PWM) functionality on pins 9 and 10, whether or not there is a Servo on those pins.

La LED de l'écran est sur la broche 9. La fonction PWM est désactivée sur cette broche lorsque l'on utilise Servo.

Il faudrait alimenter la LED du rétro éclairage autrement

skywodd


La LED de l'écran est sur la broche 9. La fonction PWM est désactivée sur cette broche lorsque l'on utilise Servo.

Il faudrait alimenter la LED du rétro éclairage autrement


Arg! Mais oui bien sur !
Code: [Select]
# define LED_PIN        (9) //PH6: OC2B
OC2B -> PWM -> Timer -> Servo -> Conflit ... logique

Donc deux solutions possible :
- Mettre un câble entre D9 et une autre broche PWM puis utiliser analogWrite() (solution la plus simple),
- digitalWrite(9, HIGH) (je crois que digitalWrite désactive la PWM avant de mettre le broche à l'état voulu, donc un peu de manipulation de port pourrait être utile)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

dje996

top sa marche  :D
en tordant la broche 9 du Shield,  redresser la broche 5 et un petit pond en 5 et 9
Code: [Select]
analogWrite(broche_eclairage_ecran,127);// broche d'intensité de l'éclairage écran  (de 0 à 255)

merci beaucoup pour votre aide.

C'était pas grand chose mais fallait le savoir

skywodd


C'était pas grand chose mais fallait le savoir

C'est toujours les petits truc qui posent probléme. J'aurai jamais pensé au rétro-éclairage :smiley-sweat:
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up