SparkFun just put a new tutorial on controlling their 8×8 RGB matrix with an Arduino. It includes a new library, so things should be easy to set up. Hopefully, I will be able to report back on my own project using this later.


Posts tagged ·
·...
SparkFun just put a new tutorial on controlling their 8×8 RGB matrix with an Arduino. It includes a new library, so things should be easy to set up. Hopefully, I will be able to report back on my own project using this later.


On the heals of the success with the Arduino kit last week, I went ahead and bought some extra parts: a 74HC595, 8 bits Shift Register, some red/green/orange LEDS (TLUV5300), and a bigger bread board. I also got some resistors, however, the proved to be wrong. The guy in the shop suggested 15 Ohm for 5 V, however, all the LED resistor calculators I looked at suggested 100-120 Ohm, I I’ll get some new ones tomorrow.
So for the application. Not very fancy so far, but great fun to see the register chip working so easily. Based on this code example by Carlyn Maw and Tom Igoe, and the tutorial at SparkFun (for their 74HC595 offering), I hacked away and came up with a "binary counter" of sorts. Here’s some pictures, and the code that went with it. I modified the example to use the shiftOut Arduino library function.
On the breadboard, yellow is +5V, and brown in ground. The extra breakaway at row 25 does nothing but support the 4 wire sound cable I used hook up to the Arduino. From left to right, Arduino to 74HC595: 12 -> SH_CP (clock), 11 -> ST_CP (latch), 9 -> DS (data). Finally, don’t be confused by the series of resistors to the right. I wanted to see the difference between 15 and 90 Ohm on one of the LEDS; it was almost not noticeable.
// Based on:
// http://arduino.cc/en/Tutorial/ShftOut13
//Pin connected to ST_CP of 74HC595
int latchPin = 11;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 9;
//holders for infromation you're going to pass to shifting function
//byte data;
void setup() {
//set pins to output because they are addressed in the main loop
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
//function that blinks all the LEDs
//gets passed the number of blinks and the pause time
blinkAll(2,500);
}
void loop() {
for (int j = 0; j < 255; j++) {
write(j);
}
}
void write(byte data) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, data);
digitalWrite(latchPin, HIGH);
delay(1000);
}
//blinks the whole register based on the number of times you want to
//blink "n" and the pause between them "d"
//starts with a moment of darkness to make sure the first blink
//has its full visual effect.
void blinkAll(int n, int d) {
write(0);
for (int x = 0; x < n; x++) {
write(255);
write(0);
}
}
A few days ago I set up the Arduino development kit on Fedora 11. Here the steps for Ubuntu 8.04 follow, based on this. I was using a slightly custom setup, so the Java install is assumed, and the extra repository suggested here (Problems Ubuntu 8.04 amd64) was not added. Instead I download the packages directly. Furthermore, I wound that it was better to go for a setup in my home directory, as you frequently have to tweak libraries and other files.
Finally, this includes a new library for DHCP by Jordan Terrell.
sudo apt-get install gcc-avr avr-libc binutils-avr avrdude uisp
# Add your personal user to these groups: dialout, uucp
sudo emacs /etc/group
cd ~
mkdir arduino
cd arduino
# Download stuff for manual installation.
wget http://arduino.googlecode.com/files/arduino-0017.tgz
tar zxvf arduino-0017.tgz
wget http://rxtx.qbang.org/pub/rxtx/rxtx-2.2pre2-bins.zip
unzip rxtx-2.2pre2-bins.zip
wget http://www.thepotterproject.net/NewSoftSerial%20JL.zip
unzip "NewSoftSerial JL.zip"
wget http://www.thepotterproject.net/Picaso.zip
unzip Picaso.zip -d Picaso
wget http://blog.jordanterrell.com/public/Arduino-DHCPv0.4.zip
unzip Arduino-DHCPv0.4.zip -d dhcp
# Use the new avrdude
cd arduino-0017/hardware/tools; rm avrdude avrdude.conf; ln -s /usr/bin/avrdude; ln -s /etc/avrdude.conf; ll; cd -
# Use the new RXTX
cd arduino-0017/lib; rm librxtxSerial.so RXTXcomm.jar; ln -s ../../rxtx-2.2pre2-bins/x86_64-unknown-linux-gnu/librxtxSerial.so; ln -s ../../rxtx-2.2pre2-bins/RXTXcomm.jar; ll; cd -
# Make NewSoftSerial, Picaso, and Dhcp libraries available
cd arduino-0017/hardware/libraries; ln -s ../../../NewSoftSerial; ln -s ../../../Picaso; ln -s ../../../dhcp; ll; cd -
That was the basic setup, which should hopefully work in most cases. However, for gcc version 4.2.2 there is a special issue with the gcc-avr package. I’ll download it and update manually.
[back in 5...]
I recently bought an Arduino starter kit along with the Ethernet "shield". In addition, I got a uVGA-PICASO-MD1 Graphics Controller chip, which attaches on to the PICASO Universal Base Board. The total price was around 130 Euros. And the goal: To create a device which takes Ethernet input and gives VGA output. The use case would be typical demo or dashboard screens, which need no user interaction, and to avoid the 3GHz/4GB RAM laptop or desktop which usually drive them.
The software installation on Fedora 11, 64 bit was relatively pain less. There are a few steps to follow, and also some special tricks for 64 bit. The gist of it, went something like this:
# Install the RPMs available from Fedora repositories.
yum install java-1.6.0-openjdk avr-gcc avr-binutils avr-libc avr-libc-docs avr-gcc-c++ avrdude rxtx uisp
cd /usr/local
mkdir arduino
cd arduino
# Download stuff for manual installation.
wget http://arduino.googlecode.com/files/arduino-0017.tgz
tar zxvf arduino-0017.tgz
wget http://rxtx.qbang.org/pub/rxtx/rxtx-2.2pre2-bins.zip
unzip rxtx-2.2pre2-bins.zip
wget http://www.thepotterproject.net/NewSoftSerial%20JL.zip
unzip "NewSoftSerial JL.zip"
wget http://www.thepotterproject.net/Picaso.zip
unzip Picaso.zip -d Picaso
# Use the new avrdude
cd arduino-0017/hardware/tools; rm avrdude avrdude.conf; ln -s /usr/bin/avrdude; ln -s /etc/avrdude/avrdude.conf; ll; cd -
# Use the new RXTX
cd arduino-0017/lib; rm librxtxSerial.so RXTXcomm.jar; ln -s ../../rxtx-2.2pre2-bins/x86_64-unknown-linux-gnu/librxtxSerial.so; ln -s ../../rxtx-2.2pre2-bins/RXTXcomm.jar; ll; cd -
# Own the examples dir, for compiling as user
chown -R myuser:myuser arduino-0017/examples
# Make NewSoftSerial and Picaso libraries available
cd arduino-0017/hardware/libraries; ln -s ../../../NewSoftSerial; ln -s ../../../Picaso; ll; cd -
# Add your personal user to these groups: dialout, uucp, lock
emacs /etc/groups
And that’s that… Thanks Sebastian Tomczak for his blog entry on the same topic. And also thanks to Jonathan Laloz for "The Potter Project", where he provides the NewSoftSerial and Picaso libraries. Without them, I would have struggled a lot more. Thanks to them, I now have a working network server on the Arduino which prints the input text through the VGA chip. Using nc, it be comes a "remote screen".
nc 192.168.2.150 9090
Hello World!![ENTER]
Here’s my program as it looks tonight:
#include <Picaso.h>
#include <NewSoftSerial.h>
#include <Ethernet.h>
//Define the Picaso object
Picaso VGAOut;
// Set MAC, IP, and start server on port.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 2, 150 };
Server server(9090);
void setup() {
// Initialise the uVGA device, Set the resolution to 640 x 480
VGAOut.Init(); VGAOut.SetResolution(1);
// Init Ethernet shield
Ethernet.begin(mac, ip); server.begin();
}
// Blink some LEDs attached to digital pins 4 and 5
void blinkTwo() {
digitalWrite(4, ON); digitalWrite(5, ON); delay(50);
digitalWrite(4, OFF); digitalWrite(5, OFF); delay(50);
}
void loop() {
// Run the demo once, just to make sure there's something which works.
VGAOut.Demo(); VGAOut.Clear();
// Listen for incoming text over Ethernet.
Client client = server.available();
if (client) {
blinkTwo(); blinkTwo();
int x=10; int y=10;
while (client.connected()) {
if (client.available()) {
digitalWrite(5, LOW);
// Draw character by character from the input stream.
char c[2] = {(char)client.read(), '\0'};
VGAOut.DrawText(x, y, 1, c, VGAOut.GetRGB(255, 255, 255));
delay(30); digitalWrite(5, HIGH); delay(30);
// Wrap the lines. (I guess I can fit a bit more here...)
x++;
if(x > 40) { x = 0; y++; }
if(y > 40) { y = 0; }
}
}
client.stop();
} else {
// If client was connect, turn on the red light.
digitalWrite(4, OFF); digitalWrite(5, ON);
}
delay(5000);
}
Bad Behavior has blocked 87 access attempts in the last 7 days.