Электронные полезности для коптеровода

Gurdzhy

Возникла у меня необходимость в паре электронных устройств, которые с ходу не нашел в магазинах по адекватной цене. Так как программировать не умею и в микроконтроллерах не разбираюсь, пришлось взять “звонок другу”)).
Итак, первое устройство которое было сделано по моей просьбе - RC Shuter для камер Sony nex 5-7. Выглядит это так: (пик с обратной стороны)

Привожу схему и прошивку в том виде, в каком получил от друга (копирайты внутри):

;**********************************************************************
;   This file is a basic code template for assembly code generation   *
;   on the PIC12F508. This file contains the basic code               *
;   building blocks to build upon.                                    *
;                                                                     *
;   Refer to the MPASM User's Guide for additional information on     *
;   features of the assembler (Document DS33014).                     *
;                                                                     *
;   Refer to the respective PIC data sheet for additional             *
;   information on the instruction set.                               *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Filename:	    main.asm                                          *
;    Date:                                                            *
;    File Version:  1.00                                              *
;                                                                     *
;    Author:        Dmitry Filimonchuk                                *
;    Company:                                      *
;    License:       FREE FOR NON COMMERCIAL                           *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files Required: P12F509.INC                                      *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes: NEX IR shutter                                            *
;                                                                     *
;**********************************************************************
;code can be recompiled for 12F508 or 10F200
;
;   +5V ---*-------------------------------+
;   GND --------------------+              |
;          |   +-------+    |   0.1uF      |
;          +-1-|o      |-8--*--||----------*
;            2-|       |-7-----|<|--[331]--*  COMMAND LED (optional)
;            3-|       |-6-----|<|--[331]--*  CARRIER LED (optional)
; INPUT -----4-|       |-5-----|<|--[101]--+  IR LED
;              +-------+
;

	list      p=12F509            ; list directive to define processor
	#include <p12F509.inc>        ; processor specific variable definitions
; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.
	__CONFIG   _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC

	IFDEF __12F509
_nRBWU		EQU	0x80
_nRBPU		EQU	0x40
_TOEXTCLK	EQU	0x20
_T0HITOLO	EQU	0x10
_PSAWDT		EQU	0x08
_PSA_256	EQU	0x07
_PSA_128	EQU	0x06
_PSA_064	EQU	0x05
_PSA_032	EQU	0x04
_PSA_016	EQU	0x03
_PSA_008	EQU	0x02
_PSA_004	EQU	0x01
_PSA_002	EQU	0x00
	ENDIF


movlf	macro	byte,reg
	movlw	byte
	movwf	reg
	endm

set_ir_command	macro content
	movlf	content & 0xFF, IR_BYTE0
	movlf	content>>0x08 & 0xFF, IR_BYTE1
	movlf	content>>0x10 & 0xFF,IR_BYTE2
	endm




#define	IR_OUT			GP2		;IR LED (active low)
#define	IN_CH			GP3		;channel IN
#define LED_DETECTED	GP0		;command LED (active low)
#define	LED_CARRIER		GP1		;carrier LED (active low)


#define	VAL_PULSEWIDTH	0x00 - (D'600' / D'32') ;0.6ms SONY IR pulse width
#define	VAL_GAP			D'45000' / D'600'		;45ms  SONY IR packet period
#define	VAL_PACKETS		D'4'					;4     SONY IR number of packets in telegram
#define	VAR_TRG_PWIDTH	D'1500' / D'64'			;1.5ms trigger pulse width
#define	VAR_TRG_PCOUNT	D'3'					;3     number of pulses in series to activate trigger

;***** VARIABLE DEFINITIONS
	cblock	0x08
T_GAPCOUNTER			;IR telegtam period counter
T_PACKETS				;IR telegram packets counter
T_BYTE0					;temporary shift register byte0
T_BYTE1					;temporary shift register byte1
T_BYTE2					;temporary shift register byte2
IR_BYTE0				;IR command register byte0
IR_BYTE1				;IR command register byte1
IR_BYTE2				;IR command register byte2
I_PULSEWIDTH			;input pulse width register (in 64us counts) for trigger
I_PULSECOUNT			;input pulse count register for trigger
	endc

;**********************************************************************


	ORG     0x1FF             ; processor reset vector

; Internal RC calibration value is placed at location 0x1FF by Microchip
; as a movlw k, where the k is a literal value.

	ORG     0x000             ; coding begins here
	goto	start



proc_send_pulse
;make 600us 38kHz carrier pulse for SONY IR
	movlw	VAL_PULSEWIDTH
	movwf	TMR0
