Posts | Comments

Planet Arduino

Archive for the ‘LED’ Category

For Game of Thrones fans, it’s an awkward time. The show has ended its run on HBO (not without a certain level of controversy), the planned prequel is still years away, and who knows when George R. R. Martin will actually get around to writing the final books in the series. Fans have no choice but to entertain themselves while waiting for further tales of adventure from Westeros, which is how we get things like this motorized clock from [Techarge].

Inspired by the now iconic opening sequence from the HBO series, elements of the 3D printed model spin around while the theme song is played courtesy of a DFPlayer Mini MP3 player module and small 2 watt speaker. The audio hardware, motor, and four digit LED display module in the front are all connected to an Arduino with a custom PCB shield, giving the inside of the clock a very clean and professional appearance.

Around the back side [Techarge] has two small push buttons to set the hour and minutes, and a large toggle to control the music and movement. As of right now it needs to be switched on and off manually, but a future enhancement could see it kick on hourly.  We’d also like to see an RTC module added to the PCB, or better yet, switch over to the ESP8266 and just pull the time down from NTP.

Who knows? By the time you’ve built one of these clocks for yourself, and the hand-made Iron Throne phone charger stand to go with it, maybe ol’ George will have slipped out a new book. But don’t count on it.

If we’ve learned anything over the years, it’s that hackers like weird clocks, and they love packing as many multicolored LEDs into a device as is humanly possible. Combine both of those concepts into one project, and you’ve got a perfect storm. So as far as unnecessarily complex timepieces go, we’d say the “Crazy Clock 4” built by [Fearless Night] ranks up there among the all-time greats.

This Arduino Pro Mini powered clock syncs the current time via GPS, with a temperature compensated DS3231 RTC to keep it on the straight and narrow between satellite downlinks. Once the clock has the correct time, how do you read it? Well, at the top you’ve got a basic numerical readout for the normies, and next to that there’s a circular LED display that looks like it could double as a sci-fi movie prop. On the lower level there’s a binary clock for the real show-offs, and as if that wasn’t enough, there’s even dual color-coded analog meters to show the hours and minutes.

[Fearless Night] has provided everything you need to follow along at home, from the Arduino source code to the 3D models of the case and Gerber files for the custom PCB. Personally we think just the top half of the clock would be more than sufficient for our timekeeping needs. If nothing else it should help save some energy, as the clock currently pulls an incredible 20 watts with all those LEDs firing off.

Should you decide to take a walk down memory lane and check out some of the other interesting LED clocks we’ve featured in the past, you’d be busy for quite awhile. But for our money, it’s still hard to beat the impossibly obtuse single-LED clock.


This seven segment art display makes use of a 81 seven segment red common cathode LED displays. The LEDs are arranged onto 100x100mm boards that each contain an Arduino Nano and 9 seven segment displays, daisy chained through three-pin headers located on the sides of the boards. The pins (power, ground, and serial) provide the signals necessary for propagating a program across each of the connected boards.

The first board – with two Arduino Nanos – sends instructions for which digits to light and drives the display, sending the instructions over to the next board on the chain.

In a multiplexed arrangement, a single Arduino Nano is able to drive up to 12 seven segment displays, but only 9 needed to be driven for the program, keeping D13’s built in LED and the serial pins free. Since no resistors are featured on the boards, current limiting is done through software. This was inspired by the Bubble LED displays on the Sinclair Scientific Calculator, and was done in order to achieve a greater brightness by controlling the current through the duty cycle.

The time between digits lighting up is 2ms, giving them some time to cool down. The animations in the demos featured falling and incrementing digits, as well as a random number generator using a linear feedback shift register.

This is a quick start guide for the Four Digit Seven Segment Display Module and Enclosure from PMD Way. This module offers a neat and bright display which is ideal for numeric or hexadecimal data. It can display the digits 0 to 9 including the decimal point, and the letters A to F. You can also control each segment individually if desired. 

Each module contains four 74HC595 shift registers – once of each controls a digit. If you carefully remove the back panel from the enclosure, you can see the pin connections:

four-digit-seven-segment-display-with-enclosure-from-pmdway

