je m'en sors pas avec I2C

  • Auteur de la discussion phil135
  • Date de début
P
phil135
Compagnon
15 Sept 2012
1 548
france, essonne, nord
  • Auteur de la discussion
  • #1
bonjour

il faut que je fasse avancer rapidement un mini projet, un test limité, et je tourne en rond sévère:

il s'agit d'interfacer des (d'abord un seul) capteur de distance à ultrasons sur un arduino

arduino uno rev3
capteur à ultrason SRF10 (vendu par lextronic)

je suis arrivé à scanner le bus i2c , ça me répond que le capteur est en 0x70
ok, mais le capteur a bien plus de registres que ça, où sont les autres ? comment y accéder ?

est-ce que l'un de vous aurait un code exemple d'interfaçage d'un capteur i2c à plusieurs registres sur un arduino ? (avec l'initialisation)
je trouve juste des exemples de capteur de température à un seul registre, et trop peu commentés

merci infiniment
 
Dernière édition:
P
phil135
Compagnon
15 Sept 2012
1 548
france, essonne, nord
  • Auteur de la discussion
  • #3
et bien ... malgré pas mal de recherches je n'avais pas trouvé cet exemple-là. merci je vais l'examiner de prés
(sans doute pas les bons mots de recherche)
 
P
phil135
Compagnon
15 Sept 2012
1 548
france, essonne, nord
  • Auteur de la discussion
  • #4
et bien .... ça marche
par contre quand j'ai voulu changer l'adresse du capteur pour pouvoir en mettre plusieurs sur le bus, j'ai d'abord eu un comportement bizarre (une sorte de décalage) et en voulant compenser ce décalage j'ai perdu la communication avec le capteur :smt022

si quelqu'un connait une manip pour revenir aux paramètres usine, je suis preneur

édit:
c’était un pb d'adressage , j'ai repris la main. mais je reste intéressé par une manip de reset, au cas où

il y a une sorte de division par 2 , ou décalage d'un bit vers la droite, entre l'adresse spécifiée et celle obtenue
et en plus toutes les adresses ne sont pas autorisées :smt021
 
Dernière édition:
P
phil135
Compagnon
15 Sept 2012
1 548
france, essonne, nord
  • Auteur de la discussion
  • #5
maintenant que c'est ok pour le capteur SRF10, j'ai un autre pb: l'afficheur

j'ai un afficheur MIDAS MC22005A6W-SPTLYI (vendu par Farnell en ref 2425728 ) qui est en quelques sorte "natif i2c" : les notions de lignes et colonnes de pixels ne sont pas accessibles (j'ai juste des DDRAM address de caractères), du coup les exemples sur le web autour d'un écran parallèle + HD44780 et la library liquidcrystal ... je ne sais pas quoi en faire
 
S
speedjf37
Compagnon
15 Oct 2009
2 186
indre et loire
Bonjour,

votre LCD MIDAS MC22005A6W-SPTLYI est piloté par un AC780S

D'après ce site il serait compatible avec LCD HD44780 :
https://developer.mbed.org/users/wim/notebook/textlcd-enhanced/

Note that there are many HD44780 compatible LCD controllers around (e.g. KS0066, ST7066, SPLC780, SED1278, LC7985A, NT7603, AIP31066). There are also controllers available that are compatible and provide additional features like an increased number of segment drivers for more characters or internal LCD contrast voltage generators (e.g. KS0073, KS0078, ST7036, SSD1803, SSD1803A, HD66712, SPLC792A). Several other types of displays use controllers that are compatible with the HD44780 to allow an easy transition, for example OLED drivers such as the WS0010 and US2066. The library controls the HD44780 through a 4-bit bus either directly or by using SPI or I2C portexpanders. Several compatible controllers also have native support for SPI and/or I2C serial interfaces in addition to, or instead of, the parallel bus (eg ST7032i, ST7036i, ST7070, SSD1803, AIP31068, PCF211X, AC780). The enhanced TextLCD library supports some of these devices


quelques liens divers LCD I2C:

