Show Posts
Pages: 1 ... 6 7 [8] 9
106  Using Arduino / Programming Questions / ramping up fading LED and suggestions on: April 03, 2012, 01:19:59 pm
so, Ive mapped sensor data to an LED's PWM values. with doing this, the fading is far from smooth. I've tried the example smoothing, but I'm not seeing any positive results. any feedback, suggestions, resources very appreciated. heres a chunk of code:

Code:
int values = cm; //cm = the values from sensor


  //forwrd fade
  outputValue1 = map(values, 25, 39, 0, 255);
  outputValue2 = map(values, 39, 25, 0, 255);
  outputValue3 = map(values, 2, 24, 0, 255);
 outputValue4= map(values, 24, 2, 0, 255);
  // change the analog out value:
   }

  //analogWrite(led1, outputValue1);
  //  analogWrite(ledsignal, outputValue2);

  if(values >= 25 ){

    analogWrite(ledG1, outputValue1);
    analogWrite(ledG2, outputValue1);
    analogWrite(ledR1, outputValue2);
    analogWrite(ledR2, outputValue2);
    digitalWrite(ledY1, LOW);
    digitalWrite(ledY2, LOW);
  }

  if(values >= 2 && values <= 24)
  {
    analogWrite(ledY1, outputValue4);
      analogWrite(ledY2, outputValue4);
     analogWrite(ledR1, outputValue3);
    analogWrite(ledR2, outputValue3);
digitalWrite(ledG1, LOW);
digitalWrite(ledG2, LOW);
107  Using Arduino / Programming Questions / Re: sensor data question on: March 30, 2012, 06:17:56 pm
i dont understand why this isn't working. you'll probably find my errors a lot quicker

Code:
/* Ping))) Sensor
 
 This sketch reads a PING))) ultrasonic rangefinder and returns the
 distance to the closest object in range. To do this, it sends a pulse
 to the sensor to initiate a reading, then listens for a pulse
 to return.  The length of the returning pulse is proportional to
 the distance of the object from the sensor.
 
 The circuit:
  * +V connection of the PING))) attached to +5V
  * GND connection of the PING))) attached to ground
  * SIG connection of the PING))) attached to digital pin 7
 
 http://www.arduino.cc/en/Tutorial/Ping
 
 created 3 Nov 2008
 by David A. Mellis
 modified 30 Aug 2011
 by Tom Igoe
 
 This example code is in the public domain.
 
 */

// this constant won't change.  It's the pin number
// of the sensor's output:

int redPin = 9;
int bluePin = 10;
int greenPin = 11;

int led13 = 13;
int redVal;
int greenVal;
int blueVal;

///////
unsigned long now;
unsigned long then = 0;
int prevSensorValue = 0;
const int pingPin = 7;
int bigChange = 10;
unsigned long longTime = 10;
///////////


int val1;
int val2;
void setup() {
  // initialize serial communication:
  Serial.begin(9600);
 pinMode(led13, OUTPUT);
}

void loop()
{
  // establish variables for duration of the ping,
  // and the distance result in inches and centimeters:
  long duration, inches, cm;

  // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);

  // The same pin is used to read the signal from the PING))): a HIGH
  // pulse whose duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.
  pinMode(pingPin, INPUT);
  duration = pulseIn(pingPin, HIGH);

  // convert the time into a distance
  inches = microsecondsToInches(duration);
  cm = microsecondsToCentimeters(duration);

  Serial.print(inches);
  Serial.print("in, ");
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();

  delay(100);

 
  int values = cm;


  //forwrd fade
  int currSensorValue = analogRead(pingPin);
   if((abs(currSensorValue - prevSensorValue)) > bigChange)
   {
      // a change occurred
      then = millis();

     digitalWrite(led13, HIGH);
     // Do something with the sensor data
 

 }
 
   prevSensorValue = currSensorValue;

  now = millis();

  if(now - then > longTime)
  {
   
     digitalWrite(led13, LOW);
     // It's been a while since a change occurred
 

   
}

  // change the analog out value:

  redVal = digitalRead(pingPin);
  greenVal = digitalRead(pingPin); //makes all the mapped functions equal to sensor readings !!!!!!!!!!
 
 
  val1 = digitalRead(pingPin);
  val2 = digitalRead(pingPin);
 
// 
   redVal = map(values, 25, 40, 0, 255);
  greenVal = map(values, 40, 25, 0, 255);
 
   val1 = map(values, 3, 24, 0, 255);
 val2= map(values, 24, 3, 0, 255);
//  blueVal= map(values, 40, 25, 0, 255);
 
  //analogWrite(led1, outputValue1);
  //  analogWrite(ledsignal, outputValue2);
int pwmMax = 255;
  if(values >= 25 ){

   analogWrite(redPin, HIGH);
    analogWrite(greenPin,redVal);
    analogWrite(bluePin, redVal);
   

  }
 
 if(values >= 3 && values <= 24)
  {
    analogWrite(redPin, val2);
    analogWrite(greenPin, val2);
analogWrite(bluePin, HIGH);
 
  }
 
 
}

long microsecondsToInches(long microseconds)
{
  // According to Parallax's datasheet for the PING))), there are
  // 73.746 microseconds per inch (i.e. sound travels at 1130 feet per
  // second).  This gives the distance travelled by the ping, outbound
  // and return, so we divide by 2 to get the distance of the obstacle.
  // See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
  return microseconds / 74 / 2;
}

long microsecondsToCentimeters(long microseconds)
{
  // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  // The ping travels out and back, so to find the distance of the
  // object we take half of the distance travelled.
  return microseconds / 29 / 2;

}

108  Using Arduino / Programming Questions / Re: sensor data question on: March 30, 2012, 04:59:12 pm
no luck. I'm sorry, i am a very slow learner. I've set prevSensorValue to read analog values which i understand in your code isn that if prevSensorValue is different from currsensorValue (both are equal to analog ping pin), and the difference is greater then 5, (> bigChange which i set to 5), then, then= millis(). and below that statement, digitalWrite(led13, HIGH); and inverse for below. nothing aside from declaring then to equal millis and send a led high signal are my understand of what goes on there. hope I'm on the right track at least. I'm not having good results.

Code:

  prevSensorValue = analogRead(pingPin);
int currSensorValue = analogRead(pingPin);
   if((abs(currSensorValue - prevSensorValue)) > bigChange)
   {
      // a change occurred
      then = millis();

     digitalWrite(led13, HIGH);
     // Do something with the sensor data
   }

  now = millis();

  if(now - then > longTime)
  {
    digitalWrite(led13, LOW); // It's been a while since a change occurred
  }
109  Using Arduino / Programming Questions / Re: sensor data question on: March 30, 2012, 09:57:53 am
OH thats right. stupid mistake forgetting the input was digital. regardless I'm still thrown off by what i should grab from the ping sensor for your script to compare to.


Quote
unsigned long now;
unsigned long then = 0;
int prevSensorValue = 5;
const int pingPin = 7;
int bigChange = 5;
unsigned long longTime = 5;



also what is prevSensorValue doing? is it comparing if the difference is in time?

it looks like its being used here to compare the data from the analog sensor instead of time? i may be incorrect
110  Using Arduino / Programming Questions / Re: sensor data question on: March 30, 2012, 08:15:23 am
well i have other conversions later in the code. I've been basically triggering my code with the values in "cm". should i replace the analog read up top with an int for cm? ask if full code needed. still a bit unclear if the way I'm using your example is conceptually correct.
111  Using Arduino / Programming Questions / Re: sensor data question on: March 29, 2012, 06:56:09 pm
i might be adding incorrect values, but heres what  i implemented, without any results:

Code:
unsigned long now;
unsigned long then = 0;
int prevSensorValue = 5;
const int pingPin = 7;
int bigChange = 5;
unsigned long longTime = 5;


int currSensorValue = analogRead(pingPin);
   if((abs(currSensorValue - prevSensorValue)) > bigChange)
   {
      // a change occurred
      then = millis();

     digitalWrite(led13, HIGH); // Do something with the sensor data
   }

  now = millis();

  if(now - then > longTime)
  {
    digitalWrite(led13, LOW); // It's been a while since a change occurred
  }

  int values = cm;


  //forwrd fade
  outputValue1 = map(values, 25, 40, 0, 255);
  outputValue2 = map(values, 40, 25, 0, 255);
  outputValue3 = map(values, 3, 24, 0, 255);
  outputValue4= map(values, 24, 3, 0, 255);
  // change the analog out value:


  //analogWrite(led1, outputValue1);
  //  analogWrite(ledsignal, outputValue2);

  if(values >= 25 ){

    analogWrite(led1, outputValue1);
    analogWrite(ledsignal, outputValue2);
    digitalWrite(led2, LOW);
  }

  if(values >= 3 && values <= 24)
  {
    analogWrite(led2, outputValue4);
    analogWrite(ledsignal, outputValue3);
digitalWrite(led1, LOW);

  
}}


