This is a project for Arduino to make a 2D Level, aimed at beginners.
Arduino draws a circle on an LED Matrix that moves around according to readings from a 2D Accelerometer.
Objectives:
* Learn how to draw a circle using simple Math’s
* Learn how to use the LOL shield for the Arduino
* Learn how an accelerometer works
Step 1: What you need
You will need:
* Arduino UNO
* LOL shield (http://jimmieprodgers.com/kits/lolshield/)
* Accelerometer (http://www.oomlout.co.uk/accelerometer-3axis-adxl335-p-247.html)
* Breadboard for wiring up e.g. (http://www.oomlout.co.uk/prototyping-bundle-for-arduino-ardp-p-186.html)
* Some Wires
Step 2: Wire it up
Attach the LOL shield to the Arduino.
Wire the Accelerometer as follows:
+3V
GND
X => A0
Y => A1
Z => N/C (Not Connected)
Note: The LOL shield does not come with Headers (as shown in the picture), attached to the topside.
I bought some here: http://www.amazon.co.uk/gp/product/B004RASBVY/ref=oh_details_o06_s00_i00
Step 3: Install the LOL Shield Libraries
http://jimmieprodgers.com/kits/lolshield/
Step 4: Let’s Start With a Circle
We’ll start by drawing a circle.
This circle will eventually move around as we tilt the device. But first things first….
We’ll illuminate individual pixels on the LOL shield using the LOL library command:
LedSign::Set(x, y , 1);
where x and y are the coordinates on the shield of the LED we wish to illuminate
Our job is to figure out how to calculate the x,y values that make a circle.
In Pseudo code we do it like this to draw just one quarter (Quadrant) of the circle:
for x = 0 to RADIUS
y=f(x); // This means y is some function of x. We haven’t said what function yet
plot(x,y)
end
So what’s the function?
r^2 = x^2 + y^2
where x^2 means “x squared” or “x to the power of 2”
We know x because it’s the for loop iterator;
We know r because it’s the radius,
So we re-arrange to find y
y = sqrt(r^2 – x^2) // sqrt() means square-root
When you code it up you get a circle as shown in the picture.
Step 5: Here’s the Code
Here’s the Arduino code to draw the circle.
Notice that the circle is drawn in 4 quadrants. We illuminate 4 LEDs for each y we calculate.
The pictures show the steps to draw the circle as x iterates from 0 to RADIUS
#include <Charliplexing.h>
// Circle: radius, inital and max x/y values
int radius = 3;
int cx = 6; // x-position of circle
int cy = 4; // y-position of circle
void setup()
{
Serial.begin(9600);
LedSign::Init();
}
void loop()
{
DrawCircle(1); // DRAW the circle
}
void DrawCircle(int ink)
// ink =0 : ERASE the circle
// ink =1 : DRAW the circle
{
for(int x = 0; x <= radius; x++) // x values from 0 to RADIUS (one Quadrant)
{
// solve r^2 = x^2 + y^2 for y
float y = sqrt(pow(radius, 2) – pow(x, 2));
y = round(y*1);
// Fill the y-position in the 4 quadrants of the circle
LedSign::Set(x + cx, y + cy, ink); // Quadrant 1
LedSign::Set(x + cx, cy – y, ink); // Quadrant 4
LedSign::Set(cx – x, y + cy, ink); // Quadrant 2
LedSign::Set(cx – x, cy – y, ink); // Quadrant 3
}
Read more: Arduino makes 2D Level