SDM inclu la commande "send_data" qui permet à un script d'envoyer trois bytes de données à un dispositif externe en flashant la LED Impression à diverses valeurs de temps.
L'impulsion la plus courte est donnée comme "unité d'impulsion" et sa valeur est réglée dans le menu Avancé\Communi Serie (Serial Comms) par incréments de dix millisecondes.
Un dispositif commercial tel que clickPAN SDM est disponible pour utiliser la commande "send_data" au servo-ontrol d'un support motorisé pour la photographie aérienne par cerf-volant.
Des exemples de script avec la command "send_data" se trouvent ici.

Vous pouvez appliquer un facteur d'accord afin de régler la largeur-d'impulsion la plus exacte.
La largeur-d'impulsion pourra varier (typiquement sur une gamme de 1,3 msec pour le A620), vraisemblablement due aux interruptions des progiciels Canon, ainsi vous devrez choisir une valeur qui vous donnera les résultats les plus fiables avec votre dispositif externe.
Une unité d'impulsion de 10 ou 20 msec est suggérée comme minimum.
Le protocole est très simple, les largeurs d'impulsions sont des mutiples d'unités d'impulsion :-
Start bit 4
Logic 0 1
Logic 1 2
Interbit space 1
Interbyte space 3
Après le bit de départ, trois bytes sont transmis.
Après l'espace interbyte de trois unités d'impulsions, le bit de départ et les trois bytes sont de nouveau envoyés.
A la réception, le dispositif devra comparer les deux valeurs de données et si elles sont équivalentes il envoie un niveau haut sur l'USB V+ d'environ 100 msec d'espace de train d'interbyte de fin.
Après le délai désiré dans votre script, la commande "data_received" reportera si les données reçues n'ont pas d'erreur.
Il n'est pas obligatoire que votre script vérifie cette valeur.
Chaque byte est limité à la gamme de -128 à +255 afin de transmettre des valeurs dans la gamme de 0 à 65535 (tel que la distance de mise au point), divisé par 256 pour donner le byte haut et appliquer l'opérateur de module (%) pour donner le byte bas.
Les configurations de bits sont:-
1111 1111 255
1000 0000 128
0111 1111 127
0111 1110 126
0000 0010 2
0000 0001 1
0000 0000 0
1111 1111 -1
1111 1110 -2
1000 0001 -127
1000 0000 -128
Le script suivant règle le paramètre "a" à 128 comme un paramètre identifieur, vous pouvez choisir n'importe quelle valeur de 0 à 255.
Il zoome les objectifs dedans et dehors et envoie la position du zoom au dispositif externe (le troisième byte n'est pas utilisé) :
@title Tx data
@param a command
@param b low byte
@param c high byte
@default a 128
@default b 0
@default c 67
sleep_for_seconds 1
:loop
set_zoom_to_step b
" Sending data"
sleep_for_seconds 1
get_zoom d
send_data a, d, c
sleep_for_seconds 4
b = b + 1
if b <> 7 then goto "loop"
:loop2
set_zoom_to_step b
" Sending data"
sleep_for_seconds 1
get_zoom d
send_data a, d, c
sleep_for_seconds 4
b = b - 1
if b >= 0 then goto "loop2"
end
En utilisant un microcontrôleur Picaxe, avec l'entrée d'un phototransistor sur la LED sur l'entrée 7, le programme suivant affichera les six bytes sur l'écran LCD :
SYMBOL DIODE_INPUT = 7
SYMBOL LED = 6
SYMBOL BIT_TIME = 3000 ' 30 msec divisor for 20 and 40 msec '0', '1' pulses.
pause 500
serout 7,N2400,(254,1)
pause 30
main:
do
PULSIN DIODE_INPUT,0,w6
loop while w6 = 0
gosub get_bytes
b1 = b0;
gosub get_bytes
b2 = b0;
gosub get_bytes
b3 = b0;
do
PULSIN DIODE_INPUT,0,w6
loop while w6 = 0
gosub get_bytes
b4 = b0;
gosub get_bytes
b5 = b0;
gosub get_bytes
b6 = b0;
serout 7,N2400,(254,128,#b1," ",#b2," ",#b3)
serout 7,N2400,(254,192,#b4," ",#b5," ",#b6)
if b1 = b4 AND b2 = b5 AND b3 = b6 then high LED
pause 500
low LED
endif
goto main
' ----------------------------------------
get_bytes:
PULSIN DIODE_INPUT, 0, w6
bit0 = w6 / BIT_TIME
PULSIN DIODE_INPUT, 0, w6
bit1 = w6 / BIT_TIME
PULSIN DIODE_INPUT, 0, w6
bit2 = w6 / BIT_TIME
PULSIN DIODE_INPUT, 0, w6
bit3 = w6 / BIT_TIME
PULSIN DIODE_INPUT, 0, w6
bit4 = w6 / BIT_TIME
PULSIN DIODE_INPUT, 0, w6
bit5 = w6 / BIT_TIME
PULSIN DIODE_INPUT, 0, w6
bit6 = w6 / BIT_TIME
PULSIN DIODE_INPUT, 0, w6
bit7 = w6 / BIT_TIME
return
' ----------------------------------------
Pour tester, une LED sur la sortie 6 flashe pour confirmer que les deux valeurs de bytes sont identiques.
Afin de régler le temps le plus précisément possible, utilisez la commande "unité-d'impulsion" pour générer une pulse unique afin que le dispositif externe connecté, puisse la mesurer.
Dans le menu Communication Série (Serial Comms), vous réglez le temps par incréments de dix msecs et vous pouvez appliquer un facteur d'accord pour varier la largeur-d'impulsion.
En utlisant un Picaxe, par exemple, faites simplement trourner le programme suivant pendant qu'un script est continuellement en train d'exécuter des commandes d'"unité-d'impulsion" :-
SYMBOL DIODE_INPUT = 7
pause 500
main: serout 7,N2400,(254,128)
do
PULSIN DIODE_INPUT,0,w2
loop while w2 = 0
serout 7,N2400,("Unit pulse ",#w2)
pause 1000
goto main
N'importe quel dispositif que vous utilisez par dessus la LED Impression devrait permettre au bouton d'opérer normalement et d'exclure la lumière de s'allumer.
Des solutions possible incluses utilisent un phototransistor monté en surface et adapté à l'intérieur d'un joint O-ring.
Cet assemblage utilise un autocollant double faces pour l'attacher au boîtier de l'appareil.
Un anneau plus large que la LED peut assurer un montage plus sécurisé.

L'image ci-dessus montre une possibilité de montage.
Pour tester, éteignez/allumez la LED en utlisant les boutons gauche/droit :-
@title LCD on_off
" Left-off, Right-on"
:loop
wait_click
is_key k "right"
if k=1 then blue_led_on
wait_click
is_key k "left"
if k=1 then blue_led_off
goto "loop"
end
Quand votre détecteur-photo électronique travaille et que vous avez accordez la largeur d'impulsion, envoyez trois bytes avec "send_data a, b, c" et utilisez le code suivant dans Picaxe pour afficher les trois bytes en tant que configuration binaire :-
' -----------------------------------------------
' Display three bytes from camera as bit patterns
' -----------------------------------------------
SYMBOL DIODE_INPUT = 7
SYMBOL LED = 6
SYMBOL BIT_TIME = 3000 ' 30 msec divisor for 20 and 40 msec '0', '1' pulses.
pause 500
serout 7,N2400,(254,1)
pause 30
main:
do
PULSIN DIODE_INPUT,0,w6
loop while w6 = 0
gosub get_bytes
b1 = b0;
gosub get_bytes
b2 = b0;
gosub get_bytes
b3 = b0;
do
PULSIN DIODE_INPUT,0,w6
loop while w6 = 0
gosub get_bytes
b4 = b0;
gosub get_bytes
b5 = b0;
gosub get_bytes
b6 = b0;
' --------------------
' Display bit patterns
' --------------------
serout 7,N2400,(254,128)
b0 = b4;
serout 7,N2400,(#bit7,#bit6,#bit5,#bit4,#bit3,#bit2,#bit1 ,#bit0," ")
b0 = b5;
serout 7,N2400,(#bit7,#bit6,#bit5,#bit4)
serout 7,N2400,(254,192)
serout 7,N2400,(#bit3,#bit2,#bit1,#bit0," ")
b0 = b6;
serout 7,N2400,(#bit7,#bit6,#bit5,#bit4,#bit3,#bit2,#bit1 ,#bit0)
' --------------------
' Blink LED if data valid
' --------------------
if b1 = b4 AND b2 = b5 AND b3 = b6 then high LED
pause 500
low LED
endif
goto main
' ----------------------------------------
get_bytes:
PULSIN DIODE_INPUT, 0, w6
bit0 = w6 / BIT_TIME
PULSIN DIODE_INPUT, 0, w6
bit1 = w6 / BIT_TIME
PULSIN DIODE_INPUT, 0, w6
bit2 = w6 / BIT_TIME
PULSIN DIODE_INPUT, 0, w6
bit3 = w6 / BIT_TIME
PULSIN DIODE_INPUT, 0, w6
bit4 = w6 / BIT_TIME
PULSIN DIODE_INPUT, 0, w6
bit5 = w6 / BIT_TIME
PULSIN DIODE_INPUT, 0, w6
bit6 = w6 / BIT_TIME
PULSIN DIODE_INPUT, 0, w6
bit7 = w6 / BIT_TIME
return
' ----------------------------------------
Vous pouvez trouver un système robotisé qui peut bénéficier de ce dispositif sur http://www.instructables.com/id/Camera-Panorama-robot-head-panograph/.