RFM12B Example

Dependencies:   RFM12B TextLCD mbed-rtos mbed

/media/uploads/hajesusrodrigues/img_3299.jpg

mBed RFM12B module Hello World example

The main purpose of this example was to implement the RFM12B module in order to be able to establish communication with the Moteino (arduino clone that uses the RFM12B).

In this example I’m able to test the communication between:

1) mBed -> mBed (2 RFM12B modules sharing the same mBed board)

2) mBed -> Moteino

3) Moteino -> mBed

Who/What is Moteino? (http://lowpowerlab.com/moteino/)

Committer:
hajesusrodrigues
Date:
Fri May 31 16:34:40 2013 +0000
Revision:
7:62126ff61851
Parent:
6:a16fea75abd3
Implementation of Sleep/WakeUp/LowBattery methods.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hajesusrodrigues 0:9457949d5d00 1 #include "mbed.h"
hajesusrodrigues 0:9457949d5d00 2 #include "rtos.h"
hajesusrodrigues 0:9457949d5d00 3 #include "RFM12B/RFM12B.h"
hajesusrodrigues 6:a16fea75abd3 4 #include "TextLCD/TextLCD.h"
hajesusrodrigues 0:9457949d5d00 5
hajesusrodrigues 0:9457949d5d00 6 extern "C" void mbed_reset();
hajesusrodrigues 0:9457949d5d00 7
hajesusrodrigues 6:a16fea75abd3 8 TextLCD lcd(p22, p23, p24, p25, p26, p27, p28,TextLCD::LCD16x2); // rs, rw, e, d4-d7
hajesusrodrigues 0:9457949d5d00 9
hajesusrodrigues 0:9457949d5d00 10 RFM12B rfm12b_sender(p5, p6, p7, p10, p9, LED1); //RFM12B(PinName SDI, PinName SDO, PinName SCK, PinName SEL, PinName IRQ, , PinName IRQ_LED);
hajesusrodrigues 0:9457949d5d00 11 RFM12B rfm12b_receiver(p11, p12, p13, p14, p15, LED4); //RFM12B(PinName SDI, PinName SDO, PinName SCK, PinName SEL, PinName IRQ, , PinName IRQ_LED);
hajesusrodrigues 0:9457949d5d00 12
hajesusrodrigues 0:9457949d5d00 13 DigitalOut rfm12b_sender_led(p21);
hajesusrodrigues 0:9457949d5d00 14 DigitalOut rfm12b_receiver_led(p18);
hajesusrodrigues 0:9457949d5d00 15
hajesusrodrigues 0:9457949d5d00 16 DigitalOut activity_ledOn(LED2);
hajesusrodrigues 0:9457949d5d00 17 DigitalOut activity_ledOff(LED3);
hajesusrodrigues 0:9457949d5d00 18
hajesusrodrigues 0:9457949d5d00 19 Serial pc(USBTX, USBRX);
hajesusrodrigues 0:9457949d5d00 20
hajesusrodrigues 0:9457949d5d00 21 char send_message[255] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
hajesusrodrigues 0:9457949d5d00 22
hajesusrodrigues 0:9457949d5d00 23 uint8_t KEY[] = "ABCDABCDABCDABCD";
hajesusrodrigues 0:9457949d5d00 24
hajesusrodrigues 0:9457949d5d00 25 #define ACK_TIME 15000 //R of ms to wait for an ack (usually between 600ms and 1300ms)
hajesusrodrigues 0:9457949d5d00 26 #define CLIENT_MOTEINO_NODE 1
hajesusrodrigues 0:9457949d5d00 27 #define CLIENT_MBED_NODE 2
hajesusrodrigues 0:9457949d5d00 28
hajesusrodrigues 0:9457949d5d00 29 #define SERVER_MOTEINO_NODE 10
hajesusrodrigues 0:9457949d5d00 30 #define SERVER_MBED_NODE 11
hajesusrodrigues 0:9457949d5d00 31
hajesusrodrigues 0:9457949d5d00 32 #define NETWORD_ID 5 //GROUP / NETWORK ID
hajesusrodrigues 0:9457949d5d00 33
hajesusrodrigues 0:9457949d5d00 34 #define MBED_TO_MBED 0
hajesusrodrigues 0:9457949d5d00 35 #define MBED_TO_ARDUINO 1
hajesusrodrigues 0:9457949d5d00 36 #define ARDUINO_TO_MBED 2
hajesusrodrigues 0:9457949d5d00 37
hajesusrodrigues 0:9457949d5d00 38 #define TEST_TYPE MBED_TO_MBED
hajesusrodrigues 0:9457949d5d00 39
hajesusrodrigues 1:e30050868e55 40 void ReceiverThread(void const *args)
hajesusrodrigues 1:e30050868e55 41 {
hajesusrodrigues 0:9457949d5d00 42 Timer receiverTimer;
hajesusrodrigues 0:9457949d5d00 43 rfm12b_receiver.Initialize(SERVER_MBED_NODE, RF12_433MHZ, NETWORD_ID); //id = 10, band 433, group 5
hajesusrodrigues 0:9457949d5d00 44 rfm12b_receiver.SetEncryptionKey((uint8_t*) KEY);
hajesusrodrigues 0:9457949d5d00 45 rfm12b_receiver.ReceiveStart();
hajesusrodrigues 0:9457949d5d00 46
hajesusrodrigues 0:9457949d5d00 47 while (true) {
hajesusrodrigues 0:9457949d5d00 48
hajesusrodrigues 0:9457949d5d00 49 if (rfm12b_receiver.ReceiveComplete()) {
hajesusrodrigues 0:9457949d5d00 50 // Do something with received data
hajesusrodrigues 0:9457949d5d00 51
hajesusrodrigues 0:9457949d5d00 52 receiverTimer.start();
hajesusrodrigues 0:9457949d5d00 53 printf("RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR\nRECEIVER- beginning receiving message\n");
hajesusrodrigues 6:a16fea75abd3 54 lcd.locate(0,1);
hajesusrodrigues 6:a16fea75abd3 55 lcd.printf("RECEIVER- BRM");
hajesusrodrigues 0:9457949d5d00 56
hajesusrodrigues 0:9457949d5d00 57 if (rfm12b_receiver.CRC_Pass()) {
hajesusrodrigues 0:9457949d5d00 58
hajesusrodrigues 0:9457949d5d00 59 printf("RECEIVER- Data received from [%d] : ", rfm12b_receiver.GetSender());
hajesusrodrigues 0:9457949d5d00 60 for (int i = 0; i < int(rfm12b_receiver.GetDataLen()); i++) {
hajesusrodrigues 0:9457949d5d00 61 printf("%c", (rfm12b_receiver.GetData())[i]);
hajesusrodrigues 0:9457949d5d00 62 }
hajesusrodrigues 0:9457949d5d00 63 printf("\n");
hajesusrodrigues 0:9457949d5d00 64
hajesusrodrigues 0:9457949d5d00 65 if (rfm12b_receiver.ACKRequested()) {
hajesusrodrigues 0:9457949d5d00 66 printf("RECEIVER- ACK sent to [%d] \n", rfm12b_receiver.GetSender());
hajesusrodrigues 0:9457949d5d00 67 rfm12b_receiver.SendACK("ACK sent from mBed server");
hajesusrodrigues 0:9457949d5d00 68 }
hajesusrodrigues 0:9457949d5d00 69
hajesusrodrigues 0:9457949d5d00 70 } else {
hajesusrodrigues 0:9457949d5d00 71 printf("RECEIVER- !!! BAD-CRC !!! \n");
hajesusrodrigues 0:9457949d5d00 72 }
hajesusrodrigues 0:9457949d5d00 73
hajesusrodrigues 0:9457949d5d00 74 printf("RECEIVER- finishing receiving message (time since start receiving message %d ms, %4.2f s)\nRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR\n", receiverTimer.read_ms(), receiverTimer.read());
hajesusrodrigues 6:a16fea75abd3 75 lcd.locate(0,1);
hajesusrodrigues 6:a16fea75abd3 76 lcd.printf("RECEIVER- finishing receiving message");
hajesusrodrigues 0:9457949d5d00 77
hajesusrodrigues 0:9457949d5d00 78 receiverTimer.stop();
hajesusrodrigues 0:9457949d5d00 79 receiverTimer.reset();
hajesusrodrigues 0:9457949d5d00 80
hajesusrodrigues 0:9457949d5d00 81 rfm12b_receiver_led = 1;
hajesusrodrigues 0:9457949d5d00 82 wait(0.2);
hajesusrodrigues 0:9457949d5d00 83 rfm12b_receiver_led = 0;
hajesusrodrigues 0:9457949d5d00 84 }
hajesusrodrigues 0:9457949d5d00 85 }
hajesusrodrigues 0:9457949d5d00 86 }
hajesusrodrigues 0:9457949d5d00 87
hajesusrodrigues 1:e30050868e55 88 void SenderThread(void const *args)
hajesusrodrigues 1:e30050868e55 89 {
hajesusrodrigues 0:9457949d5d00 90 Timer ackTimer;
hajesusrodrigues 0:9457949d5d00 91 Timer senderTimer;
hajesusrodrigues 0:9457949d5d00 92
hajesusrodrigues 0:9457949d5d00 93 bool requestACK = true;
hajesusrodrigues 0:9457949d5d00 94 rfm12b_sender.Initialize(CLIENT_MBED_NODE, RF12_433MHZ, NETWORD_ID); //id = 2, band 866, group 5
hajesusrodrigues 0:9457949d5d00 95 rfm12b_sender.SetEncryptionKey((uint8_t*) KEY);
hajesusrodrigues 0:9457949d5d00 96
hajesusrodrigues 0:9457949d5d00 97 int i = 1;
hajesusrodrigues 0:9457949d5d00 98
hajesusrodrigues 0:9457949d5d00 99 while (true) {
hajesusrodrigues 0:9457949d5d00 100 senderTimer.start();
hajesusrodrigues 0:9457949d5d00 101
hajesusrodrigues 0:9457949d5d00 102 printf("\n\n\n\n");
hajesusrodrigues 0:9457949d5d00 103 printf("SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS\nSENDER- beginning sending the message\n");
hajesusrodrigues 0:9457949d5d00 104
hajesusrodrigues 0:9457949d5d00 105 #if TEST_TYPE == MBED_TO_MBED
hajesusrodrigues 0:9457949d5d00 106 rfm12b_sender.SendStart(SERVER_MBED_NODE, send_message, i, requestACK, false);
hajesusrodrigues 0:9457949d5d00 107 #elif TEST_TYPE == MBED_TO_ARDUINO
hajesusrodrigues 0:9457949d5d00 108 rfm12b_sender.SendStart(SERVER_MOTEINO_NODE, send_message, i, requestACK, false);
hajesusrodrigues 0:9457949d5d00 109 #endif
hajesusrodrigues 0:9457949d5d00 110 if (requestACK) {
hajesusrodrigues 0:9457949d5d00 111 printf("SENDER- Waiting for ACK... after sending message \n");
hajesusrodrigues 0:9457949d5d00 112
hajesusrodrigues 0:9457949d5d00 113 ackTimer.start();
hajesusrodrigues 0:9457949d5d00 114 while (ackTimer.read_ms() <= ACK_TIME) {
hajesusrodrigues 0:9457949d5d00 115
hajesusrodrigues 0:9457949d5d00 116 #if TEST_TYPE == MBED_TO_MBED
hajesusrodrigues 0:9457949d5d00 117
hajesusrodrigues 0:9457949d5d00 118 if (rfm12b_sender.ACKReceived(SERVER_MBED_NODE) == true) {
hajesusrodrigues 0:9457949d5d00 119 printf("SENDER- ACK... received YEAHHHHHHHHH I FEEL GOOD \n");
hajesusrodrigues 0:9457949d5d00 120 break;
hajesusrodrigues 0:9457949d5d00 121 }
hajesusrodrigues 0:9457949d5d00 122
hajesusrodrigues 0:9457949d5d00 123 #elif TEST_TYPE == MBED_TO_ARDUINO
hajesusrodrigues 0:9457949d5d00 124
hajesusrodrigues 0:9457949d5d00 125 if (rfm12b_sender.ACKReceived(SERVER_MOTEINO_NODE) == true) {
hajesusrodrigues 0:9457949d5d00 126 printf("SENDER- ACK... received YEAHHHHHHHHH I FEEL GOOD \n");
hajesusrodrigues 0:9457949d5d00 127 break;
hajesusrodrigues 0:9457949d5d00 128 }
hajesusrodrigues 0:9457949d5d00 129 #endif
hajesusrodrigues 0:9457949d5d00 130
hajesusrodrigues 0:9457949d5d00 131 }
hajesusrodrigues 0:9457949d5d00 132 printf("SENDER- time since Waiting for ACK... %d ms, %4.2f s \n", ackTimer.read_ms(), ackTimer.read());
hajesusrodrigues 0:9457949d5d00 133
hajesusrodrigues 0:9457949d5d00 134 }
hajesusrodrigues 0:9457949d5d00 135
hajesusrodrigues 0:9457949d5d00 136 printf("SENDER- finishing sending the message (time since start sending message %d ms, %4.2f s)\nSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS\n \n\n", senderTimer.read_ms(), senderTimer.read());
hajesusrodrigues 0:9457949d5d00 137
hajesusrodrigues 0:9457949d5d00 138 senderTimer.stop();
hajesusrodrigues 0:9457949d5d00 139 senderTimer.reset();
hajesusrodrigues 0:9457949d5d00 140
hajesusrodrigues 0:9457949d5d00 141 ackTimer.stop();
hajesusrodrigues 0:9457949d5d00 142 ackTimer.reset();
hajesusrodrigues 0:9457949d5d00 143
hajesusrodrigues 0:9457949d5d00 144 rfm12b_sender_led = 1;
hajesusrodrigues 0:9457949d5d00 145 wait(0.2);
hajesusrodrigues 0:9457949d5d00 146 rfm12b_sender_led = 0;
hajesusrodrigues 0:9457949d5d00 147
hajesusrodrigues 0:9457949d5d00 148 (i >= 60) ? i = 0 : i++;
hajesusrodrigues 0:9457949d5d00 149
hajesusrodrigues 0:9457949d5d00 150 wait(20);
hajesusrodrigues 0:9457949d5d00 151 }
hajesusrodrigues 0:9457949d5d00 152 }
hajesusrodrigues 0:9457949d5d00 153
hajesusrodrigues 1:e30050868e55 154 int main()
hajesusrodrigues 1:e30050868e55 155 {
hajesusrodrigues 0:9457949d5d00 156
hajesusrodrigues 0:9457949d5d00 157 #if TEST_TYPE == MBED_TO_MBED
hajesusrodrigues 0:9457949d5d00 158
hajesusrodrigues 0:9457949d5d00 159 printf("TEST TYPE: MBED_TO_MBED \n");
hajesusrodrigues 0:9457949d5d00 160 Thread b_thread(ReceiverThread);
hajesusrodrigues 0:9457949d5d00 161 printf("Receive thread \n");
hajesusrodrigues 0:9457949d5d00 162 wait(20);
hajesusrodrigues 0:9457949d5d00 163 Thread a_thread(SenderThread);
hajesusrodrigues 0:9457949d5d00 164 printf("Send thread \n");
hajesusrodrigues 0:9457949d5d00 165
hajesusrodrigues 0:9457949d5d00 166 #elif TEST_TYPE == MBED_TO_ARDUINO
hajesusrodrigues 0:9457949d5d00 167
hajesusrodrigues 0:9457949d5d00 168 printf("TEST TYPE: MBED_TO_ARDUINO \n");
hajesusrodrigues 0:9457949d5d00 169 Thread a_thread(SenderThread);
hajesusrodrigues 0:9457949d5d00 170 printf("Send thread \n");
hajesusrodrigues 0:9457949d5d00 171
hajesusrodrigues 0:9457949d5d00 172 #elif TEST_TYPE == ARDUINO_TO_MBED
hajesusrodrigues 0:9457949d5d00 173
hajesusrodrigues 0:9457949d5d00 174 printf("TEST TYPE: MBED_TO_ARDUINO \n");
hajesusrodrigues 0:9457949d5d00 175 Thread b_thread(ReceiverThread);
hajesusrodrigues 0:9457949d5d00 176 printf("Receive thread \n");
hajesusrodrigues 0:9457949d5d00 177
hajesusrodrigues 0:9457949d5d00 178 #endif
hajesusrodrigues 0:9457949d5d00 179
hajesusrodrigues 0:9457949d5d00 180 while (true) {
hajesusrodrigues 0:9457949d5d00 181 activity_ledOn = 1;
hajesusrodrigues 0:9457949d5d00 182 activity_ledOff = 0;
hajesusrodrigues 0:9457949d5d00 183 wait(0.2);
hajesusrodrigues 0:9457949d5d00 184 activity_ledOn = 0;
hajesusrodrigues 0:9457949d5d00 185 activity_ledOff = 1;
hajesusrodrigues 0:9457949d5d00 186 wait(0.2);
hajesusrodrigues 1:e30050868e55 187
hajesusrodrigues 0:9457949d5d00 188 if(pc.readable()) {
hajesusrodrigues 0:9457949d5d00 189 if (pc.getc() == 'r') {
hajesusrodrigues 0:9457949d5d00 190 mbed_reset();
hajesusrodrigues 0:9457949d5d00 191 }
hajesusrodrigues 0:9457949d5d00 192
hajesusrodrigues 0:9457949d5d00 193 }
hajesusrodrigues 0:9457949d5d00 194 }
hajesusrodrigues 0:9457949d5d00 195 }