Posts with «arduino» label

Sound Localization.

Well, it’s elementary simple in theory, how to do sound localization based on phase difference of signals, that received by two spatially distant microphones. The devil, as always, in details. I’ve not seen any such project created for arduino, and get curious if it’s possible at all. Long story short, here I’d like to present my project, which answer this question  - YES!

Moreover, quantity  of electronics components not much differs from what I’ve used in my previous blog.  Compare two drawings, you will notice only 4 resistors and 4 electret microphones were added! All circuitry is just a few capacitors, 9 resistors, one IC and mics.  Frankly speaking, writing a remix of oscilloscope, I was testing  an arduino analog inputs, keeping in mind to use it in junction with electret microphones in other projects, like sound pressure measurements (dBA),  voice recognition or something funny in “color music” series. As they call it – “a pilot” project?.  There are some issue (simplest ever) oscilloscope has when doing fast rate sampling on 4 channels (settings 7, 8 and 9 Time/Div ) I already described, so I slightly reduce sampling down to 40 kHz here.



Note: *Hardware would be different for arduino boards based on different chips, and must include pre-amplifiers with AtMega328 uCPU. 

One more important things to mention in this short introductory, as I used FFT algorithm for phase calculation ( I like FFT very much, you probably, already notice it ),

Arduino is capable not only track a MOSQUITO flying in your room, it could tell if it’s MALE of FEMALE !!!!!

                  SOFTWARE.

  As I say above, I choose 40 kHz for sampling rate, which is a good compromise between accuracy of the readings  and maximum audio frequency, that Localizator could hear. Getting signals from two mic’s simultaneously, upper limits for audio data is 10 kHz. No real-time, “conveyor belt” include 4 major separate stages:

  • sampling X dimension;
  • FFT
  • phase calculation
  • delay time extracting
  • sampling Y dimension;
  • FFT
  • phase calculation
  • delay time extracting

4 mic’s split in 2 groups for X and Y coordinate consequently. Picking up 4 mic’s simultaneously is possible, but would reduce audio range down to 5 kHz, so I decided to process two dimension (horizontal and vertical planes)  separately, in series. Removing vertical tracking from the code, if it’s not necessary, would increase speed and accuracy in leftover plane, of course. I’d refer you for description of the first and second stages to other blogs, FFT was brought w/o any modification at all. Essential and most important part of this project, stages 3 and 4.

Phase Calculation (3).

 Mathematical tutorial on a topic, I’m not any good as a teacher, so you better read somewhere else, to brush up a basic concept. Core of the process is arctangent function. This link says a number of cycles. In two words – too slow.  LUT ( Look Up Tables ) is the best solution for no-float uCPU to do complex math extremely fast, and reasonably (?) precise. Drawback of LUT is limited size, so it could be saved in FLASH memory, which in next tern  is also limited. This is what I did on “resource management” side: 1 kWords ( 16-bit integers, 2 kBytes) , 32 x 32 ( 5 x 5 bites) LUT, scaled up to 512 to get better “integer” resolution. There are a few values in top-right corner, that melted together as their differences are less than “1″ (not shown on the picture on right side). The “worst” resolution is in top-left corner, where “granularity” is reaching 256, or unacceptable 50% of the dynamic range. To stay as far away from this corner, I put a “Rainbow Noise Canceler” – single line with ” IF ” statement, which “disqualifies” any BIN with magnitude, calculated at the FFT stage, lower than 256.

IF(((sina * sina) + (cosina * cosina)) < 256) phase = -1;

 I called it “Rainbow” because of it’s shape, “red line” is an arc, going from 16 on top line to 16 on left side. Also, “Gain Reset” – 6 bit ( depends on the FFT size, has to be 6 bits for 128) reduced to 5 bits, in order to get better sensitivity. This two parameters / settings, 5-bit and 3.5 bit magnitude limit, create a “threshold” for weak spectral peaks. Basically, depends on application, both values can be adjusted in  different proportions.

 There are two category of tracking technics, with mic’s installed on moving platform, and stationary mic’s. First one is a little bit easier  to understand and build, requires Relative direction to sound source. This what I’ve done. Stationary mic’s approach, when motors are moving laser pointer (or filming camera) alone, would require Absolute direction to sound source, and must include stage #5 – angle calculation via known delay time. Math is pretty simple, acrsine function, and at this point only one calculation per several frames would be necessary, so floating point math wouldn’t be an issue at all. No LUT, scaling, rounding/truncation. Elementary school geometry knowledge – thats all you need.

