collapse

* Links de Robótica

* Posts Recentes

Palavras Cruzadas por Hugu
[Hoje às 00:54]


[Projecto] Bomba Airsoft por jm_araujo
[Ontem às 16:54]


Apresentação por Tech_JA
[Ontem às 09:19]


Medir Agua que está no Poço por filjoa
[21 de Setembro de 2017, 20:58]


URGENTE - display de 7 segmentos com backpack por helderjsd
[20 de Setembro de 2017, 12:30]


Preços e fabricantes de pcb por Sérgio_Sena
[19 de Setembro de 2017, 10:20]


Isaac Asimov - I, Robot por senso
[18 de Setembro de 2017, 03:41]


ic SL440 da Plessey? por senso
[16 de Setembro de 2017, 13:11]


Compra Colectiva RS-Amidata por brunus
[15 de Setembro de 2017, 22:31]


Ideias para construir um quadrúpede simples por zordlyon
[15 de Setembro de 2017, 10:18]

Autor Tópico: Ajuda a programar arduino  (Lida 4061 vezes)

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

Offline The Wolfman

  • Mini Robot
  • *
  • Mensagens: 60
Ajuda a programar arduino
« em: 28 de Abril de 2010, 14:39 »
Olá, boa tarde.

Tenho o seguinte material:
3* Devantech SRF05
2* Mini metal Gear motor
1* SN754410
1* LDR (embora ache que está mal feito).

Tenho de fazer com que o meu robot ande e se desvie de obstáculos, e depois quando encontrar uma certa cor, ele vai acender um LED.

Podem ajudar-me? É que eu sou mesmo muito mau em C, comecei a poucos dias :p

Encontrei isto na net, e consegui por a funcionar:
Código: [Seleccione]
// written at: luckylarry.co.uk
// variables to take x number of readings and then average them
// to remove the jitter/noise from the SRF05 sonar readings
 
const int numOfReadings = 10; // number of readings to take/ items in the array
int readings[numOfReadings];    // stores the distance readings in an array
int arrayIndex = 0;              // arrayIndex of the current item in the array
int total = 0;                  // stores the cumlative total
int averageDistance = 0;        // stores the average value
 
// setup pins and variables for SRF05 sonar device
 
int echoPin = 2;              // SRF05 echo pin (digital 2)
int initPin = 3;              // SRF05 trigger pin (digital 3)
unsigned long pulseTime = 0;  // stores the pulse in Micro Seconds
unsigned long distance = 0;  // variable for storing the distance (cm)
 
// setup pins/values for LED
 
int redLEDPin = 9;    // Red LED, connected to digital PWM pin 9
int redLEDValue = 0; // stores the value of brightness for the LED (0 = fully off, 255 = fully on)
 
//setup
 
void setup() {
 
  pinMode(redLEDPin, OUTPUT);    // sets pin 9 as output
  pinMode(initPin, OUTPUT); // set init pin 3 as output
  pinMode(echoPin, INPUT); // set echo pin 2 as input
 
  // create array loop to iterate over every item in the array
 
  for (int thisReading = 0; thisReading < numOfReadings; thisReading++) {     
readings[thisReading] = 0;     
 }         
// initialize the serial port, lets you view the   
 // distances being pinged if connected to computer
     Serial.begin(9600);
 }
 
// execute
void loop() {   
digitalWrite(initPin, HIGH);   // send 10 microsecond pulse   
delayMicroseconds(10);   // wait 10 microseconds before turning off   
digitalWrite(initPin, LOW); // stop sending the pulse   
pulseTime = pulseIn(echoPin, HIGH); // Look for a return pulse, it should be high as the pulse goes low-high-low   
distance = pulseTime/58;   // Distance = pulse time / 58 to convert to cm. 
 total= total - readings[arrayIndex]; // subtract the last distance   
readings[arrayIndex] = distance; // add distance reading to array   
total= total + readings[arrayIndex]; // add the reading to the total   
arrayIndex = arrayIndex + 1;          // go to the next item in the array                                 
// At the end of the array (10 items) then start again   
if (arrayIndex >= numOfReadings)  {
    arrayIndex = 0;
  }
 
  averageDistance = total / numOfReadings;  // calculate the average distance
 
  // if the distance is less than 255cm then change the brightness of the LED
 
  if (averageDistance < 255) {
    redLEDValue = 255 - averageDistance; // this means the smaller the distance the brighterthe LED.
  }
 
  analogWrite(redLEDPin, redLEDValue); // Write current value to LED pins
  Serial.println(averageDistance, DEC); // print out the average distance to the debugger
  delay(100);   // wait 100 milli seconds before looping again
 
}

