4x4x4 LED-Cube Teil 2

Den LED-Cube werde ich über einen ArduinoMega mit den unten aufgeführten C-Code ansteuern.

ArduinoMega mit ATmega2560 Prozessor

ArduinoMega mit ATmega2560 Prozessor

Der ArduinoMega hat folgende Eigenschaften

Microcontroller: ATmega2560
Operating Voltage: 5V
Input Voltage (recommended): 7-12V
Input Voltage (limits): 6-20V
Digital I/O Pins: 54 (of which 15 provide PWM output)
Analog Input Pins: 16
DC Current per I/O Pin: 40 mA
DC Current for 3.3V Pin: 50 mA
Flash Memory: 256 KB of which 8 KB used by bootloader
SRAM: 8 KB
EEPROM: 4 KB
Clock Speed: 16 MHz

Davon nutzen werde ich folgenden Teil:

Ebenen (von unten nach oben, z = 0..3) an Pins A0, A1, A2, A3
LEDs erste Reihe (y = 0) an Pins 22, 23, 24, 25
LEDs zweite Reihe (y = 1) an Pins 26, 27, 28, 29
LEDs dritte Reihe (y = 2) an Pins 30, 31, 32, 33
LEDs letzte Reihe (y = 3) an Pins 34, 35, 36, 37

/*
 cube 
 */
 
#define LAYERs 4
#define COLs 4
#define ROWs 4
 
/* global variable definitions */
unsigned char LEDs[LAYERs][COLs * ROWs];
unsigned char pwmpos = 0; // actual step of the PWM
unsigned char layer = 1; // actual controlled layer
 
/*
 * cmp_carry_shift_left compares the two parameters
 * which results in the carry bit to be set/unset
 * that carry bit is rotated into para_io
 * the complete function consumes only 2 cycles
 */
static inline unsigned char cmp_carry_shift_left ( 
	unsigned char para_io,
	unsigned char cmp_para_1,
	unsigned char cmp_para_2 )
{
	asm volatile (
		// compare the parameters
		// (get the carry flag set/unset)
		"cp %r[cmp2], %r[cmp1]"	"\n\t"
 
		// rotate carry bit into paramter
		"rol %r[out]"		"\n\t"
 
		// output operand
		: [out] "+r" (para_io)		
		// input operands
		: [in] "r" (para_io),
		  [cmp1] "r" (cmp_para_1),
		  [cmp2] "r" (cmp_para_2)
	);
	return para_io;
}
 
/*
 * The timer3 overflow interrupt routine builds the pin states
 * to be output. the actual output is done in the beginning
 * (of the next execution) of the routine to achieve a more
 * constant time behaviour
 */
ISR ( SIG_OVERFLOW3 )
{
	static unsigned char porta, portc, portf;
	PORTB = 0x80; // turn on pin B7 for measuring the time consumption
 
	PORTA = porta; // turn on the pins of PORTA and B in resull of
	PORTC = portc; // the previous cycles outcome
	PORTF = portf;
 
	pwmpos++;
	if ( pwmpos >= 128 ) pwmpos = 0;
	if ( pwmpos == 0 )
	{
		layer++;
		if (layer == LAYERs)
		{
			layer = 0;
			PORTB |= 0x10;	// get an impulse on Pin B4 as debug output
			PORTB &= ~0x10;	// -"-
			PORTA = 0;
			PORTC = 0;
		}
		portf = 1 <= LAYERs * COLs * ROWs ) ? 0 : RX_pos + 1;
	}
	PORTB &= ~0x08;	 // turn off B3 as debug output
}
 
void setup()  { 
	unsigned char i;
 
	// Initialize port directions and output values
	DDRA = 0xFF; PORTA = 0xFF; // first 8 LEDs
	DDRC = 0xFF; PORTC = 0xFF; // second 8 LEDs
	DDRF = 0x0F; PORTF = 0x01; // 4 layers
	DDRB = 0xFF; PORTB = 0x00; // debug output LEDs
 
	// Initialize timer
	TCCR3A = (1 << WGM31) | (1 << WGM30) | (0x00 << COM3B0);
	TCCR3B = (0x01 << CS30) | (1 << WGM32) | (1 << WGM33);
	TIMSK3 |= 1 << TOIE3;
	OCR3A = 0xFF; // */
 
	// init LEDs array
	for ( i = 0; i < LAYERs * COLs * ROWs; i++ )
		( (unsigned char *) LEDs )[i] = 1;
 
	// Enable interrupts
	sei();
 
	// listen on RS232 for new data
	Serial.begin(115200);
}
 
