« Linux     Selbstgemacht »


Script fur das Arduino RTCpro ModulMittwoch, 08 April, 2015 10:36

Das Folgende betrifft Arduino, eine RTC und die Umgebung ist Linux, deswegen ist es für Windows völlig nutzlos, leider.

Meine batteriegepufferte, temperaturgesteuerte Realtimeclock für den Arduino hat beim Umstecken iwie ihre Pufferung verloren und ich musste sie neu programmieren. Welche Libraries man braucht gibt es bei Adafruit, Instructables und auch anderswo zu finden. Was man auch braucht, ist die Time-Library . Und mit der kann man die Uhr (neu) programmieren. Dazu braucht man den Unixtimestamp der gewünschten Zeit und setzt ein T davor, z. B. T1428486102 für den Mi 8. Apr 09:42:27 2015 und das wird einfach über die serielle Schnittstelle zum Arduino ausgegeben. Das kann man aus der Arduino IDE oder über minicom z. B. machen - oder einfach als echo nach /dev/ttyUSB0 umleiten :)

Aber die Arduino IDE und minicom können beide keine Zeitberechnungen oder gar den Unixtimestamp ausgeben. Und weil der frisch ausgeben von date auch nicht instant verwendet werden kann, habe ich mir mal ein kleines Script gebastelt:

    
#!/bin/sh
NOW=$(date +"%s")
# wintertime
#SOON=$(( $NOW + 3601 ))
# summertime
SOON=$(( $NOW + 7201 ))
echo "Now is $NOW which is:"
date --date="@$NOW"
echo "RTC will be set to T$SOON which is:"
date --date="@$SOON"
echo -e "T$SOON\n">/dev/ttyUSB0

Es ermittelt die gegenwärtige Zeit, passt den Zeitstempel für die Uhr und einen Übertragungszeitraum an, informiert auf der Shell und gibt das gewünschte Ergebnis direkt an der seriellen Schnittstelle aus, ganz so, wie es TimeRTCSet.ino erwartet. Es ist vorbereitet, normale Zeit statt Sommerzeit aufzubereiten und wenn die serielle Schnittstelle woanders ist, muss man das auch im Script anpassen. Ist schnell und schmutzig, ich weiß. Ein schnell mal eben gemachtes Werkzeug, mehr nicht.

Categories: Elektronik, Hardware, Programmierung, Selbstgemacht

[ [0] Kommentare ]

Mein erster Ausflug mit dem Arduino und dem DFRobot LCD Keypad shieldSamstag, 27 Dezember, 2014 17:37

Meine neue Spielwiese sollte der Arduino sein.

Mit Scripting und etwas Programmieren am Computer war ich ja schon vertraut und kam schnell auf die Idee, dass so eine Mikroprozessor-Programmierung ohne Display und Tatatur an der CPU recht uninformiert aufallen könnte. - Mein erster Ausflug sollte also gleich eine Textausgabe und eine Eingabemöglich am Gerät haben, auch wenn ich inzwischen schon bemerkt hatte, dass das Android SDK durchaus eine Wiedergabe der seriellen Konsole vom Arduino hat.

Deswegen hatte ich mir das DFRobot LCD Keypad für den Arduino gekauft, das ein blaues, beleuchtetes Display mit weißer Schrift und 6 Tasten für select, Cursorsteuerung und Reset bietet.

Aprops Arduino, ich hatte mir gekauft den Arduino Pro Mini, den Arduino Funduino, sowie den Arduino Nano gleich doppelt oder auch dreifach, Elektronik raucht schnell mal ab beim Entwickeln, dachte ich mir und die Preise sind ja echt günstig.

Bisher ist alles gut verlaufen :)

Wie man nun anfängt? Nun, ein Vergleich mit Windows und Linux hat mir gezeigt, dass es besser ist, mit Linux zu programmieren, was daran liegt, dass das Hochladen von Software bei Windows nicht geht, wenn der Arduinio am Programmierer oder sofern es geht, am USB-Kabel angeschlossen nicht erkannt wird. Das ist bei Linux kein Problem.

Ein Tip, den ich nach Fehlermeldungen am Windowscomputer beim Hochladen hatte und so nicht als Lösung im Internet gefunden habe:

Programmieren geht am Besten mit nackigen Arduino! Also nicht am Steckbrett, wo er noch mit anderen Modulen verbunden ist!!!

Ein oder mehrere Steckbretter mit kurzen und langen Steckkabeln gibt die Möglichkeit, Module mit dem Arduino zu verbinden, ohne dass man löten muss. Für Arduino geeignete Seriell-zu-USB Module, FTDI basiert, um Arduinos die keinen USB-Anschluss haben verbinden zu können. Geeignete USB-Kabel.

Das Problem auf das ich stieß, als ich das LCD am Arduino anschließen wollte, war, dass ich (natürlich) keine Webseiten fand, die die Verdrahtung ganz genau zeigten. Dokumente, die zeigten, dass man das LCD prima auf den Arduino Uno stecken konnte waren zunächst nicht so die richtige Hilfe... später, als ich mir die PIN-Schematics vom Arduino UNO reingezogen hatte, war alles klar.

Ich habe mal das PIN-Layout des LCD von einer meiner Funde mit XCircuit nachgezeichnet, hier ist es:

-die Anschlüsse, die man braucht, sind alle angehakt. Das ist auf der unteren Seite bei den Buttons Reset, 5V, Ground sowie A0 und auf der Oberseite D4-D9 und D10. Und ja, D11 MOSI ~ ist mir auf dem Bild wohl verloren gegangen und ich hab's zu spät gemerkt. Egal, brauchen wir hier ja nicht :)

Auch nicht unbedingt braucht man Reset und D10 für Backlight Control. Verbunden wird mit dem Arduino 1:1, d.h. LCD D4 geht auf Arduino D4, LCD D5 auf Arduino D5 usw., LCD 5V (Input) geht auf Arduino 5V (Output), GND auf GND und A0 auf A0. Ging bei meinem Funduino ohne weitere Maßnahmen.

Ein Sketch von DFRobot hat mir gut gefallen und modifiziert hatte ich es, weil ich wohl ein LCD V1.0 Board habe und weil ich wissen wollte, wie der Reset arbeitet und wie es ohne Backlight aussieht.

So sieht "der Gerät" aus:

Und so das modifzierte Sketch:

//Sample using LiquidCrystal library
#include <liquidcrystal.h>

/*******************************************************

This program will test the LCD panel and the buttons
Mark Bramwell, July 2010

********************************************************/

// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
//LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
// define some values used by the panel and buttons
int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5
#define backLight 10

// read the buttons
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // read the value from the sensor 
 // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
 // we add approx 50 to those values and check to see if we are close
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 // For V1.1 us this threshold
/*
if (adc_key_in  50)   return btnRIGHT;  
 if (adc_key_in  250)  return btnUP; 
 if (adc_key_in  450)  return btnDOWN; 
 if (adc_key_in  650)  return btnLEFT; 
 if (adc_key_in  850)  return btnSELECT;  
*/
 // For V1.0 comment the other threshold and use the one below:

 if (adc_key_in  50)   return btnRIGHT;  
 if (adc_key_in  195)  return btnUP; 
 if (adc_key_in  380)  return btnDOWN; 
 if (adc_key_in  555)  return btnLEFT; 
 if (adc_key_in  790)  return btnSELECT;   



 return btnNONE;  // when all others fail, return this...
}

void setup()
{
 lcd.begin(16, 2);              // start the library
 lcd.setCursor(0,0);
 lcd.print("Push the buttons"); // print a simple message
}
 
void loop()
{
 lcd.setCursor(9,1);            // move cursor to second line "1" and 9 spaces over
 lcd.print(millis()/1000);      // display seconds elapsed since power-up


 lcd.setCursor(0,1);            // move to the begining of the second line
 lcd_key = read_LCD_buttons();  // read the buttons

  switch (lcd_key)               // depending on which button was pushed, we perform an action
 {
   case btnRIGHT:
 {
 lcd.print("RIGHT ");
 break;
 }
   case btnLEFT:
 {
 lcd.print("LEFT   ");
 break;
 }
   case btnUP:
 {
 lcd.print("UP    ");
 pinMode(backLight, OUTPUT);  // Backlight off
 break;
 }
   case btnDOWN:
 {
 lcd.print("DOWN  ");
 pinMode(backLight, INPUT);  // Backlight on
 break;
 }
   case btnSELECT:
 {
 lcd.print("SELECT");
 break;
 }
 case btnNONE:
 {
 lcd.print("NONE  ");
 break;
 }
 }

}  
  