Alguém me pode dar uma ajuda, ou uns tutoriais que encontrem? Não encontrei nada de um LDR com o arduino.

Obrigado
« Última modificação: 02 de Maio de 2010, 00:18 por TigPT »

Offline The Wolfman

  • Mini Robot
  • *
  • Mensagens: 60
Re: Ajuda a programar arduino
« Responder #1 em: 29 de Abril de 2010, 21:52 »
O que é que este código tem de mal?

Este fui eu que fiz, seguindo o exemplo do site do arduino, mas depois adaptei os valores ao devantech srf05.

Código: [Seleccione]
const int sens = 7;

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

void loop()
{
  pinMode (sens, OUTPUT);
  digitalWrite (sens, LOW);
  delayMicroseconds (2);
  digitalWrite (sens, HIGH);
  delayMicroseconds (5);
  digitalWrite (sens, LOW);
 
  duration = pulseIn(sens, HIGH);
  cm = microsecondsToCentimeters(duration);
  Serial.print(cm);
  Serial.print("cm");
  Serial.printIn();
 
  delay(100);
}

long microsecondsToCentimeters(long microseconds)
{
  return microseconds / 29
}
Quando vai a compilar, dá o seguinte erro:
Citar
In function 'void loop()':
error: 'duration' was not declared in this scope In function 'long int microsecondsToCentimeters(long int)':
Qual é o problema? Segui o que estava aqui à risca, só usei centímetros em vez de polegadas...
http://arduino.cc/en/Tutorial/Ping
« Última modificação: 02 de Maio de 2010, 00:17 por TigPT »

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.234
    • Tiago Rodrigues
Re: Ajuda a programar arduino
« Responder #2 em: 29 de Abril de 2010, 22:01 »
Citar
long microsecondsToCentimeters(long microseconds)

Estás a chamar a função que ele ainda não conhece.

Todas as funções têm que estar definidas antes da sua chamada. Basta meter essa função antes do loop e já deve de funcionar.

_________
A variável "cm" também não está declarada. (não sei se o arduino permite a tal história a cima referida visto poder estar protegido contra erros de iniciantes e fazer automaticamente a declaração da função abaixo definida.
« Última modificação: 29 de Abril de 2010, 22:03 por TigPT »

Offline The Wolfman

  • Mini Robot
  • *
  • Mensagens: 60
Re: Ajuda a programar arduino
« Responder #3 em: 29 de Abril de 2010, 22:08 »
Então e em que sitio é que eu tenho de colocar isto?

Suponho que seja ''dentro'' desta coisa do void loop...

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.234
    • Tiago Rodrigues
Re: Ajuda a programar arduino
« Responder #4 em: 29 de Abril de 2010, 22:11 »
Código: [Seleccione]
cm = microsecondsToCentimeters(duration); passa a ser:
Código: [Seleccione]
long cm = microsecondsToCentimeters(duration);
Ou então no ínicio do código onde tens:
Código: [Seleccione]
const int sens = 7;
Metes por baixo:
Código: [Seleccione]
long cm;

Offline The Wolfman

  • Mini Robot
  • *
  • Mensagens: 60
Re: Ajuda a programar arduino
« Responder #5 em: 29 de Abril de 2010, 22:18 »
Continua a dar erro, e experimentei das duas maneiras...

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.234
    • Tiago Rodrigues
Re: Ajuda a programar arduino
« Responder #6 em: 29 de Abril de 2010, 22:21 »
Tinhas inúmeros erros desde chavetas a pontos e virgulas ou até declaração das variáveis.

Corrigido:
Código: [Seleccione]
const int sens = 7;

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

void loop()
{
  pinMode (sens, OUTPUT);
  digitalWrite (sens, LOW);
  delayMicroseconds (2);
  digitalWrite (sens, HIGH);
  delayMicroseconds (5);
  digitalWrite (sens, LOW);

  long duration = pulseIn(sens, HIGH);
  long cm = microsecondsToCentimeters(duration);
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();

  delay(100);
}

long microsecondsToCentimeters(long microseconds)
{
  return microseconds / 29;
}

Offline The Wolfman

  • Mini Robot
  • *
  • Mensagens: 60
Re: Ajuda a programar arduino
« Responder #7 em: 29 de Abril de 2010, 22:26 »
Assim já funciona, mas o raio do código dá-me no ''debug'' 0cm, e a luz do sensor pisca muito devagar...

Obrigado

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.234
    • Tiago Rodrigues
Re: Ajuda a programar arduino
« Responder #8 em: 29 de Abril de 2010, 22:30 »
Não vi código.. só corrigi sintax.

Offline The Wolfman

  • Mini Robot
  • *
  • Mensagens: 60
Re: Ajuda a programar arduino
« Responder #9 em: 01 de Maio de 2010, 17:43 »
Bem, usei os exemplos do arduino.cc, mas parece que aquilo só servia para o PING))) da paralaxx.