Delay Time Extraction (4).

 Subtraction phase value of one “qualified” mic’s data pull from another, produce phase difference. To turn phase difference in delay time, division by BIN number is performed. Lets call this operation “Denominator” process.  The denomination is necessary, because all data after this step going to be combine and process together, doesn’t matter of wave length, which is different for every bin. Frequency and wavelength related to each other via simple formula:  Wavelength = Velocity / Frequency, where velocity is a speed of sound wave in the air ( 340 m/sec at room temperature). As distance between two mic’s is a constant,  sound with different wavelength ( frequency ) produce different phase offset, and denomination make them proportional. (WikiPedia, I’m sure, would explain this much better, mind you, I’m a Magician, not mathematician).

First picter on right side shows  ”Nuisance 3: Incorrect arctan” correction. You will find two lines with “IF” statements in the code relaited to stage #3.

Second one,  gives you idea why other correction at stage #4 is necessary As you can see, subtraction one arctan from another generates a rectangular “pulse” ( Diff. n. corr., violet line) whenever one function changes sign but other (delayed version) not yet. Light blue line (DIFF(B)) doesn’t have such abnormality. Math is simple, just two lines with “IF’s” in the same manner, only “double size” constants this time. 2048 on my scale corresponds to 2 x PI, 1024 – PI, and 512 – PI / 2.

Arduino has only 1 ADC, so there is always constant delay time equals to one sampling period ( T = 1/40 kHz = 25 usec), which also should be subtracted ( or added, depends how you associate input 1 and 2 – left / right side mic.)

Filtering.

 To fight reverberation and noise, I choose a Low Pass Filter, which I’d call here as a “Rolling Filter”. My research with regular LPF, shows that this class of filters is completely NOT appropriate for such type of data, due their high susceptibility to “spikes”, or sudden jump in magnitude level. For example, when system getting steady reading from 2-3 test frequencies with low values, let say -10, simple averaging ( should be -10 ) results will be corrupted with one accidental spike (magnitude +2000) during next 60 – 100 consecutive frames !!!  The Median Filter doing well eliminating sudden spikes, the same time is very hungry to CPU cycles, as it’s using “sort” algorithm each time new sample was arrived to the data pull. Having 64 frequencies, and setting filter kernel to 5 – 8 samples, arduino would be buried doing sorting at almost 40 ksps.  Even processing each frequencies data not individually,  and sorting only one 64 elements array still very time consuming job.  After thinking a while, I came up to conclusion, that “Rolling Filter” has almost the same efficiency as Median, but instead of “sorting” requires only 1 additive operation! On long run, the output value will “roll” and “stick” to the middle of the pull. ( Try to model it in LibreOffice. )  Adjusting “step” of the “Rolling Filter”, you can easy manipulate responsiveness,  which is almost impossible with Median Filters. (Things TO DO: Adaptive Filtering, real time adjustment depends on input data “quality”).

 To be continue…. Video will follows !