If you’re only using one display, use the group of pins at the centre-bottom of the board. From left to right the connections are:

  1. Data out (ignore for single display use)
  2. VCC – connect to a 3.3V or 5V supply
  3. GND – connect to your GND line
  4. SDI – data in – connect to the data out pin on your Arduino/other board
  5. LCK – latch – connect to the output pin on your Arduino or other board that will control the latch
  6. CLK – clock – connect to the output pin on your Arduino or other board that will control the clock signal

For the purposes of our Arduino tutorial, connect VCC to the 5V pin, GND to GND, SDI to D11, LCK to D13 and CLK to D12. 

If you are connecting more than one module, use the pins on the left- and right-hand side of the module. Start with the connections from your Arduino (etc) to the right-hand side, as this is where the DIN (data in) pin is located.

Then connect the pins on the left-hand side of the module to the right-hand side of the new module – and so forth. SDO (data out) will connect to the SDI (data in) – with the other pins being identical for connection. 

The module schematic is shown below:

four-digit-seven-segment-display-with-enclosure-from-pmdway

Arduino Example Sketch

Once you have made the connections to your Arduino as outlined above, upload the following sketch:

// Demonstration Arduino sketch for four digit, seven segment display with enclosure
// https://pmdway.com/collections/7-segment-numeric-leds/products/four-digit-seven-segment-display-module-and-enclosure
int latchPin = 13; // connect to LCK pin intclockPin = 12; // connect to CLK pin intdataPin = 11; // connect to SDI pin int LED_SEG_TAB[]={ 0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x01,0xee,0x3e,0x1a,0x7a,0x9e,0x8e,0x01,0x00}; //0 1 2 3 4 5 6 7 8 9 dp . a b c d e f off void setup() { //set pins to output so you can control the shift register pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void displayNumber(int value, boolean leadingZero) // break down "value" into digits and store in a,b,c,d { int a,b,c,d; a = value / 1000; value = value % 1000; b = value / 100; value = value % 100; c = value / 10; value = value % 10; d = value; if (leadingZero==false) // removing leading zeros { if (a==0 && b>0) { a = 18; } if (a==0 && b==0 && c>0) { a = 18; b = 18; } if (a==0 && b==0 && c==0) { a = 18; b = 18; c = 18; } if (a==0 && b==0 && c==0 && d==0) { a = 18; b = 18; c = 18; d = 18; } } digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[d]); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[c]); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[b]); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[a]); digitalWrite(latchPin, HIGH); } void allOff() // turns off all segments { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, 0); shiftOut(dataPin, clockPin, LSBFIRST, 0); shiftOut(dataPin, clockPin, LSBFIRST, 0); shiftOut(dataPin, clockPin, LSBFIRST, 0); digitalWrite(latchPin, HIGH); } void loop() { for (int z=900; z<=1100; z++) { displayNumber(z, false); delay(10); } delay(1000); for (int z=120; z>=0; --z) { displayNumber(z, true); delay(10); } delay(1000); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[14]); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[13]); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[12]); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[11]); digitalWrite(latchPin, HIGH); delay(1000); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[16]); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[15]); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[14]); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[13]); digitalWrite(latchPin, HIGH); delay(1000); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[0]); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[1]); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[2]); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[3]+1); digitalWrite(latchPin, HIGH); delay(1000); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[7]); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[6]+1); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[5]); shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[4]); digitalWrite(latchPin, HIGH); delay(1000); }

After a moment you should see the display spring into action in the same way as in the demonstration video:

How does it work? 

First we define which digital output pins are used for latch, clock and data on lines four to six. On line eight we have created an array which contains values that are sent to the shift registers in the module to display the possible digits and letters. For example, the first – 0xfc – will activate the segments to display a zero, 0x7a for the letter C, and so on. 

From line 20 we’ve created a custom function that is used to send a whole number between zero and 9999 to the display. To do so, simply use:

void displayNumber(value, true/false);

where value is the number to display (or variable containing the number) – and the second parameter of true or false. This controls whether you have a leading zero displayed – true for yes, false for no. 

For example, to display “0123” you would use:

displayNumber(123, true);

… which results with:

four-digit-seven-segment-display-with-enclosure-from-pmdway-0123

or to display “500” you would use:

displayNumber(500, false);

… which results with:

four-digit-seven-segment-display-with-enclosure-from-pmdway-500

To turn off all the digits, you need to send zeros to every bit in the shift register, and this is accomplished with the function in the sketch called 

allOff();

What about the decimal point? 

