added the registers and a couple of functions so that FSK/OOK can be used on the Feather 32u4 w/ 433MHz LoRa radio
To make the experience fit your profile, pick a username and tell us what interests you.
We found and based on your interests.
RH_RF95.hadded registers for FSK/OOKx-chdr - 61.45 kB - 12/23/2017 at 23:06 |
|
|
RH_RF95.cppchanged init around a little bit. The changes will break the examples that come with the RadioHead library. Instead of calling init() call init_LoRa(). Then the examples should work again.x-c++src - 17.03 kB - 12/23/2017 at 23:06 |
|
Since I now have a cheap 433MHz transmitter, which I took out of the remote, I hooked it up to my tm4c123gxl in order to test my code.
//*****************************************************************************
//
// blinky.c - Simple example to blink the on-board LED.
//
// Copyright (c) 2012-2016 Texas Instruments Incorporated. All rights reserved.
// Software License Agreement
//
// Texas Instruments (TI) is supplying this software for use solely and
// exclusively on TI's microcontroller products. The software is owned by
// TI and/or its suppliers, and is protected under applicable copyright
// laws. You may not combine this software with "viral" open-source
// software in order to form a larger program.
//
// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
// DAMAGES, FOR ANY REASON WHATSOEVER.
//
// This is part of revision 2.1.3.156 of the EK-TM4C123GXL Firmware Package.
//
//*****************************************************************************
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#include "driverlib/rom.h"
#define ON 0x00
#define OFF 0x20
#define BRIGHT 0x88
#define DIM 0x98
#define X10_RF_SB_LONG 8960 // Start burts (leader) = 9ms
#define X10_RF_SB_SHORT 4500 // Start silecence (leader) = 4,5 ms
#define X10_RF_BIT_LONG 1120 // Bit 1 pulse length
#define X10_RF_BIT_SHORT 560 // Bit 1 pulse length
#define X10_RF_GAP 40000 // Length between commands
#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
void x10Switch(char house_code, uint8_t unit_code, uint8_t command);
void SendCommand(uint8_t *data, uint8_t size);
void SendX10RfByte(uint8_t data);
void SendX10RfBit(unsigned int databit);
void SEND_HIGH();
void SEND_LOW();
uint8_t _rf_repeats = 5;
void delayUS(uint32_t us) {
ROM_SysCtlDelay( (ROM_SysCtlClockGet()/(3*1000*1000))*us ) ; // more accurate
}
int
main(void)
{
volatile uint32_t ui32Loop;
//80Mhz
//ROM_SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
//
// Enable the GPIO port that is used for the on-board LED.
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
// port used for the transmitter
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
//
// Check if the peripheral access is enabled.
//
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF))
{
}
//
// Enable the GPIO pin for the LED (PF3). Set the direction as output, and
// enable the GPIO pin for digital function.
//
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_3);
//enable
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0);
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0, GPIO_PIN_0);
//signal
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_5);
//
// Loop forever.
//
while(1)
{
/*//
// Turn on the LED.
//
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, GPIO_PIN_3);
//
// Delay for a bit.
//
for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++)
{
}
//
// Turn off the LED.
//
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0x0);
//
// Delay for a bit.
//
for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++)
{
}*/
x10Switch('A', 2, ON); // Switch A1 On
delayUS(3000000);
x10Switch('A', 2, ON); // Switch A1 On
delayUS(3000000);
}
}
void x10Switch(char house_code, uint8_t unit_code, uint8_t command){
uint8_t x10buff[4]; // Set message buffer 4 bytes
switch(house_code) {
case 'A': x10buff[0] = 0b0110; break;
case 'B': x10buff[0] = 0b0111; break;
case 'C': x10buff[...
Read more »
x10 library from here:
https://github.com/pyrou/X10RF-Arduino
there were a couple of bugs, but the biggest problem is that I don't have the radio communicating yet.
#include <SPI.h>
#include <RH_RF95.h>
#include <x10rf.h>
/* for feather32u4 */
#define RFM95_CS 8
#define RFM95_RST 4
#define RFM95_INT 7
#define tx 2 // Pin number for the 433mhz OOK transmitter
#define reps 5 // Number of times that a RF command must be repeated.
#define clkpin 3
#define ledpin 13 //BLUE_LED // Pin for the led that blinks when a command is send. (0 = no blink)
// Change to 434.0 or other frequency, must match RX's freq!
#define RF95_FREQ 433.96
#define ON 0x00
#define OFF 0x20
#define BRIGHT 0x88
#define DIM 0x98
// Singleton instance of the radio driver
RH_RF95 rf95(RFM95_CS, RFM95_INT);
x10rf myx10 = x10rf(tx,clkpin,ledpin,reps);
void setup()
{
myx10.begin();
pinMode(RFM95_RST, OUTPUT);
digitalWrite(RFM95_RST, HIGH);
while (!Serial);
Serial.begin(9600);
delay(100);
Serial.println("Feather LoRa Radio Test FSK/OOK Mode!");
// manual reset
digitalWrite(RFM95_RST, LOW);
delay(10);
digitalWrite(RFM95_RST, HIGH);
delay(10);
while (!rf95.init()) {
Serial.println("LoRa radio init failed");
while (1);
}
Serial.println("LoRa radio init OK!");
if (!rf95.setFrequency(RF95_FREQ)) {
Serial.println("setFrequency failed");
while (1);
}
Serial.print("Set Freq to: "); Serial.println(RF95_FREQ);
rf95.setTxPower(23, false);
rf95.spiWriteRegister(RH_RF95_REG_01_OP_MODE, 0x00);
rf95.spiWriteRegister(RH_RF95_REG_01_OP_MODE, 0x0B);
//rf95.spiWriteRegister(RH_RF95_REG_40_DIO_MAPPING1, RH_RF95_DIO_0_2);
rf95.spiWriteRegister(RH_RF95_REG_30_PACKET_CONFIG_1, 0x80);
rf95.spiWriteRegister(RH_RF95_REG_31_PACKET_CONFIG_2, RH_RF95_DATA_MODE_CONT);
Serial.println(rf95.spiReadRegister(RH_RF95_REG_01_OP_MODE), HEX);
Serial.println(rf95.spiReadRegister(RH_RF95_REG_30_PACKET_CONFIG_1), HEX);
Serial.println(rf95.spiReadRegister(RH_RF95_REG_31_PACKET_CONFIG_2), HEX);
Serial.println(rf95.spiReadRegister(RH_RF95_REG_40_DIO_MAPPING1), HEX);
}
void loop()
{
myx10.x10Switch('A', 1, ON); // Switch D15 off
Serial.println("A1: On");
//Serial.println(rf95.spiReadRegister(RH_RF95_REG_3E_IRQ_FLAGS_1), BIN);
/*uint8_t tempVal = rf95.spiReadRegister(RH_RF95_REG_3C_TEMP);
int temp = tempVal & 0x7F;
if ((tempVal & 0x80) == 0x80){
temp *= -1;
}
Serial.println(temp);*/
delay(3000);
myx10.x10Switch('A', 1, OFF); // Switch D15 off
Serial.println("A1: Off");
delay(3000);
}
Data out to radio, and clock signal from radio being in continuous mode:
The signal out looks correct, compared to this, which is taken directly from an x10 remote:
I removed the RF transmitter from the remote, and hooked up the logic analyzer to the pins where the transmitter was in order to check what I was doing against something known and good.
Create an account to leave a comment. Already have an account? Log In.
Become a member to follow this project and never miss any updates