Show Posts
Pages: 1 ... 13 14 [15] 16 17 ... 24
211  International / Proyectos / Re: Problema con sensor fotoelectrico on: April 24, 2013, 12:08:06 pm
Otro problema podria ser si no estas usando sensors infrared que la luz ambiente este interfiriendo.
Si el bulbo de azucar es reflectivo entonces puedes colocar una placa oscura detras para que nbo refleje la luz y detectas entonces la refleccion del bulbo sin necesidad de pasar la luz a traves de este. Lo principal es que tienes que determiner cual es el umbral de deteccion en cualquier caso.

Si, el sensor ultrasonico es otra variante anuque la capacidad de resolucion puede ser un problema si los bulbos pasan muy unidos unos a otros frente al sensor.
212  International / Proyectos / Re: proyecto para una instalación interactiva con arduino on: April 23, 2013, 10:20:28 pm
Otras variants:

Tambien puedes hacer un agujero de forma triangular en la barra que a medida que avanza por el sensor optico deje pasar mas o menos luz y asi no tuine que ser translucida que es mas dificil.

Tambien puedes poner agujeros de diferentes tamanos en la barra que dejen pasar diferentes cantidades de luz.

Otra via es poner un reflector en la pista por debajo y y un sensor optico emisor-receptor de 45 grados de inclinacion (en forma de "v") mientras mas se acerque el sensor mas luz refleja hacia el receptor. Este pienso sera un poquito mas dificil de calibrar; pero como la construction es mas sencilla vale la pena darle una prueba a ver que obtienes de salida.
213  International / Proyectos / Re: proyecto para una instalación interactiva con arduino on: April 23, 2013, 10:07:02 pm
Hola:

Hackear la balanza va a ser un termendo problema como ya mencionaron. Ademas de que los "strain gauges" que usa necesitan calibracion, alineacion, pegamentos especiales, etc. Sinceramente no te recomiendo ese camino. Creo que mejor seria que uses un sensor optico en una de estas 2 formas:

La placa que pisan tine una barra con agujeros solidamente montada en el centro de forma transversal y hacia abajo, por supuesto. Los agujeros estan igualmente espaciados ( eso crea una respuesta no lineal; pero no importa por ahora).

La barra agujereada interrumpe la luz de un optoacoplador. Cuentas las interrupciones y determinas cuanto se ha movido el piso lo cual depende de la fuerza aplicada. La respuesta probablemente va a ser no lineal porque la deformacion es no lineal con el peso; pero eso lo puedes resolver encontrando la ecuacion con las muestras obtenidas para diferentes pesos y despues utilizando esa equacion en el programa para realizer la correccion. Parece complicadfo pero no lo es. Si te decides yo te digo como hacer eso que es bastante facil.

Otro metodo aun mas facil es utilizando una barra semitransparente en lugar de agujereada.La transparencia de la barra la haces variable a lo largo de esta, es decir pones lineas de differentes tonos de gris que dejen pasar mas o menos la luz. Asi detectas la cantidad de luz en el sensor midiedo el voltage y ya tienes una indicacion correspondiente a la deformacion del piso la cual depende de la fueza aplicada. estos metodos opticos son muy sencillos y eficaces. si usas infrared es aun mas confinable.

No te metas en lo de la balanza digital, crème, eso es una tremenda candela. La cantidad de electronica analogica que tienen no es de juego.

Se pueden utilizar bobinas tambien; pero es mas complicado; porque tienes que enviarle un voltage de polarizacion de corriente alterna y depues detectar la respuesta. Estudia "Linear Variable Differencial Transformer" si quieres saber como es. Tampoco te lo recomiendo.

Suerte.
214  International / Proyectos / Re: Problema con sensor fotoelectrico on: April 23, 2013, 09:32:46 pm
1- Si el tiempo que demora en pasar el azucar es entre 1100 y 1300 ms. Por que pones el limite de tiempo minimo en 75ms?. Pienso debes ponerlo en 1000 por lo menos. Con eso puedes reducir la cantidad de lectureas erroneas.

2-En estado estacionario, prueba si al poner el azucar o el bulbo o lo que sea que quieres detectar se interrumpe la luz y aparece el cambio de voltage adecuado en el pin del Arduino. Deslizas el bulbo de lado a lado o como este configurado y ves si el voltage cambia.