To turn on the decimal point for a particular digit, add 1 to the value being sent to a particular digit. Using the code from the demonstration sketch to display 87.65 you would use:

 digitalWrite(latchPin, LOW);

 shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[5]);

 shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[6]);

 shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[7]+1); // added one for decimal point

 shiftOut(dataPin, clockPin, LSBFIRST, LED_SEG_TAB[8]);

 digitalWrite(latchPin, HIGH);

… which results with:

four-digit-seven-segment-display-with-enclosure-from-pmdway-87p65

In-depth explanation of how the module is controlled

As shown in the schematic above, each digit is controlled by a 74HC595 shift register. Each shift register has eight digital outputs, each of which control an individual segment of each digit. So by sending four bytes of data (one byte = eight bits) you can control each segment of the display. 

Each digit’s segments are mapped as follows:

7segmentdisplaymap

And the outputs from each shift register match the order of segments from left to right. So outputs 0~7 match A~G then decimal point. 

For example, to create the number seven with a decimal point, you need to turn on segments A, B, C and DP – which match to the shift register’s outputs 0,1,2,8. 

Thus the byte to send to the shift register would be 0b11100001 (or 225 in decimal or 0xE1 in hexadecimal). 

Every time you want to change the display you need to re-draw all four (or more if more than one module is connected) digits – so four bytes of data are sent for each display change. The digits are addressed from right to left, so the first byte send is for the last digit – and the last byte is for the first digit. 

There are three stages of updating the display. 

  1. Set the LCK (latch) line low
  2. Shift out four bytes of data from your microcontroller
  3. Set the LCK (latch) line high

For example, using Arduino code we use:

  digitalWrite(latchPin, LOW);

  shiftOut(dataPin, clockPin, LSBFIRST, 0b10000000); // digit 4

  shiftOut(dataPin, clockPin, LSBFIRST, 0b01000000); // digit 3

  shiftOut(dataPin, clockPin, LSBFIRST, 0b00100000); // digit 2

  shiftOut(dataPin, clockPin, LSBFIRST, 0b00010001); // digit 1

  digitalWrite(latchPin, HIGH);

This would result with the following:

4digit7segmentdisplaymoduletronixlabsbits

Note how the bytes in binary match the map of the digits and their position. For example, the first byte sent was for the fourth digit, and the segment A was turned on. And that’s all there is to it – a neat and simple display. 

This post brought to you by pmdway.com – everything for makers and electronics enthusiasts, with free delivery worldwide.

To keep up to date with new posts at tronixstuff.com, please subscribe to the mailing list in the box on the right, or follow us on twitter @tronixstuff.

 

For anyone who’s been fiddling around with computers since the days before VGA, “Hunt the Wumpus” probably brings back fond memories. Developed in 1973, this text game has you move around a system of caves searching for the foul-smelling Wumpus, a vile creature which you must dispatch with your trusty bow and arrow. Some consider it to be one of the very first survival horror games ever developed, a predecessor to the Resident Evil franchise as well as the video game version of Hannah Montana: The Movie.

If the concept of “Hunt the Wumpus” sounds interesting to you, but you just can’t get over the whole text adventure thing, you may be in luck. [Benjamin Faure] has developed a semi-graphical version of the classic horror title which might better appeal to your 21st century tastes. Running on an Arduino Mega 2560 with graphics displayed on a 8 x 8 LED matrix, it’s not exactly DOOM; but at least you won’t have to type everything out.

You are winner!

For his handheld version of “Hunt the Wumpus”, [Benjamin] 3D printed a nice enclosure and adorned it with labels and instructions that look like tiny scrolls, a neat touch for a game that’s so old contemporary players would have called Zork a “next gen” game. While playing you can see where you’ve been and where you are currently thanks to illuminated dots on the MAX7219 display, and there are LEDs to warn you of your proximity to bottomless pits and the Wumpus itself. There’s even a piezo speaker that will chirp when a bat is nearby, which is important as they have a tendency to ruin your day by carrying you away to a random location in the cave.

Most of the game looks like an advanced version of Snake, but [Benjamin] did go through the trouble of adding some rudimentary animations and sound effects that play during specific parts of the game. When you shoot your arrow or get carried away by a bat, you’ll see a “cutscene” of sorts on the LED display. It’s a fairly simple effect, but helps break up the otherwise fairly spartan graphics and might just be enough to keep a youngins’ attention.

