collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: [dúvida] mudar endereço SRF02 I2C  (Lida 7637 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline Joel

  • Mini Robot
  • *
  • Mensagens: 120
[dúvida] mudar endereço SRF02 I2C
« 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

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.

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: [dúvida] mudar endereço SRF02 I2C
« Responder #1 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.

Offline Joel

  • Mini Robot
  • *
  • Mensagens: 120
Re: [dúvida] mudar endereço SRF02 I2C
« Responder #2 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?

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: [dúvida] mudar endereço SRF02 I2C
« Responder #3 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.

Offline Joel

  • Mini Robot
  • *
  • Mensagens: 120
Re: [dúvida] mudar endereço SRF02 I2C
« Responder #4 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


Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: [dúvida] mudar endereço SRF02 I2C
« Responder #5 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!

Offline Joel

  • Mini Robot
  • *
  • Mensagens: 120
Re: [dúvida] mudar endereço SRF02 I2C
« Responder #6 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.

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: [dúvida] mudar endereço SRF02 I2C
« Responder #7 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.

Offline Joel

  • Mini Robot
  • *
  • Mensagens: 120
Re: [dúvida] mudar endereço SRF02 I2C
« Responder #8 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?

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: [dúvida] mudar endereço SRF02 I2C
« Responder #9 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.

Offline Joel

  • Mini Robot
  • *
  • Mensagens: 120
Re: [dúvida] mudar endereço SRF02 I2C
« Responder #10 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

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: [dúvida] mudar endereço SRF02 I2C
« Responder #11 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.

Offline Joel

  • Mini Robot
  • *
  • Mensagens: 120
Re: [dúvida] mudar endereço SRF02 I2C
« Responder #12 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

Offline Joel

  • Mini Robot
  • *
  • Mensagens: 120
Re: [dúvida] mudar endereço SRF02 I2C
« Responder #13 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

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: [dúvida] mudar endereço SRF02 I2C
« Responder #14 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)