DSLR-PLOGIN 单反相机插件

旧时新提,时间过的很快,转眼现在已经快要入冬了,想起还没有写一个帖子和大家分享暑假在家做的一个业余项目,就是这个 DSLR-PLOGIN,我将其成为单反相机插件。如下图:

可见该插件与相机的连接是通过相机机身上的usb接口。实现了一些功能:虽然看起来都不完善吧,哈哈。

演示视频,我之前发在过哔哩哔哩上。 视频

具体功能的实现

代码我开源在此处: 代码

硬件实现

主要是使用了 LuckFox Pico Mini B ,这个板子板载flash可以不用额外的储存卡,内存也很大,价格也不是很贵,最重要的是还支持 linux,这算是打下了这个项目的基础。

其次是 JDY-33 蓝牙模块,最后就是一个 0.96寸的 oled 屏

总体上采用一块 3.7 V 锂电池 供电经一个充电保护模块(把电压降至 3V )连接至luckfox pico mini B,然后在 53, 52 脚连接蓝牙模块,59,58 脚连接屏幕。最后焊了一个板子集成了这些东西。

软件实现

gphoto2 和 libgphoto2 的交叉编译

这可以参考我写的这一篇文章 gphoto2 和 libgphoto2 的交叉编译 想要直接编程去读相机内的信息几乎不可能,所以只能借助一些库,这里让搭载 linux 的 luckfox pico 连接 相机,相机作为一个 usb 从设备,缺点是这样无法查看相册。之后,通过libgphoto2 库去读取相机内的信息,然后我在用蓝牙模块给传出来,但遇到的一个 bug 如果通过 libgphoto2 库去拍照的时候,虽然相机会有拍照动作,但拍完会报错(大概意思是连接usb不可打开相册),照片不会存下来。

主要逻辑

        
        int main( int argc, char** argv )
        {
            int ret;
            char* owner;
            CameraText text;
            void* evtdata;
            
            context = sample_create_context( ); /* see context.c */
            gp_camera_new( &camera );
            
            ret = gp_camera_init( camera, context );
            if ( ret < GP_OK ) 
            { 
                printf( "No camera auto detected.\n" ); 
                gp_camera_free( camera ); return 0; 
            } 
            // 打开串口
            serial_fd=uart_open( 4 ); 
            uart_init( serial_fd );
            // 创建蓝牙轮询子线程
            pthread_t tid[2];
            int t_ok=pthread_create( &tid[0],NULL, repl_booltooth, NULL ); assert( t_ok ); 
            // oled 初始化 
            if ( DEV_ModuleInit( ) !=0 ) 
            { 
                return -1; 
            }
            printf( "OLED Init...\r\n" ); 
            OLED_Init( ); 
            OLED_Clear( ); 
            // 子线程在 oled 屏幕上显示信息 
            t_ok=pthread_create( &tid[1], NULL,r_oled, NULL ); 
            assert( t_ok ); 
            // 等这两个进程 
            for ( int i=0; i < 2; i++ ) 
            { 
                int ret=pthread_join( tid[i], NULL ); 
            } 
            //释放资源 
            pthread_exit( NULL ); 
            uart_close( serial_fd ); 
            gp_camera_exit( camera, context ); 
            gp_camera_free( camera );
            gp_context_unref( context ); 
            return 0; 
        }
        
    
先打开蓝牙串口,然后创建一个子进程专门用来与用户进行交互,之后初始化 oled 屏幕 ,最后相机器轮询机器的信息显示出来。

结论

最后还是感觉入门机器的功能有点不够了,打算换机身。

参考