void loop()  { 
	PORTB ^= 0x02; // debug output (toggles pin B1 if nothing else is done)
}

Der Programmcode wird ganz simple mit der eigenen Arduino-Applikation via USB auf den Microkontroller in einem Rutsch kompiliert und hochgeladen. Code in das Fenster einfügen und Upload-Button klicken. Fertig!

Programm zum bespielen von Arduino's

Programm zum bespielen von Arduino’s

4x4x4 LED-Cube Teil 1

Ich habe mir mal vorgenommen, einen roten 4x4x4 LED-Würfel zu bauen. Also mit insgesamt 64 einzelnen LED’s. Ganz gut eignen sich für dieses Vorhaben 5 Millimeter große LED’s.

Schablone mit 8x8 Löchern

Schablone mit 8×8 Löchern

Als erstes dachte ich mir, ich erfinde das Rad neu und erstelle eine eigene Schablone mit Acht mal Acht Löschern, die ich mit einer Lötkolbenspitze vor- und danach mit einer 5 Millimeter LED nachgestochen habe. Für meinen Würfel reicht im Grunde eine Matrix mit vier mal vier Löchern. Ich dachte mir nur, wenn ich diesen zur Übung erst einmal fertig gestellt habe, kann man diese Schablone später für einen größeren Würfel mit insgesamt 512 LED’s benutzen. Nur leider habe ich feststellen müssen, dass meine Löscher zwar akkurater sind, aber in der Tiefe mehr Kratern als zylindrischen Vertiefungen gleichen. Dadurch stehen die einzelnen LED’s während des zusammen löten nicht stabil auf den Kopf. Ich habe dann doch die schon vorhandene benutzt, auch wenn die einzelnen gestochenen Löcher nicht immer die 20 Millimeter Abstand zu den jeweiligen benachbarten aufweisen.

Gebogene LED

Gebogene LED

Als nächstes ging es an das Biegen der Beinchen der einzelnen LED’s und dem zusammen Löten dieser zu den vier Ebenen. Es ist ganz ratsam, die Anode um wenige Millimeter circa 45 Grad abzuwinkeln, so dass sie später an der darunter liegenden Eben nicht auf den LED-Kopf stösst. Die Katode wird um 90 Grad abgewinkelt und mit jeweils nächsten verlötet. Am Ende der Viererkette wird die Katode zusätzlich mit etwas Abstand auf der Horizontalen ein weiteres Mal um 90 Grad gebogen, damit sie mit seinem Gleichen der nächsten Viererkette verlötet wird. Die Vier Stränge bekommen auch an ihren Anfängen zum Halt einen Querdraht angelötet.

Fertiger 4x4x4 LED-Würfel ohne Elektronik

Fertiger 4x4x4 LED-Würfel ohne Elektronik

Dadurch dass ich mit den Schablonen etwas Pech hatte, sieht das Endergebnis des Würfel nicht so sauber und gerade aus. Entscheidend ist nur, dass die Lötpunkte richtig fest sind, dass das Konstrukt auch hält.

Fotoalbum des LED-Cube auf Flickr

Blitz-Quarkkuchen

Zutaten:

  • 1 Kilogramm Magerquark
  • 4 Eier
  • 30 Gramm Zitronensaft oder die Menge einer gepressten Zitrone
  • 250 Gramm Zucker
  • 1 Packung Vanillepuddingpulver
  • 3 Esslöffel Grieß
  • 1 Packung Backpulver (12 Gramm)
  • 1 Prise Salz
  • 150 Gramm Butter
  • 200 Gramm Schlagsahne
  • 1 Esslöffel Sahnesteif

Zubereitung:
Quark, Eier, Zitronensaft, Zucker, Vanillepuddingpulver, Grieß, Backpulver und Salz in eine Schüssel geben und gut verühren.

Butter in einem Topf zum schmelzen bringen. Dabei darf sie leicht erwärmt sein, aber nicht erhitzen. Die flüssige Butter zügig unter die Quarkmasse rühren, da sich sonst beim Abkühlen Butterflocken bilden.

Die Sahne steifschlagen und mit einem Schneebesen unter die Quarkmasse unterheben.

Quarkmasse nun in eine Runde Backform giesen und glattstreichen.
Im vorgeheizten Backofen bei 180°C ca. 60 Minuten goldgelb backen.

