RF Remote Control

กลุ่มวงจรที่ใช้ Microcontroller Arduino , PIC , AVR ,ETC.

Moderator: gang

ภาพประจำตัวสมาชิก
gang
Master of the Order[ ผู้ดูแลระบบ]
Master of the Order[ ผู้ดูแลระบบ]
โพสต์: 1023
ลงทะเบียนเมื่อ: 11/08/2004 11:00 pm
ที่อยู่: บางน้ำผึ้ง พระประแดง สมุทรปราการ
ติดต่อ:

RF Remote Control

โพสต์โดย gang » 14/02/2009 10:00 am

ได้ซื้อ RF Module RWS-374-6 ,TWS-BS-3 (433.92MHZ) มาไว้ตั้งนานแล้ว เพื่งได้มาลองทำเสียที เลยเอามาทำ remote control 6 channel


เครื่องส่ง
จะส่งข้อมูล 1200 bps 8 Byte ต่อเฟรม 1-4 byte จะเป็นSync 5,6 จะเป็น Address 7 เป็น Data 8 เป็น Check sum เมื่อมีการกด sw ตัวใดตัวหนึ่ง จะทำให้ D1-D6 ตัวใดตัวหนึ่งนำกระแส ทำให้ MCU และ TX Module ทำงานส่งข้อมูลออกไป

โค้ด: เลือกทั้งหมด


#include <ctype.h>
#include <stdint.h>
#include <avr/io.h>
#include <compat/deprecated.h>


#define SYNC 0XAA// synchro signal
#define RADDR1 0x44
#define RADDR2 0xAB
#define ledPin 7

int inputPin6 = 13;
int inputPin5 = 12;
int inputPin4 = 11;
int inputPin3 = 10;
int inputPin2 = 9;
int inputPin1 = 8;
byte val = 0;

void setup() {

  pinMode(inputPin1, INPUT);
  pinMode(inputPin2, INPUT);
  pinMode(inputPin3, INPUT);
  pinMode(inputPin4, INPUT);
  pinMode(inputPin5, INPUT);
  pinMode(inputPin6, INPUT);
  pinMode(ledPin, OUTPUT);    // declare led as output
  SFIOR = (0<<PUD);// Pull up input
  Serial.begin(1200);
  digitalWrite(ledPin,LOW);

}

void loop(){
 
  if(digitalRead(inputPin6) == LOW){val=0x65;}
  if(digitalRead(inputPin5) == LOW){val=0x66;}
  if(digitalRead(inputPin4) == LOW){val=0x67;}
  if(digitalRead(inputPin3) == LOW){val=0x68;}
  if(digitalRead(inputPin2) == LOW){val=0x69;}
  if(digitalRead(inputPin1) == LOW){val=0x70;}
  if(val != 0){
    digitalWrite(ledPin,HIGH);
    Serial.print(SYNC,BYTE);
    Serial.print(SYNC,BYTE);
    Serial.print(SYNC,BYTE);
    Serial.print(SYNC,BYTE);
    Serial.print(RADDR1,BYTE);
    Serial.print(RADDR2,BYTE);
     Serial.print(val,BYTE);
    Serial.print((RADDR1+val),BYTE); 
  }else{
    digitalWrite(ledPin,LOW);
  }
}



เครื่องรับ
ด้านเครื่องรับจะรับข้อมูลตลอดเวลาถึงแม้ตัวเครื่องส่งยังไม่ทำงาน น่าจะเป็นเพราะระบบของ RF Module เป็นแบบ ASK ซึงเปรียบได้เหมือนเครื่องรับวิทยุแบบ AM ซึ่งจะเกิด Noise ได้มากกว่าถ้าเปรียบกับ FSK จึงจำเป็นต้องมีการ check กันความผิดพลาดของข้อมูล โดยจะเอา Byte addres และ byte data มาบวกกันแล้วเปรียบเทียบกับ Byte Check sum ถ้าเงื่อนใขถูกต้องแล้ว จึงนำข้อมูลมาใช้ได้

โค้ด: เลือกทั้งหมด


#include <avr/io.h>
#include <EEPROM.h>
#include <compat/deprecated.h> // use sbi cbi



byte  chksum = 0;
byte  sync1 = 0;
byte  addr1 = 0;
byte  addr2 = 0;
byte  val = 0;
//char val1;
int   count1 = 0;
int   i = 0;
int   sw1[6] ;
int togggle = 0;
long errcount=0;

#define ledPin 7
#define SPPin 6 // Speaker
#define SYNC 0XAA// synchro signal
#define RADDR1 0x44
#define RADDR2 0xAB
#define LEDON 0x11//switch led on command
#define MAX_ERROR_COUNT 30 // 1200 bps
//#define MAX_ERROR_COUNT 100



void seterrorcount(){
  if(errcount > MAX_ERROR_COUNT){
  togggle = 0;
  }
  errcount++;
}


