LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: Joel em 04 de Novembro de 2013, 10:09

Título: [dúvida] mudar endereço SRF02 I2C
Enviado por: Joel em 04 de Novembro de 2013, 10:09
Bom dia,

Eu estou a fazer um rôbo em que vou utilizar 4 motores e 4 sonares SRF02 , para isso tenho que mudar os endereços dos sonares, já procurei códigos para conseguir mudar os endereços mas nao tive sucesso com isso, pois da-me sempre este erro :
sketch_nov04a:8: error: expected ',' or '...' before numeric constant
sketch_nov04a:20: error: expected ',' or '...' before numeric constant

já tentei procurar em foruns e nao encontro explicação para este erro.

tenho-me baseado nestas ligações, e tambem ja usei o código que esta no final da página mas o erro é sempre o mesmo:
http://arduino.cc/en/Tutorial/SFRRangerReader (http://arduino.cc/en/Tutorial/SFRRangerReader)

já agora o código que tenho tentado usar para mudar os endereços é o seguinte:

Código: [Seleccione]
#include "Wire.h"


//byte x, y;
int currentDeviceId = 0x70;
int newDeviceId = 0x71;

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  configureDeviceId;
}

void loop()
{
Serial.println(0x71);
}

void configureDeviceId(int 0x70, int 0x71)
{
      Wire.beginTransmission(0x70);
      Wire.write(0);
      Wire.write(0xA0);
      Wire.endTransmission();
      Wire.beginTransmission(0x70);
      Wire.write(0);
      Wire.write(0xAA);
      Wire.endTransmission();
      Wire.beginTransmission(0x70);
      Wire.write(0);
      Wire.write(0xA5);
      Wire.endTransmission();
      Wire.beginTransmission(0x70);
      Wire.write(0);
      Wire.write(0x71);
      Wire.endTransmission();
}

Desde já obrigado.
Título: Re: [dúvida] mudar endereço SRF02 I2C
Enviado por: tarquinio em 04 de Novembro de 2013, 14:17
Isto n é assim:
Código: [Seleccione]
void configureDeviceId(int 0x70, int 0x71)

Tens de dar nomes aos parametros, e por or valores no setup(), onde a função está a ser chamada.
Título: Re: [dúvida] mudar endereço SRF02 I2C
Enviado por: Joel em 04 de Novembro de 2013, 15:27
Boa tarde, desde ja obrigado por me teres respondido

será que pudias deixar aqui o código de exemplo para o fazer?
Título: Re: [dúvida] mudar endereço SRF02 I2C
Enviado por: tarquinio em 04 de Novembro de 2013, 19:46
Agora é que fui ver o código que estava na página...
Estava lá isto:
Código: [Seleccione]
// The following code changes the address of a Devantech Ultrasonic Range Finder (SRF10 or SRF08)
// usage: changeAddress(0x70, 0xE6);

void changeAddress(byte oldAddress, byte newAddress)
{
  Wire.beginTransmission(oldAddress);
  Wire.write(byte(0x00));
  Wire.write(byte(0xA0));
  Wire.endTransmission();

  Wire.beginTransmission(oldAddress);
  Wire.write(byte(0x00));
  Wire.write(byte(0xAA));
  Wire.endTransmission();

  Wire.beginTransmission(oldAddress);
  Wire.write(byte(0x00));
  Wire.write(byte(0xA5));
  Wire.endTransmission();

  Wire.beginTransmission(oldAddress);
  Wire.write(byte(0x00));
  Wire.write(newAddress);
  Wire.endTransmission();
}

Este código está bem o que fizeste mal foi trocar os valores todos fa função em vez dea  usares bem... É melhor dares uma olhadela sobre como funcionam as funções antes de te meteres em aventuras mais complicadas.

Neste caso basta fazeres no setup() algo do tipo:
Código: [Seleccione]
configureDeviceId(0x70, 0x71)
É so fazeres isto e alterar os enderecos novos para cada sensor.
Título: Re: [dúvida] mudar endereço SRF02 I2C
Enviado por: Joel em 05 de Novembro de 2013, 09:26
Código: [Seleccione]
#include "Wire.h"

void setup()
{
  Wire.begin();                // join i2c bus (address optional for master)
  Serial.begin(9600);         
  configureDeviceId(0x70, 0x71);
}

void changeAddress(byte oldAddress, byte newAddress)
{
  Wire.beginTransmission(oldAddress);
  Wire.write(byte(0x00));
  Wire.write(byte(0xA0));
  Wire.endTransmission();

  Wire.beginTransmission(oldAddress);
  Wire.write(byte(0x00));
  Wire.write(byte(0xAA));
  Wire.endTransmission();

  Wire.beginTransmission(oldAddress);
  Wire.write(byte(0x00));
  Wire.write(byte(0xA5));
  Wire.endTransmission();

  Wire.beginTransmission(oldAddress);
  Wire.write(byte(0x00));
  Wire.write(newAddress);
  Wire.endTransmission();
}


Ja tentei fazer o que disses-te e da-me este erro :

