5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 4412|回复: 12
打印 上一主题 下一主题

openlrs 开源433的一些猜解

[复制链接]
跳转到指定楼层
楼主
发表于 2015-8-30 23:15 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本人新手一个。前两天由于433发射丢失,不得不重新考虑新买。无意中发现人世间有一开源433,于是在某宝搜到一开源433的PCB板。可以自己买配件组装,一发两收。总成本不过150元。
经过几天的摸索。发现调试开源源程序的一些小方法,当然有些地方可能理解不对,还请大师指点。因为此开源程序针对不同的PCB.要对应选择不同的序号:将在源程序需要更改的地方通过注释说明。

以下软件均来自openLRSng开源项目

//#define COMPILE_TX 0 // compile RX code
//#define COMPILE_TX 1 // compile TX code
以上两项是用来选择你是刷发射,还是刷接收。compile RX code(接收)  compile TX code(发射)



//####### TX BOARD TYPE #######
// Enable one of the lines below (remove leading //)


//#define BOARD_TYPE 0 // 0 = Flytron OpenLRS M1 Tx Board (not verified)
//#define BOARD_TYPE 1 // 1 = Flytron OpenLRS M1 Rx Board as TX (not verified)
//#define BOARD_TYPE 2 // 2 = Flytron OpenLRS M2/M3 Tx Board / OrangeRx UHF TX
//#define BOARD_TYPE 3 // 3 = Flytron OpenLRS Rx v2 Board / OrangeRx UHF RX / HawkEye UHF RX (RX and TX supported)
//#define BOARD_TYPE 4 // 4 = OpenLRSngTX / HawkEye UHF TX
//#define BOARD_TYPE 5 // 5 = OpenLRSngRX-4/6ch (DTF UHF/HawkEye) (RX and TX supported)
//#define BOARD_TYPE 6 // 6 = DTF UHF/HawkEye DeluxeTX (Atmega32u4)
//#define BOARD_TYPE 9 // 9 = BroversityRX

以上这几个是选择主板类型的。BOARE_TYPE 0至BOARE_TYPE 9任选其1.选择其中之一的区别在于CPU引脚功能定义不一样。
现对以上各板子的CPU引脚定义作初步解释。

BOARD_TYPE 0  (对应这个编号时,好像只可以刷发射,不可以刷成接收)

PPM_IN             A5    (遥控PPM信号输入接328P的28脚)
RF_OUT_INDICATOR   A4  
BUZZER_ACT         D9   (这个是蜂鸣器控制接328P的13脚) 
BTN                D10
Red_LED         D12   (红色指示灯正极 接328P的16脚)    
Green_LED       D11  (绿色指示灯的正极 接328P的15脚  )

以下是对应的接RFM22B的引脚
SDO_pin      A0
SDI_pin      A1
SCLK_pin     D2
IRQ_pin      D3
nSel_pin      D4


BOARD_TYPE 1 (这个只能刷成发射)
刷发射时: 
PPM_IN         D5
BUZZER_ACT    D7
BTN           D8
Red_LED         A3
Green_LED       A2
SDO_pin         A0
SDI_pin         A1
SCLK_pin        D2
IRQ_pin         D3
nSel_pin        D4

以上信息,都可以在hardware.h文件里找到。每一个BOARD_TYPE 在hardware.h里都对应得有一段代码。
在对应的代码里都可以看到328p引脚所对应的功能。本人是搞家电维修的,对硬件有一定的认识,但是对软件就不怎么熟了。以上的功能我是通过刷不同的程序然后去测试各个引脚的电压状态来确定的。通过输入PPM信号在调参软件里观察信号来验证PPM引脚功能的正确与否。

通过观察这个程序我可以搭建出来正确的硬件电路,但若是在硬件已经存在的情况下,通过修改软件的方法来适应硬件我就没有办法了。

有没有在软件方面熟悉的朋友可不可以帮忙改一下以下代码(我的433发射丢失,还剩下两接收想利用起来。刚好CPU是328P,433模块是RFM22B)

所需对应的引脚功能 

CH1   D1
CH2   D0
CH3   D7
CH4   D8
CH5   D10
CH6   D11
CH7   D12
CH8   D13


SDO_pin       A2
SDI_pin       A1
SCLK_pin      A0
IRQ_pin       D2
nSel_pin      A3
Red_LED       A4     
Green_LED    A5




在程序里所对应的代码是:(原来的代码)双斜杠后面的注释为我的猜解。

#if (BOARD_TYPE == 3)
#if (__AVR_ATmega328P__ != 1) || (F_CPU != 16000000)
#warning Possibly wrong board selected, select Arduino Pro/Pro Mini 5V/16MHz w/ ATMega328
#endif

#if (COMPILE_TX == 1)
#define TelemetrySerial Serial

#define USE_ICP1 // use ICP1 for PPM input for less jitter

#define PPM_IN 8                                         // 定义PPM 输入脚为D8