void loadeprom(){
 for(i=0;i<6;i++){
  val = EEPROM.read(i);
  if(val==1){
    digitalWrite((i+8), HIGH);
    sw1[i] = 1;
  }else if(val==0){
    digitalWrite((i+8), LOW);
    sw1[i] = 0;
  }
  }
}
void toggleLED(int ledPin2){
  if(sw1[(ledPin2-8)] == 0){
    digitalWrite(ledPin2, HIGH);
    sw1[(ledPin2-8)] = 1;
    EEPROM.write((ledPin2-8), 1);
   }else if(sw1[(ledPin2-8)] == 1){
    digitalWrite(ledPin2, LOW);
    sw1[(ledPin2-8)] = 0;
    EEPROM.write((ledPin2-8), 0);
   }     
}
void beepsound(){
  int i;
  for(i=0;i<255;i++){
    digitalWrite(SPPin,HIGH);
    delayMicroseconds(500);
    digitalWrite(SPPin,LOW);
    delayMicroseconds(500); 
  }
}
void readser(){
     if(i==0){
      addr1 = Serial.read();
      i++;
     }
     else if(i==1){
      addr2 = Serial.read();
      i++;
     }
     else if(i==2){
       val = Serial.read();
       i++;
     }
     else if(i==3){
       chksum = Serial.read();
       i++;
     }
   if(addr1 != RADDR1 && i == 1){
      i=0;
   }
   if(addr2 != RADDR2 && i == 2){
      i=0;
   }
   else if(i==4 && chksum != (addr1+val) ){
     i=0;
   }else if(i==4){
     if(togggle==0){
       toggleLED( 78 - val );
       beepsound();
     }
     addr1=0;
     chksum=0;
     val=0;
     i=0;
     //Serial.print(errcount);
     //Serial.println(":error");
     togggle=1;
     errcount=0;
   }
   seterrorcount();
   Serial.flush();
}


void setup() {
 
  pinMode( ledPin, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
 
  pinMode( SPPin, OUTPUT);

  //Serial.begin(2400); // begin serial connection with RF Link unit
  Serial.begin(1200); // begin serial communication over USB to the computer
 //Serial.begin(4800);
  loadeprom();
  i=0;
  val=0;
  digitalWrite(ledPin,HIGH); // turn on LED
  delay(1000);
  digitalWrite(ledPin,LOW); // turn off LED
}

void loop(){
    if (Serial.available() > 0) {
      digitalWrite(ledPin,HIGH);
      readser();
      digitalWrite(ledPin,LOW);
    }
}
[/b]
แนบไฟล์
rx001.png
RX
rx001.png (6.11 KiB) เปิดดู 2628 ครั้ง
tx001.png
TX
tx001.png (8.91 KiB) เปิดดู 2628 ครั้ง
I Love Arduino

ภาพประจำตัวสมาชิก
gang
Master of the Order[ ผู้ดูแลระบบ]
Master of the Order[ ผู้ดูแลระบบ]
โพสต์: 1023
ลงทะเบียนเมื่อ: 11/08/2004 11:00 pm
ที่อยู่: บางน้ำผึ้ง พระประแดง สมุทรปราการ
ติดต่อ:

โพสต์โดย gang » 14/02/2009 10:32 am

ช่วยกันคิดต่อยอดตัวส่ง Remote กันหน่อยครับ ว่าจะทำอย่างไรให้ตัวส่ง Remote ให้ประหยัดพลังงานได้มากที่สุด เพราะตอนนี้ยังต้องใช้ไฟเลี้ยงอยู่ที่ 3 ก้อน แต่อยากให้ใช้ไฟอยู่ที่ 2 ก้อน สาเหตุเพราะ D1-D6 มันตกคร่อม 0.7 V เลยใช้ถ่าน 2 ก้อนไม่พอ แต่ถ้าไม่มีวงจร Diode มาแล้วจะทำให้ MCU และ RF Module ได้ไฟเลี้ยง กินกระแสตลอดเวลา ถ่านจะหมดเร็ว
:wink:
I Love Arduino

ภาพประจำตัวสมาชิก
MAXPIC
Jedi Master
Jedi Master
โพสต์: 382
ลงทะเบียนเมื่อ: 01/01/1970 7:00 am
ติดต่อ:

โพสต์โดย MAXPIC » 14/02/2009 4:34 pm

ขอบคุณครับท่าน gang
ผลันชีวิตมาเล่น PowerE

nukenoom

โพสต์โดย nukenoom » 06/07/2009 2:08 am

ทำ switching แปลงไฟขึ้น ดีมั้ยครับ


ย้อนกลับไปยัง

ผู้ใช้งานขณะนี้

กำลังดูบอร์ดนี้: 1 และ บุคคลทั่วไป 0 ท่าน