sketch_nov04a.ino: In function 'void setup()':
sketch_nov04a:7: error: 'configureDeviceId' was not declared in this scope

Título: Re: [dúvida] mudar endereço SRF02 I2C
Enviado por: tarquinio em 05 de Novembro de 2013, 13:15
Errmmm... Os nomes das funções não estão iguais, é normal ele não encontrar...
A função que está na página chama-se changeAddress, no teu código chamaste-lhe configureDeviceId, é normal ele não encontrar... Podes usar o nome que quiseres, tens é de usar sempre o mesmo em todo o lado!
Título: Re: [dúvida] mudar endereço SRF02 I2C
Enviado por: Joel em 05 de Novembro de 2013, 14:00
Ja percebi esse meu erro, obrigado,
mas continua a nao me deixar quando mudo os endereços do sonar,
da-me estes erros agora:

sketch_nov04a.ino: In function 'void setup()':
sketch_nov04a:7: error: 'configureDeviceId' was not declared in this scope
sketch_nov04a.ino: At global scope:
sketch_nov04a:48: error: variable or field 'configureDeviceId' declared void


o código é este
Código: [Seleccione]
#include "Wire.h"

void setup()
{
  Wire.begin();                // join i2c bus (address optional for master)
  Serial.begin(9600);         
  configureDeviceId(0x00, 0x01);
}
int reading=0;
void loop()
{
 
  // step 1: instruct sensor to read echoes
  Wire.beginTransmission(112); // transmit to device #112 (0x70)
                               // the address specified in the datasheet is 224 (0xE0)
                               // but i2c adressing uses the high 7 bits so it's 112
  Wire.write(byte(0x00));      // sets register pointer to the command register (0x00) 
  Wire.write(byte(0x50));      // command sensor to measure in "inches" (0x50)
                               // use 0x51 for centimeters
                               // use 0x52 for ping microseconds
  Wire.endTransmission();      // stop transmitting

  // step 2: wait for readings to happen
  delay(70);                   // datasheet suggests at least 65 milliseconds

  // step 3: instruct sensor to return a particular echo reading
  Wire.beginTransmission(112); // transmit to device #112
  Wire.write(byte(0x02));      // sets register pointer to echo #1 register (0x02)
  Wire.endTransmission();      // stop transmitting

  // step 4: request reading from sensor
  Wire.requestFrom(112, 2);    // request 2 bytes from slave device #112

  // step 5: receive reading from sensor
  if(2 <= Wire.available())    // if two bytes were received
  {
    reading = Wire.read();  // receive high byte (overwrites previous reading)
    reading = reading << 8;    // shift high byte to be high 8 bits
    reading |= Wire.read(); // receive low byte as lower 8 bits
    Serial.println(reading);   // print the reading
  }

  delay(250);                  // wait a bit since people have to read the output :)

}


void configureDeviceId (byte( 0x00), byte (0x01))
{
  Wire.beginTransmission(0x00);
  Wire.write(byte(0x00));
  Wire.write(byte(0xA0));
  Wire.endTransmission();

  Wire.beginTransmission(0x00);
  Wire.write(byte(0x00));
  Wire.write(byte(0xAA));
  Wire.endTransmission();

  Wire.beginTransmission(0x00);
  Wire.write(byte(0x00));
  Wire.write(byte(0xA5));
  Wire.endTransmission();

  Wire.beginTransmission(0x00);
  Wire.write(byte(0x00));
  Wire.write(0x01);
  Wire.endTransmission();
}

e mesmo que meta os endereços 0x70 e 0x71 da o mesmo erro.
Título: Re: [dúvida] mudar endereço SRF02 I2C
Enviado por: tarquinio em 05 de Novembro de 2013, 14:09
Tão assim voltas exactamente ao que tinhas no início...
A função tem de ser exactamente como está no site, o único problema que tinha era que estavas a usar dois nomes diferentes para a mesma coisa. No site chama-se changeAddress e tu estavas a usar configureDeviceId... Era só ter mudado o nome.
Título: Re: [dúvida] mudar endereço SRF02 I2C
Enviado por: Joel em 05 de Novembro de 2013, 14:20
e no sitio em que esta oldadrress and newaddress nao tenho que meter os novos endereços? basta deixar como esta?
Título: Re: [dúvida] mudar endereço SRF02 I2C
Enviado por: tarquinio em 05 de Novembro de 2013, 14:32
A função fica exactamente como está, os valores colocas no sítio onde a função é chamada (no setup() ).

Antes de avancares eu sugeria fazeres algum tutorial para perceberes como funcionam as funções no geral, senão vais estar sempre um bocado às escuras sem saber o que estás a fazer.
Título: Re: [dúvida] mudar endereço SRF02 I2C
Enviado por: Joel em 05 de Novembro de 2013, 14:40

sketch_nov04a.ino: In function 'void setup()':
sketch_nov04a:7: error: 'configureDeviceId' was not declared in this scope