Então pesquisei no google, e enconrei um código para o devantech srf05. Configurei aquilo para 3 sensores, e funcionou :D

Mas só postei hoje porque o meu irmão desligou o computador e não tinha gravado o código :p

Aqui está:
Código: [Seleccione]
int duration_frt;                         
int distance_frt;                         
int srf_frt = 4;

int duration_esq;
int distance_esq;
int srf_esq = 5;

int duration_dir;
int distance_dir;
int srf_dir = 6;

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

void loop(){
  pinMode(srf_frt, OUTPUT);
  digitalWrite(srf_frt, LOW);         
  delayMicroseconds(2);
  digitalWrite(srf_frt, HIGH);         
  delayMicroseconds(10);
  digitalWrite(srf_frt, LOW);           
  pinMode(srf_frt, INPUT);
  duration_frt = pulseIn(srf_frt, HIGH);   
  distance_frt = duration_frt/58;

  pinMode(srf_esq, OUTPUT);
  digitalWrite(srf_esq, LOW);
  delayMicroseconds(2);
  digitalWrite(srf_esq, HIGH);
  delayMicroseconds(10);
  digitalWrite(srf_esq, LOW);
  pinMode(srf_esq, INPUT);
  duration_esq = pulseIn(srf_esq, HIGH);
  distance_esq = duration_esq/58;

  pinMode(srf_dir, OUTPUT);
  digitalWrite(srf_dir, LOW);
  delayMicroseconds(2);
  digitalWrite(srf_dir, HIGH);
  delayMicroseconds(10);
  digitalWrite(srf_dir, LOW);
  pinMode(srf_dir, INPUT);
  duration_dir = pulseIn(srf_dir, HIGH);
  distance_dir = duration_dir/58;
 
  Serial.println(distance_frt);
  delay(100);                           
}

O que acham?

Falta-me agora configurar os motores com a ponte-H, o LDR e o LED para quando encontrar uma vitima.
« Última modificação: 02 de Maio de 2010, 00:17 por TigPT »

Offline The Wolfman

  • Mini Robot
  • *
  • Mensagens: 60
Re: Ajuda a programar arduino
« Responder #10 em: 01 de Maio de 2010, 19:10 »
Bem, o LDR já está também...

Neste momento tenho o arduino ligado por USB, mas vou usar 8 pilhas de NiCd.

O LDR tem dois LED's de cada lado para ele ''ver'' melhor, e como esses LED's estão ligados em série, 5V, eles têm uma luz muito fraquinha.

Neste código, defini o pino 13 como saida, e acendi os LED's, mas 5V para dois led's é pouco, pelo que no código final, vou apagar esta parte, e ligar os LED's directamente ao Vin
Código: [Seleccione]
int duration_frt;                         
int distance_frt;                         
int srf_frt = 4;

int duration_esq;
int distance_esq;
int srf_esq = 5;

int duration_dir;
int distance_dir;
int srf_dir = 6;

int ldr = 0;
int valor_ldr = 5;
int led_ldr = 13;

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

