Projet - Télécommande filaire - Gestion de commande à PWM mixées

Bonjour,

Je m'interroge actuellement sur la possibilité de piloter un afficheur LCD 4*20 par l'I2C avec une Arduino Méga.

Si j'ai bien compris, il existe une librairie pour utiliser un PCF8574. Dans le présent cas, je ne vais pas utilisé de PCF, vue que mon afficheur comprends déjà une platine avec un PIC permettant la liaison série / I2C.

Je cherche donc maintenant à trouver le bon compromis entre, trouver une librairie, ou bien utiliser l'I2C classique et adapter avec des commandes en macro.

A moins que quelqu'un ai déjà eu à traiter d'un tel sujet et qui aurais déjà trouvé une solution.

Mes recherches actuel n'ont pas vraiment donner de résultat. C'est même le point mort ! Je m'en remet à vos pistes et indications.

Merci

Geeks:
Bonjour,

Je m'interroge actuellement sur la possibilité de piloter un afficheur LCD 4*20 par l'I2C avec une Arduino Méga.

Si j'ai bien compris, il existe une librairie pour utiliser un PCF8574. Dans le présent cas, je ne vais pas utilisé de PCF, vue que mon afficheur comprends déjà une platine avec un PIC permettant la liaison série / I2C.

Je cherche donc maintenant à trouver le bon compromis entre, trouver une librairie, ou bien utiliser l'I2C classique et adapter avec des commandes en macro.

A moins que quelqu'un ai déjà eu à traiter d'un tel sujet et qui aurais déjà trouvé une solution.

Mes recherches actuel n'ont pas vraiment donner de résultat. C'est même le point mort ! Je m'en remet à vos pistes et indications.

Merci

Bonjour
je n'ai pas bien compris le probleme ?
tu veux commander en filaire un affichage distant (quelle distance) un LCD géré en I2C ?

La relation avec le titre n'est pas vraiment évidente.

Artouste:
Bonjour
je n'ai pas bien compris le probleme ?
tu veux commander en filaire un affichage distant (quelle distance) un LCD géré en I2C ?

La distance est de - de 5cm :cold_sweat:

Jean-François:
La relation avec le titre n'est pas vraiment évidente.

En même temps, c'est un projet complet qui comprends une télécommande avec un dispositif d'affichage. Est-ce que ça éclaire un peu ou bien, je refais un nouveau sujet uniquement sur l'affichage ?

Je viens de changer le titre...

Bref, j'avais oublier de préciser que je passait par l'intermédiaire d'un LCD03. Celui-ci interface donc entre i2c et l'afficheur 4*20.

Bon et bien, je cherche une librairie pour fonctionné en I2C.

Bonjour,

Je viens de faire un essai avec un bout de code. A priori, ils ont tous l'air d'utilisé la librairie Wire.h.

J'ai essayer ceci:

//Test LCD 03
#include <Wire.h>

#define addresse 0xC6

void setup() {
  
  Serial.begin(9600);
  
  //Serial.println("Init");
  
  Wire.begin();                      //Lancer I2C
  Wire.beginTransmission(addresse);  //Aller sur l'adresse
  Wire.send(0x00);
  Wire.send(0x12);
  Wire.endTransmission();            //Fin de transmission
  
}

void loop() {
}

Et bien sûr, Wire.send() ne fais pas partie de la librairie :astonished:

La preuve par la compilation échoué :

LCD_I2C.cpp: In function ‘void setup()’:
LCD_I2C.cpp:17: erreur: ‘class TwoWire’ has no member named ‘send’
LCD_I2C.cpp:18: erreur: ‘class TwoWire’ has no member named ‘send’

Donc, là, je fais quoi ?

Bonjour,

Geeks:
Je viens de faire un essai avec un bout de code. A priori, ils ont tous l'air d'utilisé la librairie Wire.h.

(...)

Et bien sûr, Wire.send() ne fais pas partie de la librairie :astonished:

Arduino 1.0 = gros changements
Wire.send() -> Wire.write()
Wire.receive() -> Wire.read()
:wink:

Si tu veut le liste compléte des changements entre 0023 et 1.0

Ok, bien vue pour le lien. Je n'en savait rien jusque là :roll_eyes:

Bon par contre, si je place des Wire.write(0); et Wire.write(12); ça ne compile pas non plus :cold_sweat:

LCD_I2C.cpp: In function ‘void setup()’:
LCD_I2C.cpp:17: erreur: call of overloaded ‘write(int)’ is ambiguous
/home/geeks/Install/arduino-1.0/libraries/Wire/Wire.h:55: note: candidats sont: virtual size_t TwoWire::write(uint8_t)
/home/geeks/Install/arduino-1.0/hardware/arduino/cores/arduino/Print.h:49: note:                 size_t Print::write(const char*)

Ce qui veut dire que le problème viens d'ailleurs. Ou alors, j'ai pas tout compris. Mais je regarde quand même de mon coté, au cas ou je trouverais quelque-chose.

Maintenant, je veux bien un bout de tuyau, chu un peu largué sur cette compilation :~

Geeks:
Bon par contre, si je place des Wire.write(0); et Wire.write(12); ça ne compile pas non plus :cold_sweat:

LCD_I2C.cpp: In function ‘void setup()’:

LCD_I2C.cpp:17: erreur: call of overloaded ‘write(int)’ is ambiguous
/home/geeks/Install/arduino-1.0/libraries/Wire/Wire.h:55: note: candidats sont: virtual size_t TwoWire::write(uint8_t)
/home/geeks/Install/arduino-1.0/hardware/arduino/cores/arduino/Print.h:49: note:                 size_t Print::write(const char*)




Ce qui veut dire que le problème viens d'ailleurs. Ou alors, j'ai pas tout compris. Mais je regarde quand même de mon coté, au cas ou je trouverais quelque-chose.

Suffit de lire l'erreur :wink:

call of overloaded ‘write(int)’ is ambiguous -> il y a une ambiguïté sur l'appel de .write()

candidats sont: virtual size_t TwoWire::write(uint8_t)
size_t Print::write(const char*) -> il y a deux version de .write(), une demandant un char* et une autre utilisant un uint8_t (un byte quoi).

Il suffit donc de lire dire ce que l'on veut utiliser, ici write(uint8_t)
Wire.write((uint8_t)0);
Wire.write((uint8_t)12);

Arg, zut, trop rapide pour moi :cold_sweat:

Je viens de trouver ceci :

 Wire.begin();                      //Lancer I2C
  Wire.beginTransmission(addresse);  //Aller sur l'adresse
  Wire.write((byte)0x00);
  Wire.write((byte)0x12);
  Wire.write((byte)0x19);
  Wire.endTransmission();            //Fin de transmission

Bon, j'ai regarder quand même si j'avais des trames. C'est le cas, donc l'I2C fonctionne 8)

Mais l'afficheur non :roll_eyes:

Une idée qui me viens, vite paf !

Et si, au lieu de brancher en I2C, je branchais en TX/RX mode série ?
Ça me libérerais l'I2C pour d'autres composants non ?

Dans ce cas, sur la méga, c'est pas le cas des uno, il y a plusieurs TX/RX. Est-ce qu'elle fonctionne en même temps ou non ?

Mais bon, là, je ne suis pas certain de ce que j'avance ! Le LCD03 prends en compte cette possibilité. Est-ce que ça va le faire ?

Bon et bien, j'y ai fait :cold_sweat:

Je suis arrivé à faire fonctionné l'afficheur 8)

Je vous dit ce que j'ai fait quand même, histoire que ce soit utile à tous :wink:

