LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: LuísR.A. em 10 de Maio de 2013, 19:44

Título: Enviar bytes por I2C
Enviado por: LuísR.A. em 10 de Maio de 2013, 19:44
Preciso de enviar varios bytes para uma ponte H para a controlar.
Mas não tou conseguir. Tenho de enviar algo do genero:
http://botnroll.com/omni3md/downloads/I2C%20Commands%20for%20OMNI-3MD%20and%20OMNI-3MDMAX%20V1.06.pdf (http://botnroll.com/omni3md/downloads/I2C%20Commands%20for%20OMNI-3MD%20and%20OMNI-3MDMAX%20V1.06.pdf)

Tentei:
 
Código: [Seleccione]
#include <Wire.h>

void setup()
{
  Wire.begin(); // join i2c bus (address optional for master)
}



void loop()
{
  Wire.beginTransmission(0x18);
  Wire.write(byte(0x7A));     //Endereço para controlar um motor sem PID 
  Wire.write(byte(0x01));     //Escolha de motor
  Wire.write(byte(0x01));     //Escolha da direção do motor
  Wire.write(byte(0x32));     //Escolha da velocidade(100)
  Wire.endTransmission();    // stop transmitting


  delay(500);
}
Título: Re: Enviar bytes por I2C
Enviado por: dropes em 10 de Maio de 2013, 20:58
Assim não vais lá, tens bastantes exemplos em arduino no site além do manual.

#include <Wire.h>                   // required by Omni3MD.cpp
#include <Omni3MD.h>
//constants definitions
#define OMNI3MD_ADDRESS 0x30        // default factory address

Na página 8 do manual tem descrito o modo de comunicação:
http://botnroll.com/omni3md/downloads/Manual%20OMINI3-MD(18-07-2011).pdf (http://botnroll.com/omni3md/downloads/Manual%20OMINI3-MD(18-07-2011).pdf)
Título: Re: Enviar bytes por I2C
Enviado por: LuísR.A. em 10 de Maio de 2013, 23:44
Eu quero usar apenas envios simples sem usar a biblioteca especifica da placa pois tambem quero implementar isto noutro uControlador (tentei adaptar a biblioteca mas não funcionou).

Já fiz algo do genero nuns basics que encontrei por ai escondidos logo à primeira pois as rotinas são mesmo do tipo: adress, comand, send byte, send byte...etc

Mas fizes-te me lembrar algo. O arduino funciona apenas com endereços de 7bits e não de 8bits por isso fiz estas alterações:

Código: [Seleccione]
byte data[3]={1,1,100};
#include <Wire.h>

void setup()
{
  Wire.begin(); // join i2c bus (address optional for master)
}



void loop()
{
  Wire.beginTransmission(0x18); // transmit to device #4
  Wire.write(0x00);
  Wire.write(0xF4);
  Wire.write(data,3);        // sends five bytes
  Wire.endTransmission();    // stop transmitting

  delay(500);
}

Só poderei confirmar com sorte amanha  :-\
Título: Re: Enviar bytes por I2C
Enviado por: senso em 11 de Maio de 2013, 00:48
i2c é 7 bits, ou 10bits, no caso dos 7 bits, se te derem um endereço de 8 bits, tens de fazer um shift á direita, porque o bit menos significativo do endereço é normalmente definido pelo que queres fazer, porque ele é quem diz ao slave se vais fazer uma leitura ou uma escrita.
Título: Re: Enviar bytes por I2C
Enviado por: senso em 11 de Maio de 2013, 00:50
Presumo que não tenhas lido o pdf que o dropes deixou, porque isto está lá:

ADDRESS:
É o campo do endereço I2C. Este primeiro byte contém os 7bits do endereço I2C e o oitavo bit, o menos significativo, define se a trama é de escrita ou de leitura. Se o bit menos significativo do campo endereço for 0 (zero), a trama é de escrita e o valor do byte é 0x30. Se o bit for 1 a trama é de leitura e o valor do byte é 0x31.
Título: Re: Enviar bytes por I2C
Enviado por: LuísR.A. em 11 de Maio de 2013, 12:15
Presumo que não tenhas lido o pdf que o dropes deixou, porque isto está lá:

ADDRESS:
É o campo do endereço I2C. Este primeiro byte contém os 7bits do endereço I2C e o oitavo bit, o menos significativo, define se a trama é de escrita ou de leitura. Se o bit menos significativo do campo endereço for 0 (zero), a trama é de escrita e o valor do byte é 0x30. Se o bit for 1 a trama é de leitura e o valor do byte é 0x31.

Li isso sim por isso é que meti a seguir a mandar um byte. O problema é que na biblioteca wire diz que se escrever um endereço de 8bits que é cortado o ultimo bit e assim torna-se 7bits
http://arduino.cc/de/Reference/Wire (http://arduino.cc/de/Reference/Wire)



Citar
The Wire library requires addresses which do not include the R/W bit. Based only on the datasheet, you might conclude the address is 160 when writing and 161 when reading. The Wire library needs address 80 to communicate with this chip. The R/W bit is automatically created based on your use of the send or receive functions
http://www.pjrc.com/teensy/td_libs_Wire.html (http://www.pjrc.com/teensy/td_libs_Wire.html)
Título: Re: Enviar bytes por I2C
Enviado por: Njay em 11 de Maio de 2013, 13:00
Essa sena dos 7/8 bits refere-se ao endereço *do dispositivo*, mas tu mantiveste-o igual:

Wire.beginTransmission(0x18); // transmit to device #4
Título: Re: Enviar bytes por I2C
Enviado por: LuísR.A. em 11 de Maio de 2013, 13:18
Essa sena dos 7/8 bits refere-se ao endereço *do dispositivo*, mas tu mantiveste-o igual:

Wire.beginTransmission(0x18); // transmit to device #4

Pois no PDF refere-se a "0x18 0" = 0x30. sendo 0x18 o endereço e 0x30 o endereço + o bit de write.
A biblioteca Wire apenas aceita a parte do endereço sem o bit de write/read. Por isso é que uso so 0x18. Já nos SRF tenho de retirar o ultimo bit