#define TX_AIN0 A4 // SDA                           
#define TX_AIN1 A5 // SCL
#define TX_MODE1 11
#define TX_MODE2 12

#define BUZZER_ACT 6
#define BUZZER_PAS 3
#define BTN 7

void buzzerInit()
{
  pinMode(BUZZER_ACT, OUTPUT);
  digitalWrite(BUZZER_ACT, LOW);
  TCCR2A = (1<<WGM21); // mode=CTC
#if (F_CPU == 16000000)
  TCCR2B = (1<<CS22) | (1<<CS20); // prescaler = 128
#elif (F_CPU == 8000000)
  TCCR2B = (1<<CS22); // prescaler = 64
#else
#errror F_CPU Invalid
#endif
  pinMode(BUZZER_PAS, OUTPUT);
  digitalWrite(BUZZER_PAS, LOW);
}

void buzzerOn(uint16_t freq)
{
  if (freq) {
    digitalWrite(BUZZER_ACT,HIGH);
    uint32_t ocr = 125000L / freq;
    if (ocr>255) {
      ocr=255;
    }
    if (!ocr) {
      ocr=1;
    }
    OCR2A = ocr;
    TCCR2A |= (1<<COM2B0); // enable output on buzzer2
  } else {
    digitalWrite(BUZZER_ACT,LOW);
    TCCR2A &= ~(1<<COM2B0); // disable output buzzer2
  }
}

#define buzzerOff(foo) buzzerOn(0)
#else // RX
#define PPM_OUT 9 // OCP1A
#define RSSI_OUT 3 // PD3 OC2B

#define OUTPUTS 13 // outputs available

const pinMask_t OUTPUT_MASKS[OUTPUTS] = {
  {0x00,0x00,0x08},{0x00,0x00,0x20},{0x00,0x00,0x40}, // RSSI, CH1, CH2
  {0x00,0x00,0x80},{0x01,0x00,0x00},{0x02,0x00,0x00}, // CH2, CH3, CH4
  {0x04,0x00,0x00},{0x08,0x00,0x00},{0x10,0x00,0x00}, // CH5, CH6, CH7
  {0x00,0x10,0x00},{0x00,0x20,0x00},{0x00,0x00,0x01}, // SDA, SCL, RXD
  {0x00,0x00,0x02},                                   // TXD
};

const uint8_t OUTPUT_PIN[OUTPUTS] = { 3, 5, 6, 7, 8, 9, 10, 11, 12 , A4, A5, 0, 1};


                                   //以上应该是定义舵机输出相关的定义引脚
#define PPM_OUTPUT  5
#define RSSI_OUTPUT 0
#define LLIND_OUTPUT 8
#define ANALOG0_OUTPUT 9
#define ANALOG1_OUTPUT 10
#define SDA_OUTPUT 9
#define SCL_OUTPUT 10
#define RXD_OUTPUT 11
#define TXD_OUTPUT 12         //以上是定义D5 D0 D8 D9 D10 D1D D12为输出模式

struct rxSpecialPinMap rxSpecialPins[] = {
  {  0, PINMAP_RSSI},
  {  0, PINMAP_LBEEP},
  {  5, PINMAP_PPM},
  {  8, PINMAP_LLIND},
  {  9, PINMAP_SDA},
  {  9, PINMAP_ANALOG}, // AIN0
  { 10, PINMAP_SCL},
  { 10, PINMAP_ANALOG}, // AIN1
  { 11, PINMAP_RXD},
  { 12, PINMAP_TXD},
  { 12, PINMAP_SPKTRM},
  { 12, PINMAP_SBUS},
  { 12, PINMAP_SUMD},
};

void rxInitHWConfig()
{
  uint8_t i;
  rx_config.rx_type = RX_FLYTRON8CH;
  rx_config.pinMapping[0] = PINMAP_RSSI; // the CH0 on 8ch RX
  for (i = 1; i < 9; i++) {
    rx_config.pinMapping[i] = i - 1; // default to PWM out
  }
  rx_config.pinMapping[9] = PINMAP_ANALOG;
  rx_config.pinMapping[10] = PINMAP_ANALOG;
  rx_config.pinMapping[11] = PINMAP_RXD;
  rx_config.pinMapping[12] = PINMAP_TXD;
}
#endif
#define Red_LED    A3    //红色指示灯定义引脚(通过直接改需要的引脚达不到效果)
#define Green_LED  13    //绿色指示灯定义引脚(通过直接改需要的引脚达不到效果)

#if (COMPILE_TX != 1)
#define Red_LED_ON  PORTC |= _BV(3);   // 要更改这里的数据才能指定不同的引脚为LED灯控制
#define Red_LED_OFF  PORTC &= ~_BV(3); // 要更改这里的数据才能指定不同的引脚为LED灯控制
#define Green_LED_ON  PORTB |= _BV(5);  // 要更改这里的数据才能指定不同的引脚为LED灯控制
#define Green_LED_OFF  PORTB &= ~_BV(5);  // 要更改这里的数据才能指定不同的引脚为LED灯控制
                                     / /以上的是刷接收时LED定义

