ورکشاپ آموزشی - آیسی مدار
رفتن به محتوا

دستگاه شنود مخفی با آردوینو؛ یک میکروفون جاسوسی بساز!

ابزار و گجت
۰ نظر
۲۶ نفر
کد ۳۱۹۶

خیلی وقت‌ها پیش میاد که برای پروژه‌های امنیتی یا حتی فقط برای سرگرمی و کنجکاوی، نیاز به یک دستگاه ضبط صدای خیلی کوچیک و مخفی داشته باشیم. دستگاهی که بتونیم راحت یک گوشه قایمش کنیم تا صداهای محیط رو روی یک کارت حافظه ذخیره کنه.

توی این آموزش از تیم آیسی‌مدار، قراره با هم یک "میکروفون مخفی" یا به اصطلاح Spy Bug بسازیم. این گجت جاسوسی جذاب با استفاده از برد آردوینو پرو میکرو (Arduino Pro Micro)، یک ماژول میکروفون حساس و یک ماژول کارت‌خوان Micro SD کار می‌کنه و تمام صداها رو با فرمت صوتی ذخیره می‌کنه.

برای تغذیه این مدار جمع‌وجور از باتری‌های نیم‌قلمی استفاده کردیم و کل قطعات رو داخل یک قاب کوچیک چاپ سه‌بعدی جا دادیم تا کاملا شبیه یک گجت حرفه‌ای بشه. بریم سراغ معرفی قطعات تا این پروژه هیجان‌انگیز رو شروع کنیم!

قطعات موردنیاز

  • برد آردوینو Pro Micro (بدون پین‌هدر)
  • ماژول کارت‌خوان Micro SD (بدون پین‌هدر - اگر پین داشت باید از روی برد بازش کنی)
  • ماژول میکروفون MAX9814 (بدون پین‌هدر)
  • 2 عدد کلید کشویی SPDT (ابعاد حدودی 3.7 در 3.7 در 8.7 میلی‌متر)
  • پایانه‌های فلزی باتری نیم‌قلمی (می‌تونی از جاباتری‌های قدیمی جداشون کنی)
  • 4 عدد پیچ با طول 4 میلی‌متر و قطر 1.5 میلی‌متر
  • پیچ با طول 4 میلی‌متر و قطر 2 میلی‌متر
  • 3 عدد باتری نیم‌قلمی (AAA)
  • سیم استخوانی یا سیم لاکی نازک
  • قطعات پرینت سه‌بعدی بدنه
  • چسب برق یا هر نوار چسبی که نور رو از خودش عبور نده
  • کارت حافظه Micro SD (ظرفیت 32 گیگابایت یا کمتر)
  • پرینتر سه‌بعدی (برای چاپ قاب دستگاه)
  • هویه
  • سیم لحیم
  • پیچ‌گوشتی
  • چسب حرارتی یا قطره‌ای
  • نرم‌افزار آردوینو (Arduino IDE)
  • نرم‌افزار اسلایسر Cura
مرحله ۱

چاپ سه‌بعدی قطعات قاب دستگاه

اولین کاری که باید بکنیم، پرینت گرفتن بدنه اصلی و درپوش دستگاه شنودمون هست. من برای تنظیمات چاپ از نرم‌افزار اسلایسر Cura استفاده کردم. تنظیمات پیشنهادی برای چاپ بدنه اصلی (Case):

  1. پشتیبانی (Support): روشن (Yes)
  2. چسبندگی بستر (Buildplate adhesion): Skirt
  3. ارتفاع لایه: 0.2 میلی‌متر
  4. ضخامت دیواره: 0.8 میلی‌متر
  5. تراکم (Infill): 20 درصد
  6. تعداد لایه‌های بالا و پایین: 4 لایه
  7. سرعت چاپ: 200 mm/s
  8. جنس فیلامنت: PLA پلاس

تنظیمات پیشنهادی برای چاپ درپوش (Lid):

  1. پشتیبانی (Support): خاموش (No)
  2. چسبندگی بستر: Skirt
  3. ارتفاع لایه: 0.2 میلی‌متر
  4. ضخامت دیواره: 0.8 میلی‌متر
  5. تراکم: 20 درصد
  6. تعداد لایه‌های بالا و پایین: 4 لایه
  7. سرعت چاپ: 200 mm/s
  8. جنس فیلامنت: PLA پلاس

فایل‌های STL بدنه و درپوش رو می‌تونی دانلود و برای پرینت آماده کنی.

مرحله ۲

جاگذاری پایانه‌های فلزی باتری

کار رو با نصب پایانه‌های باتری داخل قاب شروع می‌کنیم. همون‌طور که تو تصویر می‌بینی، من از پایانه‌هایی استفاده کردم که فنر و برآمدگی دارن. اگر پایانه تو فقط فنر یا فقط برآمدگی داره، شاید مجبور بشی زائده‌های اضافی فلزیش رو با سیم‌چین قطع کنی تا دقیقا سر جاش بشینه.