da-me este erro
Título: Re: [dúvida] mudar endereço SRF02 I2C
Enviado por: tarquinio em 05 de Novembro de 2013, 14:51
Sem ver o código todo, imagino que continues com os nomes trocados...
A função que está no site chama-se changeAddress. No teu código estás a chamar-lhe configureDeviceId... Mais uma vez, podes chamar-lhe o nome que quiseres , mas tem de ser sempre o mesmo! Ou mudas o nome da função do site para configureDeviceId, ou mudas o que tens no setup para changeAddress.
Título: Re: [dúvida] mudar endereço SRF02 I2C
Enviado por: Joel em 05 de Novembro de 2013, 14:56
eu ja tinha mudado mas tive que ir buscar o código outra vez e esqueci-me de mudar , eu vou testar o código amanha a ver se ja da, obrigado pela ajuda
Título: Re: [dúvida] mudar endereço SRF02 I2C
Enviado por: Joel em 06 de Novembro de 2013, 09:08
Código: [Seleccione]
#include "Wire.h"

void setup()
{
  Wire.begin();                // join i2c bus (address optional for master)
  Serial.begin(9600);         
  configureDeviceId(0x00, 0x01);
}
int reading=0;
void loop()
{
 
  // step 1: instruct sensor to read echoes
  Wire.beginTransmission(112); // transmit to device #112 (0x70)
                               // the address specified in the datasheet is 224 (0xE0)
                               // but i2c adressing uses the high 7 bits so it's 112
  Wire.write(byte(0x00));      // sets register pointer to the command register (0x00) 
  Wire.write(byte(0x51));      // command sensor to measure in "inches" (0x50)
                               // use 0x51 for centimeters
                               // use 0x52 for ping microseconds
  Wire.endTransmission();      // stop transmitting

  // step 2: wait for readings to happen
  delay(70);                   // datasheet suggests at least 65 milliseconds

  // step 3: instruct sensor to return a particular echo reading
  Wire.beginTransmission(112); // transmit to device #112
  Wire.write(byte(0x02));      // sets register pointer to echo #1 register (0x02)
  Wire.endTransmission();      // stop transmitting

  // step 4: request reading from sensor
  Wire.requestFrom(112, 2);    // request 2 bytes from slave device #112

  // step 5: receive reading from sensor
  if(2 <= Wire.available())    // if two bytes were received
  {
    reading = Wire.read();  // receive high byte (overwrites previous reading)
    reading = reading << 8;    // shift high byte to be high 8 bits
    reading |= Wire.read(); // receive low byte as lower 8 bits
    Serial.println(reading);   // print the reading
  }

  delay(250);                  // wait a bit since people have to read the output :)

}


void configureDeviceId (byte oldAddress, byte newAddress)
{
  Wire.beginTransmission(oldAddress);
  Wire.write(byte(0x00));
  Wire.write(byte(0xA0));
  Wire.endTransmission();

  Wire.beginTransmission(oldAddress);
  Wire.write(byte(0x00));
  Wire.write(byte(0xAA));
  Wire.endTransmission();

  Wire.beginTransmission(oldAddress);
  Wire.write(byte(0x00));
  Wire.write(byte(0xA5));
  Wire.endTransmission();

  Wire.beginTransmission(oldAddress);
  Wire.write(byte(0x00));
  Wire.write(newAddress);
  Wire.endTransmission();
}

Ja nao me da erro no código mas apos eu mandar o programa o sonar nao lê os valores ,nao assume o endereço que lhe defini,

alguem sabe o porque?
nao deveria assumir o novo endereço?

obrigado
Título: Re: [dúvida] mudar endereço SRF02 I2C
Enviado por: tarquinio em 06 de Novembro de 2013, 22:29
De onde é que apareceram agora estes valores 00 e 01?
Código: [Seleccione]
configureDeviceId(0x00, 0x01);

Assumindo que o teu sensor é exactamente o que aparece no tutorial, o valor inicial tem de ser o valor inicial do sensor, neste caso 0x70. O segundo valor é o valor do novo endereço, que não sei se pode ser um valor qualquer ou se terá de estar dentro de certos limites, tens de ver os valores possíveis.

E depois no loop, se mudaste o endereço do sensor, tens de fazer as transmissões sempre para o endereço novo, o antigo já não está a receber nada.

O código que tens actualmente está a dizer para mudar o endereço de 0x00 para 0x01, e depois estás a mandar ler as coisas à mesma do endereço 0x70 (que é o mesmo que 112 em decimal)
Título: Re: [dúvida] mudar endereço SRF02 I2C
Enviado por: Joel em 08 de Novembro de 2013, 09:56
Foi o meu Professor que descobriu como se mudava os endereços ,que tambem é membro deste Forum com o username Gadelhas.

Basicamente ele é o rei e Obrigado :p

É muito ano :D
Título: Re: [dúvida] mudar endereço SRF02 I2C
Enviado por: gadelhas em 08 de Novembro de 2013, 10:22
Foi o meu Professor que descobriu como se mudava os endereços ,que tambem é membro deste Forum com o username Gadelhas.

Basicamente ele é o rei e Obrigado :p

É muito ano :D

ahahaha.... essa do ele é o Rei!!!

Sempre às ordens!