Clapping music with Arduino: Difference between revisions

From XPUB & Lens-Based wiki
Line 96: Line 96:


Now, using a [[C]] string with the [[Clapping music]] pattern.
Now, using a [[C]] string with the [[Clapping music]] pattern.
The clapping pattern might be imlemented using ''tone'' in the following way:
<source lang="c">
int speakerPin = 13;
int thedelay = 100;
char pat[] = "xxx xx x xx ";
int patlen = strlen(pat);
void setup() {}
void loop () {
  if (pat[0] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[1] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[2] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[3] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[4] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[5] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[6] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[7] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[8] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[9] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[10] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[11] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  delay(thedelay*10); // pause between repetitions
}
</source>


<source lang="c">
<source lang="c">
Line 101: Line 144:
int thedelay = 100;
int thedelay = 100;


// char keycode = 'x';
char pat[] = "xxx xx x xx ";
char pat[] = "xxx xx x xx ";
int patlen = strlen(pat);
int patlen = strlen(pat);

Revision as of 18:29, 26 October 2010

This exercise relies on the following topics in C:

  • variable types (int, char)
  • character arrays (strings)
  • loops
  • nested loops

Hello world.c

Arduino is C!

#include <stdio.h>

main ()
{
  printf("hello world\n");
}

Blink music

void setup()   {                
  pinMode(8, OUTPUT);
  for (int i=0; i<1000; i++) {
    digitalWrite(8, HIGH);
    delay(1);
    digitalWrite(8, LOW);
    delay(1);
  }
}

void loop () {}


change the argument to the delay...

for my refined control, try delayMicroseconds

void setup()   {                
  int x;
  // initialize the digital pin as an output:
  pinMode(8, OUTPUT);
  for (int i=0; i<1000; i++) {
    digitalWrite(8, HIGH);
    delayMicroseconds(250);
    digitalWrite(8, LOW);
    delayMicroseconds(250);
  }
}

void loop () {}

tone

Important: tone is a unique command in that it is asynchronous, meaning that when you call the function it starts playing the tone, but immediately returns control to your program. In Bash terms, it's like starting the program with the '&' character at the end -- the command runs "in the background". This is important to know, because you need to use the delay command to play consecutive tones, otherwise each call to tone undoes the previous ones.

So, the wrong way would be:

int speakerPin = 13;
void setup() {
  tone(speakerPin, 500, 100);
  tone(speakerPin, 600, 100);
  tone(speakerPin, 700, 100);
  tone(speakerPin, 800, 100);
  tone(speakerPin, 900, 100);
}
void loop() {}

And the right way is instead:

int speakerPin = 13;
void setup() {
  tone(speakerPin, 500, 100);
  delay(100);
  tone(speakerPin, 600, 100);
  delay(100);
  tone(speakerPin, 700, 100);
  delay(100);
  tone(speakerPin, 800, 100);
  delay(100);
  tone(speakerPin, 900, 100);
  delay(100);  
}

void loop() {}

Clapping music.c

Now, using a C string with the Clapping music pattern.

The clapping pattern might be imlemented using tone in the following way:


int speakerPin = 13;
int thedelay = 100;
char pat[] = "xxx xx x xx ";
int patlen = strlen(pat);
 
void setup() {}

void loop () {
  if (pat[0] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[1] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[2] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[3] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[4] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[5] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[6] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[7] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[8] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[9] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[10] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);
  if (pat[11] == 'x') tone(speakerPin, 400, 10);
  delay(thedelay);

  delay(thedelay*10); // pause between repetitions
}


int speakerPin = 13;
int thedelay = 100;

char pat[] = "xxx xx x xx ";
int patlen = strlen(pat);
 
void setup()
{
}
 
void loop ()
{
    int i = 0;
    
    while (i<patlen) {
        if (pat[i] == 'x') tone(speakerPin, 400, 10);
        delay(thedelay);
        i = i+1;
    }

    // the above could also be written in "shorthand" using the for statement...
    /*
    for (i=0; i<12; i+=1) {
        if (pat[i] == 'x') tone(speakerPin, 400, 10);
        delay(thedelay);
    }
    */

    delay(thedelay*10);
}
int speakerPin = 13;
int thedelay = 100;

// char keycode = 'x';
char pat[]  = "x xx xxx xxxx xxxxx ";
int patlen = strlen(pat);
 
void setup()
{
}
 
void loop ()
{
    int i = 0;
    int i2 = 0;
    while (i<patlen) {
        i2 = i+5;
        if (i2 >= patlen) i2 = i2 - patlen;
        //  maybe the % modulo operator could help!
        
        if (pat[i] == 'x') tone(speakerPin, 400, 10);
        delay(10);
        if (pat[i2] == 'x') tone(speakerPin, 800, 10);
        delay(thedelay);

        i = i+1;
    }

    delay(thedelay*10);
}

Laura's Clapping Music with Arduino

Laurier's Clapping Music with Arduino and button