Der Reset am LCD bewirkt ein Reset am Arduino, ist das Backlight aus (Cursor up, wieder an mit Cursor down), braucht man ein gut ausgeleuchtetes Display, um etwas lesen zu können. Aber vielleicht kann man ja die Darstellung invertieren und ich finde das noch irgendwann heraus.

Und jetzt geht es erst richtig los mit der Mikroprozessor-Programmierung XD

Categories: Elektronik, Hardware, Programmierung, Selbstgemacht, Software

[ [0] Kommentare ]

Gelöschte Dateien von MS-DOS Datenträgern wieder herstellenDienstag, 08 Juli, 2014 17:25

Das passiert manchmal und schnell ist es getan - die gemountete SD-Card mit einem MS-DOS Dateisystem z. B. vom Ebook-Reader wird versehentlich gelöscht und dann ist es passiert: Die Dateien sind weg und ein undelete für MS-DOS gibt es nicht.

Ist mir so vor ein paar Tagen passiert. Und ich habe gefunden, wie ich in Linux diese Daten wieder herstellen kann! Da ist sleutkit dein Freund, eine Software aus der Abteilung Forensics. Sleuthkit arbeitet mit Disk-Images, was eine gute Idee ist, damit am zu untersuchenden Datenträger keine Änderung womöglich Daten zerstören, die man lieber gerettet hätte.

Mit Linux ist das schnell und einfach gemacht. Mein Datenträger war als /dev/sde2 und /dev/sde3 gemountet und von /dev/sde2 habe ich vesehentlich Dateien gelöscht. Also läuft das so:

dd if=/dev/sde2 of=sd2.image.dd

Das erstellt eine bitgleiche Kopie der MS-DOS Partition.

Mein Script das ich erstellt habe, sieht beim Arbeiten dann so aus:

    
# msdos_recover.sh sony/sde1.image.dd
r/r 6975363:    EXTBIN (Volume Label Entry)
d/d 6975365:    Sony_Reader
d/d * 6975367:  udisk
d/d * 6975370:  rupor-enable-asec
d/d * 6975373:  rupor-disable-all
d/d * 6975375:  Books
r/r * 6975377:  This.is.CARD
d/d * 6975379:  Old.apks
d/d * 6975381:  apks
r/r * 6975384:  .created_by_pmount
continue? (y/n)
y
...reading
...writing
If we are lucky, you will find recovery at EXTBIN.
There is also a log at EXTBIN.log
done.

409M Daten wieder hergestellt :)

Interessiert? Kannst du >>msdos_recover.sh.zip<< herunterladen! Anschließend entpacken und ausführbar machen mit chmod +x msdos_recover.sh und dann iwo im ausführbaren Pfad ablegen.

Categories: Programmierung, Selbstgemacht, Software

[ [0] Kommentare ]

Media Indexer Entwicklung Status 1Donnerstag, 28 Juli, 2011 2:24

Es gibt ja bereits ein, zwei Media Kataloge für KDE und GTK, die mir aber zu aufgebläht sind und und für meinen Zweck "auf welchem USB Stick befindet sich die Datei xyz?" einfach zuviele Abhängigkeiten mitinstallieren, die ich gar nicht haben will.

Ausserdem will ich mehr C Programmieren und nachdem Perl mit Sqlite3 und zip und unzip Funktionalität gar nichts anfangen konnte, habe ich also mein zweites C Projekt angefangen, das mich sehr beansprucht hat und deswegen gab es auch lange nichts Neues hier zu lesen.

Inzwischen bin ich mit meinem persönlichen Media Indexer aber weit fortgeschritten und möchte an dieser Stelle bereits einmal ein paar Schnipsel Screenshots zeigen. Ich habe wirklich viel C Programmierungstechnik dazugelernt, dazu gleich mehr.

Ich stelle hier nur kurz mal dar, was ich gerne hätte:

Ein Programm, dass gemountetet Datenträger in /media liest, die Informationen in eine Datenbank schreibt, die ich einfach mal abfragen kann und die mir dann schnell Ergebnisse auswirft. Ich hätte ja auch einfach ein "ls -lR > USB-Stick.inhalt" pumpen können und anschliessend ein "grep" draufwerfen können. Das ist schnell erzeugt, das mit schnell ausgelesen irgendwann aber nicht mehr.

Ausserdem sollte dieses Programm kein Konsolenprogramm werden, sondern grafisch für den Desktop sein. Erste positve Erfahrungen hatte ich mit Zenity  schon gesammelt und das sollte auch meinen Ansprüchen genügen.

Dazu sollte eine Datenbank gehören, auch meinetwegen gerne verteilt auf verschiedene Dateien wie eine Datei pro Datenträger und starke Abhängigkeiten wie Server/Client Datenbanken wollte ich auch nicht haben dafür, sondern etwas wie eine Berkely Datenbank.

Meine Wahl fiel jedoch auf Sqlite, das auch in aktuellen Produkten wie Firefox und I-Phone Verwendung findet.

Bisher habe ich Einlesen fertig, hier sind die Screenshots:

Auswahl des/der Datenträger:

Datenträger Auswahl, auch mehrere  

Einlesen der Dateien, hier ist die Dauer ungewiss und durch einen pulsierenden Fortschrittsbalkens dargestellt:

Dateien einlesen

Schreiben der Datenbank mit den zuvor ermittelten Daten, hier ist der Verlauf eindeutig und es kann ein echter Fortschrittsbalken angezeigt werden:

Datenbank schreiben

Fertig:

Ende Hinweis

Ich bin mächtig stolz auf mich, ich kann jetzt nämlich in C Programmen dynamisch Speicher aloziieren, was auch dringend notwendig ist, denn die Menge an Daten von vorher nicht bestimmten Datenträgern kann man nicht fest einprogrammieren.

Ausserdem habe ich gelernt, wie ich mit C nicht nur Sqlite3 Dateien reinpumpe, sondern auch wie ich Pragmas zur Geschwindigkeitsoptimierung verwende und Unterprogramme zum Un-/Komprimieren anmelde.

Eine wahre Wucht und ich freue mich schon auf das Gestalten der Ausgabe...

[Update 01.08.2011]

Meine Vorstellung, für jedes Medium je eine Datenbank zu schreiben und bei Abfragen die Funktion SQLITE_ATTACH zu verwenden, wodurch ich alle Datenbanken über ein Datenbankhandle ansprechen kann und alle Datenbanken wie eine erscheinen, schien ja das voll geile komfortable feature zu sein.

Jedoch bin ich beim Hinsehen auf die Grenzen gestoßen, z. Z. sind da nicht mehr als 62 Datenbanken  drin. Das erscheint mir doch ein bißchen wenig, sodass ich mich beim Datenbank Design kalt erwischt fühle und das wohl ändern muss. Also ist in etwa doch nur eine Datei für alles oder so angesagt, schließlich kann eine Datenbank 2^64 Reihen haben, eine Grenze die man eigentlich gar nicht haben können soll und dann wäre die Datei 14 TB groß. Das Datenbankdesign muss ich mir also nochmal überdenken.

Categories: Hardware, Linux, Programmierung, Selbstgemacht, Software

[ [0] Kommentare ]

udev Regel für cryptsetup luks verschlüsselte USB DatenträgerFreitag, 29 April, 2011 1:12

In Linux nehme ich gerne andere Windowmanager als KDE oder Gnome, nämlich solche, die wenig Speicher brauchen und die CPU kaum beanspruchen - wie z. B. jwm oder fluxbox. Die kennen keinen Fortschrittsbalken, sondern poppen einfach auf und sind dann da und es kann losgehen. Sie sind winzig und auch klein im Funktionumfang und bringen nicht alles mit, wofür es schon Spezialisten gibt - in jwm bekomme ich Desktop Icons mit rox desktop. Der Lautstärkeregler? gvolwheel. Und so weiter.

Nun gab es aber schon immer das Problem, daß solchen smarten Windowmanagern wirklich etwas völlig und seit ewig fehlte: Ein grafisches Poppup zum Eingeben des Schlüssels, wenn man einen cryptsetup luks verschlüsselten USB Stick angeschlossen hatte.