http://blog.f8asb.com/2014/03/01/mise-en-oeuvre-i2c-vers-lcd-carte-chinoise-sur-arduino/

http://workshopshed.com/2012/07/a-little-venture-with-electronics-lcd-diagnostics-and-software/


edit: comme dit au dessus LiquidCrystal_I2C.h (il faut paramétrer les pins)

Bonne chance !

JF
 
Dernière édition:
P
phil135
Compagnon
15 Sept 2012
1 548
france, essonne, nord
  • Auteur de la discussion
  • #8
mais justement je ne vois aucune notion de pin dans ma documentation, du coup je ne sais pas quoi faire de liquidcrystal_i2c puisque tous les exemples que je trouve passent par une assignation de pins
j'ai déjà trouvé les deux derniers liens, mais je n'arrive pas à transposer vers le cas de cet afficheur
il y a forcement un câblage interne mais je n'y ai pas accès: la seule chose que je trouve dans la doc (http://www.farnell.com/datasheets/2051102.pdf ) c'est des pins i2c (ça ok, je fais marcher le i2c scanner), une liste de registres de commandes et pour les emplacements des caractères, puis un tableau de codes de caractères. c'est surement suffisant pour des gens qui maitrisent bien i2c ... mais moi j'ai besoin d'un exemple de code de mise en œuvre


par contre je n'avais pas trouvé le premier lien vers textlcd-enhanced
je suis dans le cas évoqué à la fin de l'introduction : native i2c instead of parallel bus

l'exemple un peu compliqué donné à la fin semble être un assemblage de tous les cas, à charge pour moi d'en effacer ce qui ne me concerne pas, c'est ça ?
 
jpbbricole
jpbbricole
Compagnon
26 Mai 2016
2 244
Corsier-sur-Vevey (Vaud)
Salut phil135
Dans la doc PDF, chapitre 7 il y a
5 SDA. Sur Arduino Uno pin A4
6 SCL. Sur Arduino Uno pin A5
Si tu utilise une bibliothèque, tu te "fiches" de tout ces registres.
D'après la doc, l'adresse semble être 0x78(hexa)
Pour le paramétrage des fonctions de la bibliothèque:
LiquidCrystal_I2C lcd(0x78, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

Dans void setup()
lcd.begin(20,2);

Bonne nuit
jpbbricole
 
P
phil135
Compagnon
15 Sept 2012
1 548
france, essonne, nord
  • Auteur de la discussion
  • #10
l'adresse scannée n'est pas celle-ci mais c'est pas grave
20,2 ok je vois
le 2 1 0 4 5 6 7 3 positive de liquidcristal , c'est quoi exactement ? pour moi c'etait des identité de pins en sortie d'un module i2c addon
 
jpbbricole
jpbbricole
Compagnon
26 Mai 2016
2 244
Corsier-sur-Vevey (Vaud)
LiquidCrystal_I2C.h (il faut paramétrer les pins)
En fait non, ce n'est pas nécessaire, les liaisons I2C, SDA et SCL, sont déjà définies dans les Arduino comme expliqué ici.
Donc connues de la bibliothèque. Il faut uniquement indiquer l'adresse et Colonnes/Lignes.

Bonne journée (chez nous, très pluvieuse)
jpbbricole
 
P
phil135
Compagnon
15 Sept 2012
1 548
france, essonne, nord
  • Auteur de la discussion
  • #16
bonjour

je suis désolé mais je ne parviens pas à faire réagir l'afficheur avec ton code ci-dessus (post du 02-juillet 8h03)
mis à part que mon afficheur est en 0x3C est a 2 lignes de 20 caractères, c'est un code qui est censé fonctionner par lui-même (ce qu'il me semblait comprendre) ? ou faut-il ajouter des choses autour?

include wire n'a pas l'air d’être suivi d'appels... les appels sont à l'intérieur de liquidcrystal_i2c ?
 
jpbbricole
jpbbricole
Compagnon
26 Mai 2016
2 244
Corsier-sur-Vevey (Vaud)
Salut phil135
include wire n'a pas l'air d’être suivi d'appels...
dans les 4 exemples de la bibliothèque
upload_2016-7-4_12-18-8.png

