ساخت دکمه شاتر بی سیم دوربین DSLR با آردوینو

عکاسی یکی از محبوب ترین موضوعات این روز ها است. بعضی از عکاسی ها میتوانند برای فرد عکاس خطر ایجاد کنند. مثلا عکس برداری از حیوانات درنده میتواند باعث زخمی شدن و یا حتی مرگ عکاس شود. بنابراین عکاس باید بتواند از راه دور دوربین را کنترل کند و تصویر را ثبت کند. در این پروژه آردوینو ما یک دکمه شاتر بی سیم میسازیم که دوربین DSLR را کنترل میکند. برای ارتباط بی سیم ما از ماژول فرستنده و گیرنده nRF24L01 و آردوینو اونو استفاده میکنیم. قبلا از این ماژول و آردوینو برای ساخت چت روم با آردوینو استفاده کرده بودیم.
شماتیک مدار شاتر بی سیم دوربین
شماتیک ساخت شاتر از راه دور برای دوربین DSLR در زیر نشان داده شده است.

شماتیک ساده است و به دو بخش nRF24L01 با Arduino به عنوان گیرنده و nRF24L01 با Arduino به عنوان فرستنده تقسیم میشود. در قسمت گیرنده ، دکمه در حالت LOW است بنابراین از یک مقاومت پول آپ استفاده می شود. هنگامی که دکمه فشار داده می شود ، پایه D4 تبدیل به HIGH میشود. با این کار داده ها از طریق nRF24L01 منتقل می شوند. از طرف دیگر ، گیرنده داده ها را دریافت کرده و آنها را به جک 2.5 میلی متری منتقل می کند.

قطعات مورد نیاز
از آنجا که این پروژه دارای ارتباط بی سیم است، به ماژول گیرنده و فرستنده بی سیم نیاز داریم.
- برد Arduino UNO
- کابل USB با آداپتور 5 ولت یا پاوربانک – 2 عدد
- برد آردوینو نانو
- NRF24L01 – 2 عدد
- جک 2.5 میلی متری
- مبدل 5 ولت (اگر از باتری لیتیوم 7.4 ولت استفاده می کنید)
نحوه اتصال شاتر بی سیم آردوینو به دوربین
DSLR از شاتر راه دور پشتیبانی میکند.
اتصال این پین را می توانید در تصویری که در زیر آورده شده مشاهده کنید.

نوک جک با استفاده از مقاومت پول آپ در سطح 3.3 ولت است. وقتی آردوینو نانو داده ای را از طریق nRF24L01 دریافت کند، نوک جک را به سطح 0 ولت (LOW) میرساند.
از طرف دیگر ، یک مقاومت پول آپ وجود دارد که در کنار Arduino UNO استفاده می شود. هر زمان که سوئیچ فشار داده شود ، پین ورودی محل اتصال سوئیچ LOW می شود. Arduino این داده ها را از طریق nRF24L01 به فرستنده منتقل می کند. در زیر شماتیک پین های NRF24L01 آورده شده است.

