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
-
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:
#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);
}
-
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)
-
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:
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 :-\
-
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.
-
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.
-
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)
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)
-
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
-
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