il y a le couple
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

Ce que je crains le plus, c'est que ton affichage Midas "sorte" un peu du standard des bibliothèque Arduino pour les affichages LCD i2C comme celui-ci qui est un affichage LCD standard auquel on a ajouté un interface i2C parallèle.
C'est pour celà, que dans mon post du 02-juillet 13h55, je t'ai mis le lien pour des informations sur la paire Arduino Midas.

A bientôt
jpbbricole
 
P
phil135
Compagnon
15 Sept 2012
1 548
france, essonne, nord
  • Auteur de la discussion
  • #18
en effet , je ne suis pas dans le cas général des exemples arduino, en fait je suis surement plus proche d'un usage i2c direct mais je ne maitrise pas assez
 
P
phil135
Compagnon
15 Sept 2012
1 548
france, essonne, nord
  • Auteur de la discussion
  • #20
merci
je regarderai ça demain, mais je ne me souviens pas avoir vu de reset sur le lcd
pour moi ton lien vers la library ne marche pas, mais comme il y a son nom dans l'article ça devrait aller

en tout cas merci
i2c me semblait une simplification sympa... ça c'est avéré vrai pour le câblage, mais pour le soft :mad:
 
jpbbricole
jpbbricole
Compagnon
26 Mai 2016
2 244
Corsier-sur-Vevey (Vaud)
Salut phil135

C'est ici, milles excuses!

jpbbricole
 
P
phil135
Compagnon
15 Sept 2012
1 548
france, essonne, nord
  • Auteur de la discussion
  • #22
par ailleurs j'ai reçu quelques lignes de code de la part du fabricant de l'afficheur
pb: ça commence par un #include <reg51.h>
d'habitude je trouve les libraries dans des .zip à télécharger, mais là pas moyen, j'ai juste trouvé 2 3 personnes qui affichent un fichier texte
 
jpbbricole
jpbbricole
Compagnon
26 Mai 2016
2 244
Corsier-sur-Vevey (Vaud)
Est ce que c'est du code pour Arduino avec:
void setup()
et
void loop()

?
 
P
phil135
Compagnon
15 Sept 2012
1 548
france, essonne, nord
  • Auteur de la discussion
  • #24
pas tout à fait :eek:
ils m'auraient répondu à coté de la question ?
ci-dessous le copié collé de ce code. j'ai traduis le chinois avec google translate, et j'ai mis aussi en anglais car certaines fois la traduction française me semblait étrange
ta réponse me laisse penser que c'est peut-être simplement inutilisable (?)



