旧时新提,时间过的很快,转眼现在已经快要入冬了,想起还没有写一个帖子和大家分享暑假在家做的一个业余项目,就是这个 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 的交叉编译 想要直接编程去读相机内的信息几乎不可能,所以只能借助一些库,这里让搭载 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 屏幕 ,最后相机器轮询机器的信息显示出来。