با سلام و احترام
موضوع فعالیت اصلی این سایت تابلو روان و تلویزیون شهری می باشد.
در این مقاله آموزش ساخت برد دیکدر ریموت های لرنینگ رادیویی خدمت دوستان ارائه می شود. این مدار بر اساس میکروکنترلر ATmega8 از خانواده میکروکنترلرهای 8 بیتی AVR ساخته شده است. سورس برنامه به زبان بیسیک و در محیط بسکام تهیه شده.
خواهشمندم سوالات را در انتهای همین صفحه قسمت نظرات ارسال فرمایید با تشکر
قبل از استفاده از ریموت های لرنینگ، از ریموت های کد فیکس استفاده می شد. بدین صورت که آی سی انکدر استفاده شده در ریموت، پایه های آدرس داشت که با اتصال این پایه ها به 0 یا 1 یا آزاد کد می گرفت و در قسمت گیرنده نیز آی سی دیکدر می بایست عینا مانند انکدر توسط پایه های آدرسی کد دهی می شد تا گیرنده با فرسنده بتواند کار کند. مانند PT2262 و PT2272 این ریموت ها به ریموت های کد فیکس معروف شدند.
از معایب ریموت های کد فیکس می توان به موارد ذیل اشاره نمود:
- امنیت پایین
- در صورتی که ریموت گم شود با دیدن پایه های آدرس انکدر می توان ریموت های مشابه ساخت.
- با توجه به تعداد کدهای آدرس محدود امکان تداخل ریموت با گیرنده های مجاور وجود دارد.
ریموت های کد لرنینگ:
در ریموت های لرنینگ از انکدر OTP "one time programmable" Encoder استفاده می شود. این انکدر ها دارای پایه های آدرس نمی باشند و دارای آدرس 20 بیتی منحصر به فردی می باشند که قابل تغییر نبوده و ثابت می باشند. با توجه به آدرس 20 بیتی می توانیم بیش از 1 میلیون کد آدرس داشته باشیم. آی سی خاصی جهت دیکد کردن اطلاعات OTP وجود ندارد و برای این کار ما از میکروکنترلر ها استفاده می کنیم.
براي اينكه هر ريموت را به گيرنده معرفي كنيم كه اصطلاحا مي گويند لرن كنيم بايد در مدار گيرنده از كنترل كننده اي استفاده كنيم كه بتواند اطلاعات دريافتي را ديكد كند كه بهترين گزينه استفاده از يك ميكروكنترلر مي باشد وظيفه ميكروكنترلر اين مي باشد كه اطلاعاتش را از ماژول گيرنده راديويي دريافت كرده و از بين نويز محيط و امواج مختلف و زيادي كه در محيط وجود دارند اطلاعات درست فرسنده خود را بگيرد و آنها را ديكد كند تا بتواند تشخيص دهد اولا اطلاعات ارسالي مجاز مي باشند يعني فرسنده به گيرنده معرفي شده باشد دوما چه كليد يا كليد هايي فشرده شده است و در انتها فرمان مربوطه را صادر بكند .
همانطور که در شماتیک بالا مشاهده می کنید مدار بسیار ساده طراحی شده و با کمی دقت می توانید به سادگی راه اندازیش کنید. فقط دقت کنید با توجه به حساسیت مدار به امواج رادیویی در محدوده 315 یا 433 Mhz و موارد دیگری که توضیح داده می شود از PCB استفاده کنید یعنی احتمال کار نکردن دستگاه بر روی برد بورد وجود دارد.
بسته به نوع ریموتی که استفاده می کنید فرکانس ریموت ها اکثرا یا 433 یا 315 می باشد این موضوع را می توانید از فروشنده نیز سوال بکنید تنها چیزی که مهم می باشد انکدر درون ریموت است که باید از خانواده 527 باشد مانند EV1527 یا HS527 و غیره که در حقیقت شیوه انکد کردن این چیپ ها به این صورت می باشد که ابتدا یک کد 20 بیتی ثابت برای هر ریموت ارسال می شود و بعد آن 4 بیت دیتا متناظر با کلید هایی که روی ریموت فشرده می شود ارسال می گردد.
برنامه نوشته شده با اندازه گیری مدام عرض پالسهای دریافتی از ماژول گیرنده رادیویی، در صورتی که عرض پالس در محدوده تعریف شده باشد وارد مرحله دیکد کردن آدرس ریموت می شود وقتی آدرس ریموت مجاز تشخیص داده شود گیرنده اطلاعات کد کلید های فشرده شده ریموت را بررسی می کند و طبق آن دستور خروجی را صادر می کند. کلید های روی ریموت را می توان به صورت ترکیبی بفشارید چون کد به صورت باینری ارسال و دریافت می شود شما می توانید تا 15 خروجی مستقل تعریف نمایید.
دقت داشته باشید برنامه بر اساس کریستال 4 مگاهرتز خارجی نوشته شده است با تغییر فرکانس محدوده عرض پالسها تغییر می کند. میکروکنترلر استفاده شده از شرکت ATMEL خانواده AVR مدل ATmega8 می باشد.
برنامه نوشته شدن قابلیت ذخیره تا 100 عدد آدرس ریموت را دارد. برنامه دو مدل نوشته شده است یکی بر اساس ذخیره آدرس از EEPROM داخلی میکرو و دیگیری اطلاعات آدرس ریموت ها را بر روی EEPROM سریال خارجی AT24C08 ذخیره می کند. در صورتی که قسمت تغذیه مدار خوب طراحی نشود و برنامه بر اساس EEPROM داخلی میکرو نوشته شده باشد احتمال آسیب دیدن اطلاعات EEPROM داخلی میکرو در زمان قطع و برق جریان وجود دارد. پیشنهاد می کنم سعی کنید از EEPROM خارجی استفاده نمایید.
تصاویر بالا مربوط مربوط به یه نمونه PCB SMD طراحی شده است.
دو نمونه PCB بالا یکی بدون رله و دیگری نیز با رله طراحی شده است.
سورس برنامه به زبان بیسیک در محیط بسکام
'**************************************
'LEARNING REMOTE DECODER
' Program by Mohammad Malek 1388
' malek64@gmail.com maker.blogfa.com
'**************************************
$regfile = "M8def.dat"
$crystal = 4000000
'-------------------------------------------------------------------------------
Config Pinb.0 = Input 'RF INPUT
Config Pinc.5 = Output 'Buzzer B.1
Config Pind.2 = Output 'relay 1
Config Pind.3 = Output 'relay 2
Config Pind.4 = Output 'relay3
Config Pind.5 = Output 'relay4
Config Pinc.4 = Output 'led1 learning led
Config Pinc.0 = Input 'key1
Config Scl = Portb.2 'at24cxx pin6
Config Sda = Portb.1 'at24cxx pin5
'--------------------------------- Alias --------------------------------------
_in Alias Pinb.0 'RF input
Buzz Alias Portc.5 'B.1
Rel1 Alias Portd.2 'relay1
Rel2 Alias Portd.3 'relay2
Rel3 Alias Portd.4 'relay3
Rel4 Alias Portd.5 'relay4
Led1 Alias Portc.4 'learning led
Key1 Alias Pinc.0 'learn key
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Const Eewrite = 160 'eeprom write address
Const Eeread = 161 'eeprom read address
'--------------------------------- Timer ---------------------------------------
Config Timer1 = Timer , Prescale = 8 : Stop Timer1 : Timer1 = 0
'Config Watchdog = 2048
'--------------------------------- Variable ------------------------------------
Dim S(24)as Word
Dim I As Byte
I = 0
Dim Saddress As String * 20
Dim Scode As String * 4
Dim Address As Long
Dim Code As Byte
''''''''''''''''''''''''''''''''
Dim Ra As Long 'fp address
Dim Rnumber As Byte 'remote know
Dim Okread As Bit
Dim Error As Bit
Dim Keycheck As Bit
Dim T As Word 'check for pushing lean key time
Error = 0
Okread = 0
T = 0
Keycheck = 0
Dim Eaddress As Word 'eeprom address variable
Dim E_read As Byte
Dim E_write As Byte
Dim M As String * 8
Dim M1 As String * 2
Dim M2 As String * 2
Dim M3 As String * 2
'-------------------------- read rnumber index from eeprom
Gosub Rnumber_er
If Rnumber > 100 Then
Rnumber = 0
Gosub Rnumber_ew
End If
'------------------- startup
Waitms 500
Set Led1
Gosub Beep
Gosub Beep
Reset Led1
Waitms 500
Enable Interrupts
Main:
'Start Watchdog
'************************************************************************ main
Do
'Reset Watchdog
Gosub _read
If Key1 = 0 Then
'Reset Watchdog
'Stop Watchdog
Gosub Beep
Waitms 100
Gosub Keys
'Start Watchdog
End If
Loop
'*******************************************************************************
'--------------------------------------------------------------------------read
_read:
Okread = 0
If _in = 1 Then
Do
'Reset Watchdog
If _in = 0 Then Exit Do
Loop
Timer1 = 0
Start Timer1
While _in = 0
'Reset Watchdog
Wend
Stop Timer1
If Timer1 >= 3500 And Timer1 <= 8800 Then
Do
If _in = 1 Then
Timer1 = 0
Start Timer1
While _in = 1
'Reset Watchdog
Wend
Stop Timer1
Incr I
S(i) = Timer1
End If
'Reset Watchdog
If I = 24 Then Exit Do
Loop
For I = 1 To 24
'Reset Watchdog
If S(i) >= 120 And S(i) <= 350 Then
S(i) = 0
Else
If S(i) >= 400 And S(i) <= 850 Then
S(i) = 1
Else
I = 0
Address = 0
Code = 0
Okread = 0
Return
End If
End If
Next
I = 0
Saddress = ""
Scode = ""
For I = 1 To 20
Saddress = Saddress + Str(s(i))
Next
For I = 21 To 24
Scode = Scode + Str(s(i))
Next
Address = Binval(saddress)
Code = Binval(scode)
Gosub Check
''''''''''''''''''''''''''''''''''''''''''
I = 0
End If
End If
Return
'========================================================================= keys learning
Keys:
Reset Rel1
Reset Rel2
Reset Rel3
Reset Rel4
Set Led1
Keycheck = 1 'hengame learn kardan be releha farman nade
Waitms 150
Do
If Key1 = 0 Then ' agar kelid feshorde bemanad
Gosub Beep
While Key1 = 0
Incr T
Waitms 1
If T >= 5000 Then
T = 0
Gosub Beep
Rnumber = 0
Gosub Rnumber_ew
Set Buzz
Wait 1
Wait 1
Reset Buzz
Reset Led1
Return
Exit While
End If
Wend
If T < 5000 Then
T = 0
Reset Led1
Return
End If
End If
''''''''''''''''''''''''''^^^
Gosub _read
If Okread = 1 Then
Gosub Beep
''''''''''''''''''''''repeat check
If Rnumber = 0 Then ' agar avalin remote as ke learn mishavad
Incr Rnumber
Gosub Rnumber_ew
Ra = Address
Gosub Ra_w
Exit Do
Else
Eaddress = 10 'address avalin khane baraye zakhire address remote
For I = 1 To Rnumber
Gosub Ra_r
If Ra = Address Then 'agar address remote tekrari bod yani ghablan learn shode
Set Buzz
Wait 1
Reset Buzz
Error = 1
Exit For
Else
Error = 0
End If
Eaddress = Eaddress + 1
Next
If Error = 0 Then ' agar tekrari nabod
Incr Rnumber 'be meghdare rnumber ke index tedade remote haye learn shode ast yek vahed ezafe kon
If Rnumber > 100 Then 'agar bishtar az 100 remote learn shavad
Rnumber = 100
Set Buzz
Wait 5
Reset Buzz
Else 'agar kamtar az 100 remote bod
Gosub Rnumber_ew 'meghdare rnumber ra dar eeprom zakhore mikonad
Ra = Address
Gosub Ra_w
End If
End If
End If
Exit Do
End If
Loop
Okread = 0
Reset Led1
Return
'================================================================ CHECK code chek ok
Check:
Okread = 1
If Keycheck = 0 Then 'agar keycheck=1 bashad yani be releha farman nade
Eaddress = 10
For I = 1 To Rnumber
Gosub Ra_r
If Ra = Address Then 'code
Gosub Command
Gosub Beep
Exit For
End If
Eaddress = Eaddress + 1
Next
End If
Keycheck = 0
Return
'-------------------------------- Relay command
Command:
Select Case Code:
Case 1:
Toggle Rel1
Waitms 50
Case 2:
Toggle Rel2
Waitms 50
Case 4:
Toggle Rel3
Waitms 50
Case 8:
Toggle Rel4
Waitms 50
Case Else
End Select
Return
'-------------------
'-------------------------------------------------------------------------- BEEP
Beep:
Set Buzz
Waitms 80
Reset Buzz
Waitms 30
Return
'---------------------- for write a byte to eeprom
Eew:
I2cstart
I2cwbyte Eewrite
I2cwbyte Eaddress 'A
I2cwbyte E_write
I2cstop
Waitms 10
Return
'''''''''''''''''''''' for read a byte to eeprom
Eer:
I2cstart
I2cwbyte Eewrite
I2cwbyte Eaddress 'A
I2cstart
I2cwbyte Eeread
I2crbyte E_read , Nack
I2cstop
Return
'--------------------------------- rnumber_er >eeprom read remote number learn
Rnumber_er:
Eaddress = 1
Gosub Eer
Rnumber = E_read
Return
'----------------------- rnumber_ew
Rnumber_ew:
Eaddress = 1
E_write = Rnumber
Gosub Eew
Return
'----------------------ra_w write address code to eeprom
Ra_w:
M = ""
M = Hex(ra)
M1 = Mid(m , 3 , 2)
M2 = Mid(m , 5 , 2)
M3 = Mid(m , 7 , 2)
Gosub Decode
E_write = Hexval(m1)
Gosub Eew
Incr Eaddress
E_write = Hexval(m2)
Gosub Eew
Incr Eaddress
E_write = Hexval(m3)
Gosub Eew
Return
'----------------------ra_r read address code from eeprom
Ra_r:
Gosub Eer
M1 = Hex(e_read)
Incr Eaddress
Gosub Eer
M2 = Hex(e_read)
Incr Eaddress
Gosub Eer
M3 = Hex(e_read)
M = ""
M = M + M1
M = M + M2
M = M + M3
Ra = Hexval(m)
Return
'------------------------------------------------------decode eeprom address
Decode:
Select Case Rnumber
Case 1:
Eaddress = 10
Case 2:
Eaddress = 13
Case 3:
Eaddress = 16
Case 4:
Eaddress = 19
Case 5:
Eaddress = 22
Case 6:
Eaddress = 25
Case 7:
Eaddress = 28
Case 8:
Eaddress = 31
Case 9:
Eaddress = 34
Case 10:
Eaddress = 37
Case 11:
Eaddress = 40
Case 12:
Eaddress = 43
Case 13:
Eaddress = 46
Case 14:
Eaddress = 49
Case 15:
Eaddress = 52
Case 16:
Eaddress = 55
Case 17:
Eaddress = 58
Case 18:
Eaddress = 61
Case 19:
Eaddress = 64
Case 20:
Eaddress = 67
Case 21:
Eaddress = 70
Case 22:
Eaddress = 73
Case 23:
Eaddress = 76
Case 24:
Eaddress = 79
Case 25:
Eaddress = 82
Case 26:
Eaddress = 85
Case 27:
Eaddress = 88
Case 28:
Eaddress = 91
Case 29:
Eaddress = 94
Case 30:
Eaddress = 97
Case 40:
Eaddress = 100
Case 41:
Eaddress = 103
Case 42:
Eaddress = 106
Case 43:
Eaddress = 109
Case 44:
Eaddress = 112
Case 45:
Eaddress = 115
Case 46:
Eaddress = 118
Case 47:
Eaddress = 121
Case 48:
Eaddress = 124
Case 49:
Eaddress = 127
Case 50:
Eaddress = 130
Case 51:
Eaddress = 133
Case 52:
Eaddress = 136
Case 53:
Eaddress = 139
Case 54:
Eaddress = 142
Case 55:
Eaddress = 145
Case 56:
Eaddress = 148
Case 57:
Eaddress = 151
Case 58:
Eaddress = 154
Case 59:
Eaddress = 157
Case 60:
Eaddress = 160
Case 70:
Eaddress = 163
Case 71:
Eaddress = 166
Case 72:
Eaddress = 169
Case 73:
Eaddress = 172
Case 74:
Eaddress = 175
Case 75:
Eaddress = 178
Case 76:
Eaddress = 181
Case 77:
Eaddress = 184
Case 78:
Eaddress = 187
Case 79:
Eaddress = 190
Case 80:
Eaddress = 193
Case 81:
Eaddress = 196
Case 82:
Eaddress = 199
Case 83:
Eaddress = 202
Case 84:
Eaddress = 205
Case 85:
Eaddress = 208
Case 86:
Eaddress = 211
Case 87:
Eaddress = 214
Case 88:
Eaddress = 217
Case 89:
Eaddress = 220
Case 90:
Eaddress = 223
Case 91:
Eaddress = 226
Case 92:
Eaddress = 229
Case 93:
Eaddress = 232
Case 94:
Eaddress = 235
Case 95:
Eaddress = 238
Case 96:
Eaddress = 241
Case 97:
Eaddress = 244
Case 98:
Eaddress = 247
Case 99:
Eaddress = 250
Case 100:
Eaddress = 253
Case Else
End Select
Return
'-------------------------------------------------------------------------------
کارکرد مدار به این صورت می باشد که برای لرن کردن ریموت دکمه لرن را بفشارید LED لرن روشن شده و روشن می ماند سپس یکی از کلید های ریموت را بفشارید در صورتی که ریموت لرن شود LED لرن خاموش شده و صدای بوق از دستگاه شنیده می شود. برای لرن کردن ریموت های دیگر نیز می بایست همین کار را تکرار کنیم.
برای پاک کردن ریموت های لرن شده می بایست دکمه لرن را به مدت چند ثانیه بفشارید و دستتان را رها نکنید تا صدای بوق ممتد شنیده شود.
برای دانلود نقشه شماتیک، سورس برنامه، فایل PCB Protel DXP اینجا کلیک کنید
سورس برنامه دیکدر ریموت های کد فیکس PT2242 نیز به عنوان هدیه در فایل دانلود قرار دادم.
خیلی خوشحال می شوم نظرات و انتقادات خود را از طریق بخش ارسال نظر ار انتهای همین صفحه، ارسال نمایید.