ممکنه برای جا زدن این فنرها نیاز باشه از یک ابزار کوچیک استفاده کنی یا لبه‌های پلاستیکی قاب رو کمی بتراشی تا اتصالات فلزی کاملا محکم و بدون لقی سر جای خودشون قرار بگیرن.

مرحله ۳

نصب کلیدهای کشویی

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

بعدش پین‌های سمت راست کلید رو قطع کن. پین‌های وسطی رو به هم لحیم کن و با یک تکه سیم، اون‌ها رو به قطب منفی مجموعه باتری‌ها وصل کن.

مرحله ۴

سیم‌کشی ماژول کارت‌خوان Micro SD

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

  1. پین GND ماژول به GND آردوینو
  2. پین VCC ماژول به VCC آردوینو
  3. پین MISO ماژول به پین 14 (GPIO 14) آردوینو
  4. پین MOSI ماژول به پین 16 (GPIO 16) آردوینو
  5. پین SCK ماژول به پین 15 (GPIO 15) آردوینو
  6. پین CS ماژول به پین 10 (GPIO 10) آردوینو

بعد از اینکه لحیم‌کاری تموم شد، پیشنهاد می‌کنم یکی از کدهای نمونه کتابخونه SD آردوینو رو تست کنی تا مطمئن بشی ماژول کارت‌خوان سالم هست و به درستی با برد ارتباط برقرار می‌کنه.

مرحله ۵

سیم‌کشی‌های مربوط به کلیدها و میکروفون

حالا باید چند تا سیم دیگه به میکروکنترلر اضافه کنیم. این سیم‌ها قراره به میکروفون و کلیدها وصل بشن، پس اول طولشون رو درست اندازه بگیر. بهترین کار اینه که برد آردوینو و ماژول SD رو موقتا داخل قاب بذاری، فاصله تا کلیدها و میکروفون رو اندازه بگیری و بعد سیم‌ها رو روی آردوینو لحیم کنی.

بعد از لحیم‌کاری، قطعات رو داخل قاب جاساز کن. بردها باید دقیقا توی فضای مستطیلی فرو برن و پورت تایپ سی (USB-C) آردوینو هم باید دقیقا روبه‌روی سوراخ روی دیواره قاب قرار بگیره. اگر دیدی ماژول کارت‌خوان یکم بزرگه، می‌تونی خیلی کم لبه‌های بردش رو بتراشی تا جا بشه. نگران نباش؛ تراشیدن بخش‌های خالی حاشیه فیبر مدار چاپی هیچ آسیبی به قطعاتش نمی‌زنه.

حالا سیم‌ها رو به کلیدها لحیم کن. پین GND رو به کلید پایینی و پین شماره 2 (GPIO 2) رو به کلید بالایی متصل کن.

مرحله ۶

نصب و اتصال ماژول میکروفون

تو این قدم، ماژول میکروفون رو به سیم‌هایی که تو مرحله قبل از آردوینو کشیدیم متصل می‌کنیم. اول از همه، ماژول میکروفون رو با استفاده از اون پیچ 4 میلی‌متری (با قطر 2 میلی‌متر) سر جای خودش روی قاب پیچ کن تا ثابت بمونه. بعد سیم‌ها رو طبق راهنمای زیر بهش لحیم کن:

  1. پین GND میکروفون به GND آردوینو
  2. پین VDD میکروفون به VCC آردوینو
  3. پین Out میکروفون به پین آنالوگ A0 آردوینو

وقتی این اتصالات رو زدی، یک سیم هم از قطب مثبت مجموعه باتری‌ها به پین VDD میکروفون بکش تا برقش تأمین بشه.

مرحله ۷

تکمیل مونتاژ و جاگذاری باتری‌ها

برای اینکه میکروکنترلر تکون نخوره، اون رو با کمی چسب داخل قاب محکم کن. یک نکته خیلی مهم اینه که ال‌ای‌دی‌های روی برد آردوینو خیلی پرنور هستن و اگر روشن باشن، نورشون از درزهای قاب بیرون می‌زنه و دستگاه مخفی‌مون لو میره! برای جلوگیری از این اتفاق، روی چراغ‌های برد رو با چسب برق (لنت) یا هر چسب مات دیگه‌ای بپوشون. در آخر، سه تا باتری نیم‌قلمی که از قبل آماده کردی رو داخل جایگاه باتری قرار بده.

مرحله ۸

برنامه‌نویسی و پیکربندی آردوینو