//*************************************************************************************
//-----------------------------通用字符型LCM测试程序-----------------------------------
//-----------------Procédures d'essai LCD de caractère universel----------------------
//------------------Universal character LCD testing procedures-----------------------
//
// google translate from chinese, vers français , to english
//*************************************************************************************
//MCU: AT89C52
//LCD Drive: SPLC708D/S6A0069/KS0066U
//实用范围: Champ d'application: Scope:
//
//-------------------------------------------------------------------------------------
//创建时间: Créé: Created: 2005.11.14
//创建者: Créateur: creator: FDZ81
//--------------------------------------------------------------------------------------
#include <reg51.h>
//--------------------------------------------------------------------------------------
//LCM I/O定义: Définition i/o: I / O definition:
sbit RS = P3^5; //;DEFINE LCM WDATA/INSTRUCTION PIN
sbit RW = P3^6; //;DEFINE LCM READ/WRITE PIN
sbit E = P3^7; //;DEFINE LCM CHIP ENABLE PIN
#define KEY P2 //按键 bouton button
#define LCM_DATA P1 //;DEFINE LCM WDATA BUS PIN
#define DATA_TYPE_4BIT 0 //数据方式为4bit读写方式 Mode de données de 4 bits à lire et à écrire 4 bit data mode to read and write
#define DATA_TYPE_8BIT 1 //数据方式为8bit读写方式 Mode de données 8bit à lire et à écrire 8bit data mode to read and write
bit biDataType; //数据方式标志 Mode données drapeau Data mode flag
#define DEALY 2
//--------------------------------------------------------------------------------------
//延时程序 procédure de retard Delay procedure , cystal frequency = 12MHz
void Delay10Ms(unsigned char d)
{
unsigned int t;
while(d--)
{
t = 5000;
while(t--);
}
}
//======================================================================================
//忙查询并等待空闲 Occupé requête et attendre ralenti Busy query and wait for idle
void LCMBusyCheck(void)
{
LCM_DATA =0xff;
while (1)
{
RS = 0;
RW = 1;
E = 1;
if ((LCM_DATA & 0x80) == 0x00) break;
E = 0;
}
}
//======================================================================================
//写入指令 Ecrire instruction Write instruction
void LCMWriteCommand(unsigned char d)
{
char t = DEALY;

t = 10;
while(--t);
// LCMBusyCheck();
RS = 0; //选择指令寄存器 Sélectionnez le registre d'instruction Select the instruction register
RW = 0;
LCM_DATA = d;
while(--t);
E = 1; //写入 écrire Write
E = 0;
if (biDataType == DATA_TYPE_4BIT) //4位数据方式 Mode de données 4 Data mode 4
{
RS = 0; //选择指令寄存器 Sélectionnez le registre d'instruction Select the instruction register
RW = 0;
LCM_DATA = (d << 4);
t = DEALY;
while(t--);
E = 1; //写入 écrire Write
E = 0;
}
}
//======================================================================================
//写入数据 Ecrire des données Write data
void LCMWriteData(unsigned char d)
{
char t = DEALY;

t = 10;
while(--t);
// LCMBusyCheck();
RS = 1; //选择数据寄存器 Sélectionnez le registre de données Select the data register
RW = 0;
LCM_DATA = d;
while(t--);
E = 1; //写入 écrire Write
E = 0;
if (biDataType == DATA_TYPE_4BIT) //4位数据方式 Mode de données 4 Data mode 4
{
RS = 1; //选择数据寄存器 Sélectionnez le registre de données Select the data register
RW = 0;
LCM_DATA = (d << 4);
t = DEALY;
while(t--);
E = 1; //写入 écrire Write
E = 0;
}
}
//=======================================================================================
//上电时,不查询busy信号的写入指令方式 La mise sous tension, ne pas interroger le mode signal occupé de commande d'écriture On power-up, does not query the write command mode busy signal
void LCMWriteInitCommand(unsigned char d)
{
char t = DEALY;

RS = 0; //选择指令寄存器 Sélectionnez le registre d'instruction Select the instruction register
RW = 0;
LCM_DATA = d;
while(t--);
E = 1; //写入 écrire Write
E = 0;
if (biDataType == DATA_TYPE_4BIT) //4位数据方式 Mode de données 4 Data mode 4
{
RS = 0; //选择指令寄存器 Sélectionnez le registre d'instruction Select the instruction register
RW = 0;
LCM_DATA = d << 4;
t = DEALY;
while(t--);
E = 1; //写入 écrire Write
E = 0;
}
}
//======================================================================================
//LCM初始化 Initialisation
void LCMInit(void)
{
/*
Delay10Ms(3); //等待 attendez wait 30ms
LCMWriteInitCommand(0x30); //不查询busy写入指令 Pas une requête de commande d'écriture occupée Not Query busy writing command
Delay10Ms(3); //等待30ms Attendre 30ms wait 30 ms
LCMWriteCommand(0x30); //8bit数据方式 Mode de données 8bit 8bit data mode
Delay10Ms(3); //等待30ms Attendre 30ms wait
LCMWriteCommand(0x38); //8bit数据方式,2行显示 Mode de données 8bit, affichage 2 lignes 8bit data mode, 2-line display
Delay10Ms(3); //等待30ms Attendre wait 30ms
LCMWriteCommand(0x0c); //display on,cursor off,blinks off
Delay10Ms(3); //等待30ms Attendre wait 30ms
LCMWriteCommand(0x06); //cursor shift = increment
Delay10Ms(3); //等待30ms Attendre wait 30ms
LCMWriteCommand(0x01); //clear display
Delay10Ms(3); //等待30ms Attendre wait 30ms
*/
LCMWriteCommand(0x01); //clear display
Delay10Ms(1); //等待10ms,等待清零结束,否则如果立即写入显示数据,会造成第一行前面的字没显示 Attendez 10ms, attendez que la commande pour terminer, ou si les données d'affichage est écrit immédiatement, se traduira par la première rangée en face du mot n'a pas montré Wait 10ms, wait for the command to complete, or if the display data is written immediately, will result in the first row in front of the word did not show

if(!biDataType)
{
//4bit数据方式 Le mode de données 4bit 4bit data mode
LCMWriteInitCommand(0x20); //不查询busy写入指令 Pas une requête de commande d'écriture occupée Not Query busy writing command
Delay10Ms(1); //等待30ms Attendre wait 30ms
LCMWriteInitCommand(0x20); //不查询busy写入指令 Pas une requête de commande d'écriture occupée Not Query busy writing command
Delay10Ms(1); //等待30ms Attendre wait 30ms
LCMWriteCommand(0x20);
Delay10Ms(1); //等待30ms Attendre wait 30ms
LCMWriteCommand(0x28); //4bit数据方式,2行显示 Mode de données 4bit, affichage 2 lignes 4bit data mode, 2-line display
}
else
{
//8bit数据方式 Mode de données 8bit 8bit data mode
LCMWriteInitCommand(0x30); //不查询busy写入指令 Pas une requête de commande d'écriture occupée Not Query busy writing command
Delay10Ms(1); //等待30ms Attendre wait 30ms
LCMWriteInitCommand(0x30); //不查询busy写入指令 Pas une requête de commande d'écriture occupée Not Query busy writing command
Delay10Ms(1); //等待30ms Attendre wait 30ms
LCMWriteCommand(0x30);
Delay10Ms(1); //等待30ms Attendre wait 30ms
LCMWriteCommand(0x38); //8bit数据方式,2行显示 Mode de données 8bit, affichage 2 lignes 8bit data mode, 2-line display
}
LCMWriteCommand(0x0c); //display on,cursor off,blinks off
LCMWriteCommand(0x06); //cursor shift = increment

}
//======================================================================================
void LCMWriteExtendASIC(void)
{
unsigned char i;

for(i = 0xc0;i != 0;i++)
{
LCMWriteData(i);
}
}
//======================================================================================
//2个自定义字符的点阵数据写入CGRAM中 2 personnalisé caractères des données matricielles est écrit dans le CGRAM 2 custom-character dot-matrix data is written to the CGRAM
void LCMWriteMyChar(void)
{
unsigned char code disp1[8] = {0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f};
unsigned char code disp2[8] = {0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15};
unsigned char code disp3[8] = {0x1f,0x11,0x11,0x11,0x11,0x11,0x11,0x1f};

unsigned char i;

LCMWriteCommand(0x40); //Set 第一个 première First CGRAM address
for(i = 0;i <8;i++)
{
LCMWriteData(disp1); //写入自定义的点阵数据 Ecrire des données treillis personnalisé Write custom lattice data
}
LCMWriteCommand(0x48); //Set 第二个 deuxième second CGRAM address
for(i = 0;i <8;i++)
{
LCMWriteData(disp2); //写入自定义的点阵数据 Ecrire des données treillis personnalisé Write custom lattice data
}
LCMWriteCommand(0x50); //Set 第二个 deuxième second CGRAM address ?? devrait-elle etre "troisième" ? should it be "third" ?
for(i = 0;i <8;i++)
{
LCMWriteData(disp3); //写入自定义的点阵数据 Ecrire des données treillis personnalisé Write custom lattice data
}
//自定义符显示 Affichage de l'icône personnalisée Custom icon display
// LCMWriteCommand(0x80); //Set DDRAM address
// LCMWriteData(0); //第一个自定义字符在显存 Le premier caractère dans une mémoire personnalisée The first character in a custom memory DDRAM address = 0 中 dans in
// LCMWriteData(1); //第二个自定义字符在显存 Les seconds caractères personnalisés dans la mémoire The second custom characters in memory DDRAM address = 1 中 dans in
}
//======================================================================================
void main(void)
{
unsigned char i,j,d;
unsigned char ucDisplay[]=" Midas DIsplays ";
unsigned char ucDiffrenceChar[] = {0x61,0x71,0x81,0x91,0xa1,0xb1,0xc1,0xd1};

biDataType = DATA_TYPE_8BIT; //8位数据方式 Mode de données de 8 bits 8-bit data mode
// biDataType = DATA_TYPE_4BIT;
LCMInit();
LCMWriteMyChar(); //自定义字符点阵数据写入CGRAM Caractère personnalisé des données matricielles est écrit CGRAM Custom character dot-matrix data is written CGRAM
while(1)
{
//-----------------------------------------------
LCMWriteCommand(0x80); //点全显 Le tout était The whole point was
for(i=0;i<80;i++)
{
LCMWriteData(0);
}
Delay10Ms(11);
//-----------------------------------------------
LCMWriteCommand(0x01); //clear display
//
LCMWriteCommand(0x80); //写入8个特别选择的特征字符,作为区别不同字库 Écrit huit caractères caractéristique spécialement sélectionnés pour distinguer entre police différente Written eight specially selected characteristic character as to distinguish between different font
for(j=10;j!=0;j--)
{
for(i=0;i<8;i++)
{
LCMWriteData(ucDiffrenceChar);
}
}
Delay10Ms(11);
//-----------------------------------------------
LCMWriteCommand(0x80); //全显示“#” Affiche complet "#" Full displays "#"
for(i=0;i<80;i++)
{
LCMWriteData('#');
}
Delay10Ms(11);
//-----------------------------------------------
LCMWriteCommand(0x80); //全显示"$" Plein écran "$" Full Display "$"
for(i=0;i<80;i++)
{
LCMWriteData('$');
}
Delay10Ms(11);
//-----------------------------------------------
LCMWriteCommand(0x01); //clear display
//
LCMWriteCommand(0x80); //
LCMWriteExtendASIC(); //将扩展ASIC80个特征字符一次写入DDRAM Les étendues ASCII 80 caractères comportent l'écriture une fois DDRAM The extended ASCII 80 characters feature the write-once DDRAM
Delay10Ms(11);
}
}
 
