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
-
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:
#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.
-
Isto n é assim:
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.
-
Boa tarde, desde ja obrigado por me teres respondido
será que pudias deixar aqui o código de exemplo para o fazer?
-
Agora é que fui ver o código que estava na página...
Estava lá isto:
// 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:
configureDeviceId(0x70, 0x71)
É so fazeres isto e alterar os enderecos novos para cada sensor.
-
#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
-
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!
-
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
#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ã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.
-
e no sitio em que esta oldadrress and newaddress nao tenho que meter os novos endereços? basta deixar como esta?
-
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.
-
sketch_nov04a.ino: In function 'void setup()':
sketch_nov04a:7: error: 'configureDeviceId' was not declared in this scope
da-me este erro
-
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.
-
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
-
#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
-
De onde é que apareceram agora estes valores 00 e 01?
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)
-
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
-
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!