|
本人新手一个。前两天由于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
|
欢迎继续阅读楼主其他信息
|