If you subtract a dimension, this project is reminiscent of the 1D dungeon crawler we covered last year. But if even one dimension is too many, you could always run the text version of “Hunt the Wumpus on your trusty Arduino.

There’s not much time left now. If you’re going to put something together to give the youngsters some night terrors in exchange for all that sweet candy, you better do it quick. This late to the game you might not have time to do anything too elaborate, but luckily we’ve come across a few quick Halloween hacks that can get you some pretty cool effects even if it’s only a few hours before the big night.

As a perfect example, these LED “blinking eyes” were created by [Will Moser]. Using nothing more exotic than some bare LEDs, an Arduino, and a cardboard box, these little gadgets can quickly and easily be deployed in your windows or bushes to produce an unsettling effect after the sun goes down. Thanks to the pseudorandom number generator in the Arduino code, the “eyes” even have a bit of variability to them, which helps sell the idea that your Halloween visitors are being watched by proper creatures of the night.

The hardware side of this project is very simple. [Will] takes a container such as a small cardboard box and cuts two holes in it to serve as the eyes. He notes that containers which are white or reflective on the inside work best. You’ll want to get a little artistic here and come up with a few different shaped sets of eyes, which is demonstrated in the video after the break. Inside each box goes a colored LED, wired back to the Arduino.

For the software, [Will] is using a floating analog pin as a source of random noise, and from there comes up with how often each LED will blink on and off, and for how long. Both the hardware and software sides of this project are perfect for beginners, so it might be a good way to get the Little Hackers involved in the festivities this year; if you’re the type of person who enjoys replicating small humans in addition to creeping them out.

LEDs seem to be the hacker’s decoration of choice come Halloween, from wearable LED eyes to remote controlled illuminated pumpkins.

We’ll admit it: sometimes we overthink things. We imagine some of you are the same way; there seems to be something in the hacker mentality that drives us to occasionally over-engineer ideas to the point of unrecognizability. There’s nothing inherently wrong with this, but sometimes it does keep us from seeing easier solutions.

For example, the very slick looking personalized LED sign (Google Translate) that [Clovis Fritzen] recently wrote in to share with us. If we were tasked with creating something like this there would certainly have been a 3D printer and likely a CNC involved before all was said and done, and a few days later we’d still be working out the bugs in our OpenSCAD code. But his approach is very different. Fantastically simple and constructed largely from household items, this is a good project to keep the Junior Hackers entertained on a rainy weekend.

The first step of the process is to draw out the characters you want onto a piece of cardboard, and then carefully cut it out. If you’re worried that you’re not particularly artistic, this step will go a bit better if you print out the design and tape the paper over the cardboard to serve as a template. Once you’ve got your design cut out, you glue or tape a piece of standard printer paper over it. This is the face of the display; it just needs to be lit from behind.

If you wanted to make a sign that was just a single color and didn’t have individually addressable elements, then it would be enough to illuminate the whole cutout with a single light source. But where’s the appeal in that? As [Clovis] shows, you can get much better results by constructing a segmented box, with one LED in each cell. By wiring each LED to a pin on an Arduino or other microcontroller, you’ll have control over the color and brightness of each section of the sign.

Of course, if you’re not big on the whole cardboard aesthetic, you could even recreate this design with the aforementioned CNC and 3D printer. [Clovis] shows how the basic concept works, and that it can be scaled pretty easily depending on the kind of materials you have access to.

When you show up at a party wearing this bare PCB watch, there are effectively two possible reactions you might receive from the other people there. Either they are going to snicker at the nerd who’s wearing a blinking circuit board on their wrist in public, or they are going to marvel at the ridiculously low part count. We’ll give you one guess as to which reaction you’d likely get at any event Hackaday is involved in.

Designed and built by [Electronoobs], this extremely simple watch consists of a ATmega328P microcontroller, a dozen LEDs with their associated 200 Ω resistors, and a battery. There’s also a single push button on the front which is used to not only set the watch, but turn the LEDs on when you want to check the time. Short of dropping down to one LED and blinking out the time, it’s hard to imagine a timepiece with fewer components than this.

You’re probably wondering how [Electronoobs] pulled this off without an external clock source for the ATmega328P chip. The chip actually has an internal 8 MHz oscillator that can be used, but you need to flash the appropriate bootloader to it first. Accordingly, the backside of the PCB has both SPI and a UART solder pads for external bootloader and firmware programming.