می توان این ماژول را به عنوان گیرنده یا فرستنده پیکربندی کرد. این یک ماژول RF بسیار ارزان است که از دامنه 2.4 گیگاهرتز استفاده می کند.
کد آردوینو برای شاتر دوربین بیسیم
برای این پروژه دو کد مختلف استفاده شده است ، یکی برای فرستنده و دیگری برای گیرنده.
کد برای فرستنده:
کتابخانه ها ابتدا فراخوانی شده اند.
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include "printf.h" #include <ArduinoJson.h>
آدرس تنظیم میشود که این باید برای فرستنده و گیرنده یکسان باشد.
const byte address[6] = {0xe1, 0xe1, 0xe1, 0xe1, 0xe1}; Boolean ایجاد می شود که در آن حالت تریگر از true به false یا برعکس تغییر می یابد.
volatile bool isTrigger = false;
مرحله بعدی شروع کار NRF24L01 قبل از اجرای برنامه واقعی است. در اینجا دامنه ، نوع داده و حالت تنظیم شده است. nRF24L01 به عنوان یک فرستنده تنظیم شده است ، و همچنین برای مسافت طولانی با حداکثر توان RF تنظیم شده است. همچنین آدرسی را که قبلاً تنظیم شده را باید قرار دهید.
void setup()
{
Serial.begin(9600);
printf_begin();
Serial.println(F("\n\rRF24/examples/scanner/"));
// پیکربندی ماژول رادیویی
radio.begin();
radio.setAutoAck(false);
//تنظیم آدرس
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN); //set as: RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
radio.setDataRate(RF24_2MBPS); //set as: F24_250KBPS, F24_1MBPS, F24_2MBPS ==>250KBPS = طولانی
radio.setChannel(115); //تنظیم کانال
radio.setCRCLength(RF24_CRC_8);
// radio.printDetails();
//پیکربندی به عنوان فرستنده
radio.stopListening(); پس از تنظیم فرستنده nRF24L01 ، نوبت به تنظیم ورودی دکمه ای می رسد که توسط کاربر فشار داده می شود. پین به عنوان ورودی تنظیم شده است.
pinMode(SHUTT_REMOTE_TRIGGER_PIN, INPUT); // تنظیم پین دکمه به عنوان ورودی
// attachInterrupt(digitalPinToInterrupt(SHUTT_REMOTE_TRIGGER_PIN), shutter_remote_trigger, LOW);
// attachInterrupt(digitalPinToInterrupt(SHUTT_REMOTE_TRIGGER_PIN), shutter_remote_trigger, HIGH );
}
void shutter_remote_trigger() {
isTrigger = true;
}
// متغیر ها تغییر میکنند
int ledState = HIGH; // وضعیت فعلی پین
int buttonState; // وضعیت دکمه
int lastButtonState = LOW; // آخرین وضعیت دکمه
unsigned long lastDebounceTime = 0; // آخرین باری که وضعیت تغییر کرده
unsigned long debounceDelay = 50; // تنظیم دیبانس برای نویز دکمه در void loop، حالت دکمه به طور مداوم کنترل می شود و هر زمان که فشار داده شود ، یک JSON برای گیرنده ارسال می شود.
void loop()
{
// خواندن وضعیت دکمه
int reading = digitalRead(SHUTT_REMOTE_TRIGGER_PIN);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// کد های مربوط به دیبانس دکمه
if (reading != buttonState) {
buttonState = reading;
if (buttonState == LOW) {
isTrigger = true;
}
}
}
lastButtonState = reading;
if (true == isTrigger) {
StaticJsonDocument<50> doc;
doc[SHUTT_TRIGGER_JSON_KEY] = SHUTT_TRIGGER_ACTIVE;
//ارسال پیام به گیرنده
char send_dt[32] = {0};
String output;
//serializeJson(doc, Serial);
serializeJson(doc, send_dt);
Serial.println(send_dt);
radio.write(&send_dt, sizeof(send_dt));
isTrigger = false;
}
delay(10);
} کد برای گیرنده:
این کد مشابه فرستنده است.
کتابخانه ها ابتدا فراخوانی شده اند.
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include "printf.h" #include <ArduinoJson.h>
آدرس تنظیم میشود همانطور که قبلاً گفته شد ، این آدرس باید هم برای فرستنده و هم برای گیرنده یکسان باشد. قبلاً در بخش آدرس فرستنده نیز آورده شده است.
const byte address[6] = {0xe1, 0xe1, 0xe1, 0xe1, 0xe1}; مرحله بعدی شروع کار nRF24L01 قبل از اجرای برنامه واقعی است. در اینجا ، محدوده ، نوع داده و حالت نیز همانند قسمت فرستنده تنظیم شده اند ، اما در اینجا به عنوان یک گیرنده به جای فرستنده تنظیم شده است.
همچنین آدرسی را که قبلاً تنظیم شده بود قرار می دهد.
void setup()
{
Serial.begin(9600);
printf_begin();
//Serial.println(F("\n\rRF24/examples/scanner/"));
// پیکربندی ماژول رادیویی
radio.begin();
radio.setAutoAck(false);
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_MIN); //set as: RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
radio.setDataRate(RF24_2MBPS); //set as: F24_250KBPS, F24_1MBPS, F24_2MBPS ==>250KBPS = مسافت طولانی
radio.setChannel(115); //تنظیم کانال
radio.setCRCLength(RF24_CRC_8);
// تنظیم به عنوان گیرنده
radio.startListening(); پس از تنظیم گیرنده nRF24L01 ، وقت آن است که در صورت دریافت JSON که اطلاعات دکمه فشرده شده را دارد ، پین شاتر را روی LOW تنظیم کنید.
void loop()
{
digitalWrite(SHUTT_TRIGGER_PIN, HIGH);
//خواندن داده اگر در بافر موجود است
if (radio.available())
{
StaticJsonDocument<50> doc;
char recv_dt[32] = {0};
radio.read(&recv_dt, sizeof(recv_dt));
Serial.println(recv_dt);
// حذف json
DeserializationError error = deserializeJson(doc, recv_dt);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
//بازگشت;
} else {
char s_trig_stat = doc[SHUTT_TRIGGER_JSON_KEY];
if (SHUTT_TRIGGER_ACTIVE == s_trig_stat) {
Serial.println("Set Shutter pin Low");
digitalWrite(SHUTT_TRIGGER_PIN, LOW); // LOW کردن پین دیجیتال
digitalWrite(LED_BUILTIN, HIGH);
delay(250); // 250 میلی ثانیه صبر
}
}
digitalWrite(LED_BUILTIN, LOW);
}
} موارد موجود در فایل : سورس کامل
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود










سلام میشه کاری کرد که فقط با یک دکمه لمسی یا هر دکمه دیگر عمل شاتل را انجام دهد و فقط هم بر روی آردوینو نانو اتفاق بیفتد
سلام عزیز
بله میشه