( Predicting your question, how “good” is localization?  Its about same, as Laser TRF (tracking range finder) has, look at other blogs for now to get impression.  In other words: ASTONISHINGLY GOOD,   a few (1 – 5) angular degree in closed environment.

Link to Arduino (Leonardo) sketch:  Localizator-beta-9.


Traffic lights tell you when your Xbox Live friends are gaming

It sounds like [Andrew] is trying to build a Pavlovian response into his behavior when it comes to online gaming. He wants to make sure he doesn’t miss out when all his friends are online, so he built this traffic signal to monitor Xbox Live activity. It will illuminate the lights, and drive the meters differently based on which of his friends are currently online. When the light’s green, he drops everything a grabs a controller.

The base of the light is a black project box. Inside you’ll find the Arduino compatible chip which drives the device mounted on a piece of protoboard. A WIZnet W5100 adds network connectivity at the low price of around $25. There is one problem with the setup. The API which [Andrew] found doesn’t use any authentication. This means that he can only see the public status of his friends; anyone who has set their online status set to private will always register as ‘online’. If you know of an existing Xbox Live API that would solve this issue we’d love to hear from you in the comments.


Filed under: xbox hacks

Build a POV Death Star, you will

Building a Persistence of Vision globe is pretty awesome, but overlaying a Death Star pattern on the display takes it to the next level of geekery. Like us, [Jason] has wanted to build one of these for a long time. His success pushes us one step closer to taking the plunge and we hope it will inspire you to give it a shot too.

As he mentions in the beginning of his write up, the mechanical bits of these displays are really where the problems lie. Specifically, you need to find a way to transfer power to the spinning display. In this case use went with some DC motor brushes. These are replacement parts through which he drilled a hole to accept the metal axles on top and bottom. We hadn’t seen this technique before, but since motor brush replacements are easy to find and only cost a few bucks we’d say it’s a great idea.

The 24 blue LEDs that make up the display are all on one side of the PCB. They’re driven by an ATmega328 running the Arduino bootloader. [Jason] uses an FTDI adapter to program the chip. Don’t miss the video embedded after the break.


Filed under: led hacks
Hack a Day 01 Oct 17:17

Janus: The Gatekeeper

[Piet] wrote in to tell us about his hack that allows for his front gate to be opened without a key. Unlike this hack that we featured in August, you don’t need a subway pass, just a good memory. As explained in his article (and the video after the break) if the proper sequence of doorbell rings is input, the gate unlocks itself.

For hardware a [mehduino] is used to take the doorbell input and decide whether or not the “secret knock” has been achieved. The door can be unlocked remotely via a button on the processor. Reprogramming the code is achieved by simply holding the program button while the code is entered on the “remote ringer” button.

Be sure to check out the video after the break to see this lock in action. The housing application may not be exactly what you expect. Also of interest, is that in true hacker fashion, the bare processor is hanging by a hook on his wall!


Filed under: arduino hacks, lifehacks
Hack a Day 29 Sep 17:05

Doodle Bot on Instructables and MAKE Projects

Well I sent 2 Doodle Bots to Andrew to show at Makers Faire and for anyone interested I have now put detailed, step by step instructions here:

Instructables: http://www.instructables.com/id/Building-a-Doodle-Bot-kit-from-DAGU/

MAKE Projects: http://makeprojects.com/Project/Building-a-Doodle-Bot-kit/2627/1#.UGbsra4_5Sm

read more

Let's Make Robots 29 Sep 15:48

Manipulating Vocals Using Arduino


Amanda Ghassaei made a vocal effects box that digitizes the human voice using the granular synthesis function on Arduino. Audio comes in at 40khz, is digitized, then outputted in 8 bit sound.

Melodies sung are distinct in both tone and timbre, as evidenced by the Somewhere Over the Grainbow sample track. But the granular synthesis introduces it’s own distinct tonal characteristics to change the sound as it’s being digitized. The result could easily be blended into your favorite electronic tracks.

Amanda posted an Instructable on the project, including steps on how to create the handsome triangular enclosure she made.

[via The Arduino Blog]


Filed under: Arduino, Music

Small Quadruped Robot

Primary image

What does it do?

Navigate around via ultrasound

Hi, I'm new to LMR as a member. But I've been browsing around LMR to learn robotics. First, sorry for my bad English. I finished making my quadruped robot a couple weeks ago. It was my first robotic project using microcontroller. In fact, it was my first microcontroller project. Unfortunately it wasn't well documented during the making process since I didn't plan to publish it before. :( So here is what I can collect from scattered file in my PC..

 

 

Cost to build

$150,00

Embedded video

Finished project

Complete

Number

Time to build

Type

URL to more information

Weight

read more

IKEA SMS lamp with GSM shield

-->-->-->-->

 

 

 

We create a lamp controlled by SMS using a GSM shield, a RGB shield and a Arduino UNO.
Due to the simplicity of these boards, simply plug one over the other and connect a strip led to have a lighting effect.
Then sending normal text messages from any phone, you can turn on and choose the color to set.

The scketch check the text of the received message, if the SMS contains a character, it follows on the corresponding color.
It ‘also provided a fader functions can be called with the character F

This is the list commands:
R to set RED
G to set GREEN
B to set BLUE
Y to set YELLOW
O to set ORANGE
P to set PURPLE
W to set WHITE
F to set the fader function

This is just an example of the possible applications of the GSM / GPRS shield.
You can for example control the home lighting with a simple text message, or receive an SMS in case of alarm.
In addition, the SIM900 has the capacity to also decode DTMF tones, so you can call this in the sim GSM shield and switch loads directly from the telephone keypad.

The complete library it contains many other functions through which you can make calls, connect to the Internet, send and receive SMS.

This is the simple firmware in Arduino.

 

//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs

#include "SIM900.h"
#include "sms.h"
#include "SoftwareSerial.h"
#include "sms.h"
SMSGSM sms;
int red = 10;    // RED LED connected to PWM pin 3
int green = 5;    // GREEN LED connected to PWM pin 5
int blue = 6;    // BLUE LED connected to PWM pin 6
int r=50; int g=100; int b=150;
int rup; int gup; int bup;

boolean started=false;
char smsbuffer[160];
char n[20];
int fader=1;
int inc=10;

void setup() 
{
  //Serial connection.
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  //Start configuration of shield with baudrate.
  if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;  
  }
  else Serial.println("\nstatus=IDLE");
  if(started){
    delsms();
  }

};

void loop() 
{
  int pos=0;
  //Serial.println("Loop");
  if(started){
    pos=sms.IsSMSPresent(SMS_ALL);
    if(pos){
      Serial.println("IsSMSPresent at pos ");
      Serial.println(pos); 
      sms.GetSMS(pos,n,smsbuffer,100);
        Serial.println(n);
        Serial.println(smsbuffer);
        if(!strcmp(smsbuffer,"R")){
          Serial.println("RED");
          r=255;
          g=0;
          b=0;
        }      
        if(!strcmp(smsbuffer,"G")){
          Serial.println("GREEN");
          r=0;
          g=255;
          b=0;
        }    
        if(!strcmp(smsbuffer,"B")){
          Serial.println("BLUE");
          r=0;
          g=0;
          b=255;
        }  
        if(!strcmp(smsbuffer,"P")){
          Serial.println("PURPLE");
          r=255;
          g=0;
          b=255;
        }  
        if(!strcmp(smsbuffer,"Y")){
          Serial.println("YELLOW");
          r=255;
          g=255;
          b=0;
        }  
        if(!strcmp(smsbuffer,"O")){
          Serial.println("ORANGE");
          r=255;
          g=165;
          b=0;
        }  
        if(!strcmp(smsbuffer,"W")){
          Serial.println("WHITE");
          r=255;
          g=255;
          b=255;
        }  
        if(!strcmp(smsbuffer,"F")){
          Serial.println("FADER");
          fader=1;
          r=50; g=100; b=150;
        }
        else
        {
          fader=0;
        }  
        rgb(r, g, b);
        delsms();

    }
    if(fader){
      funcfader();
    }

  }
};

void delsms(){
  Serial.println("delsms");
  for (int i=0; i<10; i++){  //do it max 10 times
      int pos=sms.IsSMSPresent(SMS_ALL);
      if (pos!=0){
        Serial.print("\nFind SMS at the pos ");
        Serial.println(pos); 
        if (sms.DeleteSMS(pos)==1){    
          Serial.print("\nDeleted SMS at the pos ");
          Serial.println(pos);      
        }
        else
        {
          Serial.print("\nCant del SMS at the pos ");
          Serial.println(pos);         
        }
      }
    }

}

void funcfader(){
    if (rup==1){r+=1;}
    else{r-=1;}
    if (r>=255){rup=0;}
    if (r<=0){rup=1;}

    if (gup==1){g+=1;}
    else{g-=1;}
    if (g>=255){gup=0;}
    if (g<=0){gup=1;}

    if (bup==1){b+=1;}
    else{b-=1;}
    if (b>=255){bup=0;}
    if (b<=0){bup=1;}  
    rgb(r, g, b);
}

void rgb(int r, int g, int b)
{
  if (r>255) r=255;
  if (g>255) g=255;
  if (b>255) b=255;
  if (r<0) r=0;
  if (g<0) g=0;
  if (b<0) b=0;

  analogWrite(red, r); 
  analogWrite(green, g); 
  analogWrite(blue, b);   
}
-->-->-->-->-->-->
-->-->

StomperDrino

Primary image

What does it do?

Navigates around the room detecting obstacles and avoiding them.

I got this book for my Kindle over amazon Insectronics: Build Your Own Walking Robot and decided for this to be my first robot project. As i have been dealing with arduino for some time now but mostly building advanced outdoor sensor networks using long range RF. The book has it all from cutting the parts to programming the PIC they used to control the robot. I made a arduino version since i have a lot of arduinos at home.

Future addons:

- Use a arduino nano with a homemade servo shield to downsize the electronics

Cost to build

$120,00

Embedded video

Finished project

Number

Time to build

48 hours

Type

legs

URL to more information

Weight

read more

1-Day Project: Pantry Light

We have two pantries in our flat, one of which could use some light.

There's an outlet in there, but a simple solution won't do: I have more circuitry and time on my hands than I can handle, and the least I can do is make an over-complicated pantry light.

Parts lying around to use:

  • AC-DC converter blocks with screw-terminals outputting 12V at 2A. I have a bunch of these-- came with the LED strips.
  • A length of white LED strip.
  • Lots of TIP-120-style MOSFETs, intended for a second light suit. It's fun to have a lot of high power switches around.
  • Spare Arduino-compatible boards, including the "StripDuino" by "Tinkeract.com," here I quote the names since links go nowhere.
The idea is simple-- rest your hand on the large strip on the door sill as you scan the pantry contents. The light will turn on if you tap the strip, or it will fade if you leave your hand on it.

This design solves the problem uniquely with:

  1. Very large switch surface,
  2. Variable brightness by holding the switch,
  3. Indirect lighting from compact, dense LED strip tucked out of view.
I have a hardware sketch working in terms of the key elements of the controlling Arduino system:
  • Capacitive touch sensing works between pins D5 and D6 with a 1M resistor
  • Touch surface works: aluminum foil with soldered wire plus a layer of hot glue and tape.
  • PWM works with the MOSFET to control the LED strip nicely, with the board's 3.3V logic.
For the light strip at full power, I measure 240.8 mA at 11.85 V, so 2.85 W of power. This is not much but it scales proportionally to the length of the strip.

To do:

  1. Capture the working circuit in an Eagle schematic.
  2. Build a looping sketch with the tap/hold fading behavior.
More to come...