USBIP auf einem Raspberry Pi starten

Innerhalb meiner Peergroup hatte die Tage jemand versucht, mit Hilfe der Linux-Software USBIP Geräte, welche an einem USB-Port hängen, auch für ein Netzwerk nutzbar zu machen. Im Gegensatz zu einem normalen Debian-Kernel für Standart-PC’s, sind die entsprechenden USBIP-Module aber für die ARM-Architektur im Kernel nicht enthalten. Und irgendwie scheint es prinzipiell wohl Probleme zu geben, die Treiber für den Kernel zu bauen. Dies trifft also nicht nur auf den Raspberry Pi, sondern auch so netter Embeded-Hardware wie der Dockstar. Nach ein bischen stöbern über die allseits bekannten Suchmaschienen bin ich aber hier auf eine – für’s erste funktionierende Lösung gestossen. Sie ist auf ein Debian Wheezy abgestimmt.

Als erstes sollte man sich vergewissern, dass man für sein Raspberry Pi sowohl den aktuellsten Kernel, als auch die neuen Firmware-Treiber und Module geladen hat. Dann wie folgt:

sudo apt-get install git
git clone git://github.com/raspberrypi/linux.git kernel
cd kernel
wget https://raw.github.com/raspberrypi/firmware/master/extra/Module.symvers
zcat /proc/config.gz > .config

Als nächstes öffnet man mit einem Editor die .config und fügt am Ende folgendes hinzu:

CONFIG_USBIP_CORE=m
CONFIG_USBIP_VHCI_HCD=m
CONFIG_USBIP_HOST=m
CONFIG_USBIP_DEBUG=n

Danach auf der Kommandozeile folgende Befehle absetzen:

make oldconfig
make LOCALVERSION=+ modules_prepare
make SUBDIRS=drivers/staging/usbip
sudo make SUBDIRS=drivers/staging/usbip modules_install
sudo depmod -a

Jetzt USBIP installieren:

sudo apt-get install usbip

Nun den Host-Treiber laden (um USB-Geräte teilen zu können)

sudo modprobe usbip-host

Zum Geräte auflisten:

sudo usbip list -l

Man sollte sich die Bus-ID merken, damit man das Gerät dann zum Teilen frei geben kann:

sudo usbip bind --busid 'BUSID'

Als Antwort kommt dann:

bind device on busid 'BUSID': complete

Für den Client wird dann folgendes ausgelöst:

sudo modprobe vhci-hcd
usbip list --remote 'pi ip'
sudo usbip attach --host 'pi ip' --busid 'BUSID'
lsusb

Apfelkuchen mit Streuseln vom Blech

Zutaten für 1 Portion:

  • 300 Gramm Mehl
  • 200 Gramm Margarine oder Butter
  • 100 Gramm Zucker
  • 1 Eier
  • 1 Packung Vanillezucker
  • 6 Äpfel (z.B.: Elstar)
  • 350 Gramm Apfelmus

Für die Streusel:

  • 200 Gramm Margarine oder Butter
  • 275 Gramm Mehl
  • 175 Gramm Zucker
  • 1 Teelöffel, gestrichen Zimt
  • 1 Prise Salz
  • evtl. Walnüsse oder andere Nüsse

Mehl, Fett, Zucker, Ei und Vanillezucker zu einem Teig verarbeiten und auf ein Blech verteilen. Für die angegebenen Mengen der Zutaten reicht ein etwas kleineres Obstkuchenblech. Dann die Äpfel schälen, in STücke schneiden und mit dem Apfelmus in einer Schüssel vermischen. Die Masse auf den Teig geben.

Zu den Streuseln: Das Fett im Topf schmelzen, vom Herd nehmen, die restlichen Zutaten vermischen un dazugeben. Diese Masse kurz abkühlen lassen und dann die Streusel erzeugen, indem man den entstandenen Teig in die Hand nimmt und zwischen beiden Händen zerbröselt. Natürlich am besten über den Kuchen auf dem Blech.

Dann auf mittlerer Schiene bei circa 175 Grad Celsius circa 45 Minuten backen. Aber Vorsicht: Immer beobachten, da Streusel verbrennen.

Dazu passt Sahne oder auch Vanilleeis. Man kann auch auf die Apfelmasse gehackte Walnüsse oder ähnliches geben. Und darüner dann die Streusel.