void loop(){
  pinMode(srf_frt, OUTPUT);
  digitalWrite(srf_frt, LOW);         
  delayMicroseconds(2);
  digitalWrite(srf_frt, HIGH);         
  delayMicroseconds(10);
  digitalWrite(srf_frt, LOW);           
  pinMode(srf_frt, INPUT);
  duration_frt = pulseIn(srf_frt, HIGH);   
  distance_frt = duration_frt/58;

  pinMode(srf_esq, OUTPUT);
  digitalWrite(srf_esq, LOW);
  delayMicroseconds(2);
  digitalWrite(srf_esq, HIGH);
  delayMicroseconds(10);
  digitalWrite(srf_esq, LOW);
  pinMode(srf_esq, INPUT);
  duration_esq = pulseIn(srf_esq, HIGH);
  distance_esq = duration_esq/58;

  pinMode(srf_dir, OUTPUT);
  digitalWrite(srf_dir, LOW);
  delayMicroseconds(2);
  digitalWrite(srf_dir, HIGH);
  delayMicroseconds(10);
  digitalWrite(srf_dir, LOW);
  pinMode(srf_dir, INPUT);
  duration_dir = pulseIn(srf_dir, HIGH);
  distance_dir = duration_dir/58;

  ldr = analogRead(valor_ldr);
  digitalWrite(led_ldr, HIGH);
  Serial.println(ldr);
 
  delay(100);                           
}
Agora vou tratar da ponte H, mas tenho de ver se me safo nas sub-rotinas para depois decidir para que lado anda o bixo.
« Última modificação: 01 de Maio de 2010, 19:13 por TigPT »

Offline The Wolfman

  • Mini Robot
  • *
  • Mensagens: 60
Re: Ajuda a programar arduino
« Responder #11 em: 01 de Maio de 2010, 23:09 »
Ora bem, inclui aqui uma parte dos motores.

Código: [Seleccione]
int duration_frt;                         
int distance_frt;                         
int srf_frt = 4;

int duration_esq;
int distance_esq;
int srf_esq = 5;

int duration_dir;
int distance_dir;
int srf_dir = 6;

int ldr = 0;
int valor_ldr = 5;
int led_ldr = 13;

int motor_esq[] = {2, 3};
int motor_dir[] = {7,8};
int i;

void setup(){
Serial.begin(9600);

for(i = 0; i < 2; i++){
  pinMode(motor_esq[i], OUTPUT);
  pinMode(motor_dir[i], OUTPUT);
}

}


void loop(){
  pinMode(srf_frt, OUTPUT);
  digitalWrite(srf_frt, LOW);         
  delayMicroseconds(2);
  digitalWrite(srf_frt, HIGH);         
  delayMicroseconds(10);
  digitalWrite(srf_frt, LOW);           
  pinMode(srf_frt, INPUT);
  duration_frt = pulseIn(srf_frt, HIGH);   
  distance_frt = duration_frt/58;

  pinMode(srf_esq, OUTPUT);
  digitalWrite(srf_esq, LOW);
  delayMicroseconds(2);
  digitalWrite(srf_esq, HIGH);
  delayMicroseconds(10);
  digitalWrite(srf_esq, LOW);
  pinMode(srf_esq, INPUT);
  duration_esq = pulseIn(srf_esq, HIGH);
  distance_esq = duration_esq/58;

  pinMode(srf_dir, OUTPUT);
  digitalWrite(srf_dir, LOW);
  delayMicroseconds(2);
  digitalWrite(srf_dir, HIGH);
  delayMicroseconds(10);
  digitalWrite(srf_dir, LOW);
  pinMode(srf_dir, INPUT);
  duration_dir = pulseIn(srf_dir, HIGH);
  distance_dir = duration_dir/58;

  digitalWrite(motor_esq[0], HIGH); 
  digitalWrite(motor_esq[1], LOW);
 
  digitalWrite(motor_dir[0], HIGH);
  digitalWrite(motor_dir[1], LOW);
 
  ldr = analogRead(valor_ldr);
  digitalWrite(led_ldr, HIGH);
 
  Serial.println(ldr);
 
  delay(100);                           
}
Não os posso ligar porque tenho o arduino ligado por USB, mas isto assim não devia dar 5V nos fios que ligam aos motores? Se eu for medir com o multimetro a tensão nos fios que supostamente ligam nos motores, tenho uma tensão de 0,284V...
« Última modificação: 01 de Maio de 2010, 23:12 por TigPT »