P
phil135
Compagnon
15 Sept 2012
1 548
france, essonne, nord
  • Auteur de la discussion
  • #25
je suis revenu sur ton post du 04 juillet 17h03
mini modifs pour adapter à mon cas, j’obtiens:


/*
Hello World! for Midas LCD
*/
#include < ST7036.h >
//set the LCD address to 0x3C,
//20 chars and 2 line display
ST7036 lcd = ST7036 ( 2, 20, 0x3C );

void setup() {
lcd.init();
lcd.setCursor(0, 0);
lcd.print(Hello world);
}

void loop() {
}


et la compilation ne passe pas:

ATTENTION : La catégorie '' dans la bibliothèque FullIP n'est pas valide. Définition sur : 'Uncategorized'
ATTENTION : La catégorie '' dans la bibliothèque UIPEthernet n'est pas valide. Définition sur : 'Uncategorized'
D:\per\Documents\Arduino\forum_01\forum_01.ino:5:26: fatal error: ST7036.h : No such file or directory

#include < ST7036.h >

^

compilation terminated.

exit status 1
Error compiling for board Arduino/Genuino Uno.


ce que je ne comprends pas c'est que st7036 je viens de l'ajouter


bon, avec quelques tatonnements la compilation est acceptée
#include <lcd.h>
#include <LCD_C0220BiZ.h>
#include <ST7036.h>


/*
Hello World! for Midas LCD
*/
// #include <ST7036.h>

//set the LCD address to 0x3C,
//20 chars and 2 line display
ST7036 lcd = ST7036 ( 2, 20, 0x3C );

void setup() {
lcd.init();
lcd.setCursor(0, 0);
lcd.print("Hello world");
}

void loop() {
}

... mais rien sur l'écran
 
Dernière édition:
Haut