Startseite » CopyPii – Mit dem Raspberry Pi automatisch jede eingelegte SD Karte kopieren

CopyPii – Mit dem Raspberry Pi automatisch jede eingelegte SD Karte kopieren

von Christoph
4.7/5 - (8 votes)

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!

copyPii - mit dem Raspberry automatisch jede eingelegte SD Karte kopieren!

copyPii – mit dem Raspberry automatisch jede eingelegte SD Karte kopieren!

Benötigte Bauteile

Das ganze soll dann am Schluss so aussehen

Gehäuse von innen

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.

Raspberry Pi Gehäuse CopyPii

Viel Spaß beim Nachbauen! Bei Fragen, bitte einfach in die Kommentare und ich versuche zu helfen!

Könnte auch interessant sein

8 Kommentare

Sascha Waas 25.02.2019 - 9:02

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.

Reply
Christoph Bimmer 25.02.2019 - 9:55

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.

Reply
Sascha Waas 25.02.2019 - 10:22

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.

Reply
Christoph Bimmer 25.02.2019 - 10:33

Das sollte schon funktionieren. Steck mal die SD Karte samt Kartenleser an. Nicht nacheinander.

Reply
Sascha Waas 25.02.2019 - 10:36

Danke für die schnelle Antwort. Ich habe es genauso gemacht. SD-Karte samt Kartenleser. Es passiert trotzdem nichts.

Reply
Christoph Bimmer 26.02.2019 - 14:28

Was sagt denn DMESG? Nutze das script schon eine ganze Weile nicht mehr.

Reply
Sascha Waas 27.02.2019 - 12:46

Danke. Hab es es jetzt anders gelöst.

Reply
Ben 28.12.2019 - 13:21

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

Reply

Hinterlasse einen Kommentar

* Wenn Du einen Kommentar hinterlässt, akzeptierst Du unsere Datenschutzbedingungen.