Auf unseren Treffen ist es immer sehr mühsehlig die Speicherkarten von den ganzen FPV’lern zu kopieren. Vorallem wenn man dafür nur eine oder zwei Stunden Zeit hat. Also hab ich mir überlegt, was man machen kann. Die Lösung: Ein Raspberry Pi in einem schicken Pinken Gehäuse mit eingebauter SSD und der Cardreader wird als USB-Datenschleuder missbraucht!
Benötigte Bauteile
- Raspberry Pi
- Einen Modellbau BEC mit 5A (ebay)
- Adafruit TFT für den Raspberry
- SSD Festplatte
Es geht auch ne normale Festplatte im 2,5″ Format, allerdings steigt dann der Stromverbrauch nicht unerheblich und man sollte einen großen Kondensator mit in die Versorgung einbauen, da der Peak zu hoch sein könnte und das dem Pi nicht gefällt.) - Externes Gehäuse für 2,5″ Festplatten
Wir benötigen den USB-Controller daraus. - Speicherkarte mit mind. 8 GB
- SD Card Reader (1-3 Stück)
- USB-Hub
- W-Lan Stick (nur für ältere Raspberry Modell! Wie der installiert wird, hab ich hier schonmal geschrieben)
- passendes Gehäuse (evtl. gedruckt?!?!) (download)
- Netzwerkkabel fürs erste Setup
- Etwas Kabel für Stromversorgung vom Hub und des Raspberrys
- Heißkleber!
Das ganze soll dann am Schluss so aussehen
Akkuversorgung
Der CopyPii wird per XT-60 und einem 3-5S Akku versorgt (je nach verwendetem BEC) und wartet auf eine SD Karte die in den eingebauten USB-Hub eingeschoben wird. Intern arbeitet eine SSD mit 128 GB Speicher und wartet nur darauf befüllt zu werden. Den Raspberry versorge ich direkt per Kabel. Ich habe die Versorgungsleitung einfach am Input angelötet. Vor der Diode.
Linuxkenntnisse
- Mount einer Festplatte und der USB-Sticks
- Einrichtung von Samba
- W-Lan einrichtung
- Ansteuerung des TFT Displays
Das eigentliche Kopier-Script habe ich von hier: https://github.com/LarsMichelsen/sd-autocopy
Dort steht auch erklärt, wie das Script funktioniert und was man alles für Vorbereitungen treffen muss.
Geändert habe ich lediglich dass er von jeder Speicherkarte kopiert, die man in den Hub einsteckt. Es findet somit keine Seriennummernüberprüfung der Speicherkarte mehr statt. Ebenso erstellt das Script einen Unterordner mit einem Timestamp, damit man keine Bilder oder Videos überschreibt.
Die Änderung dass er von jedem Stick kopiert habe ich wieder rückgängig gemacht. Linux hat die Eigenheit, dass es “tote scripte” nach kurzer Zeit aus dem Speicher wirft. Was bei großen Dateien (Videos von der Gopro) echt zu problemen führt!
Fotodatum
Das Script ließt das Fotodatum aus und erstellt je nach Aufnahmedatum wieder einen Unterordner.
#!/bin/bash # # sd-autocopy - Copies/Moves images automatically from inserted media # # Copyright (c) 2011 Lars Michelsen <lm@larsmichelsen.com; # # License: # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # But this in curly braces and detach the whole block to background # for not blocking udev during copying. { USER=root #unter welchen Rechten die Dateien gespeichert werden -- SMB USER! TARGET=/media/ssd/_upload #Zielverzeichnis eintragen HANDLED_SERIALS=Multiple_Card_Reader_058F63666438-0:0 MOUNT=/media/cardreader #Ordner vorher erstellen FILE_MATCH=".*.(jpg|cr2|jpeg|pdf|mkv|avi|mp4|3gp|mpg|mov|mpeg|wma|wmv|vob|mts)$" #hier die Dateiformate eintragen TRANSFER=cp #cp für kopieren, mv für verschieben TIMESTAMP=$(date +%Y%m%d%H%M%S) #timestamp für Unterordner # END OF CONFIGURATION ######################################################## # DEBUG: # To enable debugging without udev events uncomment the lines below #ID_SERIAL=0x000006d4 #DEVNAME=/dev/mmcblk0p1 # Catch unset but needed vars - terminate script if [ -z "$ID_SERIAL" ] || [ -z "$DEVNAME" ]; then exit 1 fi if ! echo "$HANDLED_SERIALS" | grep $ID_SERIAL >/dev/null 2>&1; then logger -t sd-autocopy "Card not accepted!" exit 1 fi logger -t sd-autocopy "Karte akzeptiert. Starte Kopiervorgang..." if [ ! -d "$MOUNT" ]; then mkdir -p "$MOUNT" fi mount $DEVNAME "$MOUNT" LINES=$(find "$MOUNT" -regextype posix-egrep -iregex "$FILE_MATCH" -printf "%TY-%Tm-%Td_%pn") DATES=$(echo "$LINES" | cut -d_ -f1 | uniq) # First create the directories when missing for DATE in $DATES; do echo $DATE mkdir -p "$TARGET/$TIMESTAMP/$DATE" done # Move the images NUM=0 for LINE in $LINES; do DATE=${LINE%%_*} FILE=${LINE#*_} logger -t sd-autocopy "Kopiere $FILE" $TRANSFER "$FILE" "$TARGET/$TIMESTAMP/$DATE" NUM=$(($NUM+1)) done umount $DEVNAME # Fix the permissions for all directories recursive where # files have been copied/moved to for DATE in $DATES; do chown -R $USER.$USER "$TARGET/$TIMESTAMP" chmod -R 775 /media/ssd done logger -t sd-autocopy "Fertig! $NUM Dateien kopiert." } & exit 0
TFT mit Syslog
Ich habe zusätzlich noch einen TFT eingebaut, der mir den Syslog anzeigt, da mir die Kenntnisse in Python fehlen um das ganze grafisch etwas schöner gestalten zu können. Ein “system halt” Button hab ich auf einen Button vom TFT hinterlegt, damit ein sauberes Herunterfahren immer gewährt wird. Momentan stelle ich fest, wenn eine Karte fertig ist, dass die USB-Reader nicht mehr blinken.
Weitere ToDo’s
- grafische Oberfläche mit python auf dem TFT ohne startx
- Evtl. Namen generieren für Ordner je nach eingelegter Speicherkarte
Also, wen Du das ganze noch ein bisschen mit einer grafischen Python Oberfläche aufpeppeln kannst, melde Dich! Im endeffekt würde es schon reichen, wenn man den syslog ausließt und auf Nachrichten filtert. Dies dann auf dem TFT ausgibt.
Das Gehäuse habe ich oben als STL mal mit drangehängt. Bitte beachtet, das der RaspberryPi mount von hier stammt.
Viel Spaß beim Nachbauen! Bei Fragen, bitte einfach in die Kommentare und ich versuche zu helfen!
8 Kommentare
Ich hoffe, das hier lebt noch… Ich habe da eine Frage:
Ich wollte gerne das Script nutzen. Wenn ich es aber nun mit “sudo bash sd-autocopy” starte, bekomme ich folgende Fehlermeldungen:
sd-autocopy: Zeile 21: $’\r’: Kommando nicht gefunden.
sd-autocopy: Zeile 24: $'{\r’: Kommando nicht gefunden.
sd-autocopy: Zeile 25: $’\r’: Kommando nicht gefunden.
sd-autocopy: Zeile 33: $’\r’: Kommando nicht gefunden.
sd-autocopy: Zeile 35: $’\r’: Kommando nicht gefunden.
sd-autocopy: Zeile 40: $’\r’: Kommando nicht gefunden.
sd-autocopy: Zeile 63: Syntaxfehler beim unerwarteten Wort `$’do\r”
‘d-autocopy: Zeile 63: `for DATE in $DATES; do
Kannst du du mit da bitte weiterhelfen?
Ich versuche das ganze auf einem Raspberry Pi 3 mit Raspbian.
Hi Sascha, das sieht mir ganz nach einem versteckten Zeilenumbruch in deinem Script aus. Hast Du das mit einen kompatiblem Editor (z.B. Notepad++) bearbeitet?
Versuchs mal mit dem Befehl:
sed -i ‘s/\r$//’ sd-autocopy und anschließend nochmal ausführen.
Danke. Nach dem Befehl kommt keine Fehlermeldung mehr.
Nun scheint aber nichts zu geschehen. Ist das normal, dass das Script nichts macht, wenn keine SD-Karte angeschlossen wird?
Auch wenn nun eine SD-Karte angeschlossen wird, passiert nichts nach Ausführen des Scripts. Es kommt auch keine Meldung.
Das sollte schon funktionieren. Steck mal die SD Karte samt Kartenleser an. Nicht nacheinander.
Danke für die schnelle Antwort. Ich habe es genauso gemacht. SD-Karte samt Kartenleser. Es passiert trotzdem nichts.
Was sagt denn DMESG? Nutze das script schon eine ganze Weile nicht mehr.
Danke. Hab es es jetzt anders gelöst.
Hallo,
ich wollte die coole Idee auch umsetzen doch leider habe ich kaum einen Plan von Linux und stehe deshalb etwas vor Problemen. Könnte mir einer kurz sagen wie man das auf dem Raspberry Pi einrichten muss damit es läuft? …. Ich komme kein Stück vorwärts
Gruß Ben