thanks so much for your help.
112  Using Arduino / Programming Questions / Re: sensor data question on: March 29, 2012, 06:30:10 pm
Quote
Then, on each pass through loop, look at now vs. then, and decide what to do.

how do i look at now vs then? a bit of clarification please.
113  Using Arduino / Programming Questions / Re: sensor data question on: March 29, 2012, 06:24:43 pm
hahaha! glad you didn't use the snark library. thanks a bunch man. cheers
114  Using Arduino / Programming Questions / sensor data question on: March 29, 2012, 06:00:48 pm
so i'll explain what I'm doing first. using a ping sensor to change LED's. simple. but what i was wondering if their is a way to detect when a  sensor stays at a particular number for "x" amount of time, to do something else. i know i can use another sensor, but thats a last resort.
115  Using Arduino / Programming Questions / Re: LEDS, cross fading, mapping question on: March 29, 2012, 05:17:27 pm
sorry, here is what I'm doing:

Code:
  outputValue1 = map(values, 25, 40, 0, 255);
  outputValue2 = map(values, 40, 25, 0, 255);
  outputValue3 = map(values, 2, 24, 0, 255);
  outputValue4= map(values, 24, 2, 0, 255);
  // change the analog out value:


  //analogWrite(led1, outputValue1);
  //  analogWrite(ledsignal, outputValue2);

  if(values >= 25 ){

    analogWrite(led1, outputValue1);
    analogWrite(ledsignal, outputValue2);
  }

  if(values >= 2 && values <= 24)
  {
    analogWrite(led2, outputValue4);
    analogWrite(ledsignal, outputValue3);


  }
}
116  Using Arduino / Programming Questions / Re: LEDS, cross fading, mapping question on: March 29, 2012, 05:07:37 pm
actually now I'm trying to crossfade between the 3 LED's and I'm having a road block conceptually on how to tackle this. i ended up making two more map functions, but i know this isn't necessary. so transition is led1 cross fades into led2; led 2 crossfades into led3 
117  Using Arduino / Programming Questions / Re: LEDS, cross fading, mapping question on: March 29, 2012, 02:05:50 pm
great suggestion. thanks
118  Using Arduino / Programming Questions / Re: LEDS, cross fading, mapping question on: March 29, 2012, 01:54:32 pm
thanks for the helpful (and at times unnecessarily snarky) tips. cheers
119  Using Arduino / Programming Questions / LEDS, cross fading, mapping question on: March 29, 2012, 01:13:18 pm
so i think i have a pretty decent sketch that does what i need. to sum it up, the values from an infrared sensor are being averaged and then mapped to control pwm range of some LED's. as you increase, decrease, the leds crossfade between each other.