#else
#define Red_LED2   9
#define Green_LED2 10
#define Red_LED_ON  { PORTC |= _BV(3); PORTB |= _BV(1); }
#define Red_LED_OFF { PORTC &= ~_BV(3); PORTB &= ~_BV(1); }
#define Green_LED_ON  PORTB |= (_BV(5) | _BV(2));
#define Green_LED_OFF PORTB &= ~(_BV(5) | _BV(2));
#endif
                                                          //以上是刷发射时LED的定义



//以下是定义与433射频模块的相关语句
//## RFM22B Pinouts for Public Edition (Rx v2)
#define  nIRQ_1 (PIND & 0x04)==0x04 //D2
#define  nIRQ_0 (PIND & 0x04)==0x00 //D2

#define  nSEL_on PORTD |= (1<<4) //D4
#define  nSEL_off PORTD &= 0xEF //D4

#define  SCK_on PORTC |= (1<<2) //A2
#define  SCK_off PORTC &= 0xFB //A2

#define  SDI_on PORTC |= (1<<1) //A1
#define  SDI_off PORTC &= 0xFD //A1

#define  SDO_1 (PINC & 0x01) == 0x01 //A0
#define  SDO_0 (PINC & 0x01) == 0x00 //A0

#define SDO_pin A0    
#define SDI_pin A1
#define SCLK_pin A2
#define IRQ_pin 2
#define nSel_pin 4

void setupSPI()
{
  pinMode(SDO_pin, INPUT);   //SDO
  pinMode(SDI_pin, OUTPUT);   //SDI
  pinMode(SCLK_pin, OUTPUT);   //SCLK
  pinMode(IRQ_pin, INPUT);   //IRQ
  pinMode(nSel_pin, OUTPUT);   //nSEL
}


//以上是定义433射频模块的相关定义
#define IRQ_interrupt 0
void setupRfmInterrupt()
{
  attachInterrupt(IRQ_interrupt, RFM22B_Int, FALLING);
}

#endif




欢迎继续阅读楼主其他信息

13
发表于 2020-4-3 14:15 | 只看该作者
这么便宜啊。。。
12
发表于 2020-1-28 15:49 | 只看该作者
您好楼主,这个源码里面配置引脚搞懂了吗
11
发表于 2019-2-25 17:03 | 只看该作者
你好,我现在也想做433增程,有些问题想向您请教一下方便
10
发表于 2019-2-24 16:08 | 只看该作者
你还,我现在也想做433增程,有些问题想向您请教一下方便加微信吗?  18678803883
9
 楼主| 发表于 2015-9-20 16:19 | 只看该作者
PCB在某宝里,开源433你就会找到,这里好像不可以发联接。

8
发表于 2015-9-18 15:43 | 只看该作者

顶了,做个记号,以后可能有用,顺便问下PCB能给的地址吗,也想买
7
发表于 2015-9-18 10:50 | 只看该作者
顶了,做个记号,以后可能有用,顺便问下PCB能给的地址吗,也想买
6
发表于 2015-9-2 13:21 | 只看该作者
好文一定要顶!
5
发表于 2015-9-1 11:13 | 只看该作者
l6760753 发表于 2015-8-31 11:24
谢谢指教,调参时都是用你的那个中文软件,挺好用的,在这里感谢你的分享。

通过分析程序,原理图都能 ...

原版的多少有些小问题,主要还是23BP的功率和距离满足不了需求,我们自己做了高频部分,过程艰辛漫长

4
 楼主| 发表于 2015-8-31 11:24 | 只看该作者
q7w8e9 发表于 2015-8-31 10:06
关于板子的原理图,可以参照我的帖子

谢谢指教,调参时都是用你的那个中文软件,挺好用的,在这里感谢你的分享。

通过分析程序,原理图都能画出过大概,现在的问题是:在原理图已经存的情况下,如何通过更改代码来适应原理图。

也观望过你的凤凰,当时就准备入手了。后去淘宝一看,有这个方案的PCB板卖,刚好除了433模块,其它的小元件我都有。所以才买了来一套。


3
发表于 2015-8-31 10:06 | 只看该作者
l6760753 发表于 2015-8-30 23:22
之所以写这些,是因为我这里谷歌网址不好上,生怕哪天谷歌彻底的打不开,那不坏了。到时想刷程序都刷不了了 ...

关于板子的原理图,可以参照我的帖子

沙发
 楼主| 发表于 2015-8-30 23:22 | 只看该作者
之所以写这些,是因为我这里谷歌网址不好上,生怕哪天谷歌彻底的打不开,那不坏了。到时想刷程序都刷不了了,所以把源程序下来以存备用。另外对软件编程真的还是未入门。以上理解纯属是猜解的,要是猜解得不对,还请大师们指教。另外我这里有对应完整的源程序,不知道怎么上传附件
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /1 下一条

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