سلام من کار خاصی نکردم ولی گقتم شاید کسی بخواد.
مقدمه :
ما برای اینکه بخواهیم به کامپیوتر دستگاه یا برد الکترونیکی وصل کنیم و باهاش کارهای باحال انجام بدیم دو راه داریم یکی راه پیچیده مثل استفاده از یو اس بی یا بلوتوث (که بعد از چندسال هنوزم من نتونستم!) و دیگری راه ساده که این راه های ساده دوتا بود یکی پورت پرینتر (که از بین اش بردند) و یکی هم پورت میکروفن.
--
از اونجایی که من آدم چیز بلدی نیستم ساده ترین راه رو می گم!
اول باید alsa-utils رو نصب کنید ولی به احتمال زیاد الان هم باید نصب باشه
بعد یک فیش صدا (ترجیا یکمی سیم داشته باشه)رو به پورت میکروفون وصل کنید و توی alsamixer فسمت mic-bost رو کاملا ببندین البته نبندین هم چیزی نمی شه ولی من خوشم نمی یاد!
این برنامه زیر رو با نام ad کامپایل کنید
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <fstream>
using namespace std;
int main(int argc , char *argv[])
{
int sample=atoi(argv[1]);
if (sample < 10) {cerr<<"sample (parameter #1) must be bigger than 10000 (opt=5(sec)*frequency/rate Ex:5*2000)"<<endl;exit(1);}
ifstream file (argv[2],ios::binary);
unsigned int ui;
int i;
char ch;
unsigned char uch;
int st[256]={0};
int sub,begin,last;
//find noise of line
for (int j=0;j<sample;j++)
{
file.get(ch);
uch=ch;
sub=uch;
st[sub]++;
}
for (int i=0;i<256;i++)
if (st[i]>0){
begin=i; break;}
for (int i=255;i>-1;i--)
if (st[i]>0){last=i; break;}
//end find noise of line
cout <<begin<<"-"<<last<<endl;
while (!file.eof())
{
file.get(ch);
uch=ch;
i=uch;
if (i>=last+10 || i<begin-5) {cout <<"1";}
}
return 0;
}
حالا این کارها رو انجام بدید
mkfifo /tmp/pipe
arecord -r 10000 -t raw >> /tmp/pipe
حالا این برنامه منتظر می مونه که یکی دیگه هم به فایل pipe وصل بشه پس توی یک پنجره دیگه می زنیم
./ad 40000 /tmp/pipe
حالا برنامه ۴ ثانیه صبر می کنه (۴۰۰۰تقسیم بر ۱۰۰۰۰)تا نویز خط رو حساب کنه بعدش محدوده ی نویز خط رو می نویسه و حالا آماده است که سیگنال رو دریافت کنه برای ارسال سیگنال فقط کافیه شست مبارک ! رو به سر سیم/فیشی که داخل پورت میکروفون هست بزنید تا سیگنال فرستاده بشه توی برنامه هم هروقت که چیزی رو حس ! کرد مقدار ۱ رو می نویسه که البته می تونید توی برنامه تغییری بدهید که به جای چیزی نوشتن یک دستور را اجرا کنه!
---
اطلاعات اضافی!
۱۰۰۰۰ در arecord -r 10000 به این معنی هست که نرخ نمونه برداری ۱۰کیلو هرتز هست یعنی هر ثانیه ۱۰ هزار تا نمونه می گیره که حداقلش ۲۰۰۰ نمونه در ثانیه هست. هر نمونه هم که می گیره ۲۵۶ حالت داره (اصطلاحا می گن ۸بیتی!) که حالت پیشفرض اش هست و ۱۶ بیتی یا ۲۴ بیتی هم توی بعضی جاها استفاده می شه.
پارامتر اول توی کدی که گذاشتم تعداد کل نمونه هایی است که برای تشخیص محدوده نویز خط به کار می ره که فرمول محاسبه اش اینه: مقدار زمان برای تست(به ثانیه) * سرعت نرخ نمونه برداری
برای اینکه خوشگل تر سیگنال بفرستیم می شه با یک آی سی ۵۵۵ و یک خازن ۱۰ نانو و مقاومت (یا ولوم) فرکانس ایجاد کرد(که توی سایت های الکترونیک می تونید نقشه اش رو پیدا کنید)
---
این کار رو می شه خیلی بهتر هم انجام داد یا شاید هم کسی این کار رو کرده(من جست و جویی نکردم)