قبل از اینکه درپوش دستگاه رو ببندیم، باید برنامه‌اش رو آپلود کنیم. نرم‌افزار Arduino IDE رو باز کن و مطمئن شو که کتابخونه‌های زیر رو نصب کردی:

  1. کتابخانه SD
  2. کتابخانه TMRpcm

بعد از نصب، باید یک تغییر کوچیک تو فایل‌های کتابخونه ایجاد کنیم. از منوی File وارد بخش Preferences بشه تا مسیر پوشه Sketchbook رو پیدا کنی (همون‌طور که تو تصویر اول مشخصه). به اون آدرس برو، پوشه libraries رو باز کن و دنبال پوشه TMRpcm بگرد. وقتی بازش کنی لیستی از فایل‌ها رو می‌بینی.

فایل pcmConfig.h رو با یک نرم‌افزار ویرایش متن ساده باز کن. یکم بیا پایین تا به خط //#define ENABLE_RECORDING برسی. اون دو تا اسلش (//) اول خط رو پاک کن و فایل رو ذخیره کن. اگر این خط رو از حالت کامنت خارج نکنی، کد پروژه ارور میده و کامپایل نمیشه.

حالا برد آردوینو رو با کابل به کامپیوتر وصل کن. مدل برد (Arduino Micro) و پورتش رو انتخاب کن، کدی که برای این پروژه آماده شده رو باز کن و روی برد آپلود کن.

وقت تست کردنه! کارت حافظه رو داخل ماژول قرار بده و یک بار برد رو ریست کن. حالا کلید بالایی رو روشن کن و سریال مانیتور رو تو نرم‌افزار باز کن.

باید پیام Recording همراه با اسم فایل رو روی صفحه ببینی. وقتی کلید بالایی رو خاموش کنی، پیام Stopped recording میاد و عملیات متوقف میشه. حالا کارت حافظه رو دربیار و به کامپیوتر وصل کن. اگر یک فایل صوتی با فرمت wav. توش دیدی، یعنی همه‌چیز عالی پیش رفته!

تبریک میگم! تو با موفقیت دستگاه شنود مخفی خودت رو ساختی. اگر فایلی ساخته نشده بود، مطمئن شو که کارت حافظه‌ات با فرمت FAT32 فرمت شده باشه و اتصالات سیم‌ها رو دوباره چک کن.

تحلیل کدهای پروژه

همیشه خوبه که بدونی کدهایی که آپلود می‌کنی چطور کار می‌کنن تا اگر خواستی بعدا بتونی بهینه‌شون کنی.

Arduino
#include <SD.h>
#include <SPI.h>
#include <TMRpcm.h>

تو خطوط اولیه، کتابخونه‌های مورد نیاز رو فراخوانی کردیم. کتابخونه SD برای خواندن و نوشتن روی کارت حافظه، SPI برای ارتباط از طریق پین‌های MISO و MOSI و در نهایت TMRpcm برای ضبط سیگنال‌های صوتی آنالوگ روی کارت حافظه استفاده میشه.

TXT
#define CS 10
TMRpcm audio;
int fileNumber = 0;
int switchPin = 2;
bool isRecording = false;

در ادامه، پین Chip Select ماژول کارت‌خوان رو روی GPIO 10 تنظیم کردیم و یک شیء از کلاس TMRpcm ساختیم تا توابع ضبط صدا رو فراخوانی کنیم. سه خط بعدی هم متغیرهایی برای شماره فایل، پین کلید و وضعیت فعال بودن ضبط تعریف می‌کنن.

TXT
int findNextFileNum() {
int currNum = 1;
char currFileName[13];
snprintf(currFileName, sizeof(currFileName), "REC%03d.wav", currNum);
while (SD.exists(currFileName)) {
currNum++;
snprintf(currFileName, sizeof(currFileName), "REC%03d.wav", currNum);
}
return currNum;
}

تابع findNextFileNum جلوی این رو می‌گیره که فایل‌های قبلی روی کارت حافظه پاک بشن. اگر فایلی با اسم REC001 روی کارتت باشه، برنامه فایل بعدی رو با اسم جدید می‌سازه. این کار با متغیرهای currNum و currFileName و تابع snprintf انجام میشه که تا سه رقم عدد رو به انتهای اسم فایل اضافه می‌کنه. این تابع با یک حلقه while چک می‌کنه تا اولین شماره فایلی که هنوز وجود نداره رو پیدا کنه.

در نهایت شماره فایلی که برای ضبط جدید آزاده رو برمی‌گردونه.

Arduino
void setup() {
Serial.begin(9600);
delay(100);
pinMode(A0, INPUT);
pinMode(switchPin, INPUT_PULLUP);
Serial.println("Mounting micro SD card...");
if (!SD.begin(CS)) {
Serial.println("Failed to mount micro SD card.");
Serial.println("");
while (true);
}
Serial.println("Successfully mounted microSD card.");
Serial.println("");
audio.CSPin = CS;
fileNumber = findNextFileNum();
}

