For the hardware, I used the same circuit presented on Day 10.
In order to create the PWM, I used the ServoBlaster library by Richard Ghirst. It is part of the PiBits project (look for the “Download ZIP” button in the right side of the page).
Although it is possible to use the ServoBlaster deamon from the command line, I wrote a program to gradually turn the LEDs on and off:
C source code:
/*
blink.c
Written by Wilson Medeiros (clockeater)
Revision 1.0 - 2013-12-07
This software requires that the ServoBlaster daemon (servod) to be running:
sudo ./servod --min=0 --max=2000
ServoBlaster is a third-party library written by Richard Hirst
*/
#include <stdio.h>
void blink();
void setLeds(int green, int red);
void wait();
int main (int argc, char* argv)
{
blink();
return 0;
}
void blink()
{
int cycles;
for(cycles=0; cycles<10 ; cycles++)
{
int value;
for(value = 0; value <= 2000; value += 100)
{
setLeds(value, 2000 - value);
wait();
}
for(value = 2000; value >= 0; value -= 100)
{
setLeds(value, 2000 - value);
wait();
}
}
}
/*
Set the pulse width for the leds
Values must be between 0 and 2000 (1 = 10 us, 2000 = 20ms)
The green led is wired to GPIO 18 and the red one to GPIO 23
Each one is wired in series with a 330 ohm resistor
*/
void setLeds(int green, int red)
{
FILE *f;
f = fopen("/dev/servoblaster", "a");
fprintf(f, "2=%d\n", green);
fprintf(f, "5=%d\n", red);
fclose(f);
}
/*
Wait for 1/10 second
*/
void wait()
{
usleep(100000);
}