Déjà, il s'agit d'un fonctionnement sur 7 bits et non 8. Donc 0xC6 est en fait 0x63.
Autre chose, il faut déplacer le curseur avec une commande 0x02 et ensuite le numéro de la case. Comme j'ai 4x20 cases, on en à au total 80.
1 à 20 -> ligne 1
21 à 40 -> ligne 2
41 à 60 -> ligne 3
61 à 80 -> ligne 4

Une dernière chose. Ne cherchez pas la correspondance avec les valeurs données dans la doc. Elles sont en décimale et il faut les convertir en hexadécimale.

Maintenant que vous savez tout, voyons ce bout de code simplicime :smiley:

//Test LCD 03
#include <Wire.h>

#define addresse 0x63

void setup() {
  
  //Serial.begin(9600);
  
  //Serial.println("Init");
  
  Wire.begin();                        //Lancer I2C
  
  Wire.beginTransmission(addresse);  //Aller sur l'adresse
  Wire.write((byte)0x00);            //Null
  Wire.write((byte)0x0C);            //Effacer Ecran
  Wire.write((byte)0x13);            //Allumage de l'ecran
  Wire.endTransmission();            //Fin de transmission
  
}

void loop() {
  
  Wire.beginTransmission(addresse);  //Aller sur l'adresse
  Wire.write((byte)0x00);            //Null
  Wire.write((byte)0x01);            //Mettre le curseur au début
  Wire.write("Hello");               //Ecrire Hello
  Wire.endTransmission();            //Fin de transmission
  
  delay(1000);
  
  Wire.beginTransmission(addresse);  //Aller sur l'adresse
  Wire.write((byte)0x00);            //Null
  Wire.write((byte)0x02);            //Préparer le curseur à aller ailleur
  Wire.write(26);                    //Aller sur la case N° 26
  Wire.write("World");               //Ecrire World
  Wire.endTransmission();            //Fin de transmission
  
  delay(1000);
  
  Wire.beginTransmission(addresse);  //Aller sur l'adresse
  Wire.write((byte)0x00);            //Null
  Wire.write((byte)0x0C);            //Effacer Ecran
  Wire.endTransmission();            //Fin de transmission
  
  delay(1000);
}

Bon, je passe à la suite :astonished:

Bah oui quoi, je ne suis pas venu là pour me reposé :stuck_out_tongue_closed_eyes:

Bon, j'ai parler d'une télécommande. C'est le moment de brancher 2 manches composés de 2 potentiomètres de 5K.
Je compte mixé deux potentiomètres sur un manche. L'autre manche je verrais plus tard !
Quand je dis mixé, je vais expliqué ce que je compte faire.

Potar 1 -> AN1
Potar 2 -> AN2

Si mon manche est poussé en avant, Potar 1 = 5K, Potar 2 = 2.5K.

  • Dans ce cas, mes deux PWM de sorties seront de 180° pour le servo 1 et de 0° pour le servo 2. C'est des valeurs d'angles de servo-moteurs.

Si mon manche est poussé en arrière, Potar 1 = 0K, Potar 2 = 2.5K.

  • Dans ce cas, mes deux PWM de sorties seront de 0° pour le servo 1 et de 180° pour le servo 2.

Par contre, si mon manche est à gauche, Potar 1 = 2.5K, Potar 2 = 5K.

  • Dans ce cas, mes deux PWM de sorties seront de 180° pour le servo 1 et de 180° pour le servo 2.

Enfin, si mon manche est à droite, Potar 1 = 2.5K, Potar 2 = 0K.

  • Dans ce cas, mes deux PWM de sorties seront de 0° pour le servo 1 et de 0° pour le servo 2.

J'ai donc mixé mes voies. Enfin presque ! En effet, si je ne touche pas au manche, Potar 1 = 2.5K et Potar 2 = 2.5K, alors chaque sorties est à 90°.

Il faut aussi que je gère les cas ou le manche est en haut à droite, en haut à gauche, en bas à droite et en bas à gauche.

Comment est-ce que je peux donc mixé les voies si au départ chaque potentiomètre à sa prpre PWM de sortie lui correspondant ?