Im Gentoo Forum habe ich eine schöne Vorlage gefunden für eine udev Regel die in arch Linux funktionierte, nicht aber in Gentoo. Das habe ich untersucht und mit der ersten selbst erstellten udev Regel für mich experimentiert, was man in der udev Regel machen kann und was ein externes Script braucht. Das Problem hatte ich schnell gefunden und es lag hier verborgen: "Running external programs upon certain events ... udev does not run these programs on any active terminal, and it does not execute them under the context of a shell. Be sure to ensure your program is marked executable, if it is a shell script ensure it starts with an appropriate shebang (e.g. #!/bin/sh), and do not expect any standard output to appear on your terminal. (http://reactivated.net/writing_udev_rules.html#external-run )

Was dabei herausgekommen ist, kann man hier sehen:

Leerer Desktop vor dem Einstecken des USB-Sticks 

USB Stick gesteckt, das Fenster poppt auf 

Eingabe des Schlüssels 

Desktop Notify poppt auf 

Der geöffnete /media Ordner 

Der Inhalt des gemounteten Ordners 

Wieder eine Ebene zurück 

Umounten mittels pumount des Ordners mit der Maus 

Der Ordner nun nicht mehr gemountet 

Der USB-Stick wieder herausgezogen 

Download /etc/udev/rules.d/99-crypt.mount.rules weil es hier sonst den Rahmen sprengt :-)

/etc/udev/scripts/crypt.open.sh

 
#!/bin/sh WHAT=$1 WHERE=$2 while [ "$LOOP" != "done" ] do export DISPLAY=":0.0" PASS=`/usr/bin/sudo -u sascha /usr/bin/zenity --entry --hide-text=LUKS \ --text="LUKS open $WHAT at $WHERE" --title "Luks Passphrase" --width 500` if [ $? = 0 ];then # This is the ok button LOOP="run" echo $PASS | /sbin/cryptsetup -t 15 luksOpen $WHAT $WHERE if [ $? = 0 ]; then # Password success LOOP="done" fi else # this catches the cancel button LOOP="done" fi

done

Damit das im Windowmanager mit dem umounten funktioniert, muss der auf pumount eingestellt werden und sys-apps/pmount installiert sein.

Super, was habe ich lange vergeblich nach soetwas gesucht und jetzt konnte ich es sogar selbst fertigstellen.

Categories: Hardware, Linux, Programmierung, Selbstgemacht, Software

[ [0] Kommentare ]

Hacking Samsung SPF-87H - Linux demon v0.0.2Sonntag, 27 Februar, 2011 14:57

Der Deamon ist nicht länger auf /proc/bus/usb/devices angewiesen, wenn diese Pseudodatei nicht existiert, wird in /sys/bus/usb/devices hinabgestiegen und dort nach dem Gerät gesucht.

Hiermit kommt also die v0.0.2 an der sich sonst nichts geändert hat.

Download spf87hd_v0.0.2.tar.gz 

Categories: Hardware, Linux, Programmierung, Selbstgemacht, Software

[ [0] Kommentare ]

Hacking Samsung SPF-87H - Linux demonMittwoch, 02 Februar, 2011 13:34

Meinen Wunsch, wie ich den Samsung SPF-87H digitalen Bilderrahmen als Zweit-Monitor verwenden möchte, habe ich fertig programmiert. Da Samsung für dieses Gerät leider nur Windowsen unterstützt, guckt man als Linux User diesbezüglich in die Röhre. Das ist nicht (mehr) modern, aber leider Fakt. Nun ja, wenn du etwas gemacht haben willst, mach' es selbst! Und so habe ich mir einen Demon geschrieben.

Der Demon läuft im Hintergrund, schläft überwiegend und guckt dann immer nach einer Sekunde nach, ob das Gerät angeschlossen und im Monitormodus ist - dann schlägt er zu. Die Systemlast läuft gegen Null. Die einfache Lösung erschien mir am Anfang platt, es hat sich aber herausgestellt, daß sie auch die nervenschonenste und auch die Last schonenste ist, jedenfalls ist es nun so, dass ich die Pseudodatei des Kernels /proc/bus/usb/devices nach "Vendor=04e8 ProdID=2034" greppe. Das ist ja auch nicht wirklich eine echte Dateioperation und findet ohne Plattenzugriff allein im Hauptspeicher statt.

Es wird dann der permanente Monitormodus eingeschaltet und, sofern man es angegeben hat, das Kommando für diesen Fall ausgeführt. Da starte ich das Script, dass mir meine Conkys, die auf dem Hauptmonitor laufen, beendet und mir dann mit Xvfb, scrot und jpeg2spf87h, siehe unten, die Bilder auf den SPF-87H pumpt, die ich da sehen möchte.

Der demon kann noch was, denn wenn ich den SPF-87H dann wieder ausschalte, wird das Kommando für diesen Fall gestartet und dann startet er per Script wieder meine Conkys für den Hauptbildschirm.

Im Syslog sieht das so aus:

    
Feb  2 00:09:52 localhost spf87hd[16354]: SPF87H device in monitor mode found.
Feb  2 00:09:53 localhost spf87hd[16354]: claimed device.
Feb  2 00:09:53 localhost spf87hd[16354]: Permanent monitor mode enabled.
Feb  2 00:09:54 localhost spf87hd[16354]: Monitor cmd started.
...
Feb  2 00:11:27 localhost spf87hd[16354]: SPF-87H monitor device gone.
Feb  2 00:11:27 localhost spf87hd[16354]: No-Monitor cmd started.

Im Top:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                   
16354 root      20   0 18692  784  584 S    0  0.0   0:00.95 spf87hd

Na, damit kann man doch zufrieden sein, oder nicht?

Der Demon läuft auch im Vordergrund und kann auch ohne jede Option ausgeführt werden, dann schaltet er nur den permanenten Monitormodus auf dem Gerät ein.

Als demon muss er als root laufen, damit er in /var/run/ auch seine pid Datei schreiben und wieder löschen kann. Als user Prozess kann er auch betrieben werden, dann jedoch nur als Vordergrund Prozeß.

    
  $ ./spf87hd -h
Initializes the SAMSUNG SPF-87H for Linux Monitor Mode when it is set to it.

spf87hd has these Options:

-f, --foreground          Don't deamonize, stay at console.
-n, --nomonitor 'command' Command (unchecked) to be executed after Mini-
  Monitor function has been stopped.
-m, --monitor 'command'   Command (unchecked) to be executed after Mini-
  Monitor function has been started.
-u, --user [name]         Username (must exist) the commands are run by.
-h, --help                This text.
 

Für das Rüberschieben von JPEG Dateien habe ich auch ein eigenes Programm geschrieben, naja, abgeschrieben, wie im Großen und Ganzen eigentlich alles abgeschrieben, angepaßt und modifiziert ist. Dafür hat es aber auch sehr wenig Systemlast und produziert keine Beschwerden des Kernels mehr, "...process 24676 (jpeg2spf87h) did not claim interface 0 before use". Und ich verwende da libusb_bulk_transfer, genau wie der Windows Treiber auch bulk transfer verwendet.

Fehler passieren, die ich nicht verhindern kann. Bei hoher Systemlast ist es so, dass hier bei mir das Bilder rübersenden nicht immer funktioniert. Das ist aber kein Fehler von jpeg2spf87h, sondern eine Folge der Arbeit des Kernels in so einer Situation, jpeg2spf87h ist eben userland. Ausserdem gerät das Gerät manchmal aus dem Monitormodus hinein in den Datenträgermodus, das ist aber selten und kann durch einen Neustart des SPF-87H behoben werden. Ich merke das an der Bildschirmmeldung die dann kommt, sinngemäß steht dann da, der Datenspeicher sei fast voll und ich solle Dateien löschen wenn ich da Platz brauche. Diese Meldung fehlt vermutlich wenn Platz ist, dann merkt man es wohl nur daran, dass das Bild nicht mehr aktualisiert wird. Vermutlich ist das ein Bug in der Firmware, nur habe ich wenig Lust die neue Firmware einzuspielen die diesen Bug behebt, mir aber meine ganze Arbeit vielleicht wieder zunichte macht. Wer weiß? Never change a running sytem, you know? Aber vielleicht kann mir ja ein Leser mit der neuesten Firmware da mal was berichten...

Für die Realisation dieses kleinen aber anstrengenden Projektes habe ich also vielen Leuten zu danken, sie sind alle in den Quellen aufgeführt. Ja, opensource ist eine tolle Sache, ohne hätte ich meinen Samsung SPF-87H wohl wieder verkauft, oder nein, zum Kauf wäre es gar nicht erst gekommen. So wird mein Dank noch größer und geht auch an Samsung, denn ohne diese Versorgungslücke hätte ich mich gar nicht in diese Arbeit gestürzt. Da aber auch ohne Opensource ohne Hintergrund und Basis dieses Projekt gar nicht möglich gewesen wäre, ist es sogar so, daß ich gar nicht allen danken kann. Was ich aber tun kann, ist, das was ich gemacht habe, wieder zu veröffentlichen.

Wer also Lust hat, den Code einmal zu begutachten oder als Vorlage für sein eigenes Projekt nehmen möchte, oder wenn Du sogar selbst einen Samsung SPF-87H mit dieser bescheuerten, broken by design Firmware hast, dann hättest du ja sogar selbst dafür Verwendung.

Downloads:

spf87hd_v0.0.1.tar.gz 

jpeg2spf87h_v0.0.1.tar.gz 

Categories: Hardware, Linux, Programmierung, Selbstgemacht, Software

[ [1] Kommentar ]

Hacking Samsung SPF-87HMontag, 17 Januar, 2011 2:52

Der Digitale Bilderrahmen Samsung SPF-87H  kann unter Windows als Zusatzbildschirm verwendet werden. Auf http://vdrportal.de/board/thread.php?postid=947900   zeichnete sich ab, dass es auch mit Linux läuft.

Nun, da es mir keiner programmiert hat, musste ich es selbst tun und ein verschnupftes Wochenende weiter mit viel Internetsuche und viel Code kopieren und zusammenwürfeln und vor allem einem USB Verkehr Mitschnitt durch Wireshark war es schließlich soweit:

spf87h-tool , mein erstes C-Programm, das die ermittelte Codesequenz zum Bildschirm schickt, damit der im Monitormodus bleibt, ist fertig (UPDATE: Ich arbeite gerade an einem Deamon, damit man den Bildschirm nur "anschalten" muss und der rest automagisch funktioniert).

Der Samsung SPF-87H Digitale Bilderrahmen ist nun nicht länger nur ein Windows Werkzeug, sondern mir auch in Gentoo Linux zu Diensten und ich habe jetzt einen Zweitbildschirm, auf den ich meine Conkies auslagere, so habe ich auch in Vollbilddarstellung auf dem Hauptmonitor schnell mal auf den kleinen Samsung erblickt, was mein System so macht und wie das Wetter wird.

Nun kann ich den Monitor einschalten, Mini Monitor Modus auswählen, das Programm spf87h-tool starten, dann geht es los :

SPF-87H.sh

#!/bin/sh
killall conky 2>&1 >/dev/null
killall Xvfb 2>&1 >/dev/null
rm /tmp/.X13-lock 2>&1 >/dev/null
Xvfb :13 -screen 0 480x800x16 &
sleep 5
/home/sascha/SPF-87H/playusb/playusb -j /tmp/ram/xwud.jpg
export DISPLAY=:13.0
conky -p 0 -c /home/sascha/SPF-87H/conky/.conkyWeather &
conky -p 4 -c /home/sascha/SPF-87H/conky/.conkySystem &
conky -p 6 -c /home/sascha/SPF-87H/conky/.conkyCal &
conky -p 8 -c /home/sascha/SPF-87H/conky/nixie_clock.conkyrc &
while `grep -q 'Vendor=04e8 ProdID=2034' /proc/bus/usb/devices`
do
scrot /tmp/ram/xwud.jpg -q 100
jpegtran -rotate 90 -trim -outfile /tmp/ram/xwud.jpg /tmp/ram/xwud.jpg
/home/sascha/SPF-87H/playusb/playusb -j /tmp/ram/xwud.jpg
done
killall conky 2>&1 >/dev/null
killall Xvfb 2>&1 >/dev/null
sudo rm /tmp/.X13-lock 2>&1 >/dev/null
exit 0

Ach ja, /tmp/ram, das mounte ich per

/etc/fstab

  none /tmp/ram tmpfs mode=1777,size=512M 0 0

