pines

Dependencies:   HMC5883L111 RF24 RF24Network mbed motoresDC

Fork of RF24Network_Send by Akash Vibhute

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #define MAPLE_MINI
00002 #include "pines.h"
00003 #include "mbed.h"
00004 #include <HMC5883L.h>
00005 #include <RF24Network.h>
00006 #include <RF24.h>
00007 #include <motoresDC.h>
00008 
00009 Serial pc(TX3_PIN, RX3_PIN);
00010 HMC5883L brujula;
00011 InterruptIn boton(PB_8);
00012 
00013 //motores       D27   D31    D30    D26   D29    D28     
00014 MotoresDC carro(PWM_L, CTRL1_L, CTRL2_L, PWM_R, CTRL1_R, CTRL2_R);
00015 
00016 PwmOut led(PB_1);
00017 DigitalOut status(PB_2);
00018 
00019 RF24 radio(spi_MOSI, spi_MISO, spi_SCK, nrf_CE, nrf_CSN );
00020 
00021 // Network uses that radio
00022 RF24Network network(radio);
00023 
00024 // Address of our node
00025 const uint16_t this_node = 01;
00026 // Address of the other node
00027 const uint16_t other_node = 00;
00028 // How often to send payload packet to the other unit
00029 const unsigned long interval = 100; //ms
00030 // When did we last send?
00031 unsigned long last_sent;
00032 Timer t;
00033 // How many have we sent already
00034 unsigned long packets_sent;
00035 Timer t_packet;
00036 // Structure of our payload
00037 struct payload_t 
00038 {
00039     unsigned long ms;
00040     unsigned long counter;
00041     double heading;
00042 };
00043 
00044 volatile double heading;
00045 volatile unsigned int flag = 0;
00046 // functions
00047 void toggle(void)
00048 {
00049     flag = 1;
00050     heading = brujula.getHeading();
00051 }
00052 
00053 void initP()
00054 {
00055     led = 1;
00056     boton.fall(toggle);
00057     brujula.init();
00058     carro.conducir(1);
00059     wait_ms(1000);
00060     carro.conducir(0);
00061     led = 0;
00062     wait_ms(500);
00063     led = 1;
00064     radio.begin();
00065     network.begin(/*channel*/ 90, /*node address*/ this_node);
00066     carro.conducir(-1);
00067     wait_ms(2000);
00068     t.start();
00069     t_packet.start();
00070     status = 0;
00071     led = 0;
00072     carro.conducir(0);
00073 }
00074 
00075 void checkMessage()
00076 {
00077     while ( network.available() ) 
00078         {
00079             // If so, grab it and print it out
00080             RF24NetworkHeader header_rx;
00081             payload_t payload_rx;
00082             network.read(header_rx,&payload_rx,sizeof(payload_rx));
00083             carro.conducir(payload_rx.heading / 360.0);
00084             status = abs(payload_rx.heading) < 5.0 ? 1 : 0;
00085         }
00086 }
00087 //------
00088 
00089 bool sendMessage(double angulo)
00090 {
00091     led = !led;
00092             t.reset();
00093 
00094             payload_t payload_tx;
00095             payload_tx.ms = t_packet.read_ms();
00096             payload_tx.counter = packets_sent++;
00097             payload_tx.heading = angulo;
00098             
00099             RF24NetworkHeader header_tx(/*to node*/ other_node);
00100             bool ok = network.write(header_tx,&payload_tx,sizeof(payload_tx));    
00101             flag = 0;
00102             led = 0;     
00103             return ok;
00104 }    
00105 int main()
00106 {   
00107     initP();
00108     
00109     
00110     while(1) 
00111     {
00112         // Pump the network regularly
00113         network.update();
00114         checkMessage();
00115         /* If it's time to send a message, send it! */
00116         double angulo = brujula.getHeading();
00117         led = angulo / 360.0;
00118         unsigned long now = t.read_ms();
00119         if ( (now - last_sent) > interval  ) 
00120         {
00121             last_sent = now;
00122             bool ok = sendMessage(angulo);
00123         }
00124         
00125         /*
00126         if(abs(angulo) < 4)
00127         {
00128             led = 1;
00129         }
00130         else
00131         {
00132             led = 0;
00133         }
00134         */
00135     }
00136 
00137 }