• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino nano (Klon) - problem z magistralą I2C
#1
Cześć

Mam problem z połączeniem wyświetlacza LCD (16x2 z konwerterem hd44780) z magistralą I2C na klonie Arduino Nano.

Na płytce mam opis wyjść SDA i SCL odpowiednio na A4 i A5 (co zgadza się z wieloma schematami w sieci). Do w/w pinów doprowadziłem rezystory 10k podłączone pod linię 5V (próbowałem też 3V). Używając znalezionych w sieci przykładów kodu użycia wyświetlacza (typu Hello World) - wyświetlacz nadal nie chciał działać.

Poszukałem kawałka kodu do znalezienia adresu wyświetlacza jednak to nadal nie pomogło (Poczytałem i dowiedziałem się że mam chip na konwerterze od PCF8574T czyli od semiconductors więc brak lutu na zworkach oznacza adres 0x3F ale to nadal nic mi nie daje, poza wiedzą. Zlutowałem pierwszą zworkę by mieć 0x3E). Żaden adres nie został znaleziony a program cały czas próbował 'skanować' adresy jednak nawet po 10 minutach nic nie wynikło z tego.

Kod:
I2C Scanner
Scanning...

Znalazłem chyba na zagranicznym forum Arduino post gdzie ktoś polecił użycie biblioteki "hd44780" (czyli tej od konwertera) oraz jednego z przykładów "I2CexpDiag", który diagnozuje połączenia z I2C. Program wypluł taki zbitek informacji. 

Kod:
********************************************************************
Serial Initialized
--------------------------------------------------------------------
I2CexpDiag - i2c LCD i/o expander backpack diagnostic tool
--------------------------------------------------------------------
hd44780 lib version: 1.3.2
--------------------------------------------------------------------
Reported Arduino Revision: 1.8.13
CPU ARCH: AVR - F_CPU: 16000000
--------------------------------------------------------------------
SDA digital pin: 18 A4
SCL digital pin: 19 A5
--------------------------------------------------------------------
Checking for required external I2C pull-up on SDA - STUCK LOW
Checking for required external I2C pull-up on SCL - YES
********************************************************************
ERROR: SDA or SCL stuck pin
********************************************************************
I2C bus not usable

(W przypadku podpięcia 3V zamiast 5V do SDA i SCL problem z pullup znika jednak nie znajduje adresów, czyli jakby nadal nie działało)

Podobny problem mam pod Arduino Uno, czyżby uszkodzony wyświetlacz LCD? Większość przykładów w sieci podpina LCD z konwerterem pod UNO bez rezystorów (próbowałem i tak i tak) i to tam działa a mi nawet adresu (który znam) nie wyświetla.

Na zdjęciach Nano jest podpięte zasilaniem z zasilacza 12V a LCD z listwy 5V (również z zasilacza) tak samo jak rezystory. GND przeprowadzone z obu stron do Arduino. 

Czy ja gdzieś robię jakiś błąd? Czy może faktycznie LCD uszkodzone albo konwerter? Zamówiłem drugi aczkolwiek nie daje mi to spokoju i wolałbym wiedzieć.

Pozdrawiam. 

Z góry też przepraszam jeśli to złe miejsce, gdyż zastanawiałem się między 'Piaskownica' a 'Instalacja i rozwiązywanie problemów'


Załączone pliki Miniatury
       
 
Odpowiedź
#2
Jak skaner nic nie wykrywa to szukanie pasującej biblioteki nie ma większego sensu. Dla pewności użyłbym innego urządzenia na I2C by wyeliminować wadę od strony Arduino, czy może jakiś błędny kod skanera. Ja używam tego, możesz sprawdzić dla pewności:
Kod:
/**
* I2CScanner.ino -- I2C bus scanner for Arduino
*
* 2009,2014, Tod E. Kurt, http://todbot.com/blog/
*
*/

#include "Wire.h"
extern "C" {
#include "utility/twi.h"  // from Wire library, so we can do bus scanning
}

// Scan the I2C bus between addresses from_addr and to_addr.
// On each address, call the callback function with the address and result.
// If result==0, address was found, otherwise, address wasn't found
// (can use result to potentially get other status on the I2C bus, see twi.c)
// Assumes Wire.begin() has already been called
void scanI2CBus(byte from_addr, byte to_addr,
                void(*callback)(byte address, byte result) )
{
  byte rc;
  byte data = 0; // not used, just an address to feed to twi_writeTo()
  for( byte addr = from_addr; addr <= to_addr; addr++ ) {
    rc = twi_writeTo(addr, &data, 0, 1, 0);
    callback( addr, rc );
  }
}

// Called when address is found in scanI2CBus()
// Feel free to change this as needed
// (like adding I2C comm code to figure out what kind of I2C device is there)
void scanFunc( byte addr, byte result ) {
  Serial.print("addr: ");
 
  Serial.print(addr,DEC);
  Serial.print(", hex: ");
  Serial.print(addr,HEX);
  Serial.print( (result==0) ? " found!":"       ");
  Serial.print( (addr%4) ? "\t":"\n");
}


