Электронные полезности для коптеровода
Возникла у меня необходимость в паре электронных устройств, которые с ходу не нашел в магазинах по адекватной цене. Так как программировать не умею и в микроконтроллерах не разбираюсь, пришлось взять “звонок другу”)).
Итак, первое устройство которое было сделано по моей просьбе - 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'
Устройство мной опробовано, работает отлично. Но, как известно, бочки меда без ложки дегтя не бывает.) В данном случае учудили маркетологи сони. Дело в том, что режим срабатывания затвора выбирается среди других, не менее полезных режимов съемки. На пример таких как брекетинг, ночная съемка, непрерывная съемка и режимы с использованем таймера. В общем, либо с пульта и простой режим, либо интелектуальные режимы, но старая , добрая серва.)
Продолжение следует…
Георгий, а можно готовый ХЕКС попросить под PIC 10F202 ? А то у меня их завалялось, лежат без дела. Ну и схемку естественно
Саш, схема в коде, в первых строках. Хекса у меня нет, но я попрошу - если осталась у друга - выложу.
наткнулся тут у немцев на пару тем:
forum.mikrokopter.de/topic-24157.html
forum.mikrokopter.de/topic-16565-1.html
если коротко, то расширяем у Спектрумов количество каналов до ДВЕНАДЦАТИ.
может кому будет полезно.
Чтобы не забывать выключать передатчик - маленькая полезная штучка - rcopen.com/blogs/90045/13027
Второе устройство кторое мне было строго необходимо - RC комутатор между тремя камерами и двумя Video Tx. Зачем это нужно? В идеале хотелось иметь возможность комутировать видеовыход фотика, курсовой камеры и камеры, установленной в корме коптера. Так же, коммутируются питающие напряжения передатчиков, дабы не держать оба передатчика постоянно включенными. На плате разведены 2 шины питания. Так же, есть сквозной канал для звука. Для дальних полетов или полетов на пересеченной местности, хотелось иметь на борту два видео передатчика, с возможностью удаленного переключения между ними. В итоге, обрисовал техзадание нашему камраду alexeykozin и через непродолжительное время получил готовый девайс. Данный девайс описан на странице автора. Скриншоты с пульта управления - Futaba 10 CAG. Позже выложу скриншоты с пульта Futaba T8FG. Получилось так, что эта идея была озвучена и автору первого устройства (RC Shutter) и на свет появилась другая реальзация этого дивайса на микроконтроллере Пик. Но о ней позже.
Второе устройство кторое мне было строго необходимо
Чтобы управлять двумя видео передатчиками использую два вот таких свитча hobbyking.com/…/__8833__Turnigy_Receiver_Controlle… работающих в реверсном включении в одном свободном канале пульта управления. (Если один включен, то второй выключен) Но, а двух (трех) канальных видеокомутаторов в инете полно. Ранее с ними была одна проблема. Все они нормально работали с питанием до 3.7-4 вольт. Пока это узнали….то до этого накупил много их, выискивая как бы рабочий вариант и даже свой лудить захотелось. Думалось, что бракованные попадаются . Питали их естественно согласно руководства от 5 вольт. Под них еще один канал. Сумарно задействуется два канала, но крайне удобно в управлении все этой горой коммутации
Подниму темку 😃
Озадачился шутером для Panasonic GH2 нашол готовые девайсы но цена не устраивает . Нашел схемку
Проверил, работае ,тоесть запись стартует и останавливается при условии наличия резистора на 38-42К между первым и вторым контактами разъема 2.5мм и резким спадом сопротивления до 3К тоесть если шунтирывать первый резистор. Но вот как реализовать управление от приемника это вопрос. Понятно что надежней и проще на PIC но в програмирывании я не шарю. Если кто уже делал такое поделитесь опытом.
вместо выключателей оптроны
а управлять ими можно ардуинкой с протейшим скетчем читающим управляющий импульс с радоприемника и включающий оптроны
Ардуинка по габаритам не подходит.Надо чтонить типа атини.
Ардуина на 8ми ногой тиньке