Попытка разблокировать датчики автофокуса с M42-объективом

Тема в разделе "Объективы для байонета А", создана пользователем vasimv, 4 апр 2006.

  1. Пожалуйста, только уши и прорезь для замка я точил по месту, после того, как вкручивал объектив, иначе шкала может оказаться внизу, а это несколько не удобно.
    Важно: угол заточки фрезы под резьбу около 30град. Токарю отдавайте чертеж с объективом в комплекте. Сначала пускай нарежет в болванке резьбу, проверит объективом, потом точит переходник.
     
  2. gor А как у Вас с фокусировкой на бесконечность? Ведь на минольте - 44.5, на м42-45.5. И jolos-вский переходник вроде и убирает 1 лишний мм у м42.
     
  3. Наоборот, добавляет. Именно потому что у минолты меньше. :)
     
  4. to gor

    Спасибо, я надеялся на полный чертеж, с допусками:).
    Видимо придется самому рисовать:(
     
  5. Вечно я спешу написать ;)
     
  6. Ну, допуски я Вам и так скажу - 0, 05мм в любую сторону. У меня станок на работе бытовой, он иной раз погрешность большую выдает, тем не менее ни с одним из трех переходников проблем не возникло.
     
  7. Чевой-то тема подзаглохла. Энтузиасты, где вы? Маньяк, vasimv, где вы? Что нового?
     
  8. Чевой-то тема подзаглохла. Энтузиасты, где вы? Маньяк, vasimv, где вы? Что нового?
     
  9. Чевой-то тема подзаглохла. Энтузиасты, где вы? Маньяк, vasimv, где вы? Что нового?
     
  10. Я пока не занимался дальнейшими изысками. Может в выходные займусь.
     
  11. Я пока не занимался дальнейшими изысками. Может в выходные займусь.
     
  12. Я пока не занимался дальнейшими изысками. Может в выходные займусь.
     
  13. Итак, попробовал считать ПЗУ объектива. Не уверен, что считывание прошло нормально (считывал через velleman K8000, возможно в программе что-то напутал).

    Считывал так:

    1. Подаем 5 вольт на контакт 7 (Ucc)
    2. Подаем 0 на контакт 5 (CS/Read инверсный)
    3. Подаем серии импульсов пачками по восемь (с паузами между ними) на контакт 6 (Clock)
    4. Считываем побитно с контакта 8 в начале каждого импульса на контакте 6 (первый бит - младший).

    ПЗУ было от объектива Quantaray 35-80/4-5.6 (соответственные и значения). Удалось установить, что считывать стоит только первые 32 байта, дальше прет повтор.

    Вот содержимое на одном из крайних значений зума (не уверен точно, наверное на 80):

    0000000000: FF 80 28 50 08 20 10 10 | 43 33 00 FB 34 FE 00 00
    0000000010: 5C 00 A7 00 00 00 00 00 | 00 00 00 00 00 00 00 A7

    Вот содержимое ПЗУ при значении зума, которое камерой распознается как 60/4.5:

    0000000000: FF 80 28 50 04 20 10 10 │ 3C 33 00 FB 42 FE 00 00
    0000000010: 50 00 A7 00 00 00 00 00 │ 00 00 00 00 00 00 00 A7

    Выделены изменяющиеся при разном зуме байты. Вот их значения при уменьшении (увеличении?) зума:

    1. (крайнее, 80/5.6?) 08, 43, 34, 5C
    2. 07, 41, 36, 5A
    3. (подтвержденные камерой 60/4.5) 04, 3C, 42, 50
    4. (среднее, 50mm?) 04, 3A, 44, 4D
    5. 02, 38, 49, 49
    6. 00, 32, 55, 3F
    7. (крайнее, 35/4?) 00, 30, 57, 3E

    Следует помнить, что таблицы значений диафрагмы - прошиты в камере, так что может указываться не числовое значение, а индекс в таблице диафрагм. Возможно, это же относится и к фокусному.

    Кстати, если кто-то знает микросхемы ROM/EEPROM/FlashROM с похожим протоколом обмена - просьба сообщить. Протокол смахивает сильно на SPI (контакт 5 - SS, контакт 6 - SCK, контакт 8 - MISO, сигнал MOSI не используется), но в нем, насколько мне известно - после приема очередного байта SS выставляют в логическую единицу и понижают перед приемом следующего. Здесь же - он всегда на нуле. Также SPI-пзушки обычно требуют сначала передать им адрес для считывания перед началом считывания (а тут - ничего не передается от камеры).

    Update: Сделал программу для Atmel Atmega8535L в режиме SPI slave, имитирующую ПЗУ. Работает! Только байтов, на самом деле, не 32, а 33 (точнее, 32, но первый FF не считается) - последний имеет значение 0x63. Скоро подробности опубликую.
     
  14. Итак, попробовал считать ПЗУ объектива. Не уверен, что считывание прошло нормально (считывал через velleman K8000, возможно в программе что-то напутал).

    Считывал так:

    1. Подаем 5 вольт на контакт 7 (Ucc)
    2. Подаем 0 на контакт 5 (CS/Read инверсный)
    3. Подаем серии импульсов пачками по восемь (с паузами между ними) на контакт 6 (Clock)
    4. Считываем побитно с контакта 8 в начале каждого импульса на контакте 6 (первый бит - младший).

    ПЗУ было от объектива Quantaray 35-80/4-5.6 (соответственные и значения). Удалось установить, что считывать стоит только первые 32 байта, дальше прет повтор.

    Вот содержимое на одном из крайних значений зума (не уверен точно, наверное на 80):

    0000000000: FF 80 28 50 08 20 10 10 | 43 33 00 FB 34 FE 00 00
    0000000010: 5C 00 A7 00 00 00 00 00 | 00 00 00 00 00 00 00 A7

    Вот содержимое ПЗУ при значении зума, которое камерой распознается как 60/4.5:

    0000000000: FF 80 28 50 04 20 10 10 │ 3C 33 00 FB 42 FE 00 00
    0000000010: 50 00 A7 00 00 00 00 00 │ 00 00 00 00 00 00 00 A7

    Выделены изменяющиеся при разном зуме байты. Вот их значения при уменьшении (увеличении?) зума:

    1. (крайнее, 80/5.6?) 08, 43, 34, 5C
    2. 07, 41, 36, 5A
    3. (подтвержденные камерой 60/4.5) 04, 3C, 42, 50
    4. (среднее, 50mm?) 04, 3A, 44, 4D
    5. 02, 38, 49, 49
    6. 00, 32, 55, 3F
    7. (крайнее, 35/4?) 00, 30, 57, 3E

    Следует помнить, что таблицы значений диафрагмы - прошиты в камере, так что может указываться не числовое значение, а индекс в таблице диафрагм. Возможно, это же относится и к фокусному.

    Кстати, если кто-то знает микросхемы ROM/EEPROM/FlashROM с похожим протоколом обмена - просьба сообщить. Протокол смахивает сильно на SPI (контакт 5 - SS, контакт 6 - SCK, контакт 8 - MISO, сигнал MOSI не используется), но в нем, насколько мне известно - после приема очередного байта SS выставляют в логическую единицу и понижают перед приемом следующего. Здесь же - он всегда на нуле. Также SPI-пзушки обычно требуют сначала передать им адрес для считывания перед началом считывания (а тут - ничего не передается от камеры).

    Update: Сделал программу для Atmel Atmega8535L в режиме SPI slave, имитирующую ПЗУ. Работает! Только байтов, на самом деле, не 32, а 33 (точнее, 32, но первый FF не считается) - последний имеет значение 0x63. Скоро подробности опубликую.
     
  15. Ну, кто тут про медведей рассуждал?

    Я сделал имитатор объектива на контроллере ATmega8535 (на фото). Не следует думать, что там реально нужен такой мощный (относительно, конечно) микроконтроллер, просто под рукой был этот. Реальный размер программы (скомпилированной из C) - 210 байт. Программа (компилировалась с WinAVR) прилагается (с тремя вариантами положения зума). Попрощался с "одуванчиком номер один" - порвался кабель контактной платы, нужно будет припаивать новый кабель и клеить заново. :(

    Итак, хардварный протокол - SPI, без сигнала MOSI. ПЗУ работает в режиме slave, хранит 32 байта (однако перед первым байтом из памяти - выдает байт 0xFF. Есть подозрение, что это не выдача байта, а получение команды на считывание из фотоаппарата, но реально от камеры нигде ничего не передается).

    Удалось выяснить назначение некоторых байтов (возможно, часть из них отражаются только в exif, а реальные значения - другие):

    Байт со смещением 0x01 (нулевое смещение - первый после FF байт) хранит код минимального значения диафрагмы (без учета потерь при зуммировании): 0x30 - /5.6, 0x28 - /4, 0x24 - /3.2, меньше 0x22 - /2.8.

    Байт со смещением 0x03 - код минимальной диафрагмы с учетом потерь при зуме (относительно минимальной): 0x0 - минимальное, прибавление 1 - +шаг диафрагмы (значение 0x8 при байте 0x01=28 - дает /5.6).

    Байт со смещением 0x07 - код фокусного расстояния: 0x3c - 60mm, 0x43 - 80mm, 0x44 - 85mm, 0x4a - 110mm, 0x4c - 120mm, 0x4e - 135mm, 0x63 - 330mm, 0x7e - 650mm. Очевидно, в камере есть таблица фокусных, а этот байт - индекс в этой таблице.

    Короче, пора запускать в серию. Нужно только подобрать подходящий микроконтроллер или ПЗУ, организовать производство. У меня таких возможностей нет, к сожалению.

    Примечание к фотографии: там на плате требуется только тот контроллер, что справа от матрицы светодиодной. Сама матрица и другой контроллер - никак к нашему вопросу не относятся. Кварцевый резонатор и конденсаторы - также не требуются для работы (только для возможности прошивания контроллера, не вынимая из платы).

    Распиновка (для Atmega8535):

    1-3 контакты байонета (смотреть на тушку, слева направо) - SSM/xi, не используются
    4 - GND, на контроллере pin 11 (GND)
    5 - SS инверсный, на контроллере pin 5 (PB4/SS инверсный)
    6 - SCK, на контроллере pin 8 (PB7/SCK)
    7 - Vcc, на котроллере pin 10 (Vcc)
    8 - MISO, на контроллере pin 7 (PB6/MISO)

    Другие контакты контроллера вообще не используются и никуда не подсоединяются. Соответственно, можно применить даже контроллеры в восьмипиновых корпусах (лишь бы SPI поддерживали).



    Текст программы (переключение PB6 из output в input и обратно - не требуется на самом деле, просто на всякий случай):

    #define F_CPU 1000000L
    #include <inttypes.h>
    #include <avr/io.h>
    // Config bits: CKSEL0 - 1, CKSEL1..3 - 0 (1 mHz internal RC), BODEN - 1

    // uint8_t lensdata[] = {0xff, 0x80, 0x28, 0x50, 0x04, 0x20, 0x10, 0x10, 0x3C, 0x33, 0x00, 0xfb, 0x42, 0xfe, 0x00, 0x00, 0x50, 0x00, 0xa7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xa7, 0x63}; // Quantaray 35-80/4-5.6 at 60/4.5

    // uint8_t lensdata[] = {0xff, 0x80, 0x28, 0x50, 0x08, 0x20, 0x10, 0x10, 0x43, 0x33, 0x00, 0xfb, 0x34, 0xfe, 0x00, 0x00, 0x5c, 0x00, 0xa7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xa7, 0x63}; // Quantaray 35-80/4-5.6 at 80/5.6

    uint8_t lensdata[] = {0xff, 0x80, 0x20, 0x50, 0x00, 0x20, 0x10, 0x10, 0x4E, 0x33, 0x00, 0xfb, 0x34, 0xfe, 0x00, 0x00, 0x5c, 0x00, 0xa7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xa7, 0x63}; // Quantaray 35-80/4-5.6 at 135/2.8 :)

    int main(int argc, char **argv) {
    int i;
    uint8_t t;

    DDRB = 0;
    // SPI interface - slave mode
    SPCR &= ~(_BV(MSTR) | _BV(SPR0) | _BV(CPHA) | _BV(CPOL));
    SPCR |= _BV(DORD) | _BV(SPE);
    t = SPSR; // clear SPIF
    PORTB = 0x0;
    SPDR = 0xff;

    while(1) {
    while(PINB & _BV(PB4)) { }; // wait for SS low
    PORTB |= _BV(PB6);
    DDRB |= _BV(PB6);
    for(i = 0; i < sizeof(lensdata); i++) {
    t = SPSR; // read SPSR just to clear SPIF
    SPDR = lensdata;
    while((!(SPSR & (1<<SPIF))) && !(PINB & _BV(PB4))) { };
    PORTB=0;
    if (PINB & _BV(PB4)) {
    break;
    }
    }
    DDRB &= ~_BV(PB6);
    while(!(PINB & _BV(PB4))) { }; // wait for SS returns to high
    }
    }
     
  16. Ну, кто тут про медведей рассуждал?

    Я сделал имитатор объектива на контроллере ATmega8535 (на фото). Не следует думать, что там реально нужен такой мощный (относительно, конечно) микроконтроллер, просто под рукой был этот. Реальный размер программы (скомпилированной из C) - 210 байт. Программа (компилировалась с WinAVR) прилагается (с тремя вариантами положения зума). Попрощался с "одуванчиком номер один" - порвался кабель контактной платы, нужно будет припаивать новый кабель и клеить заново. :(

    Итак, хардварный протокол - SPI, без сигнала MOSI. ПЗУ работает в режиме slave, хранит 32 байта (однако перед первым байтом из памяти - выдает байт 0xFF. Есть подозрение, что это не выдача байта, а получение команды на считывание из фотоаппарата, но реально от камеры нигде ничего не передается).

    Удалось выяснить назначение некоторых байтов (возможно, часть из них отражаются только в exif, а реальные значения - другие):

    Байт со смещением 0x01 (нулевое смещение - первый после FF байт) хранит код минимального значения диафрагмы (без учета потерь при зуммировании): 0x30 - /5.6, 0x28 - /4, 0x24 - /3.2, меньше 0x22 - /2.8.

    Байт со смещением 0x03 - код минимальной диафрагмы с учетом потерь при зуме (относительно минимальной): 0x0 - минимальное, прибавление 1 - +шаг диафрагмы (значение 0x8 при байте 0x01=28 - дает /5.6).

    Байт со смещением 0x07 - код фокусного расстояния: 0x3c - 60mm, 0x43 - 80mm, 0x44 - 85mm, 0x4a - 110mm, 0x4c - 120mm, 0x4e - 135mm, 0x63 - 330mm, 0x7e - 650mm. Очевидно, в камере есть таблица фокусных, а этот байт - индекс в этой таблице.

    Короче, пора запускать в серию. Нужно только подобрать подходящий микроконтроллер или ПЗУ, организовать производство. У меня таких возможностей нет, к сожалению.

    Примечание к фотографии: там на плате требуется только тот контроллер, что справа от матрицы светодиодной. Сама матрица и другой контроллер - никак к нашему вопросу не относятся. Кварцевый резонатор и конденсаторы - также не требуются для работы (только для возможности прошивания контроллера, не вынимая из платы).

    Распиновка (для Atmega8535):

    1-3 контакты байонета (смотреть на тушку, слева направо) - SSM/xi, не используются
    4 - GND, на контроллере pin 11 (GND)
    5 - SS инверсный, на контроллере pin 5 (PB4/SS инверсный)
    6 - SCK, на контроллере pin 8 (PB7/SCK)
    7 - Vcc, на котроллере pin 10 (Vcc)
    8 - MISO, на контроллере pin 7 (PB6/MISO)

    Другие контакты контроллера вообще не используются и никуда не подсоединяются. Соответственно, можно применить даже контроллеры в восьмипиновых корпусах (лишь бы SPI поддерживали).



    Текст программы (переключение PB6 из output в input и обратно - не требуется на самом деле, просто на всякий случай):

    #define F_CPU 1000000L
    #include <inttypes.h>
    #include <avr/io.h>
    // Config bits: CKSEL0 - 1, CKSEL1..3 - 0 (1 mHz internal RC), BODEN - 1

    // uint8_t lensdata[] = {0xff, 0x80, 0x28, 0x50, 0x04, 0x20, 0x10, 0x10, 0x3C, 0x33, 0x00, 0xfb, 0x42, 0xfe, 0x00, 0x00, 0x50, 0x00, 0xa7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xa7, 0x63}; // Quantaray 35-80/4-5.6 at 60/4.5

    // uint8_t lensdata[] = {0xff, 0x80, 0x28, 0x50, 0x08, 0x20, 0x10, 0x10, 0x43, 0x33, 0x00, 0xfb, 0x34, 0xfe, 0x00, 0x00, 0x5c, 0x00, 0xa7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xa7, 0x63}; // Quantaray 35-80/4-5.6 at 80/5.6

    uint8_t lensdata[] = {0xff, 0x80, 0x20, 0x50, 0x00, 0x20, 0x10, 0x10, 0x4E, 0x33, 0x00, 0xfb, 0x34, 0xfe, 0x00, 0x00, 0x5c, 0x00, 0xa7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xa7, 0x63}; // Quantaray 35-80/4-5.6 at 135/2.8 :)

    int main(int argc, char **argv) {
    int i;
    uint8_t t;

    DDRB = 0;
    // SPI interface - slave mode
    SPCR &= ~(_BV(MSTR) | _BV(SPR0) | _BV(CPHA) | _BV(CPOL));
    SPCR |= _BV(DORD) | _BV(SPE);
    t = SPSR; // clear SPIF
    PORTB = 0x0;
    SPDR = 0xff;

    while(1) {
    while(PINB & _BV(PB4)) { }; // wait for SS low
    PORTB |= _BV(PB6);
    DDRB |= _BV(PB6);
    for(i = 0; i < sizeof(lensdata); i++) {
    t = SPSR; // read SPSR just to clear SPIF
    SPDR = lensdata;
    while((!(SPSR & (1<<SPIF))) && !(PINB & _BV(PB4))) { };
    PORTB=0;
    if (PINB & _BV(PB4)) {
    break;
    }
    }
    DDRB &= ~_BV(PB6);
    while(!(PINB & _BV(PB4))) { }; // wait for SS returns to high
    }
    }
     
  17. Проконсультировался с Лушниковым, нам могут подойти Atmel'овские ATTiny в корпусах MLF, если не найдем более мелкую ПЗУ-шку с нужным нам протоколом. Но у него размеры - 4.0 x 4.0 x 0.75 мм. То есть, между резьбой объектива и выступом байонета в переходнике M42 - не влезет. Только вертикально, что чревато изготовлением гнутых плат (такие вообще делают?). :) Выходов два - вырезать часть зацепа байонета на переходнике под кристалл или срезать хвостовик у объективов (что, в общем-то, довольно безопасно, но лишние трудозатраты и заодно придется отхватить рычаг прыгалки).
     
  18. Респект,vasimv!:)

    Весь вечер вертел свои линзы с переходниками и пришел к неутешительному выводу, что при любом размере чипа без подпилов переходника и хвостовика не обойтись. В конце концов решил помозговать над идеей вертикального расположения чипа. Тоже оказалось проблематично. В итоге родилась гибкая конструкция: контактную плату располагаем между хвостовиком и переходником (1,5мм-достаточно ), от нее по канавке выводим шину к чипу, располагается он вертикально. Шина должна быть достаточно маленькой и жесткой. Подгибаем ее по месту. В самой камере места достаточно, чтобы расположить чип без помех для линзы. То, что примерно получается, показано на рисунке. Начинаю трясти знакомых в почтовых ящиках. К сожалению, очень близких не осталось, что захотят за работу, большой вопрос.
     
  19. Оторвется. К тому же - при установке в байонет будет цепляться за все подряд. Лучше, пожалуй, сделать выемку в резьбе, прямо под контактной группой, как я делал для выведения кабеля (у jolos-овского есть аналогичная, но для рычага привода диафрагмы). Как раз чуть больше четырех миллиметров набирается. Либо все же размещать нормально и обрезать хвосты объективов (точность в этом случае никакая не нужна, желательно только чернить как-то место спила).

    Кстати, лучше сразу рассчитывать на 7 контактов (можно пару разместить со стороны обратной размещению SSM/xi/D контактов), чтобы можно было перепрошивать процессор прямо в переходнике.
     
  20. Между прочим, вся эта конструкция, и даже более того, встанет на переходник MD->AF [​IMG]
    А в переходнике Jolos M42->AF можно выфрезеровать канавку в цилиндре. Там есть запас почти в 3 мм по диаметру и уж точно больше 5 мм по высоте. Правда, в этом случае в нём образуется дырка, но это не существенно. Этого скорее всего будет достаточно.
     

Поделиться этой страницей