Durch tmpfs kann ich Dateien im RAM ablegen und verarbeiten, das verschnellert den Prozess enorm. Sogar meine nixie Röhren Digital Uhr mit Sekunden läuft im Zweitbildschirm dann ganz aktzeptabel.

Categories: Hardware, Linux, Programmierung, Selbstgemacht, Software

[ [1] Kommentar ]

Programmieren lernen - für KinderSamstag, 30 Oktober, 2010 22:59

Mein Freund Marc hat einen Sohn. Der spielt gern am Computer und an der Konsole, ist ja klar. Marc und ich haben darüber gesprochen ob es nicht was Schönes gibt, das einen spielerischen Einstieg in die Programmierung bietet. Der Auslöser war die Heise ct-cd mit solcher Software darauf.

Ich habe mir AntMe angesehen, zuerst mit VisualBasic, da ich kein Buch dafür habe und Hilfe im Internet zu diesem Thema begrenzt ist, habe ich dann dasselbe nochmal mit C# gemacht und ja, mein erstes halbwegs vernünftiges Ameisenvolk übersteht andere Völker, wenn die Nahrungsquellen Verteilung nicht unfair ist und die anderen keine Tötungsmaschinen losschicken. - Ich finde jedoch, da man bei AntMe richtig mit einer Hochsprache programmiert ist es unzufriedenstellend, dass die Antme engine eine blackbox ist. Das hat zur Folge, dass man nicht alles verstehen kann, was ich sehr unschön finde.

Viel interessanter fand ich da Etoys. Etoys startet einen desktop und am Anfang gibt es da ein kleines Auto das herum fährt und wenn es wo gegen bummst, dann dreht es um und fährt in anderer Richtung weiter, das Mini script das das kleine Auto steuert, steht auch gleich für eine erste Untersuchung da.

Man kann tutorials und demos aufrufen, eine Gallerie fertiger Projekte ansehen und starten, sowie ein neues eigenes Projekt starten. Dafür steht eine workbench zur Verfügung und die Objekte, die man erzeugt. Tja, wenn man denn mal mit einem eigenen Projekt startet, dann steht da am Anfang ein Objekt dass man sich selbst malt oder man holt sich etwas aus der workbench. Objekte haben dann Eigenschaften und Fähigkeiten, die man per script steuern kann.

Das nenne ich einen kind gerechten Ansatz und mein erstes Projekt "Pong" hat mir viel Freude bereitet. Die Programmierung ist in sich geschlossen und man kann wenn-dann Beziehungen aufbauen, Bewegungen auslösen und vieles mehr. Wie was geht, erschließt sich nach und nach von selbst oder man sieht sich die lokalen tutorials und die im Internet an.

In Etoys kann man wohl auf Deutsch umschalten, jedoch hat das nicht eine hundert prozentige Wirkung. Wenn sich jemand damit beschäftigt, ist ein englischer Wortschatz sehr vorteilhaft und bestimmt wird der mit Etoys dann auch gleich ein kleines bisschen mit aufgebaut, was ich eher als Vorteil denn als Nachteil sehe, Marc übrigens auch :-)

Hier ist der link  zu den Video tutorials, die ich sehr lehrreich fand, englisch latürnich. Und hier kann die Projektdatei Pong heruntergeladen werden (rechtsklick zum herunterladen, linksklick, falls das Etoys plugin installiert ist):

 PONG.015.pr 

Das ist überhaupt die Krux, ein deutsches Projekt, das habe ich nicht gefunden, leider.

Ausserdem bin ich noch auf Alice gestoßen, das ist vom Ansatz her wohl nicht so für Kinder geeignet, das Programm läßt sich aber sogar auf deutsch umstellen und bietet nach längerem "Studium" die Komplexität, die Etoys abgeht. Hier hat man auch einen "desktop", d. i. eine 3D Landschaft, die man dann mit Objekten bestücken kann und diese haben wiederum Eigenschaften und Fähigkeiten, die man manipulieren kann. Einen Astronauten auf dem Mond, der ein paar Schritte herumläuft und sich fragt, wie er da wohl hingekommen ist, hatte ich in wenigen Minuten erstellt. Macht Spaß, echt!

Categories: Programmierung

[ [0] Kommentare ]

« Linux     Selbstgemacht »