Aller au contenu

Tuto Octolapse pour des appareils Android non supportés par GPhoto2


Messages recommandés

Hello,

Il existe de nombreux tutos Octolapse pour des appareils photos (DSLR, etc) et webcams via l'excellent outil GPhoto2 mais pas grand chose pour les appareils Android non supportés.
Dans mon cas il s'agit d'un Samsung Galaxy S8.

La solution proposée dans ce tuto consiste à prendre des photos à l'aide des commandes ADB (Android Debug Bridge) via un script assez similaire à celui de GPhoto2.
 

Pour rappel, un appareil Android branché en USB peut se mettre dans différents modes (PTP, MTP, charge uniquement, etc). Un spécifique et caché par défaut permet d'envoyer certaines commandes pour différentes actions sur l'appareil (copie de fichiers, execution/arrets/(des)installations de programmes, etc) sans le manipuler directement. C'est le mode "Débogage USB" et c'est grâce à ce mode que l'on va pouvoir prendre les photos.

Avant toutes choses, l'éxecution de commandes ADB n'est pas sans risques pour votre appareil.  Ni ce forum, ni moi ne peuvent être tenu responsables des éventuels problèmes rencontrés. Pensez à effectuer une sauvegarde de vos données personnelles sur votre appareil Android avant d'aller plus loin ! 

 

1. Activer le mode "Débogage USB"

  • Ce mode est activable dans le menu "développeur", menu caché par défaut, comme précisé dans ce tutoriel. Plus de détail ICI

 

2. Installer ADB sur le PI

sudo apt-get install adb

 

3. Brancher l'appareil Android sur le PI via le câble USB.

  • Si le mode Débogage USB est activé, une fenêtre d'autorisation doit apparaître :

image.png.6672b44cf8b4b04e8b4ff82f044b30ad.png

  • Il faut valider et pour éviter d'avoir cette fenêtre à chaque fois, cocher pour mémoriser le choix.
     

4. Vérifier la commande ADB pour l'ouverture du logiciel de la capture photo

  • taper la ligne suivante :

 

adb shell am start -a android.media.action.IMAGE_CAPTURE
  • Dans le cas de mon téléphone, l'application native s'ouvre par contre je n'ai pas la possibilité d'enregistrer de photos (une spécificité Samsung ?). Il faut utiliser la commande suivante à la place :
adb shell "am start -a android.media.action.STILL_IMAGE_CAMERA"
  • Si un logiciel par défaut est défini, il va s'ouvrir automatiquement. Sinon un choix doit être proposé (avec la possibilité de mémoriser le choix).
    Dans le logiciel de prise de photo, il faut également vérifier où sont stoquées les photos prises.
    Par exemple :
    ► Carte SD : /storage/0000-0000/DCIM/Camera
    ► Mémoire interne : /sdcard/DCIM/Camera
    Les photos sont nommées de cette manière : YYYYMMDD_HHMMSS.jpg (YYYY: année, MM : mois, etc) mais ça dépend du logiciel utilisé
    Cette étape est importante car il faudra définir le bon emplacement dans le script.


5. La création du script

Le script est composé en trois parties, la première et la dernière sont du copier/coller du script utilisé par GPhoto2 :

Partie 1  (début) :

#!/bin/bash

# Put the arguments sent by Octolapse into variables for easy use
SNAPSHOT_NUMBER=$1 #... an integer value that increments after each successful snapshot
DELAY_SECONDS=$2 #..... the camera delay in seconds
DATA_DIRECTORY=$3 #.... the path to the Octolapse data folder
SNAPSHOT_DIRECTORY=$4 # the path to the current camera's snapshot folder for the current print job.may not exist so be $SNAPSHOT_FILENAME=$5 #. the expected file name of the snapshot after it has been taken
SNAPSHOT_FULL_PATH=$6 # the full path and filename of the expected snapshot.If this file exists after the script has re$

# Check to see if the snapshot directory exists
if [ ! -d "${SNAPSHOT_DIRECTORY}" ];
then
  echo "Creating directory: ${SNAPSHOT_DIRECTORY}"
  mkdir -p "${SNAPSHOT_DIRECTORY}"
  mkdir -p "${SNAPSHOT_DIRECTORY}/fullres"
fi

Il faudra juste rajouter le chemin où sont stoquées les photos:

cam_path='/sdcard/DCIM/Camera'

Partie 3 (fin):

if [ ! -f "${SNAPSHOT_FULL_PATH}" ];
then
  echo "The snapshot was not found in the expected directory: '${SNAPSHOT_FULL_PATH}'." >&2
  exit 1
fi

 

La partie 2 consiste à lancer les commandes ADB adéquates pour prendre la photo et la déplacer dans le dossier d'Octolapse.
En fonction de l'appareil Android et du logiciel de photo utilisé, les commandes et délais d'attentes peuvent varier. Il faudra tester et adapter si besoin.
Voici les différentes commandes qui peuvent servir :
 

adb shell "input keyevent KEYCODE_WAKEUP"  #...................... déverrouillage
adb shell "input keyevent KEYCODE_SLEEP" #........................ verrouillage
adb shell "input keyevent KEYCODE_HOME" #......................... écran d'accueil
adb shell "input keyevent KEYCODE_CAMERA" #....................... prise de la photo
adb shell "input keyevent KEYCODE_FOCUS" #........................ focus manuel avant de prendre une photo
adb shell "am start -a android.media.action.IMAGE_CAPTURE" #...... ouverture de l'application photo par défaut
adb shell "am start -a android.media.action.STILL_IMAGE_CAMERA" #. ouverture de l'application photo par défaut
adb shell "am force-stop com.sec.android.app.camera" #............ fermeture de l'application photo
adb shell ls #.................................................... la fonction "ls" classique avec tous les paramètres possibles
adb pull $FullFileName #.......................................... copier de fichier(s)
adb shell rm $FullFileName #...................................... suppression de fichier(s)



