一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 4596|回复: 23
收起左侧

[其他DIY] 论坛买的"NRF2401A+ATMEGA48V 遥控器"改造成功

[复制链接]
发表于 2015-8-13 11:09 | 显示全部楼层 |阅读模式
本帖最后由 guicai 于 2015-8-13 11:41 编辑

221352k8p8i8pt8qzp25q9.jpg
之前在本论坛买的这种遥控器,这几天重新编写了程序,使每个按键 按下时都会发送键码,并通过NRF24L01模块接收键码,静态电流4uA左右,连续按键大于15秒则保护,防止误压.
只要NRF24系列接收模块配置如下即可接收:
1:启用CRC16校验
2:设置为接收模式
3:禁止自动应答
4:设置地址宽度3字节(地址为0x201508)
5:使用2频道
6:选择1Mbit传输速率
7:4字节数据宽度
8:启动接收.
收到的4字节数据DAT1,DAT2,DAT3,DAT4含义为:
DAT1=电池电压AD值(平时都是0xff,小于0xe9则欠压保护,对应电池电压约2v)
DAT2=键码
DAT3=键码
DAT4=键码
一共22个按键,每个按键对应1bit,按下为1,其中DAT4的bit1,bit0为保留位,始终是0

,烧写接口定义如下:
MEGA48.jpg

我使用的是下面的烧写器,tb十几元一个:
sxq.jpg


附件为hex烧写文件,熔丝配置字为0xFFDF62
AVR48YKQ_1.rar (1.11 KB, 下载次数: 19, 售价: 10 人民币)




评分

参与人数 2一乐金币 +116 收起 理由
littlebadbay + 16 很给力!
litchiate + 100 很给力!

查看全部评分

发表于 2015-8-13 16:21 | 显示全部楼层
有点没有看明白
发表于 2015-8-13 16:39 | 显示全部楼层
表示不懂,但鬼才就是鬼才。
 楼主| 发表于 2015-8-13 21:58 | 显示全部楼层
本帖最后由 guicai 于 2015-8-13 22:07 编辑

呵呵,应该算是一种逆向工程吧, 这种非商业目的 或着是无商业价值的 是最最郁闷的鸡肋了, 1 电路的逆向破解非常费时,和重新设计电路几乎差不多精力, 要摸透别人的原理图,推测他的设计思路 ,再加以利用,因为不能改电路板了.2 遥控器是二手处理品,数量很少,10个 100个最多了,辛辛苦苦破解好了之后,发现后续没供货了.  除非是疯狂的电子爱好者,一般人不会这么但疼的. 如果其他坛友也购买了这种遥控器, 就方便多了,烧入1楼的程序,就马上可以利用起来了.  当初我主要看中的是这个遥控器是无线的,不需要直对着电视机, 这样冬天就可以 手放在被窝里按遥控了, 特别不喜欢红外的,要冬天手放外面按遥控 "冻死"了 . 而且经过改造之后,就可以把自己房间的 彩电/机顶盒/窗帘/通风机/壁扇,这5种电器的常用按键 全部集成在这个无线遥控上, 多么爽啊
发表于 2015-8-13 22:32 | 显示全部楼层
赞!资料好,毛线用。
发表于 2015-8-13 23:09 | 显示全部楼层
图片和说明太少,也不知道卖帖在哪,表示还看不明白
发表于 2015-8-14 21:35 | 显示全部楼层
图片信息量太少,好歹看下芯片呀。
发表于 2015-9-2 22:59 | 显示全部楼层
谢 lz,已经用上了。

买过的自然知道,没买过的知道了也没啥用。

https://www.yleee.com.cn/forum.php?mod=viewthread&tid=40296
发表于 2015-9-2 23:02 | 显示全部楼层
本帖最后由 litchiate 于 2015-9-2 23:05 编辑



以下为 arduino 使用 lz程序的一个例子,花了一个晚上改的, 之前没用过nrf24L01.
作用是控制小夜灯的亮度。




