Codice da ST Nucleo a Arduino

Salve a tutti, sono venuto in possesso di un pcb controllato da un St Nucleo, in questo pcb ci sono dei moltiplicatori di uscita MCP23008 che controllano dei relè e altri ingressi, i MCP23008 sono controllati via I2C mediante i pin D14 e D15 di Arduino.
Volevo sostituire st nucleo, difficile da programmare per le mie competenze, con arduino Uno.
Ho il listato di ST Nucleo dove si accende e si spegne un relè ma pur riportando i dati in un esempio di Arduino non riesco a controllare nulla.
Di seguito vi inoltro stralcio della programmazione ST Nucleo e successivamente l'esempio di arduino
Grazie mille

//* USER CODE BEGIN 0 
//Slave MCP23008 address: 0b0100 010(R/W) 0x44

#define MCP23008_ADDR 0x44

//* USER CODE BEGIN 2 */

unsigned char data[2];


// Write 0x00 to IODIR (address 0x00): Set all pin as outputs
 
 data[0] = 0x00;
 data[1] = 0x00;
 HAL_I2C_Master_Transmit(&hi2c1,MCP23008_ADDR,data,2,10);

// USER CODE BEGIN 3 
// Write 0x81 to GPIO (address 0x09): Set PIN0 and PIN7 high

 data[0] = 0x09;
 data[1] = 0x81;
 HAL_I2C_Master_Transmit(&hi2c1,MCP23008_ADDR,data,2,100);
 HAL_Delay(1000);

// Write 0x00 to GPIO (address 0x09): Set all pin low

 data[0] = 0x09;
 data[1] = 0x00;
 HAL_I2C_Master_Transmit(&hi2c1,MCP23008_ADDR,data,2,100);
 HAL_Delay(1000);
 
 /* USER CODE END 3 */

questo invece quello di arduino, questo è l'originale ho cambiato gli addii e i Wire.write() ma non funziona.

// MCP23008_I2CR8G5LE I2C address is 0x20(32)
#define Addr 0x20

void setup()
{
  // Initialise I2C communication as MASTER
  Wire.begin();
  // Initialise serial communication, set baud rate = 9600
  Serial.begin(9600);

  // Start I2C Transmission
  Wire.beginTransmission(Addr);
  // Select IODIR register
  Wire.write(0x00);
  // All pins are configured as outputs
  Wire.write(0x00);
  // Stop I2C transmission
  Wire.endTransmission();
  delay(300);
}

void loop()
{

  // Start I2C Transmission
  Wire.beginTransmission(Addr);
  // Select GPIO register
  Wire.write(0x09);
  // All pins are set to logic HIGH
  Wire.write(0xFF);
  // Stop I2C transmission
  Wire.endTransmission();

  // Output data to serial monitor
  Serial.println("Turning all Relays of Port-A ON");
  delay(500);
}

... e perché il codice ST non lo avresti racchiuso nei tag CODE ? ? ? :o :o :o

Guglielmo

fatto.. scusate non ci avevo pensato

... basta ... CLICK ... e trovi tutto fatto :grinning:

Guglielmo

La ricerca su google è la prima che ho fatto, ho scaricato molti codici di esempio, la seconda ricerca che ho fatto è su questo forum, lo faccio sempre prima di scrivere un topic, credimi sono giorni che ci provo ma nulla....

Purtroppo non ho avuto i risultati sperati il relè non si eccita sicuramente sbaglio qualche addr non lo so ma con il codice postato di nucleo funziona e con quello di arduino (in quello postato ho omesso solo#include <Wire.h>) non funziona ho cambiato molti parametri ma nulla....

ho provato anche vari scan I2C per trovare l'indirizzo ma non leggono nulla

marchino283:
ho provato anche vari scan I2C per trovare l'indirizzo ma non leggono nulla

Se lo scanner NON trova nulla hai sbagliato i collegamneti ...
... hai messo le resistenze di pull-up sul bus I2C ? Con Arduino sono obbligatorie ... magari sulla scheda a cui era collegato c'erano già a bordo.

Guglielmo

Altra cosa ... la scheda che stai cercando di collegare, è fatta per lavorare con i 5V di Arduino ? Perché le nucleo, se ben ricordo, lavorano a 3.3V ... ::slight_smile:

Guglielmo

nel pcb si può scambiare le schede nucleo oppure arduino uno, ho controllato le resistenze in uscita dai pin 14 e 15 ci sono, forse è l'uso di questi pins il problema? (non usa A0 e A1)
dal listato di st nucleo scrive di ADDR 0x44 e poi:

HAL_I2C_Master_Transmit(&hi2c1,MCP23008_ADDR,data,2,10);

dopo "data, 2..." dato che ci sono più mcp23008 nel pcb potrebbe essere quel 2 identifica un'altro indirizzo?

ma come posso inserirlo in arduino?

dimenticavo, il pcb è alimentato dall'esterno con 12 Volt

Pin 14 e 15 ... cosa intendi ? Quali pin sulle headers di Arduino ?

Perché il bus I2C lo hai esclusivamente sui pin A4/A5 e, lo stesso (semplicemente i due pin sono riportati anche da un'altra parte), ripetuto sui pin SCL/SDA che si trovano, dopo Digital13, GND, AREF.

Lo scanner lo DEVE rilevare, dopo di che, con la libreria Adafruit lo puoi sicuramente controllare ... ci sono decine e decine di progetti con quell'integrato, NON è nulla di particolare, quindi ... può SOLO essere un tuo errore di collegamento.

Guglielmo

i pin che intendevo sono proprio quelli indicati da te dopo AREF... ora ricontrollo il tutto.. ma non capisco perché con nucleo funziona.... se fossero i collegamenti non troverebbe neanche nucleo l'indirizzo e quindi il relè..

Hai per caso un link a questa scheda ? E' una scheda commerciale o è una scheda "custom" che non si trova ?

Guglielmo

è custom non si trova me l'ha regalata un mio amico che l'ha ricevuta a sua volta da uno studente etc etc... chissà .....comunque ora provo a vedere bene i collegamenti...

Salve, scusate il ritardo nella risposta, ho dovuto aspettare la risposta di un elettronico che appunto mi ha confermato che ci sono le resistenze di pull up da 10k(cod 103 smd) da SLC e SDA a gnd.
Non capisco perché con st nucleo funziona e con arduino no e usando un programma scanner i2c non trova nulla.

Foto ?

Eccola ma non credo sia di aiuto...

scusate...

Dalla serigrafia il pcb è fatto per Arduino Uno, però... pare modificata, no ? Quei fili grigi volanti.

Per quanto riguarda i fili, una parte vanno a integrati per controllare dei motori DC(non ci ho ancora guardato).
Quello più lungo va a un integrato per la lettura di una sonda K e questa funziona, anzi tutto quello che è collegato direttamente a delle uscite arduino funziona.
Quello che non riesco a far funzionare è tutto quello collegato via I2C che sono un display lcd dei relè e altre cose tipo i motori che come ho già detto non ho ancora guardato...
Non riesco a far andare i relè e neppure lcd non trovo nessun addr, quello che non mi quadra è che con st nucleo(hanno i pin di arduino) i relè funzionano ho postato anche il codice.