Offline The Wolfman

  • Mini Robot
  • *
  • Mensagens: 60
Re: Ajuda a programar arduino
« Responder #12 em: 01 de Maio de 2010, 23:39 »
Bem, por hoje não faço mais nada.

Já adicionei um LED com o comando if (fui ver ao site do arduino como funciona).

Se o valor do LDR for maior que 500 acende, se não for apaga. O que achei estranho foi ter de dizer que se o valor for menor, o led fica LOW, não é lógico?
Código: [Seleccione]
int duration_frt;                         
int distance_frt;                         
int srf_frt = 4;

int duration_esq;
int distance_esq;
int srf_esq = 5;

int duration_dir;
int distance_dir;
int srf_dir = 6;

int ldr = 0;
int valor_ldr = 5;
int led_ldr = 13;

int motor_esq[] = {2, 3};
int motor_dir[] = {7,8};
int i;

int led_vitima = 12;

void setup(){
Serial.begin(9600);

for(i = 0; i < 2; i++){
  pinMode(motor_esq[i], OUTPUT);
  pinMode(motor_dir[i], OUTPUT);
}

}


void loop(){
  pinMode(srf_frt, OUTPUT);
  digitalWrite(srf_frt, LOW);         
  delayMicroseconds(2);
  digitalWrite(srf_frt, HIGH);         
  delayMicroseconds(10);
  digitalWrite(srf_frt, LOW);           
  pinMode(srf_frt, INPUT);
  duration_frt = pulseIn(srf_frt, HIGH);   
  distance_frt = duration_frt/58;

  pinMode(srf_esq, OUTPUT);
  digitalWrite(srf_esq, LOW);
  delayMicroseconds(2);
  digitalWrite(srf_esq, HIGH);
  delayMicroseconds(10);
  digitalWrite(srf_esq, LOW);
  pinMode(srf_esq, INPUT);
  duration_esq = pulseIn(srf_esq, HIGH);
  distance_esq = duration_esq/58;

  pinMode(srf_dir, OUTPUT);
  digitalWrite(srf_dir, LOW);
  delayMicroseconds(2);
  digitalWrite(srf_dir, HIGH);
  delayMicroseconds(10);
  digitalWrite(srf_dir, LOW);
  pinMode(srf_dir, INPUT);
  duration_dir = pulseIn(srf_dir, HIGH);
  distance_dir = duration_dir/58;

  digitalWrite(motor_esq[0], HIGH); 
  digitalWrite(motor_esq[1], LOW);
 
  digitalWrite(motor_dir[0], HIGH);
  digitalWrite(motor_dir[1], LOW);
 
  ldr = analogRead(valor_ldr);
  digitalWrite(led_ldr, HIGH);
 
  if (ldr > 500)
{
  pinMode(led_vitima, OUTPUT);
  digitalWrite(led_vitima, HIGH); 
}

  if (ldr < 500)

  pinMode(led_vitima, OUTPUT);
  digitalWrite(led_vitima, LOW);
}
 
  Serial.println(ldr);
 
  delay(100);                           
}
E pronto, as minhas brincadeiras de hoje acabaram, comentem :D

P.S., TigPT, reparei agora que nestes casos mete-se as tags code e não quote, já não precisas de ter trabalho ;)

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.234
    • Tiago Rodrigues
Re: Ajuda a programar arduino
« Responder #13 em: 02 de Maio de 2010, 00:19 »
Até amanha. Não tenhas pesadelos com código. Vai lá com o tempo. ;)

Offline The Wolfman

  • Mini Robot
  • *
  • Mensagens: 60
Re: Ajuda a programar arduino
« Responder #14 em: 04 de Maio de 2010, 22:36 »
Oh pá, as vezes sou mesmo estúpido. Tive dois dias a pensar porque é que a ponte H não funciona, e só hoje é que vi que não a liguei ao ground --'

Já está a funcionar, e já ando a tratar de sub rotinas.