byte start_address = 8;       // lower addresses are reserved to prevent conflicts with other protocols
byte end_address = 119;       // higher addresses unlock other modes, like 10-bit addressing

// standard Arduino setup()
void setup()
{
    Wire.begin();

    Serial.begin(115200);                   // Changed from 19200 to 9600 which seems to be default for Arduino serial monitor
    Serial.println("\nI2CScanner ready!");

    Serial.print("starting scanning of I2C bus from ");
    Serial.print(start_address,DEC);
    Serial.print(" to ");
    Serial.print(end_address,DEC);
    Serial.println("...");

    // start the scan, will call "scanFunc()" on result from each address
    scanI2CBus( start_address, end_address, scanFunc );

    Serial.println("\ndone");
   
    // Set pin mode so the loop code works ( Not required for the functionality)
    pinMode(13, OUTPUT);
}

// standard Arduino loop()
void loop()
{
    // Nothing to do here, so we'll just blink the built-in LED
    digitalWrite(13,HIGH);
    delay(300);
    digitalWrite(13,LOW);
    delay(300);
}

Moduły "arduinowe" zwykle mają rezystor między VCC i liniami I2C, dla pewności można odłączyć wszystko od zasilania i zmierzyć rezystancję między VCC i SDA, to samo dla VCC i SCL. Sprawdzanie czy zadziała z 3V czy 5V nie ma sensu, ma być rezystor do pinu zasilania VCC, nie robi się innego poziomu napięć na liniach komunikacyjnych.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Sprawdzałem to samo na Uno, bo też mam płytkę i jest podobnie, LCD nie działa. Być może to właśnie LCD jest uszkodzone. Co do innych urządzeń na I2C to nie posiadam.

A z tego Twojego kodu dostaję śmieci na monitorze

Kod:
⸮a⸮⸮⸮⸮⸮⸮⸮0⸮⸮⸮⸮⸮⸮⸮J⸮B⸮

Też nie wczytywałem się w kod by zgłębić to skąd się pojawiają te krzaczki, ale skoro mówisz, że działa u Ciebie wierzę na słowo, że powinno przy poprawnym działaniu pokazać poprawnie adres 0x3E zamiast w/w
 
Odpowiedź
#4
(17-01-2021, 23:13)5n0w napisał(a): Sprawdzałem to samo na Uno, bo też mam płytkę i jest podobnie, LCD nie działa. Być może to właśnie LCD jest uszkodzone. Co do innych urządzeń na I2C to nie posiadam.

A z tego Twojego kodu dostaję śmieci na monitorze

Kod:
⸮a⸮⸮⸮⸮⸮⸮⸮0⸮⸮⸮⸮⸮⸮⸮J⸮B⸮

Też nie wczytywałem się w kod by zgłębić to skąd się pojawiają te krzaczki, ale skoro mówisz, że działa u Ciebie wierzę na słowo, że powinno przy poprawnym działaniu pokazać poprawnie adres 0x3E zamiast w/w
A jaką masz ustawioną prędkość na monitorze. Domyślnie ustawienia to 9600 a w kodzie masz 115200. Pewnie tu jest pies pogrzebany, czyli krzaczki.
 
Odpowiedź
#5
(18-01-2021, 08:13)Agregacik napisał(a):
(17-01-2021, 23:13)5n0w napisał(a): Sprawdzałem to samo na Uno, bo też mam płytkę i jest podobnie, LCD nie działa. Być może to właśnie LCD jest uszkodzone. Co do innych urządzeń na I2C to nie posiadam.

A z tego Twojego kodu dostaję śmieci na monitorze

Kod:
⸮a⸮⸮⸮⸮⸮⸮⸮0⸮⸮⸮⸮⸮⸮⸮J⸮B⸮

Też nie wczytywałem się w kod by zgłębić to skąd się pojawiają te krzaczki, ale skoro mówisz, że działa u Ciebie wierzę na słowo, że powinno przy poprawnym działaniu pokazać poprawnie adres 0x3E zamiast w/w
A jaką masz ustawioną prędkość na monitorze. Domyślnie ustawienia to 9600 a w kodzie masz 115200. Pewnie tu jest pies pogrzebany, czyli krzaczki.


Jeżu, faktycznie zapomniałem o baud rate... Pomijając tutaj ewidentnie moje niedopatrzenie to skrypt zachowuje się tak jak każdy inny skaner portów, czyli nie pokazuje mi nic

Kod:
I2CScanner ready!
starting scanning of I2C bus from 8 to 119...

Jutro dojdzie do mnie drugi LCD na I2C i chyba nie od semiconductors tylko drugiego dostawcy, zobaczę czy tamto zadziała bo nie wykluczam iż to właśnie LCD jest uszkodzone a ja szukam błędu we wszystkim.

Dzięki za zwrócenie uwagi na baud rate, jakoś uznałem że wszyscy ciągną na 9600 Wink
 
Odpowiedź
#6
Wyświetlacz ma kropki, wiec raczej nie uszkodzony czeka na dane, podejrzewam że albo coś z lutowaniem PCF8574T albo cos nie łączy....

Zapodaj dokładne zdjecia LCD i PCF8574T
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości