Prodotti
gbm
Sensore prossimità LED IR - Arduino & Processing
Tutorials -
Venerdì 03 Dicembre 2010 05:06
Scritto da gbm

Ciao a tutti ragazzi. Dopo l'algoritmo E.R.E.R. ci siamo dedicati principalmente a semplificare il sistema di funzionamento del nostro sensore per permettere anche agli utenti meno esperti di costruire il proprio senza troppi problemi. Come di certo ricorderete il sensore di prossimità LED che ho progettato tempo fa necessitava di due resistenze e quindi vari collegamenti. Per facilitare il montaggio e rendere veloce e semplice il test ho ripensato il circuito in modo da non necessitare di altro che di due LED infrarossi da 850nm.

Incredibile il range raggiungibile con tempi di esposizione alti. Con una lettura di durata 115 millisecondi è possibile percepire un foglio A4 in cartoncino nero opaco a piu' di 150cm!

L'emettitore va connesso con il positivo (gamba lunga) alla porta 12 e il negativo al GND (a fianco). Il ricevitore andra' connesso con negativo alla porta 11 e positivo alla porta 10.

Dopo aver infilato i 4 pin nei fori corretti caricate il codice:

#define irEmitter 12            // polo positivo emettitore
#define irReceiverN 11          // polo negativo ricevitore
#define irReceiverP 10          // polo positivo ricevitore
long distance = 0;
int interval = 0;

void setup() {
  Serial.begin(9600);              // inizializza seriale a 9600 baud
  pinMode(irEmitter, OUTPUT);      // il led emettitore è un output
  pinMode(irReceiverP, OUTPUT);    // il polo positivo del let ricevitore è un output
  digitalWrite(irReceiverP, LOW);  // e deve essere LOW
}


void focus(int focusPoint) {
 interval = focusPoint;  
 distance = readLight(true) - readLight(false);
 if(distance < 0) distance = 0;
 // processing
 Serial.println(distance);
}

double readLight(boolean lightOn) {       
 digitalWrite(irEmitter, lightOn ? HIGH : LOW);
 pinMode(irReceiverN, OUTPUT);
 digitalWrite(irReceiverN, HIGH); //carico ricevitore di induttanza
 long reading = 0;
 pinMode(irReceiverN, INPUT);
 digitalWrite(irReceiverN, LOW);
 long lightTime = millis(); 
 while((millis() - lightTime) < interval)
  if(digitalRead(irReceiverN) == 0)
   reading++;
 
 return reading;
}
  
void loop() {
focus(115);
}

L'algoritmo si occupa  di mantenere un tempo di acquisizione fisso di 115millisecondi e di filtrare la luce ambientale dando come output la quantità di luce riflessa dall' ostacolo. Potete variare l'intervallo all'interno di focus(); tra 2 e 1.500 millisecondi, piu' aumenterete il tempo di acquisizione piu' il range sara' elevato e minore sara' il refresh rate. In poche parole, focus(2); permette di acquisire intorno a 20 volte al secondo ma con un range di 5cm, focus(200); permette di sentire a 3 metri di distanza un muro bianco 2 volte al secondo.

Dopodichè caricare in Processing questo codice:

import processing.serial.*;
Serial myPort;
int xPos = 0;

void setup() {
  size(1000, 600);       
  myPort = new Serial(this, Serial.list()[0], 9600);
  myPort.bufferUntil('\n');
  background(0);
}

void draw() {}

void serialEvent(Serial myPort) {
  String valueStr = myPort.readStringUntil('\n');
  if(valueStr != null) {
    float valueFloat = float(trim(valueStr));
    valueFloat = map(valueFloat, 0, 6000, 0, height);

    stroke(255, 70, 0);
    ellipse(xPos, valueFloat, 10, 10);

    if(xPos++ >= width) {
      xPos = 0;
      background(0);
    }
  }
}


Questo codice si occupa di rappresentare in un grafico x (tempo), y (distanza ostacolo).  Vedere il video per avere un riscontro.

 

Licenza Creative Commons
Gioblu infrared sensor by Giovanni Blu Mitolo is licensed under a Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported License.
Based on a work at www.gioblu.com.

 

Gioblu Robotics ¬© 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com · Via Savona 123 20146 Milano MI · PI 06977550968 · Codice fiscale MTLGNN86S09F205F

Gioblu BOTServer è online dal 10 Aprile 2010 - 319.232 Visite - 1.027.175 Pagine visualizzate - 182.309 Visitatori unici - 536 utenti attivi