_psp_loop_10
	bcf		GPIO,IR_OUT			;0 - LED ON
	goto	$+1
	goto	$+1
	goto	$+1
	bsf		GPIO,IR_OUT			;1 -LED OFF
	goto	$+1
	goto	$+1
	goto	$+1
	goto	$+1
	goto	$+1
	goto	$+1
	goto	$+1
	nop
	btfsc	TMR0,7
	goto	_psp_loop_10
	decf	T_GAPCOUNTER,f
	retlw	0

proc_send_space
;make 600us space
	movlw	VAL_PULSEWIDTH
	movwf	TMR0
_pss_loop:
	btfsc	TMR0,7
	goto	_pss_loop
	decf	T_GAPCOUNTER,f
	retlw	0


;send telegram to IR
;data located in IR_BYTEX 1st TX bit is IR_BYTE2 MSB
;S means 2400us pulse 600us space. start pulse TX
;1 means 1200us pulse 600us space. logical 1 TX
;0 means 600us pulse 600us space. logical 0 TX
;last 1 in data means the stop bit and not transmitted
;for example B'10001100 10111100 00001000' transmitted as S110001100101111000000
;         MSB  IR_BYTE2 IR_BYTE1 IR_BYTE0  LSB
proc_send_ir
;init packets counter
	movlw	VAL_PACKETS
	movwf	T_PACKETS
;start to transmit packet
_psi_start
;init gap counter
	movlw	VAL_GAP
	movwf	T_GAPCOUNTER
;set temporary register
	movfw	IR_BYTE0
	movwf	T_BYTE0
	movfw	IR_BYTE1
	movwf	T_BYTE1
	movfw	IR_BYTE2
	movwf	T_BYTE2
;TX start pulse (2.4ms pulse 0.6ms space)
	call	proc_send_pulse
	call	proc_send_pulse
	call	proc_send_pulse
	call	proc_send_pulse
	call	proc_send_space
;start sending packet
_psi_send_bit
	call	proc_send_pulse
	bcf		STATUS,C
	rlf		T_BYTE0,f
	rlf		T_BYTE1,f
	rlf		T_BYTE2,f
	btfsc	STATUS,C
	call	proc_send_pulse
	call	proc_send_space
	movfw	T_BYTE0
	iorwf	T_BYTE1,w
	btfss	STATUS,Z
	goto	_psi_send_bit
	iorwf	T_BYTE2,w
	xorlw	0x80
	btfss	STATUS,Z
	goto	_psi_send_bit
;TX complete
;start intergap
_psi_send_gap
	call	proc_send_space
	btfss	STATUS,Z
	goto	_psi_send_gap
;send next packet
	decfsz	T_PACKETS,f
	goto	_psi_start
	retlw	0



start
	movwf   OSCCAL            ; update register with factory cal value
;setup inputs
	movlw	1<<IN_CH
	tris	GPIO
main_init:
	movlw	0xFF
	movwf	GPIO
	clrf	I_PULSECOUNT
main_loop
;setup MCU TMR 128us/tick @ 4MHz internal clock, disable Wake-Up on pin change
	movlw	_PSA_128 | _nRBWU
	option
;wait for pulse raise (logic 0 to 1 in IN_CH)
	clrf	TMR0
_pmp_waitzero
	btfss	GPIO,IN_CH
	goto	_pmp_waitone
	movlw	0x01
	addwf	TMR0,w
	btfsc	STATUS,Z
	goto	main_init			;timeout (32ms) go reinit
	goto	_pmp_waitzero
_pmp_waitone
	btfsc	GPIO,IN_CH
	goto	_pmp_start
	movlw	0x01
	addwf	TMR0,w
	btfsc	STATUS,Z
	goto	main_init			;timeout (32ms) go reinit
	goto	_pmp_waitone
;start pulse measurement
_pmp_start
;setup MCU TMR 64us/tick @ 4MHz internal clock, disable Wake-Up on pin change
	movlw	_PSA_064 | _nRBWU
	option
	clrf	TMR0
;wait for pulse fall (logic 1 to 0 in IN_CH)
_pmp_waitfall
	btfss	GPIO,IN_CH
	goto	_pmp_read
	movlw	0x01
	addwf	TMR0,w
	btfsc	STATUS,Z
	goto	main_init				;pulse width > 16ms. fail. go reinit
	goto	_pmp_waitfall