3-Pudiera suceder que la variacion en la intensidad de luz no sea suficiente para provocar un cambio de voltage en el sensor completamente digital, es decir aunque el voltage varie, el cambio no llega a se interpetado como un cambio de "1" a "0" o viceversa (depende de como lo hayas hecho). Eso me parece bastante probable porque el azucar es semitransparente y quizas no produzca suficiente "swing" en le voltage de salida del sensor.

4- Si tu bulbo (que no se lo que es) es cilindrico y el paso por el sensor es transversal entonces como varia la seccion transversal varia la cantidad de luz que logra pasar. Esto en combinacion con lo anterior (#3) puede provocar que el tiempo detectado como obstruction de la luz, sea mas pequeno que el que tarda todo el cilindro en pasar frente al sensor.

5-Prueba con un voltimetro u osciloscopio como varia el voltage a la salida del sensor a medida que pasas el bulbo frente a este. Creo que asi notaras lo que esta sucediendo en realidad y por que no te funciona.

Si no encuentras el problema muestra esquemas, fotos y codigo aqui para comprender mejor y poder ayudarte.

Buena suerte.
215  International / Proyectos / Re: Arduino - Girasol seguidor de luz on: April 23, 2013, 07:45:28 am
Code:
void moveI()
{
  difI = salidaC - salidaI;
  if (difI > 4)
  {
    pos = pos + 1 ;                           
    myservo.write(pos);
    difI= salidaC - salidaI;
    if(difI < 4)
    {
      reset();
    }
    if(pos == 0)
    {
      for(pos = 0; pos < 90; pos++) 
      {                                 
        myservo.write(pos);             
        delay(25);                       
      }
    }     
    Serial.println("Mueve Derecha");
    Serial.println("nueva posicion: " + (pos));
    delay(55);
  }                     
  return;
}


La condicion
 if(difI < 4)
    {
      reset();
    }
nunca se ejecuta porque esta dentro del if(difI > 4) que es la condicion opuesta.
 Unreachable code...
por tanto nunca ejectuta el metodo reset();

Debes ponerlo como:

if(difI >= 4)
{
Cosas que quieres hacer aqui si la condicion es verdadera;
}
else
{
reset();
}
216  International / Proyectos / Re: Datos camara arduino al ordenador on: April 23, 2013, 07:04:03 am
Si buscas en you tube hay algunos videos similares a este. Los que he visto utilizan otro metodo para enviar la senal de video a la computadora y no directamente desde Arduino con el shield que mencionas. El problema pienso que esta en la velocidad de comunicacion de Arduino con la computer que no se si pueda permitir "streaming video" en tiempo real. El clock de Arduino es solo de 16MHz. Creo que esa la clave del problema que planteas, la velocidad de comunicacion y procesamiento. No he visto nada que permita hacerlo. Quizas no lo han intentado; pero lo dudo, Estos arduinistas tratan de cuanto hay y de cuanto no hay. Lo que yo he podido hacer hasta ahora es solo capturar una camara desde processing. El programa de processing entonces se comunica y trabaja con Arduino; pero la cam esta conectada directamente a un USB port del computer. No he utilizado el cam shield precisamente por eso porque no se como visualizar el video en la computadora; pero bueno quizas ya lo han hecho aunque no lo hayamos encontrado nosotros.
https://www.youtube.com/watch?v=K3djHgg_0Qw
217  Community / Local Groups / Re: Miami Arduino People? on: April 23, 2013, 06:28:12 am
Me too. I'm also from Miami.
218  Topics / Science and Measurement / Re: Why use bridge vs. other measurement circuits for thermistors? on: April 21, 2013, 04:23:09 pm
Excellent idea.
219  Topics / Science and Measurement / Re: Why use bridge vs. other measurement circuits for thermistors? on: April 21, 2013, 08:10:33 am
Quote
So with a single value of the potentiometer in the first leg you may compensate to zero the thermistor of ANY value in the second.

Yes, of course he just needs to do it once. If the "zeroing" is constantly done then the bridge will always be balanced at any temp with no differential output. The ten turn pot is to allow precise adjustment and recalibrate for drift errors from time to time if necessary. Another way is to use 1% or lower tolerance resistors with high stability.
220  Topics / Science and Measurement / Re: Why use bridge vs. other measurement circuits for thermistors? on: April 21, 2013, 07:02:40 am
Quote
Not sure how a bridge circuit can have impedances that are close to balanced unless you employ a variable impedance resistor in the bridge? Or perhaps a ladder of resistors in series that are shorted by transistors as needed?

Yes, that's how you will need to balance your bridge (Zeroing) for the temp you want to establish as reference. Ten turn precision pots are regularly used for that. Another way is to set an offset voltage level added to the diff amp. If the signal is converted to digital, corrections can also be done by adding or subtracting a "DC voltage" value to the samples to compensate for the difference and zeroing the bridge. 
221  Topics / Science and Measurement / Re: Why use bridge vs. other measurement circuits for thermistors? on: April 20, 2013, 06:19:15 pm
Quote
chances are the noise will be picked up by both lines, and therefore should/will be rejected at the inputs of your differential amp. Only the true signal (i.e. the data you want),will be accepted by the diff opamp. So it has better noise immunity.

That's exactly why.

edit a little bit  smiley-wink

chances are the common mode noise will be present at both inputs with the same amplitud  and therefore should/will be rejected by your differential amp. The diff amp will not amplify (or very little) if there is no difference between the inputs. Only the true signal (i.e. the differential signal, the signal you want), will be amplified by the diff amp. So it has better noise immunity.

This subjects will help.
-Common Mode Rejection Ratio (CMRR) of the diff amp.
-Wheastone Bridge

222  Topics / Science and Measurement / Re: Artificial Horizon+Compass. on: April 20, 2013, 11:09:32 am
Hi:

I did a few modifications with respect to what appears in the video, like decreasing the precision of the variables and rotating the Pitch scale instead of the Bank one.

I'd like to see someone adding the code to handle 3 simple pots connected to 3 Arduino analog inputs to have it ready (better if the code can handle 360 deg pots at least for the compass). I don't want to do that now.

I had the CircularScale(); function already written for a previous project and decided to reuse it here instead of going PVectors as the instructions are low level and simple so they can easily be modified for other languages.

Here is the code:

//Artificial Horizon+Compass by Adrian Fernandez 4-19-2013
//Built with Processing 1.5.1
int W=1350; //My Laptop's screen width
int H=690;  //My Laptop's screen height
float Pitch;
float Bank;
float Azimuth;
float ArtificialHoizonMagnificationFactor=0.7;
float CompassMagnificationFactor=0.85;
float SpanAngle=120;
int NumberOfScaleMajorDivisions;
int NumberOfScaleMinorDivisions;
PVector v1, v2; //For testing only

void setup()
{
  size(W, H);
  rectMode(CENTER);
  smooth();
  //strokeCap(SQUARE);//Optional
}

void draw()
{
  background(0);
  translate(W/4, H/2.1); 
  MakeAnglesDependentOnMouse();
  Horizon();
  rotate(-Bank);
  PitchScale();
  Axis();
  rotate(Bank);
  Borders();
  Plane();
  ShowAngles();
  Compass();
  ShowAzimuth();
}

void MakeAnglesDependentOnMouse() //For testing only.
{
  v2= new PVector();
  v1= new PVector(W/2, H/2);
  v2.x=mouseX;
  v2.y=mouseY;
  Bank = PVector.angleBetween(v1, v2);
  Pitch=mouseY-H/2;
  Azimuth=(180/PI*10*Bank)%360;
}

void Horizon()
{
  scale(ArtificialHoizonMagnificationFactor);
  noStroke();
  fill(0, 180, 255);
  rect(0, -100, 900, 1000);
  fill(95, 55, 40);
  rotate(-Bank);
  rect(0, 400+Pitch, 900, 800);
  rotate(Bank);
  rotate(-PI-PI/6);
  SpanAngle=120;
  NumberOfScaleMajorDivisions=12;
  NumberOfScaleMinorDivisions=24; 
  CircularScale();
  rotate(PI+PI/6);
  rotate(-PI/6); 
  CircularScale();
  rotate(PI/6);
}

void ShowAzimuth()
{
  fill(50);
  noStroke();
  rect(20, 470, 440, 50);
  int Azimuth1=round(Azimuth);
  textAlign(CORNER);
  textSize(35);
  fill(255);
  text("Azimuth:  "+Azimuth1+" Deg", 80, 477, 500, 60);
}

void Compass()
{
  translate(2*W/3, 0);
  scale(CompassMagnificationFactor);
  noFill();
  stroke(100);
  strokeWeight(80);
  ellipse(0, 0, 750, 750);
  strokeWeight(50);
  stroke(50);
  fill(0, 0, 40);
  ellipse(0, 0, 610, 610);
  for (int k=255;k>0;k=k-5)
  {
    noStroke();
    fill(0, 0, 255-k);
    ellipse(0, 0, 2*k, 2*k);
  }
  strokeWeight(20);
  NumberOfScaleMajorDivisions=18;
  NumberOfScaleMinorDivisions=36; 
  SpanAngle=180;
  CircularScale();
  rotate(PI);
  SpanAngle=180;
  CircularScale();
  rotate(-PI);
  fill(255);
  textSize(60);
  textAlign(CENTER);
  text("W", -375, 0, 100, 80);
  text("E", 370, 0, 100, 80);
  text("N", 0, -365, 100, 80);
  text("S", 0, 375, 100, 80);
  textSize(30);
  text("COMPASS-01", 0, -130, 500, 80);
  rotate(PI/4);
  textSize(40);
  text("NW", -370, 0, 100, 50);
  text("SE", 365, 0, 100, 50);
  text("NE", 0, -355, 100, 50);
  text("SW", 0, 365, 100, 50);
  rotate(-PI/4);
  CompassPointer();
}

void CompassPointer()
{
  rotate(PI+radians(Azimuth)); 
  stroke(0);
  strokeWeight(4);
  fill(100, 255, 100);
  triangle(-20, -210, 20, -210, 0, 270);
  triangle(-15, 210, 15, 210, 0, 270);
  ellipse(0, 0, 45, 45);   
  fill(0, 0, 50);
  noStroke();
  ellipse(0, 0, 10, 10);
  triangle(-20, -213, 20, -213, 0, -190);
  triangle(-15, -215, 15, -215, 0, -200);
  rotate(-PI-radians(Azimuth));
}

void Plane()
{
  fill(0);
  strokeWeight(1);
  stroke(0, 255, 0);
  triangle(-20, 0, 20, 0, 0, 25);
  rect(110, 0, 140, 20);
  rect(-110, 0, 140, 20);
}

void CircularScale()
{
  float GaugeWidth=800; 
  textSize(GaugeWidth/30);
  float StrokeWidth=1;
  float an;
  float DivxPhasorCloser;
  float DivxPhasorDistal;
  float DivyPhasorCloser;
  float DivyPhasorDistal;
  strokeWeight(2*StrokeWidth);
  stroke(255);
  noFill();

  float DivCloserPhasorLenght=GaugeWidth/2-GaugeWidth/9-StrokeWidth;
  float DivDistalPhasorLenght=GaugeWidth/2-GaugeWidth/7.5-StrokeWidth;

  for (int Division=0;Division<NumberOfScaleMinorDivisions+1;Division++)
  {
    an=SpanAngle/2+Division*SpanAngle/NumberOfScaleMinorDivisions; 
    DivxPhasorCloser=DivCloserPhasorLenght*cos(radians(an));
    DivxPhasorDistal=DivDistalPhasorLenght*cos(radians(an));
    DivyPhasorCloser=DivCloserPhasorLenght*sin(radians(an));
    DivyPhasorDistal=DivDistalPhasorLenght*sin(radians(an));   
    line(DivxPhasorCloser, DivyPhasorCloser, DivxPhasorDistal, DivyPhasorDistal);
  }

  DivCloserPhasorLenght=GaugeWidth/2-GaugeWidth/10-StrokeWidth;
  DivDistalPhasorLenght=GaugeWidth/2-GaugeWidth/7.4-StrokeWidth;

  for (int Division=0;Division<NumberOfScaleMajorDivisions+1;Division++)
  {
    an=SpanAngle/2+Division*SpanAngle/NumberOfScaleMajorDivisions; 
    DivxPhasorCloser=DivCloserPhasorLenght*cos(radians(an));
    DivxPhasorDistal=DivDistalPhasorLenght*cos(radians(an));
    DivyPhasorCloser=DivCloserPhasorLenght*sin(radians(an));
    DivyPhasorDistal=DivDistalPhasorLenght*sin(radians(an));
    if (Division==NumberOfScaleMajorDivisions/2|Division==0|Division==NumberOfScaleMajorDivisions)
    {
      strokeWeight(15);
      stroke(0);
      line(DivxPhasorCloser, DivyPhasorCloser, DivxPhasorDistal, DivyPhasorDistal);
      strokeWeight(smiley-cool;
      stroke(100, 255, 100);
      line(DivxPhasorCloser, DivyPhasorCloser, DivxPhasorDistal, DivyPhasorDistal);
    }
    else
    {
      strokeWeight(3);
      stroke(255);
      line(DivxPhasorCloser, DivyPhasorCloser, DivxPhasorDistal, DivyPhasorDistal);
    }
  }
}

void Axis()
{
  stroke(255, 0, 0);
  strokeWeight(3);
  line(-115, 0, 115, 0);
  line(0, 280, 0, -280);
  fill(100, 255, 100);
  stroke(0);
  triangle(0, -285, -10, -255, 10, -255);
  triangle(0, 285, -10, 255, 10, 255);
}

void ShowAngles()
{
  textSize(30);
  fill(50);
  noStroke();
  rect(-150, 400, 280, 40);
  rect(150, 400, 280, 40);
  fill(255);
  Pitch=Pitch/5;
  int Pitch1=round(Pitch);
  Bank=Bank*180/PI;
  int Bank1=round(Bank);
  text("Pitch:  "+Pitch1+" Deg", -20, 411, 500, 60);
  text("Bank:  "+Bank1+" Deg", 280, 411, 500, 60);
}

void Borders()
{
  noFill();
  stroke(0);
  strokeWeight(400);
  rect(0, 0, 1100, 1100);
  strokeWeight(200);
  ellipse(0, 0, 1000, 1000);
  fill(0);
  noStroke();
  rect(4*W/5, 0, W, 2*H);
  rect(-4*W/5, 0, W, 2*H);
}

void PitchScale()

  stroke(255);
  fill(255);
  strokeWeight(3);
  textSize(24);
  textAlign(CENTER);
  for (int i=-4;i<5;i++)
  { 
    if ((i==0)==false)
    {
      line(110, 50*i, -110, 50*i);
    } 
    text(""+i*10, 140, 50*i, 100, 30);
    text(""+i*10, -140, 50*i, 100, 30);
  }
  textAlign(CORNER);
  strokeWeight(2);
  for (int i=-9;i<10;i++)
  { 
    if ((i==0)==false)
    {   
      line(25, 25*i, -25, 25*i);
    }
  }
}
223  Topics / Science and Measurement / Artificial Horizon+Compass. on: April 19, 2013, 05:11:22 am
Hi:

This is an Artificial Horizon/Compass combo built with Processing to be used with Arduino for 3 axis position visualization of a static swivel platform. It's not intended for navigation. At this point, the variables are dependent on the mouse position for testing purposes. These are part of the set of instruments I'm building to be used with Arduino. The idea is to have several "off-the-shelf instruments" already built to facilitate the implementation of Arduino projects using a computer.

Here is the video:https://www.youtube.com/watch?v=w5K2QXLH4eo&feature=youtu.be
224  Topics / Science and Measurement / Re: Control Panels for Arduino/Processing 1.5.1. on: April 15, 2013, 06:32:33 pm
Thanks.
225  Topics / Science and Measurement / Re: Problems using the DUE DACs to drive a difference amplifier on: April 07, 2013, 09:21:35 am
Quote
"I can provide code and/or circuit diagrams (if needed) once I get back to my apartment after the holiday weekend."

Did you return already?
Posting the schematic will help.
Pages: 1 ... 13 14 [15] 16 17 ... 24