Par exemple, pour l'application native du Galaxy S8, la prise de photo peut s'enclencher via ce script :

adb shell "input keyevent KEYCODE_WAKEUP"
adb shell "am start -a android.media.action.STILL_IMAGE_CAMERA"
sleep 1
adb shell "input keyevent KEYCODE_CAMERA"
sleep 3
adb shell "am force-stop com.sec.android.app.camera"
adb shell "input keyevent KEYCODE_SLEEP"

Il est important de rajouter quelques secondes (sleep) pour laisser le temps à l'appareil de lancer l'application et prendre la photo. Dans cet exemple le "profil" utilisé est le mode "automatique" et ne permet pas un réglage "aux petits oignons". C'est économe puisque le téléphone se verrouille (écran s'éteint) une fois la tâche terminée mais ça prend plus de temps (ce qui nécessitera de rallonger le paramètre Snapshot Timeout dans Octolapse)

Un autre exemple, via une application rajoutée (DLSR Camera Professional) permettant un mode plus "pro" et rapide (mais moins économe). On part du principe que l'application est déjà ouverte, l'utilisateur a effectué tous les réglages désirés (ISO, Focus, exposition, zoom, etc). La prise de photo se réduit à deux lignes :

adb shell "input keyevent KEYCODE_CAMERA"
sleep 3

Encore une fois, cette partie dépend du matériel (si assez rapide, on peut passer à un "sleep 2" par exemple), du logiciel utilisé et de comment on veut prendre les photos.

 

Ensuite, pour le déplacement de la photo de l'appareil Android sur le PI, j'ai choisi la méthode suivante :

last_file=$(adb shell ls -1t $cam_path | head -1)

Cette instruction permet de retrouver le dernier fichier présent dans le dossier $cam_path, soit théoriquement la dernière photo, si tout fonctionne correctement...

Le déplacement de la photo s'effectue en 2 temps :

1. La copie sur le PI (+ renommage):

cd "${SNAPSHOT_DIRECTORY}" # ............. choix du dossier
adb pull $cam_path/$last_file # .......... copie de la photo
mv $last_file "${SNAPSHOT_FILENAME}" # ... renommage du fichier

2. La suppression sur l'appareil Android :

adb shell rm $cam_path/$last_file

Bien que fonctionnel, ce n'est pas parfait car si pour X raisons la photo n'a pas été prise correctement, le script en l'état va prendre le dernier fichier (donc pas la photo attendue) et va la copier et la supprimer sur l'appareil Android. Raison pour laquelle il vaut mieux lancer ce script dans un dossier vide par défaut histoire de ne pas faire de bêtises sur des photos précédentes ^^
L'idéal serait de s'assurer préalablement que la photo a été correctement prise. Par exemple en faisant ressortir le dernier fichier datant de moins de 10s et s'il n'y en a pas, alors ça veut dire que la photo n'a pas été prise. Je n'ai pas encore trouvé de solution à ce niveau via une commande "adb shell ls..." mais peut-être que quelqu'un aura la bonne idée pour compléter ce tuto et proposer une méthode plus "secure".

Le script complet dans mon cas est le suivant :

#!/bin/bash

# Put the arguments sent by Octolapse into variables for easy use
SNAPSHOT_NUMBER=$1 #... an integer value that increments after each successful snapshot
DELAY_SECONDS=$2 #..... the camera delay in seconds
DATA_DIRECTORY=$3 #.... the path to the Octolapse data folder
SNAPSHOT_DIRECTORY=$4 # the path to the current camera's snapshot folder for the current print job.may not exist so be $SNAPSHOT_FILENAME=$5 #. the expected file name of the snapshot after it has been taken
SNAPSHOT_FULL_PATH=$6 # the full path and filename of the expected snapshot.If this file exists after the script has re$

cam_path='/sdcard/DCIM/DSLRCamera' 

# Check to see if the snapshot directory exists
if [ ! -d "${SNAPSHOT_DIRECTORY}" ];
then
  echo "Creating directory: ${SNAPSHOT_DIRECTORY}"
  mkdir -p "${SNAPSHOT_DIRECTORY}"
  mkdir -p "${SNAPSHOT_DIRECTORY}/fullres"
fi

adb shell "input keyevent KEYCODE_CAMERA"
sleep 3
cd "${SNAPSHOT_DIRECTORY}"
adb pull $cam_path/$last_file
mv $last_file "${SNAPSHOT_FILENAME}"
adb shell rm $cam_path/$last_file

if [ ! -f "${SNAPSHOT_FULL_PATH}" ];
then
  echo "The snapshot was not found in the expected directory: '${SNAPSHOT_FULL_PATH}'." >&2
  exit 1
fi

La création du script peut s'effectuer va la commande suivante (dans le dossier /home/pi ou /scripts/ par exemple):

nano take_snapshot.sh

puis faire un copier/coller du script et enregistrer. Ensuite il faudra le rendre executable via la commande:
 

sudo chmod +x take_snapshot.sh

 

Enfin, dans le module d'Octolapse, créer un nouveau profile de caméra de type "External camera script", en précisant le script (le chemin complet) et éventuellement ajuster le Timeout :

image.thumb.png.a4c965d95e35cafbd0a1c5c91b00d200.png

 

Reste à tester le script via le lien idoine (cf flèche sur l'image ci-dessus) et s'assurer qu'il n'y a pas d'erreurs.

 

Vos retours sont les bienvenus ☺

  • J'aime 2
Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...