LoginSignup
1
1

More than 1 year has passed since last update.

raspiでautofocusを実装してみる(1)

Last updated at Posted at 2021-12-06

購入商品

カメラを使ってみたかったのでarducamを購入しました.

こちらの商品です.3000くらいで電動フォーカスをプログラミングできます.

Documentsとgithub

初期設定

最初はgithub,説明書にあるとおりに進めていく

sudo raspi-config

からcameraをenableにする
次にサンプルで必要なopencvを入れて,i2cをonにする(詳しくはenable_i2c_vcを参照).

sudo apt-get install python-opencv
git clone https://github.com/ArduCAM/RaspberryPi.git
cd RaspberryPi/Motorized_Focus_Camera
sudo chmod +x enable_i2c_vc.sh
./enable_i2c_vc.sh

rebootするかと言われるのでyと押す.完了

サンプルコード実行

libarducam_vcm.so

遊ぶために関数を理解する.
実装がわからない関数は

arducam_vcm.vcm_write(val)
arducam_vcm.vcm_init()

だけであるから問題はない.1
簡単にいうとvcm_writeが焦点距離を書き込む関数,vcm_initが初期化する関数のよう.

libarducam_keyboard.so

keyboardの入力を読み取る関数.これはcfileがあるので書き直し可能.
矢印キーを頑張って処理するために色々書いたり入力させた文字をターミナル上で表示しないようにするためにしている.
upとdownの時のreturnが気に入らないので128と129に書き直した.

libarducam_keyboard.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>

#define UP 128
#define DOWN 129

int arducam_get_key()
{
    int key_value;
    struct termios new_config;
    struct termios old_config;

    tcgetattr(0, &old_config);
    new_config = old_config;
    new_config.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(0, TCSANOW, &new_config);
    key_value = getchar();
    tcsetattr(0, TCSANOW, &old_config);
    return key_value;
}
int processKeyEvent(void)
{
    int keyVal = 0;
    keyVal = arducam_get_key();
    if (keyVal == 27)
    {
        keyVal = arducam_get_key();
        if (keyVal == 91)
        {
            keyVal = arducam_get_key();
            if (keyVal == 65)
            {
                return UP;
            }
            if (keyVal == 66)
            {
                return DOWN;
            }
        }
    }
    else
    {
        return keyVal;
    }
}
//test
int main(int argc, char **argv)
{
    int val = processKeyEvent();
    printf("val = %d\r\n", val);
    printf("%d\n", 'a');
}

Motorized_Focus_Camera_Preview.py

私の環境だと普通に動きませんでした.(python3,raspi4Bの8GB,macからrealvnc)
コードを修正 and 終了のif文がないので追加

Motorized_Focus_Camera_Preview.py
import os
import time
import _thread as thread
from ctypes import *
import picamera
keyboard = CDLL('./lib/libarducam_keyboard.so')
arducam_vcm = CDLL('./lib/libarducam_vcm.so')
UP = 128
DOWN = 129
SAVE = 115
focus_val = 512
step = 10

if __name__ == "__main__":
    try:
        # vcm init
        arducam_vcm.vcm_init()
        camera = picamera.PiCamera()
        camera.preview_fullscreen = False
        preview = camera.start_preview()
        # set windows size
        preview.window = (0, 0, 800, 600)
    except:
        os.system(
            """ps aux | grep raspistill | grep -v grep | awk '{ print "kill -9", $2 }' | sh""")
        raise BaseException("resource error")

    print("Please press up and down to adjust focus.")
    while True:
        keyVal = keyboard.processKeyEvent()
        time.sleep(0.01)
        if keyVal == UP:
            print("UP")
            focus_val = focus_val+step
            if focus_val > 1023:
                focus_val = 1023
            print(focus_val)
            arducam_vcm.vcm_write(focus_val)
        if keyVal == DOWN:
            print("DOWN")
            focus_val = focus_val-step
            if focus_val < 0:
                focus_val = 0
            print(focus_val)
            arducam_vcm.vcm_write(focus_val)
        if keyVal == ord('s'):
            print("save test.jpg")
            camera.capture("test.jpg")
        if keyVal == ord('a'):
            print("END")
            break
    camera.close()

ここから読み取るにfocus_valは0から1023までで考えれば良い

トラブルリスト

・ tightvncserverではpreviewが表示できない

realvncを使う.
参考サイト
https://www.youtube.com/watch?v=dbBWyeHbGs0
https://ryoichi0102.hatenablog.com/entry/vnc-viewer-cannot-currently-show-the-dekstop

・cui版ではpicameraとかのインストールで色々エラーが出る
desktop版をインストールする.

続きはコントラストAFの実装


  1. これに関連したissue.逆アセンブリしてる.https://github.com/ArduCAM/RaspberryPi/issues/47 

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1