This was the entry event to our electronics window sign project. I created a circuit with an LED, a battery, and copper tape. This circuit illuminated the acrylic laser-cut piece which represents a Black Lives Matter fist.
Project brief for the first project in engineering.
Requirements for the project that must be met.
The requirements for research that must be met for this project.
This is a video of the Arduino and the blinking led. I made it do this by coding the Arduino to have a delay between the led turning on and off.
This is an image of the Arduino circuit. To create it I went to circuit-diagram.org and used icons for the led, the wires, and the Arduino.
This is the circuit diagram. It shows how each LED gets powered.
This is an image of the circuit. The wire carries the ground to the row on the other side so all six LEDs can light up.
Video of the circuit diagram. This shows the LEDs lighting up and the circuit working.
int led2 = 2; int led3 = 3; int led4 = 4; int led10 = 10; int led11 = 11; int led12 = 12;
void setup() {
pinMode(led2, OUTPUT) ; pinMode(led3, OUTPUT) ; pinMode(led4, OUTPUT) ; pinMode(led10, OUTPUT) ; pinMode(led11, OUTPUT) ;
pinMode(led12, OUTPUT) ;
}
void loop() {
digitalWrite(led2, HIGH); delay(1000);
digitalWrite(led2, LOW) ; delay(1000);
digitalWrite(led3, HIGH); delay(1000);
digitalWrite(led3, LOW) ; delay(1000);
digitalWrite(led4, HIGH); delay(1000);
digitalWrite(led4, LOW) ; delay(1000);
digitalWrite(led10, HIGH); delay(1000);
digitalWrite(led10, LOW) ; delay(1000);
digitalWrite(led11, HIGH); delay(1000);
digitalWrite(led11, LOW) ; delay(1000);
digitalWrite(led12, HIGH); delay(1000);
digitalWrite(led12, LOW) ; delay(1000);
}
This is the inside of our Window Light project. We made the Neopixel strip connect to the arduino by using female jumper wires. We tied the ends of the wires on the Neopixel strip, with the ends of the female jumper wires.
This is the full Window Light project. Mine currently doesn't work because there were issues with the Arduino software, but the intent was for colorful lights to illuminate the letters.
// A basic everyday NeoPixel strip test program.
// NEOPIXEL BEST PRACTICES for most reliable operation:
// - Add 1000 uF CAPACITOR between NeoPixel strip's + and - connections.
// - MINIMIZE WIRING LENGTH between microcontroller board and first pixel.
// - NeoPixel strip's DATA-IN should pass through a 300-500 OHM RESISTOR.
// - AVOID connecting NeoPixels on a LIVE CIRCUIT. If you must, ALWAYS
// connect GROUND (-) first, then +, then data.
// - When using a 3.3V microcontroller with a 5V-powered NeoPixel strip,
// a LOGIC-LEVEL CONVERTER on the data line is STRONGLY RECOMMENDED.
// (Skipping these may work OK on your workbench but can fail in the field)
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1:
#define LED_PIN 6
// How many NeoPixels are attached to the Arduino?
#define LED_COUNT 32
// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
// Argument 1 = Number of pixels in NeoPixel strip
// Argument 2 = Arduino pin number (most are valid)
// Argument 3 = Pixel type flags, add together as needed:
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
// NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
// setup() function -- runs once at startup --------------------------------
void setup() {
// These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
// Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif
// END of Trinket-specific code.
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
strip.show(); // Turn OFF all pixels ASAP
strip.setBrightness(255); // Set BRIGHTNESS to about 1/5 (max = 255)
}
// loop() function -- runs repeatedly as long as board is on ---------------
void loop() {
// Fill along the length of the strip in various colors...
colorWipe(strip.Color(255, 0, 0), 200); // Red
colorWipe(strip.Color(255, 0, 120), 200); // Pink
colorWipe(strip.Color(106, 0, 255), 200); // Purple
colorWipe(strip.Color(0, 0, 255), 200); // Blue
colorWipe(strip.Color(0, 255, 174), 200); // Blue Green
colorWipe(strip.Color(0, 255, 255), 200); // Teal
colorWipe(strip.Color(0, 255, 120), 200); // Green Blue
colorWipe(strip.Color(0, 255, 0), 200); // Green
colorWipe(strip.Color(120, 255, 0), 200); // Yellow
colorWipe(strip.Color(255, 255, 0), 200); // Orange
colorWipe(strip.Color(255, 255, 255), 500); // Orange
// Do a theater marquee effect in various colors...
// theaterChase(strip.Color(127, 127, 127), 50); // White, half brightness
// theaterChase(strip.Color(127, 0, 0), 50); // Red, half brightness
// theaterChase(strip.Color( 0, 0, 127), 50); // Blue, half brightness
rainbow(20); // Flowing rainbow cycle along the whole strip
//theaterChaseRainbow(50); // Rainbow-enhanced theaterChase variant
}
// Some functions of our own for creating animated effects -----------------
// Fill strip pixels one after another with a color. Strip is NOT cleared
// first; anything there will be covered pixel by pixel. Pass in color
// (as a single 'packed' 32-bit value, which you can get by calling
// strip.Color(red, green, blue) as shown in the loop() function above),
// and a delay time (in milliseconds) between pixels.
void colorWipe(uint32_t color, int wait) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, color); // Set pixel's color (in RAM)
strip.show(); // Update strip to match
delay(wait); // Pause for a moment
}
}
// Theater-marquee-style chasing lights. Pass in a color (32-bit value,
// a la strip.Color(r,g,b) as mentioned above), and a delay time (in ms)
// between frames.
void theaterChase(uint32_t color, int wait) {
for(int a=0; a<10; a++) { // Repeat 10 times...
for(int b=0; b<3; b++) { // 'b' counts from 0 to 2...
strip.clear(); // Set all pixels in RAM to 0 (off)
// 'c' counts up from 'b' to end of strip in steps of 3...
for(int c=b; c<strip.numPixels(); c += 3) {
strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
}
strip.show(); // Update strip with new contents
delay(wait); // Pause for a moment
}
}
}
// Rainbow cycle along whole strip. Pass delay time (in ms) between frames.
void rainbow(int wait) {
// Hue of first pixel runs 5 complete loops through the color wheel.
// Color wheel has a range of 65536 but it's OK if we roll over, so
// just count from 0 to 5*65536. Adding 256 to firstPixelHue each time
// means we'll make 5*65536/256 = 1280 passes through this outer loop:
for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
// Offset pixel hue by an amount to make one full revolution of the
// color wheel (range of 65536) along the length of the strip
// (strip.numPixels() steps):
int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
// strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
// optionally add saturation and value (brightness) (each 0 to 255).
// Here we're using just the single-argument hue variant. The result
// is passed through strip.gamma32() to provide 'truer' colors
// before assigning to each pixel:
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
}
strip.show(); // Update strip with new contents
delay(wait); // Pause for a moment
}
}
// Rainbow-enhanced theater marquee. Pass delay time (in ms) between frames.
void theaterChaseRainbow(int wait) {
int firstPixelHue = 0; // First pixel starts at red (hue 0)
for(int a=0; a<30; a++) { // Repeat 30 times...
for(int b=0; b<3; b++) { // 'b' counts from 0 to 2...
strip.clear(); // Set all pixels in RAM to 0 (off)
// 'c' counts up from 'b' to end of strip in increments of 3...
for(int c=b; c<strip.numPixels(); c += 3) {
// hue of pixel 'c' is offset by an amount to make one full
// revolution of the color wheel (range 65536) along the length
// of the strip (strip.numPixels() steps):
int hue = firstPixelHue + c * 65536L / strip.numPixels();
uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB
strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
}
strip.show(); // Update strip with new contents
delay(wait); // Pause for a moment
firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames
}
}
}
To the left is a research paper on Huey P. Newton. In preparation for our Neopixel and window light project, we researched social justice figures. The words on the laser cut window light is a slogan that represents or is related to the person that we researched. Since I researched the cofounder of the Black Panther Party, my window light says Black Panther Party.
As mentioned above, after researching a social justice figure, we created or used a slogan relating to that figure. I used "Black Panther Party" as my slogan because my social justice figure. We designed these in CANVA and tried to minimize the amount of space between the words and letters.
Brief - The brief is the guidelines that set the project. It's usually the problem that is given and can be compared to the writing prompt in ELA.
Research - The research process is the process of looking up or finding information related to the brief. This can be reading through scientific studies, articles, and more that will help you solve your problem.
Idea and Brainstorming - During this phase, one will brainstorm multiple ideas and may likely not find one that works the best. If they are unsure if the design that they decide upon is bad or inefficient, the next phases help them determine that.
Prototype - During this phase, one will come up with a physical or digital version of the thing that they brainstormed. An example of a prototype in video games, are the Alpha and Beta versions of the game.
Testing - In this phase, one will test and experiment with their prototype. They find out whether their prototype solves their problem or not. If it does not solve the problem or answer the question provided in the brief, they may go back to the Idea and Brainstorming or Prototype phases. This phase is where you collect the data for the next phase.
Evaluation - In this phase of the design process, one will evaluate the data that they gathered in the testing phase. If their design does help to solve their problem, they will want to determine how efficient it is in solving this problem. If they recognize that it can be more efficient, they may go back to the Idea and Brainstorming or Prototype phases of their project. It is very likely that the first prototype will not be the best and most efficient one.
What did you find most challenging about this course, and how did you overcome this challenge?
The most challenging thing about this course was the Neopixel strip/Window Light project. This is because of a few reasons. First, it was very tedious twisting the wires together, and although I got over this problem, and I don't like knowing that I'll have to do it again in future projects. Also, putting everything in the box was difficult, it felt as if everything didn't fit correctly, but eventually I made it work. It was also frustrating to build the whole thing, just for my Arduino software to have an error every time I try to upload the code.
What are you most proud of from this semester?
I am most proud of correctly assembling the Neopixel strip. Like I mentioned before, twisting the wires and fitting everything in the box was very tedious and a little frustrating, although these are minor accomplishments, I'm proud that I found a way to make it work.