As you might expect, there’s a downside to using the internal oscillator: it’s not very good. The ATmega328P spec sheet claims a factory calibrated accuracy of ±10%, and [Electronoobs] has found that equates to a clock drift of around 15 seconds per day. Not exactly great, but considering the battery only lasts for two days anyway, it doesn’t have much of an impact in this case.

Compared to other “analog” LED watches we’ve seen, the simplicity of this build is really quite remarkable. The closest competitor we’ve seen so far is this slick binary watch.

We’d seen it done with buttons, switches, gestures, capacitive touch, and IR remote, but never like this. [electron_plumber] made an LED that can be blown out like a candle, and amazingly it requires no added sensors. The project uses an Arduino to demonstrate turning a tiny LED on and off in response to being blown on, and the only components are the LED and a resistor.

[electron_plumber] used an 0402 LED and thin wires to maximize the temperature responses.
How is this done? [electron_plumber] uses an interesting property of diodes (which are the “D” in LED) to use the LED itself as a temperature sensor. A diode’s voltage drop depends on two things: the current that is being driven through the diode, and the temperature. If the current is held constant, then the forward voltage drop changes reliably in response to temperature. Turning the LED on warms it up and blowing on it cools it off, causing measurable changes in the voltage drop across the device. The change isn’t much — only a handful of millivolts — but the effect is consistent and can be measured. This is a principle [Elliot Williams] recently covered in depth: using diodes as temperature sensors.

It’s a clever demo with a two important details to make it work. The first is the LED itself; [electron_plumber] uses a tiny 0402 LED that is mounted on two wires in order to maximize the temperature change caused by blowing on it. The second is the method for detecting changes of only a few millivolts more reliably. By oversampling the Arduino’s ADC, an effectively higher resolution is obtained without adding any hardware or altering the voltage reference. Instead of reading the ADC once, the code reads the ADC 256 times and sums the readings. By working with the larger number, cumulative changes that would not register reliably on a single read can be captured and acted upon. More details are available from [electron_plumber]’s GitHub repository for LEDs as Sensors.

Embedded below is a video that is as wonderful as it is brief. It demonstrates the project in action, takes a “show, don’t tell” approach, and is no longer than it needs to be.

In the past we have seen LEDs that can be blown out like candles in different ways; one used a microphone to detect blowing while another used a thermistor to detect the temperature change from blowing. [electron_plumber]’s project is notable not only for using no added parts, but also for being documented in a way that just about anyone can get up and running, and that’s something we always like to see.

Light painting: there’s something that never gets old about waving lights around in a long exposure photo. Whilst most light paintings are single shots, some artists painstakingly create frame-by-frame animations. This is pretty hard to do when moving a light around by hand: it’s mostly guesswork, as it’s difficult to see the results of your efforts until after the photo has been taken. But what if you could make the patterns really precise? What if you could model them in 3D?

[Josh Sheldon] has done just that, by creating a process which allows animations formed in Blender to be traced out in 3D as light paintings. An animation is created in Blender then each frame is automatically exported and traced out by an RGB LED on a 3D gantry. This project is the culmination of a lot of software, electronic and mechanical work, all coming together under tight tolerances, and [Josh]’s skill really shines.

The first step was to export the animations out of Blender. Thanks to its open source nature, Python Blender add-ons were written to create light paths and convert them into an efficient sequence that could be executed by the hardware. To accommodate smooth sliding camera movements during the animation, a motion controller add-on was also written.

The gantry which carried the main LED was hand-made. We’d have been tempted to buy a 3D printer and hack it for this purpose, but [Josh] did a fantastic job on the mechanical build, gaining a solidly constructed gantry with a large range. The driver electronics were also slickly executed, with custom rack-mount units created to integrate with the DragonFrame controller used for the animation.

The video ends on a call to action: due to moving out, [Josh] was unable to continue the project but has done much of the necessary legwork. We’d love to see this project continued, and it has been documented for anyone who wishes to do so. If you want to check out more of [Josh]’s work, we’ve previously written about that time he made an automatic hole puncher for music box spools.

Thanks for the tip, [Nick].



  • Newsletter

    Sign up for the PlanetArduino Newsletter, which delivers the most popular articles via e-mail to your inbox every week. Just fill in the information below and submit.

  • Like Us on Facebook