_pmp_read
;pulse length in TMR0 in 64us ticks
	movfw	TMR0
	movwf	I_PULSEWIDTH
	bcf		GPIO,LED_CARRIER		;pulse detected. ON CARRIER LED
	movlw	VAR_TRG_PWIDTH
	subwf	I_PULSEWIDTH,w
	btfsc	STATUS,C				;unlike a normal CPU, C set when borrow DID NOT occured
	goto	_m_detected
	clrf	I_PULSECOUNT
	bsf		GPIO,LED_DETECTED		;trigger pulse not detecded. OFF DETECTED LED
	goto	main_loop
_m_detected
	bcf		GPIO,LED_DETECTED		;trigger pulse detecded. ON DETECTED LED
	incf	I_PULSECOUNT,f
	movlw	VAR_TRG_PCOUNT
	subwf	I_PULSECOUNT,w
	btfss	STATUS,Z
	goto	main_loop
;trigger catched (series of 3 pulse's detected)
;setup MCU TMR 32us/tick @ 4MHz internal clock, disable Wake-Up on pin change
	movlw	_PSA_032 | _nRBWU
	option
	set_ir_command	B'101101001011100011111000'		;shutter for NEX
;	set_ir_command	B'100011001011110000001000'		;shutter for HANDYCAM
	call	proc_send_ir
	goto	main_loop

	END                       ; directive 'end of program'

Устройство мной опробовано, работает отлично. Но, как известно, бочки меда без ложки дегтя не бывает.) В данном случае учудили маркетологи сони. Дело в том, что режим срабатывания затвора выбирается среди других, не менее полезных режимов съемки. На пример таких как брекетинг, ночная съемка, непрерывная съемка и режимы с использованем таймера. В общем, либо с пульта и простой режим, либо интелектуальные режимы, но старая , добрая серва.)
Продолжение следует…

cylllka

Георгий, а можно готовый ХЕКС попросить под PIC 10F202 ? А то у меня их завалялось, лежат без дела. Ну и схемку естественно

Gurdzhy

Саш, схема в коде, в первых строках. Хекса у меня нет, но я попрошу - если осталась у друга - выложу.

Gurdzhy

Второе устройство кторое мне было строго необходимо - RC комутатор между тремя камерами и двумя Video Tx. Зачем это нужно? В идеале хотелось иметь возможность комутировать видеовыход фотика, курсовой камеры и камеры, установленной в корме коптера. Так же, коммутируются питающие напряжения передатчиков, дабы не держать оба передатчика постоянно включенными. На плате разведены 2 шины питания. Так же, есть сквозной канал для звука. Для дальних полетов или полетов на пересеченной местности, хотелось иметь на борту два видео передатчика, с возможностью удаленного переключения между ними. В итоге, обрисовал техзадание нашему камраду alexeykozin и через непродолжительное время получил готовый девайс. Данный девайс описан на странице автора. Скриншоты с пульта управления - Futaba 10 CAG. Позже выложу скриншоты с пульта Futaba T8FG. Получилось так, что эта идея была озвучена и автору первого устройства (RC Shutter) и на свет появилась другая реальзация этого дивайса на микроконтроллере Пик. Но о ней позже.

delfin000
Gurdzhy:

Второе устройство кторое мне было строго необходимо

Чтобы управлять двумя видео передатчиками использую два вот таких свитча hobbyking.com/…/__8833__Turnigy_Receiver_Controlle… работающих в реверсном включении в одном свободном канале пульта управления. (Если один включен, то второй выключен) Но, а двух (трех) канальных видеокомутаторов в инете полно. Ранее с ними была одна проблема. Все они нормально работали с питанием до 3.7-4 вольт. Пока это узнали….то до этого накупил много их, выискивая как бы рабочий вариант и даже свой лудить захотелось. Думалось, что бракованные попадаются . Питали их естественно согласно руководства от 5 вольт. Под них еще один канал. Сумарно задействуется два канала, но крайне удобно в управлении все этой горой коммутации

7 months later
kedrikov

Подниму темку 😃
Озадачился шутером для Panasonic GH2 нашол готовые девайсы но цена не устраивает . Нашел схемку

Проверил, работае ,тоесть запись стартует и останавливается при условии наличия резистора на 38-42К между первым и вторым контактами разъема 2.5мм и резким спадом сопротивления до 3К тоесть если шунтирывать первый резистор. Но вот как реализовать управление от приемника это вопрос. Понятно что надежней и проще на PIC но в програмирывании я не шарю. Если кто уже делал такое поделитесь опытом.

alexeykozin

вместо выключателей оптроны
а управлять ими можно ардуинкой с протейшим скетчем читающим управляющий импульс с радоприемника и включающий оптроны

kedrikov

Ардуинка по габаритам не подходит.Надо чтонить типа атини.

kedrikov

Недолго думая соорудил на плате от микросервы и оптопары