/*********************************************************************
**  Device:  nRF24L01+                                              **
**  File:   EF_nRF24L01_TX.c                                        **
**                                                                  **
**  Copyright (C) 2011 ElecFraks.                                   **
**  This example code is in the public domain.                      **
**                                                                  **
**  Description:                                                    **
**  This file is a sample code for your reference.                  **
**  It's the v1.1 nRF24L01+ by arduino                              **
**  Created by ElecFreaks. Robi.W,24 July 2011                      **
**                                                                  **
**   SPI-compatible                                                 **
**   CE        to digital pin 8                                     **
**   CSN       to digital pin 9  (SS pin)                           **
**   NRF_SCK   to digital pin 10 (NRF_SCK pin)                      **
**   NRF_MOSI  to digital pin 11 (NRF_MOSI pin)                     **
**   NRF_MISO  to digital pin 12 (NRF_MISO pin)                     **
**   IRQ       to digital pin 13 (NRF_MISO pin)                     **

8 IRQ  7 MISO
6 MOSI 5 SCK
4 CSN  3 CE
2 VCC  1 GND
*********************************************************************/

#include "API.h"

#define CE             8    //Chip Enable Activates RX or TX mode  
#define CSN            9     //SPI Chip Select     
#define NRF_SCK        10
#define NRF_MOSI       11
#define NRF_MISO       12
#define IRQ            13    //Maskable interrupt pin   
//---------------------------------------------------------------------------
#define TX_ADR_WIDTH    3   // 3 unsigned chars TX(RX) address width
#define TX_PLOAD_WIDTH  4   // 4 unsigned chars TX payload

const char PWM_PIN=6;
int PWM_Duty;


unsigned char TX_ADDRESS[TX_ADR_WIDTH  =
{
  0x08,0x15,0x20    // Low Byte First
}; // Define a static TX address

unsigned char rx_buf[TX_PLOAD_WIDTH];
unsigned char tx_buf[TX_PLOAD_WIDTH];
//***************************************************
void setup()
{
  pinMode(CE,  OUTPUT);
  pinMode(NRF_SCK, OUTPUT);
  pinMode(CSN, OUTPUT);
  pinMode(NRF_MOSI,  OUTPUT);
  pinMode(NRF_MISO, INPUT);
  pinMode(IRQ, INPUT);
  pinMode(PWM_PIN, OUTPUT);
  //  attachInterrupt(1, _ISR, LOW); // interrupt enable
  Serial.begin(9600);
  init_io();                        // Initialize IO port
  unsigned char status=SPI_Read(STATUS);
  Serial.print("status = ");
  Serial.println(status,HEX);      // There is read the mode’s status register, the default value should be ‘E’  
  Serial.println("*****************RX_Mode start******************************");
  RX_Mode();                        // set RX mode
  
            analogWrite(6,127);
  
}
void loop()
{
    unsigned char status = SPI_Read(STATUS);                         // read register STATUS's value

   
    if(status&RX_DR)                                                 // if receive data ready (TX_DS) interrupt
    {
      SPI_Read_Buf(RD_RX_PLOAD, rx_buf, TX_PLOAD_WIDTH);             // read playload to rx_buf
      SPI_RW_Reg(FLUSH_RX,0);                                        // clear RX_FIFO
      for(int i=0; i<4; i++)
      {
          Serial.print(" ");
          Serial.print(rx_buf[i],DEC);                              // print rx_buf
      }
      Serial.println(" ");
      switch(rx_buf[1])
      {
        case 1:
          PWM_Duty = 0;
          break;
        case 2:
          PWM_Duty = 10;
          break;
        case 4:
          PWM_Duty = 90;
          break;
        case 8:
          PWM_Duty = 120;
          break;
        case 16:
          PWM_Duty = 150;
          break;
        case 32:
          PWM_Duty = 180;
          break;
        case 64:
          PWM_Duty = 210;
          break;
        case 128:
          PWM_Duty = 255;
          break;  
        default :
          break;   
      }   
      Serial.println(PWM_Duty,DEC);
    }
      SPI_RW_Reg(WRITE_REG+STATUS,status);                             // clear RX_DR or TX_DS or MAX_RT interrupt flag
      delay(200);
    analogWrite(6,PWM_Duty);
    //analogWrite(6,12);
}

//**************************************************
// Function: init_io();
// Description:
// flash led one time,chip enable(ready to TX or RX Mode),
// Spi disable,Spi clock line init high
//**************************************************
void init_io(void)
{
  digitalWrite(IRQ, 0);
  digitalWrite(CE, 0);                        // chip enable
  digitalWrite(CSN, 1);                 // Spi disable        
}

/**************************************************
* Function: SPI_RW();
*
* Description:
* Writes one unsigned char to nRF24L01, and return the unsigned char read
* from nRF24L01 during write, according to SPI protocol
**************************************************/
unsigned char SPI_RW(unsigned char Byte)
{
  unsigned char i;
  for(i=0;i<8;i++)                      // output 8-bit
  {
    if(Byte&0x80)
    {
      digitalWrite(NRF_MOSI, 1);    // output 'unsigned char', MSB to NRF_MOSI
    }
    else
    {
      digitalWrite(NRF_MOSI, 0);
    }
    digitalWrite(NRF_SCK, 1);                      // Set NRF_SCK high..
    Byte <<= 1;                         // shift next bit into MSB..
    if(digitalRead(NRF_MISO) == 1)
    {
      Byte |= 1;                               // capture current NRF_MISO bit
    }
    digitalWrite(NRF_SCK, 0);                 // ..then set NRF_SCK low again
  }
  return(Byte);                           // return read unsigned char
}
/**************************************************/

/**************************************************
* Function: SPI_RW_Reg();
*
* Description:
* Writes value 'value' to register 'reg'
/**************************************************/
unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value)
{
  unsigned char status;

  digitalWrite(CSN, 0);                   // CSN low, init SPI transaction
  status = SPI_RW(reg);                   // select register
  SPI_RW(value);                          // ..and write value to it..
  digitalWrite(CSN, 1);                   // CSN high again

  return(status);                   // return nRF24L01 status unsigned char
}
/**************************************************/

