Python auf jeder Seite (was ja auch klar ist, da Python auf den Pis ja anscheinend ziemlich verbreitet ist). Daher dachte ich, dass es vielleicht am einfachsten wäre, wenn ich mir die Sprache anschaue.
Python für den Pi ist das GoTo für Anfänger - vorallem wenn der Pi für Anfänger vermarktet wird.
Dabei entsteht natürlich immer der Eindruck, man könne das nur mit Linux und Python machen - und das ist falsch.
Man kann in jeder Sprache, die für ARMhf und ARM7 kompilierbar oder interpretierbar ist auf dem Pi arbeiten.
Man braucht nicht mal Linux, sondern kann seine Programme direkt als Kernel auf dem Prozessor ausführen (also richtig embedded).
Letztenendes musst du entscheiden, welche Sprache du auf dem Pi benutzen willst.
Für mich persönlich lehne ich nur Python ab, weil ich finde, dass es eine grausame Sprache ist. Insofern sehe ich mich da befangen.
Linux hat ein Filemapping für GPIOs unter /sys/class/gpio; damit kannst du GPIO von der Shell oder in Shellskripten ansprechen.
(Da gibt es bestimmt auch sowas wie inotify für diese Files.)
Ebenfalls für die Shell und C/C++ gibt es WiringPi [1, 2]. Damit ist es möglich per Executable oder als C Library mit den GPIOs zu arbeiten.
Zusätzlich gibt es noch linux/gpio.h, aber ich weiß nicht, ob dort alle Calls exportiert sind. Musst du mal gucken, ob du das in den Linux Header Files oder unter /usr/include/ irgendwo findest.
Was richtig wehtut und zum Angeben genutzt werden kann: direkter Registerzugriff. GPIO Pins auf dem Pi sind ARM Peripherals und per Register ansprechbar.
Bspw. für den allerersten Pi (BCM 2835) - hier gibt es dann das entsprechende Handbuch dazu. Die Registeradressen musst du umrechnen von physikalischen Busadressen auf ARM Peripheral Adressen. Beim Pi starten die Peripherals bei 0x20000000UL (UL für unsigned long) - die GPIOs starten bei 0x20200000UL
Ein Register ist dann unsigned int lang, sodass du dir ein Array aus Registern basteln kannst.
volatile unsigned int* gpio = (unsigned int*) 0x20200000UL;
gpio[7] = (1 << 16); //Pull high
gpio[10] = (1 << 16); //Pull low
Ob das der Linux Kernel allerdings zulässt, weiß ich nicht - habe das bisher nur ohne Kernel gemacht.
Hier wird Pin 16 geschalten, ab Pin 32 geht es in das nächste Register (7 bzw. 10 wird dann inkrementiert).
Vorher den Pin Mode noch entsprechend setzen. Beim BCM 2835 gehen da solche Hacks auf:
unsigned char freg = pin / 10;
unsigned char regpos = (pin%10) * 3;
gpio[freg] = (mode << regpos);
//Input Mode = 0 || Output Mode = 1
=============
Was ImageMagick angeht dachte ich es kommt für dich in Frage, weil du ja nach einem Binary gefragt hast, was dir deine Collage erstellt und per Shell aufrufbar ist. Layers kann wohl auch Bilder drehen und ich denke, dass Layers dir da was nettes erzeugen kann.
Edit: Links vergessen.
1: https://github.com/WiringPi/WiringPi
2: http://wiringpi.com/reference/