now my question: i want to simply trigger a 3rd LED to digital HIGH and set the other two crossfading LED's to LOW, but when i try this with my if statement, the mapping from sensor is causing confliction and in turn, causing the crossfade LEDS to flicker. suggestions? heres the code:

Code:
//Use of MaxSonar EZ1 sonar module in analog mode with arduino
// median filter of five consecutive readings to eliminate spikes
//
// Bill Gentles, Nov. 12, 2010
//borrowing an idea from the Arduino Forum on array sort
//http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1283456170/12
//the "insert sort" code is from whistler
//
//take 5 readings and store them in an array rangevalue[]
//using an "ascending insert sort" rearrange the array values in ascending order
//choose the middle element in the array, which will by definition be the median of the set of values
//
//Analog pin 1 for reading in the analog voltage from the MaxSonar device.
 const int numReadings = 10;

int readings[numReadings];      // the readings from the analog input
int index = 0;                  // the index of the current reading
int total = 0;                  // the running total
int average = 0;                // the average
 int vals;
 const int anPin = 1;
const int led1 = 10; // DIGITAL output pin that the LED is attached to
const int ledsignal = 13;
const int led2 = 9; // DIGITAL output pin that the LED is attached to
int sensorValue = 0; // value read from the pot
int outputValue1 = 0; // value output to the PWM
int outputValue2 = 0; // value output to the PWM
//variables needed to store values
int arraysize = 3;  //quantity of values to find the median (sample size). Needs to be an odd number
int rangevalue[] = {0, 0, 0};    //declare an array to store the samples. not necessary to zero the array values here, it just makes the code clearer
//*********************************************************************************************
void setup()
{
    for (int thisReading = 0; thisReading < numReadings; thisReading++)
    readings[thisReading] = 0;         
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(ledsignal, OUTPUT);
  //This opens up a serial connection to shoot the results back to the PC console
  Serial.begin(9600);
  printArray(rangevalue, arraysize);
 //delay(10);   //wait a while to open serial monitor window

}
//********************************************************************************
void loop()
{
// subtract the last reading:
  total= total - readings[index];         
  // read from the sensor: 
  readings[index] = analogRead(anPin);
  // add the reading to the total:
  total= total + readings[index];       
  // advance to the next position in the array: 
  index = index + 1;                   

  // if we're at the end of the array...
  if (index >= numReadings)             
    // ...wrap around to the beginning:
    index = 0;                           

  // calculate the average:
  average = total / numReadings;     
  pinMode(anPin, INPUT);
  vals = constrain(vals, 66, 490);
  outputValue1 = map(vals, 66, 211, 0, 255);
outputValue2 = map(vals, 490, 241, 0, 255);
// change the analog out value:
analogWrite(led1, outputValue1);
analogWrite(led2, outputValue2);
//delay(1000);

if ( vals >= 212 && vals<=240 ){
  digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
      digitalWrite(ledsignal, HIGH);
}
else {
  digitalWrite(ledsignal, LOW);
}
  //MaxSonar Analog reads are known to be very sensitive. See the Arduino forum for more information.
  //Maxbotix does not recommend averaging readings as the occasional value can be wildly inaccurate and skew the average
  //A median sort is the preferred method.

   for(int i = 0; i < arraysize; i++)
   {     //array pointers go from 0 to 4

    //Used to read in the analog voltage output that is being sent by the MaxSonar device.
    //The MaxSonar Scale factor is (Vcc/512) per inch. A 5V supply yields ~9.8mV/in
    //The Arduino will map input voltages between 0 and 5 volts into integer values between 0 and 1023.
    //This yields a resolution between readings of: 5 volts / 1024 units or, .0049 volts (4.9 mV) per unit.
    //Therefore, one unit from the arduino's ADC represents 0.5 inches

     rangevalue[i] = analogRead(anPin);
//     Serial.print("i, value   ");
//     Serial.print(i);
//     Serial.print(" ,  ");
//     Serial.print(rangevalue[i]);
//     Serial.println();

     //delay(1);  //wait between analog samples
    }

   //Serial.print("unsorted ");
   printArray(rangevalue, arraysize);
  // Serial.println();
   isort(rangevalue, arraysize);
   //Serial.print("sorted ");
   printArray(rangevalue, arraysize);
   //Serial.println();

 // now show the medaian range
    int midpoint = arraysize/2;    //midpoint of the array is the medain value in a sorted array
//note that for an array of 5, the midpoint is element 2, as the first element is element 0
    // Serial.print("median range value ");
    // Serial.print(rangevalue[midpoint]);
    // Serial.println();
     //Serial.println();
 vals = rangevalue[midpoint];
  //delay(1);    //wait a while so you can read the values on the serial monitor

}   //end of loop

//*********************************************************************************
// sort function
void isort(int *a, int n)
   //  *a is an array pointer function
{
  for (int i = 1; i < n; ++i)
  {
    int j = a[i];
    int k;
    for (k = i - 1; (k >= 0) && (j < a[k]); k--)
    {
a[k + 1] = a[k];
    }
    a[k + 1] = j;
  }
}
//***********************************************************************************
//function to print array values
void printArray(int *a, int n)
{

  for (int i = 0; i < n; i++)
  {
   // Serial.print(a[i], DEC);
    //Serial.print(' ');
  }

  //Serial.println();
}


120  Using Arduino / Programming Questions / Re: LINEAR ACTUATOR POSITION FEEDBACK HELP!! on: December 13, 2011, 09:10:55 am
this is all understood.

can someone integrate this into the code so i can get a better understanding of its application. that will clarify this for me
Pages: 1 ... 6 7 [8] 9