/**************************************************
* Function: SPI_Read();
*
* Description:
* Read one unsigned char from nRF24L01 register, 'reg'
/**************************************************/
unsigned char SPI_Read(unsigned char reg)
{
  unsigned char reg_val;

  digitalWrite(CSN, 0);           // CSN low, initialize SPI communication...
  SPI_RW(reg);                   // Select register to read from..
  reg_val = SPI_RW(0);           // ..then read register value
  digitalWrite(CSN, 1);          // CSN high, terminate SPI communication

  return(reg_val);               // return register value
}
/**************************************************/

/**************************************************
* Function: SPI_Read_Buf();
*
* Description:
* Reads 'unsigned chars' #of unsigned chars from register 'reg'
* Typically used to read RX payload, Rx/Tx address
/**************************************************/
unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
{
  unsigned char status,i;

  digitalWrite(CSN, 0);                  // Set CSN low, init SPI tranaction
  status = SPI_RW(reg);                   // Select register to write to and read status unsigned char

  for(i=0;i<bytes;i++)
  {
    pBuf[i = SPI_RW(0);    // Perform SPI_RW to read unsigned char from nRF24L01
  }

  digitalWrite(CSN, 1);                   // Set CSN high again

  return(status);                  // return nRF24L01 status unsigned char
}
/**************************************************/

/**************************************************
* Function: SPI_Write_Buf();
*
* Description:
* Writes contents of buffer '*pBuf' to nRF24L01
* Typically used to write TX payload, Rx/Tx address
/**************************************************/
unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
{
  unsigned char status,i;

  digitalWrite(CSN, 0);                   // Set CSN low, init SPI tranaction
  status = SPI_RW(reg);             // Select register to write to and read status unsigned char
  for(i=0;i<bytes; i++)             // then write all unsigned char in buffer(*pBuf)
  {
    SPI_RW(*pBuf++);
  }
  digitalWrite(CSN, 1);                  // Set CSN high again
  return(status);                  // return nRF24L01 status unsigned char
}
/**************************************************/

/**************************************************
* Function: RX_Mode();
*
* Description:
* This function initializes one nRF24L01 device to
* RX Mode, set RX address, writes RX payload width,
* select RF channel, datarate & LNA HCURR.
* After init, CE is toggled high, which means that
* this device is now ready to receive a datapacket.
/**************************************************/
void RX_Mode(void)
{
  digitalWrite(CE, 0);
  SPI_RW_Reg(WRITE_REG + SETUP_AW, 0x01);     // 3 bytes address width
  SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // Use the same address on the RX device as the TX device
  SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);        // Disable Auto.Ack:Pipe0
  SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);    // Enable Pipe0
  SPI_RW_Reg(WRITE_REG + RF_CH, 2);           // Select RF channel 2
  SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // Select same RX payload width as TX Payload width
  SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     // TX_PWR:0dBm, Datarate:1Mbps
  SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);       // Set PWR_UP bit, enable CRC(2 unsigned chars) & Prim:RX. RX_DR enabled..
  digitalWrite(CE, 1);                             // Set CE pin high to enable RX device
}
/**************************************************/





发表于 2015-9-2 23:09 | 显示全部楼层
再传个按键编码 NRF键码.png

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-3 18:34 , Processed in 0.070723 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表