در تابع Setup تمام تنظیمات اولیه انجام میشه. سریال مانیتور با سرعت 9600 استارت می‌خوره، پین آنالوگ A0 روی حالت ورودی و پین کلید روی INPUT_PULLUP تنظیم میشه.

دلیل استفاده از INPUT_PULLUP اینه که با فعال کردن مقاومت بالاکش داخلی میکروکنترلر، دیگه نیازی نیست یک مقاومت خارجی برای کلید لحیم کنیم. بعد از اون ارتباط با ماژول SD بررسی میشه و اگر مشکلی بود، روی سریال مانیتور ارور میده و متوقف میشه. اگر ماژول SD با موفقیت شناسایی بشه، شماره فایل جدید برای شروع ضبط مشخص میشه.

Arduino
void loop() {
int switchState = digitalRead(switchPin);
char fileName[13];
if (switchState == LOW && !isRecording) {
isRecording = true;
snprintf(fileName, sizeof(fileName), "REC%03d.wav", fileNumber);
audio.startRecording(fileName, 16000, A0);
Serial.print("Recording ");
Serial.println(fileName);
} else if (switchState == HIGH && isRecording) {
isRecording = false;
snprintf(fileName, sizeof(fileName), "REC%03d.wav", fileNumber);
audio.stopRecording(fileName);
Serial.print("Stopped recording ");
Serial.println(fileName);
Serial.println("");
fileNumber++;
}
}

می‌رسیم به تابع Loop که مدام در حال اجراست. اول وضعیت کلید رو می‌خونه؛ وقتی کلید روشن باشه مقدار 0 (LOW) و وقتی خاموش باشه مقدار 1 میده. بعد یک متغیر 13 بایتی برای نام فایل تعریف میشه (12 کاراکتر برای اسم و پسوند، به علاوه کاراکتر پایان رشته null).

شرط if زمانی اجرا میشه که کلید فعال باشه و هنوز فرآیند ضبط شروع نشده باشه. تو این حالت متغیر recording صحیح (true) میشه و نام فایل جدید شکل می‌گیره.

سپس تابع startRecording مقادیر صوتی آنالوگ رو با نرخ نمونه‌برداری 16000 هرتز از پین A0 می‌خونه و روی فایل می‌نویسه. یک پیام هم روی سریال مانیتور چاپ میشه که نشون میده ضبط شروع شده.

چون وضعیت ضبط فعال شده، این بلوک کد دیگه اجرا نمیشه تا زمانی که کلید خاموش و دوباره روشن بشه. اگر کلید خاموش بشه و قبلا در حال ضبط باشیم، بخش دوم if اجرا میشه.

تو این بخش، متغیر وضعیت ضبط غیرفعال میشه، تابع stopRecording ضبط صدا رو متوقف می‌کنه، پیام توقف روی سریال مانیتور میاد و در آخر یک واحد به شماره فایل‌ها اضافه میشه تا برای دفعه بعد آماده باشه. و به این ترتیب دستگاه برای دور بعدی عملیات آماده می‌مونه.

مرحله ۹

بستن درپوش و استفاده از دستگاه

وقتی خیالت از بابت عملکرد مدار و برنامه‌نویسی راحت شد، درپوش قاب رو بذار و با استفاده از اون چهار تا پیچ، چهار گوشه درپوش رو به بدنه اصلی متصل کن. فقط دقت کن که سوراخ بزرگ روی درپوش دقیقا بالای میکروفون قرار بگیره تا صداها رو به خوبی دریافت کنه.

کار ساخت میکروفون جاسوسی به پایان رسید! برای استفاده از این دستگاه جذاب، فقط کافیه کلید پایینی رو به سمت راست بکشی تا روشن بشه. برای شروع ضبط هم کلید بالایی رو به سمت راست ببر و وقتی خواستی متوقفش کنی، همون کلید رو به چپ برگردون. اگر تو مراحل ساخت یا کدهای برنامه به مشکلی برخوردی، حتما تو بخش نظرات برام بنویس تا راهنماییت کنم.

فایل‌های پیوست

STL spy_bug_case.stl
STL spy_bug_lid.stl
INO Spy_bug.ino

تو میتونی اولین سازنده باشی!

اگه پروژه رو ساختی به اشتراک بزار و اعتبار هدیه بگیر

این آموزش با استانداردهای اختصاصی آیسی‌مدار بازنویسی و بهینه‌سازی شده و تمامی حقوق انتشار آن متعلق به این مجموعه است و در صورت کپی یا بازنشر پیگرد قانونی خواهد داشت.

آموزش‌های مشابه

گفتگو‌های کاربران

هنوز نظری ثبت نشده؛ تو شروع کن!