I bought a box of x10 stuff at goodwill for $4.50, and I didn't have any 433MHz radios at home so I went and got one of these at the local MicroCenter. They didn't have any of the really cheap radios, but this should be good for other things later. I was disappointed to find out that the RadioHead library wasn't complete for this board, but that was easy enough to get through.
The radio still doesn't quite do what I want, but I do have it in FSK and continuous TX mode. I am hoping that I am just handling the x10 protocol wrong now. I will have to wait until I get another one of these radios until I can test things out.
changed 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.
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))voidx10Switch(char house_code, uint8_t unit_code, uint8_t command);
voidSendCommand(uint8_t *data, uint8_t size);
voidSendX10RfByte(uint8_t data);
voidSendX10RfBit(unsignedint databit);
voidSEND_HIGH();
voidSEND_LOW();
uint8_t _rf_repeats = 5;
voiddelayUS(uint32_t us){
ROM_SysCtlDelay( (ROM_SysCtlClockGet()/(3*1000*1000))*us ) ; // more accurate
}
intmain(void){
volatileuint32_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);
}
}
voidx10Switch(char house_code, uint8_t unit_code, uint8_t command){
uint8_t x10buff[4]; // Set message buffer 4 bytesswitch(house_code) {
case'A': x10buff[0] = 0b0110; break;
case'B': x10buff[0] = 0b0111; break;
case'C': x10buff[...
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 driverRH_RF95 rf95(RFM95_CS, RFM95_INT);
x10rf myx10 = x10rf(tx,clkpin,ledpin,reps);
voidsetup(){
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);
}
voidloop(){
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.