Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: ISR_Mini-explorer_Rangefinder
Fork of ISR_Mini-explorer by
Diff: robot.h
- Revision:
- 1:8569ac717e68
- Parent:
- 0:15a30802e719
- Child:
- 2:0435d1171673
--- a/robot.h Thu Feb 02 12:21:11 2017 +0000
+++ b/robot.h Tue Feb 20 13:37:47 2018 +0000
@@ -1,54 +1,79 @@
/** @file */
-//AUTOR: Fernando Pais
-//MAIL: ferpais2508@gmail.com
-//DATA: 6/6/2016
-// VERSÃO 6.4.0
-//
-//Alterações: Problema de compatibilidade entre encoder e infravermelho resolvido
-// Odometria actualizada automaticamente
-// Valor da bateria verificado na inicialização
-// Motores movem-se de 0 a 1000 para melhor difrenciação
-//
-//#include "mbed.h"
-//#include "init.h"
-//#define _USE_MATH_DEFINES
-# define M_PI 3.14159265358979323846 /* pi */
#include <math.h>
#include <string.h>
#include "VCNL40x0.h"
-#include "nRF24L01P.h"
+#include <RF24.h>
+#include "Encoder.h"
+
+I2C i2c(PTC9,PTC8);
+I2C i2c1(PTC11,PTC10);
+
+
+ float X=20;
+ float Y=20;
+
+ Mutex mutex_i2c0, mutex_i2c1;
+ Encoder esquerdo(&i2c, &mutex_i2c0, 0);
+ Encoder direito(&i2c1, &mutex_i2c1, 1);
+
+ Thread thread;
+
+
+
+void odometry_thread()
+{
+ float theta=0;
+ long int ticks2d=0;
+ long int ticks2e=0;
+
+
-void Odometria();
+ while (true) {
+ esquerdo.incremental();
+ direito.incremental();
+ //-------------------------------------------
+ long int ticks1d=direito.readIncrementalValue();
+ long int ticks1e=esquerdo.readIncrementalValue();
+
+ long int D_ticks=ticks1d - ticks2d;
+ long int E_ticks=ticks1e - ticks2e;
+
+ ticks2d=ticks1d;
+ ticks2e=ticks1e;
+
+ float D_cm= (float)D_ticks*((3.25*3.1415)/4096);
+ float L_cm= (float)E_ticks*((3.25*3.1415)/4096);
+
+ float CM=(D_cm + L_cm)/2;
+
+ theta +=(D_cm - L_cm)/7.18;
+
+ theta = atan2(sin(theta), cos(theta));
+
+ // meter entre 0
+
+ X += CM*cos(theta);
+ Y += CM*sin(theta);
+ //-------------------------------------------
+
+ Thread::wait(10);
+ }
+}
+
// classes adicionais
-nRF24L01P my_nrf24l01p(PTD2, PTD3, PTD1, PTC13, PTC12, PTA13);
+RF24 radio(PTD2, PTD3, PTD1, PTC12 ,PTC13);
VCNL40x0 VCNL40x0_Device (PTC9, PTC8, VCNL40x0_ADDRESS);
+
+
Timeout timeout;
Serial pc(PTE0,PTE1);
-I2C i2c(PTC9,PTC8);
-I2C i2c1(PTC11,PTC10);
+
// Variables needed by the lib
unsigned int ProxiValue=0;
-short int prev_R=0;
-short int prev_L=0;
-long int total_R=0;
-long int total_L=0;
-long int ticks2d=0;
-long int ticks2e=0;
-float X=20;
-float Y=20;
-float AtractX = 0;
-float AtractY = 0;
-float theta=0;
-int sensor_left=0;
-int sensor_front=0;
-int sensor_right=0;
-short int flag=0;
-int IRobot=0;
-int JRobot=0;
//SAIDAS DIGITAIS (normal)
DigitalOut q_pha_mot_rig (PTE4,0); //Phase Motor Right
@@ -121,11 +146,7 @@
AnalogOut dac_comp_mic (PTE30); //Dac_Comparator MIC
-/* Powers up all the VCNL4020. */
-void init_Infrared()
-{
- VCNL40x0_Device.SetCurrent (20); // Set current to 200mA
-}
+
/**
* Selects the wich infrared to comunicate.
@@ -143,25 +164,42 @@
if(ch>=1)
ch_f[0]=1<<ch;
- i2c.start();
+mutex_i2c0.lock();
i2c.write(addr,ch_f,1);
- i2c.stop();
+ mutex_i2c0.unlock();
+}
+
+
+
+
+
+/* Powers up all the VCNL4020. */
+void init_Infrared()
+{
+
+ for (int i=0; i<6;i++)
+ {
+ tca9548_select_ch(i);
+ VCNL40x0_Device.SetCurrent (20); // Set current to 200mA
+ }
+ tca9548_select_ch(0);
}
/**
- * Get ADC value of the chosen infrared.
+ * Get the distance from of the chosen infrared.
*
- * @param ch - Infrared to read (1..5)
+ * @param ch - Infrared to read (0,1..5)
*
* Note: for the values of ch it reads (0-right, ... ,4-left, 5-back)
*/
-long int read_Infrared(char ch) // 0-direita 4-esquerda 5-tras
+float read_Infrared(char ch) // 0-direita 4-esquerda 5-tras
{
tca9548_select_ch(ch);
VCNL40x0_Device.ReadProxiOnDemand (&ProxiValue); // read prox value on demand
-
- return ProxiValue;
+ float aux =floor(pow((float)ProxiValue/15104.0,-0.57)*10.0)/10.0 ;
+ return aux;
+ //return ProxiValue;
}
///////////////////////////////////////////////////////////////////////////////////////////////
@@ -256,168 +294,6 @@
///////////////////////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////// ENCODER ///////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////////////////////////
-
-/**
- * Reads Position of left magnetic encoder.
- *
- * @return The absolute position of the left wheel encoder (0..4095)
- */
-long int read_L_encoder()
-{
-
- char data_r_2[5];
-
- i2c.start();
- i2c.write(0x6C);
- i2c.write(0x0C);
- i2c.read(0x6D,data_r_2,4,0);
- i2c.stop();
-
- short int val1=data_r_2[0];
- short int val2=data_r_2[1];
- val1=(val1&0xf)*256;
- long int final=(val2+val1);
-
- return final;
-}
-
-
-/**
- * Reads Position of right magnetic encoder.
- *
- * @return The absolute position of the right wheel encoder (0..4095)
- */
-long int read_R_encoder()
-{
-
- char data_r_2[5];
-
- i2c1.start();
- i2c1.write(0x6C);
- i2c1.write(0x0C);
- i2c1.read(0x6D,data_r_2,4,0);
- i2c1.stop();
-
- short int val1=data_r_2[0];
- short int val2=data_r_2[1];
- val1=(val1&0xf)*256;
- long int final=(val2+val1);
-
- return final;
-}
-
-
-/**
- * Calculates and returns the value of the right "incremental" encoder.
- *
- * @return The value of "tics" of the right encoder since it was initialized
- */
-long int incremental_R_encoder()
-{
- short int next_R=read_R_encoder(); // Reads curent value of the encoder
- short int dif=next_R-prev_R; // Calculates the diference from last reading
-
- if(dif>3000) { // Going back and pass zero
- total_R=total_R-4096+dif;
- }
- if(dif<3000&&dif>0) { // Going front
- total_R=total_R+dif;
- }
- if(dif<-3000) { // Going front and pass zero
- total_R=total_R+4096+dif;
- }
- if(dif>-3000&&dif<0) { // going back
- total_R=total_R+dif;
- }
- prev_R=next_R; // Sets last reading for next iteration
-
- return total_R;
-}
-
-
-/**
- * Calculates and returns the value of the left "incremental" encoder.
- *
- * @return The value of "tics" of the left encoder since it was initialized
- */
-long int incremental_L_encoder()
-{
- short int next_L=read_L_encoder(); // Reads curent value of the encoder
- short int dif=-next_L+prev_L; // Calculates the diference from last reading
-
- if(dif>3000) { // Going back and pass zero
- total_L=total_L-4096+dif;
- }
- if(dif<3000&&dif>0) { // Going front
- total_L=total_L+dif;
- }
- if(dif<-3000) { // Going front and pass zero
- total_L=total_L+4096+dif;
- }
- if(dif>-3000&&dif<0) { // going back
- total_L=total_L+dif;
- }
- prev_L=next_L; // Sets last reading for next iteration
-
- return total_L;
-}
-
-
-/**
- * Calculate the value of both encoder "incremental" every 10 ms.
- */
-void timer_event() //10ms interrupt
-{
- timeout.attach(&timer_event,0.01);
- if(flag==0) {
- incremental_R_encoder();
- incremental_L_encoder();
- }
- Odometria();
-
- return;
-}
-
-
-/**
- * Set the initial position for the "incremental" enconder and "starts" them.
- */
-void initEncoders()
-{
- prev_R=read_R_encoder();
- prev_L=read_L_encoder();
- timeout.attach(&timer_event,0.01);
-}
-
-
-/**
- * Returns to the user the value of the right "incremental" encoder.
- *
- * @return The value of "tics" of the right encoder since it was initialized
- */
-long int R_encoder()
-{
- wait(0.0001);
-
- return total_R;
-}
-
-/**
- * Returns to the user the value of the right "incremental" encoder.
- *
- * @return The value of "tics" of the right encoder since it was initialized
- */
-long int L_encoder()
-{
- wait(0.0001);
-
- return total_L;
-}
-
-
-///////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////// BATTERY ///////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
@@ -425,15 +301,14 @@
* Reads adc of the battery.
*
* @param addr - Address to read
- * @return The voltage of the batery
+ * @return The voltage of the baterry
*/
long int read16_mcp3424(char addr)
{
char data[4];
- i2c1.start();
+ mutex_i2c1.lock();
i2c1.read(addr,data,3);
- i2c1.stop();
-
+ mutex_i2c1.unlock();
return(((data[0]&127)*256)+data[1]);
}
@@ -464,9 +339,9 @@
char data[1];
data[0]= (char)chanel_end | (char)n_bits_end | (char)(gain-1) | 128;
- i2c1.start();
+ mutex_i2c1.lock();
i2c1.write(addr,data,1);
- i2c1.stop();
+ mutex_i2c1.unlock();
}
@@ -491,179 +366,6 @@
}
///////////////////////////////////////////////////////////////////////////////////////////////
-/////////////////////////////// RF COMUNICATION ///////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////////////////////////
-
-
-/**
- * Initializes the NRF24 module for comunication.
- *
- * Note: if the module is broken or badly connected this init will cause the code to stop,
- * if all these messages don't appear thats the case
- */
-void config_init_nrf()
-{
- my_nrf24l01p.powerUp(); // powers module
- my_nrf24l01p.setRfFrequency (2400); // channel 0 (2400-0 ... 2516-116)
- my_nrf24l01p.setTransferSize(10); // number of bytes to be transfer
- my_nrf24l01p.setCrcWidth(8);
- my_nrf24l01p.enableAutoAcknowledge(NRF24L01P_PIPE_P0); // pipe where data transfer occurs (0..6)
- pc.printf( "nRF24L01+ Frequency : %d MHz\r\n", my_nrf24l01p.getRfFrequency() );
- pc.printf( "nRF24L01+ Data Rate : %d kbps\r\n", my_nrf24l01p.getAirDataRate() );
- pc.printf( "nRF24L01+ TX Address : 0x%010llX\r\n", my_nrf24l01p.getTxAddress() );
- pc.printf( "nRF24L01+ RX Address : 0x%010llX\r\n", my_nrf24l01p.getRxAddress() );
- pc.printf( "nRF24L01+ CrC Width : %d CrC\r\n", my_nrf24l01p.getCrcWidth() );
- pc.printf( "nRF24L01+ TransferSize : %d Paket Size\r\n", my_nrf24l01p.getTransferSize () );
- my_nrf24l01p.setReceiveMode();
- my_nrf24l01p.enable();
- pc.printf( "Setup complete, Starting While loop\r\n");
-}
-
-
-/**
- * Receives a number from the Arduino.
- *
- * @return The value send by the arduino
- */
-double receiveValue(void)
-{
- char temp[4];
- double Val;
- bool ok=0;
- my_nrf24l01p.setTransferSize(4);
- my_nrf24l01p.setReceiveMode();
- my_nrf24l01p.enable();
- do {
- if(my_nrf24l01p.readable(NRF24L01P_PIPE_P0)) {
- ok = my_nrf24l01p.read( NRF24L01P_PIPE_P0,temp, 4);
- }
- } while(ok==0);
-
- //transformation of temp to convert to original value
- if(temp[0]==0) // if first elemente is 0 then its negative
- Val = double(-(int(temp[1])+int(temp[2])*255+int(temp[3])*255*255));
- else // else its positive
- Val = double(int(temp[1])+int(temp[2])*255+int(temp[3])*255*255);
-
- return Val;
-}
-
-
-/**
- * Sends a number to the Arduino
- *
- * @param Value - number to be sent to the Arduino
- */
-void sendValue(long int Value)
-{
- bool ok=0; // comunication sucess, o if failed 1 if sucessfull
- // double math=Value/65025; // temporary variable save results
- int zero=1; // 1 byte, ( - ) if 0 ( + ) if 1
- int one=0; // 2 byte (0..255), multiplied by 1
- int two=0; // 3 byte (0..255), multiplied by 255
- int three=0; // 4 byte (0..255), multiplied by 255*255
-
-//transformation of Value to send correctly through pipe
- if (Value<0) {
- zero=0;
- Value=abs(Value);
- }
- // Value=abs(Value);
-
- double math=Value/65025; // temporary variable save results
-
- if(math<1) {
- math=Value/255;
- if(math<1) {
- two=0;
- one=Value;
- } else {
- two=(int)math;
- one=Value % 255;
- }
- } else {
- three=(int)math;
- math=Value/255;
- if(math<1) {
- two=0;
- one=Value;
- } else {
- two=(int)math;
- one=Value % 255;
- }
- }
- char temp[4]= {(int)zero,(int)one,(int)two,(int)three};
-
- // Apagar depois de testar mais vezes
- // pc.printf("1 inidice...%i...\r", temp[0]);
- // pc.printf("2 inidice...%i...\r", temp[1]);
- // pc.printf("3 inidice...%i...\r", temp[2]);
- // pc.printf("4 inidice...%i...\r", temp[3]);
-
- my_nrf24l01p.setTransferSize(4);
- my_nrf24l01p.setTransmitMode();
- my_nrf24l01p.enable();
- do {
- ok = my_nrf24l01p.write( NRF24L01P_PIPE_P0,temp, 4);
- if(ok==1)
- pc.printf("Done.....%i...\r", Value);
- else {
- pc.printf("Failed\r");
- wait(1);
- }
- } while(ok==0);
-}
-
-/**
- * Sends matrix to arduino.
- *
- * @param matrix - Matrix of numbers to send [0..255]
- * @param row - Number of rows
- * @param column - Number of columns
- */
-void sendMatrix(int (*matrix)[18],int row , int column)
-{
- short ok=0;
- short int i =0;
- short int j=0;
- short int byte=0;
- int members=column*row;
- char message[32]= {0};
- pc.printf("J ...%d... \r",members);
-
- my_nrf24l01p.setTransferSize(32);
- my_nrf24l01p.setTransmitMode();
- my_nrf24l01p.enable();
-
- do {
- int* point = matrix[j];
-
- do {
- message[byte]= point[i];
- if (byte==31 || (i+1)*(j+1)==members) {
-
- do {
- ok = my_nrf24l01p.write( NRF24L01P_PIPE_P0,message, 32);
- if(ok==0)
- wait(1);
-
- } while(ok==0);
-
- byte=-1;
- }
-
- byte++;
- i++;
-
- } while(i<column);
-
- i=0;
- j++;
- } while(j<row);
-
-}
-
-///////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////// Sonar ////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
// Commands of operation with ultrasonic module
@@ -688,57 +390,9 @@
{
char data[1];
data[0]= 0x0C;
- wait_ms(1);
- i2c1.start();
- i2c1.write(0x30,data,1);
- i2c1.stop();
- i2c1.start();
- i2c1.write(0x30,data,1);
- i2c1.stop();
-}
-
-
-void disable_dc_dc_boost()
-{
- char data[1];
- data[0]= 0x0B;
- wait_ms(1);
- i2c1.start();
+ mutex_i2c1.lock();
i2c1.write(0x30,data,1);
- i2c1.stop();
-}
-
-
-void start_read_left_sensor()
-{
- char data[1];
- data[0]= 0x0A;
- wait_ms(1);
- i2c1.start();
- i2c1.write(0x30,data,1);
- i2c1.stop();
-}
-
-
-void start_read_front_sensor()
-{
- char data[1];
- data[0]= 0x09;
- wait_ms(1);
- i2c1.start();
- i2c1.write(0x30,data,1);
- i2c1.stop();
-}
-
-
-void start_read_right_sensor()
-{
- char data[1];
- data[0]= 0x08;
- wait_ms(1);
- i2c1.start();
- i2c1.write(0x30,data,1);
- i2c1.stop();
+ mutex_i2c1.unlock();
}
@@ -746,49 +400,30 @@
{
char data[1];
data[0]= 0x07;
- wait_ms(1);
- i2c1.start();
+ mutex_i2c1.lock();
i2c1.write(0x30,data,1);
- i2c1.stop();
+ mutex_i2c1.unlock();
}
-void measure_always_off()
-{
- char data[1];
- data[0]= 0x06;
- wait_ms(1);
- i2c1.start();
- i2c1.write(0x30,data,1);
- i2c1.stop();
-}
-
/**
* Returns left sensor value
*/
static unsigned int get_distance_left_sensor()
{
-
+
static char data_r[3];
static unsigned int aux;
- flag=1;
-
+
data_r[0]= 0x05;
- wait_ms(1);
- i2c1.start();
+ mutex_i2c1.lock();
i2c1.write(0x30,data_r,1);
- i2c1.stop();
- wait_ms(10);
- i2c1.start();
- i2c1.read(0x31,data_r,2,0);
- i2c1.stop();
+ i2c1.read(0x31,data_r,2);
+ mutex_i2c1.unlock();
aux=(data_r[0]*256)+data_r[1];
- flag=0;
+
return aux;
- // sensor_left=aux;
- // pc.printf("\nDistance Left Sensor: %u mm",aux); //0 - 2500mm
-
}
@@ -800,22 +435,17 @@
static char data_r[3];
static unsigned int aux;
- flag=1;
+
data_r[0]= 0x04;
- wait_ms(1);
- i2c1.start();
+
+ mutex_i2c1.lock();
i2c1.write(0x30,data_r,1);
- i2c1.stop();
- wait_ms(10);
- i2c1.start();
- i2c1.read(0x31,data_r,2,0);
- i2c1.stop();
+ i2c1.read(0x31,data_r,2);
+ mutex_i2c1.unlock();
aux=(data_r[0]*256)+data_r[1];
- flag=0;
+
return aux;
- // sensor_front=aux;
- // pc.printf("\nDistance Front Sensor: %u mm",aux); //0 - 2500mm
}
@@ -828,69 +458,359 @@
static char data_r[3];
static unsigned int aux;
- flag=1;
data_r[0]= 0x03;
- wait_ms(1);
- i2c1.start();
+
+ mutex_i2c1.lock();
i2c1.write(0x30,data_r,1);
- i2c1.stop();
- wait_ms(10);
- i2c1.start();
i2c1.read(0x31,data_r,2,0);
- i2c1.stop();
+ mutex_i2c1.unlock();
aux=(data_r[0]*256)+data_r[1];
- flag=0;
+
return aux;
- // sensor_right=aux;
- // pc.printf("\nDistance Right Sensor: %u \r",aux); //0 - 2500mm
}
-void get_status_always_measure()
-{
+///////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////// RF COMMUNICATION ////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////////////////
- static char data_r[3];
- static unsigned int aux;
+/**
+ * Initializes nrf24l01 module, return value 1 if module is working correcty and 0 if it's not.
+ *
+ ** @param channel - Which RF channel to comunicate on, 0-125
+ *
+ * \warning Channel on Robot and Board has to be the same.
+ */
+ void init_nRF(int channel){
+ int result;
+ result = radio.begin();
+
+ pc.printf( "Initialation nrf24l01=%d\r\n", result ); // 1-working,0-not working
+ radio.setDataRate(RF24_1MBPS);
+ radio.setCRCLength(RF24_CRC_16);
+ radio.setPayloadSize(32);
+ radio.setChannel(channel);
+ radio.setAutoAck(true);
+
+ radio.openWritingPipe(0x314e6f6465);
+ radio.openReadingPipe(1,0x324e6f6465);
+
+ radio.startListening();
+}
+
+char txData, rxData;
+char q[1];
+
- data_r[0]= 0x02;
- wait_ms(1);
- i2c1.start();
- i2c1.write(0x30,data_r,1);
- i2c1.stop();
- wait_ms(10);
- i2c1.start();
- i2c1.read(0x31,data_r,2,0);
- i2c1.stop();
+/**
+ * Wireless control of motors using nrf24l01 module and FRDM-KL25Z board(robot is working as receiver).
+ */
+void robot_RC()
+{
+ if (radio.available() ) {
- aux=data_r[0];
- pc.printf("\nStatus of read always on/off: %u ",aux); //0 (off) - 1 (on)
-
+ radio.read( &rxData, sizeof(rxData) );
+ pc.putc( rxData );
+
+ q[0]=pc.putc( rxData );
+ if (q[0]=='w'){
+ leftMotor(1,500);
+ rightMotor(1,500);
+ }
+ else if( q[0]=='s'){
+ leftMotor(0,500);
+ rightMotor(0,500);
+ }
+ else if( q[0]=='a'){
+ leftMotor(0,500);
+ rightMotor(1,500);
+ }
+ else if( q[0]=='d'){
+ leftMotor(1,500);
+ rightMotor(0,1000);
+ }
+ else if( q[0]==' '){
+ leftMotor(1,0);
+ rightMotor(1,0);
+ }
+ }
}
-void get_status_dcdc_converter()
-{
+
+/**
+ * Robot is sending values of all sensors (right/left incremental encoder, ultrasonic sensors, infarated sensors and Odometria) to FRDM-KL25Z board using nrf24l01 module.
+ *
+ *Note: Check if module is initilized correctly.
+ */
+void send_Robot_values(){
+
+// WRITE ID:
+// INCREMENTAL LEFT ENCODER - a
+// INCREMENTAL RIGHT ENCODER - b
+// LEFT ULTRASENSOR - c
+// FRONT ULTRASENSOR - d
+// RIGHT ULTRASENSOR - e
+// INFRARED SENSOR 0 - f
+// INFRARED SENSOR 1 - g
+// INFRARED SENSOR 2 - h
+// INFRARED SENSOR 3 - i
+// INFRARED SENSOR 4 - j
+// INFRARED SENSOR 5 - k
+// ODOMETRIA "X" - l
+// ODOMETRIA "Y" - m
+
+// LEFT ENCODER addr: a
+
+ int left_encoder = 0; //read value from device
+ char left_encoder_R[10]; //char array ..._R to read value
+ char left_encoder_W[12]; //char array ..._W to write value
+
+ snprintf(left_encoder_R, 10, "%d", left_encoder); //int value to char array
+
+ for (int i=0; i < 10;i++) //changing posiision of chars in array
+ {
+ left_encoder_W[i+2]=left_encoder_R[i];
+ }
+
+ left_encoder_W[0]='Q'; //adding id to message
+ left_encoder_W[1]='a'; //adding id to parameter
+
+// RIGHT ENCODER addr: b
+
+ int right_encoder = 0; //read value from device
+ char right_encoder_R[10]; //char array ..._R to read value
+ char right_encoder_W[11]; //char array ..._W to write value
+
+ snprintf(right_encoder_R, 10, "%d", right_encoder); //int value to char array
+
+ for (int i=0; i <10;i++) //changing positision of chars in array
+ {
+ right_encoder_W[i+1]=right_encoder_R[i];
+ }
+
+ right_encoder_W[0]='b'; //adding id to parameter
+
+
+// LEFT ULTRASENSOR addr: c
+
+ int left_sensor = get_distance_left_sensor(); //read value from device
+ char left_sensor_R[5]; //char array ..._R to read value
+ char left_sensor_W[6]; //char array ..._W to write value
+
+ snprintf(left_sensor_R, 5, "%d", left_sensor); //int value to char array
- static char data_r[3];
- static unsigned int aux;
+ for (int i=0; i < 5;i++) //changing positision of chars in array
+ {
+ left_sensor_W[i+1]=left_sensor_R[i];
+ }
+
+ left_sensor_W[0]='c'; //adding id to parameter
+
+
+// FRONT ULTRASENSOR addr: d
+
+ int front_sensor = get_distance_front_sensor(); //read value from device
+ char front_sensor_R[5]; //char array ..._R to read value
+ char front_sensor_W[6]; //char array ..._W to write value
+
+ snprintf(front_sensor_R, 5, "%d", front_sensor); //int value to char array
+
+ for (int i=0; i < 5;i++) //changing positision of chars in array
+ {
+ front_sensor_W[i+1]=front_sensor_R[i];
+ }
+
+ front_sensor_W[0]='d'; //adding id to parameter
+
+
+// RIGHT ULTRASENSOR addr: e
+
+ int right_sensor = get_distance_right_sensor(); //read value from device
+ char right_sensor_R[5]; //char array ..._R to read value
+ char right_sensor_W[6]; //char array ..._W to write value
+
+ snprintf(right_sensor_R, 5, "%d", right_sensor); //int value to char array
+
+ for (int i=0; i < 5;i++) //changing positision of chars in array
+ {
+ right_sensor_W[i+1]=right_sensor_R[i];
+ }
+
+ right_sensor_W[0]='e'; //adding id to parameter
+
+
+// INFRARED SENSOR 0 addr: f
+
+ float infrared_0 = read_Infrared(0); //read value from device
+
+ char infrared_0_R[5]; //char array ..._R to read value
+ char infrared_0_W[7]; //char array ..._W to write value
+
+ snprintf(infrared_0_R, 5, "%.1f", infrared_0); //int value to char array
+
+ for (int i=0; i < 6;i++) //changing positision of chars in array
+ {
+ infrared_0_W[i+2]=infrared_0_R[i];
+ }
+
+ infrared_0_W[0]='Z'; //adding id to message
+ infrared_0_W[1]='f'; //adding id to parameter
+
+// INFRARED SENSOR 1 addr: g
+
+ float infrared_1 = read_Infrared(1); //read value from device
+
+ char infrared_1_R[sizeof(infrared_1)+1]; //char array ..._R to read value
+ char infrared_1_W[sizeof(infrared_1)+2]; //char array ..._W to write value
+
+ snprintf(infrared_1_R, sizeof(infrared_1_R), "%.1f", infrared_1); //int value to char array
+
+ for (int i=0; i < sizeof(infrared_1)+2;i++) //changing positision of chars in array
+ {
+ infrared_1_W[i+1]=infrared_1_R[i];
+ }
+
+ infrared_1_W[0]='g'; //adding id to parameter
- data_r[0]= 0x01;
- wait_ms(1);
- i2c1.start();
- i2c1.write(0x30,data_r,1);
- i2c1.stop();
- wait_ms(10);
- i2c1.start();
- i2c1.read(0x31,data_r,2,0);
- i2c1.stop();
+
+// INFRARED SENSOR 2 addr: h
+
+ float infrared_2 = read_Infrared(2); //read value from device
+
+ char infrared_2_R[sizeof(infrared_2)+1]; //char array ..._R to read value
+ char infrared_2_W[sizeof(infrared_2)+2]; //char array ..._W to write value
+
+ snprintf(infrared_2_R, sizeof(infrared_2_R), "%.1f", infrared_2); //int value to char array
+
+ for (int i=0; i < sizeof(infrared_2)+2;i++) //changing positision of chars in array
+ {
+ infrared_2_W[i+1]=infrared_2_R[i];
+ }
+
+ infrared_2_W[0]='h'; //adding id to parameter
+
+
+// INFRARED SENSOR 3 addr: i
+
+ float infrared_3 = read_Infrared(3); //read value from device
+
+ char infrared_3_R[sizeof(infrared_3)+1]; //char array ..._R to read value
+ char infrared_3_W[sizeof(infrared_3)+2]; //char array ..._W to write value
+
+ snprintf(infrared_3_R, sizeof(infrared_3_R), "%.1f", infrared_3); //int value to char array
+
+ for (int i=0; i < sizeof(infrared_3)+2;i++) //changing positision of chars in array
+ {
+ infrared_3_W[i+1]=infrared_3_R[i];
+ }
+
+ infrared_3_W[0]='i'; //adding id to parameter
+
+
+// INFRARED SENSOR 4 addr: j
+
+ float infrared_4 = read_Infrared(4); //read value from device
+
+ char infrared_4_R[sizeof(infrared_4)+1]; //char array ..._R to read value
+ char infrared_4_W[sizeof(infrared_4)+2]; //char array ..._W to write value
+
+ snprintf(infrared_4_R, sizeof(infrared_4_R), "%.1f", infrared_4); //int value to char array
+
+ for (int i=0; i < sizeof(infrared_4)+2;i++) //changing positision of chars in array
+ {
+ infrared_4_W[i+1]=infrared_4_R[i];
+ }
+
+ infrared_4_W[0]='j'; //adding id to parameter
+
+
+// INFRARED SENSOR 5 addr: k
+
+ float infrared_5 = read_Infrared(5); //read value from device
+
+ char infrared_5_R[sizeof(infrared_5)+1]; //char array ..._R to read value
+ char infrared_5_W[sizeof(infrared_5)+2]; //char array ..._W to write value
+
+ snprintf(infrared_5_R, sizeof(infrared_5_R), "%.1f", infrared_5); //int value to char array
- aux=data_r[0];
- pc.printf("\nStatus of DC/DC Converter: %u ",aux); //0 (off) - 1 (on)
+ for (int i=0; i < sizeof(infrared_5)+2;i++) //changing positision of chars in array
+ {
+ infrared_5_W[i+1]=infrared_5_R[i];
+ }
+
+ infrared_5_W[0]='k'; //adding id to parameter
+
+
+// ODEMETRIA X addr: l
+
+ float X_od = X; //read value from device
+
+ char X_od_R[sizeof(X_od)+1]; //char array ..._R to read value
+ char X_od_W[sizeof(X_od)+2]; //char array ..._W to write value
+
+ snprintf(X_od_R, sizeof(X_od_R), "%.1f", X_od); //int value to char array
+
+ for (int i=0; i < sizeof(X_od)+2;i++) //changing positision of chars in array
+ {
+ X_od_W[i+1]=X_od_R[i];
+ }
+
+ X_od_W[0]='l'; //adding id to parameter
+
+
+// ODEMETRIA X addr: m
+
+ float Y_od = Y; //read value from device
+
+ char Y_od_R[sizeof(Y_od)+1]; //char array ..._R to read value
+ char Y_od_W[sizeof(Y_od)+2]; //char array ..._W to write value
+
+ snprintf(Y_od_R, sizeof(Y_od_R), "%.1f", Y_od); //int value to char array
-}
+ for (int i=0; i < sizeof(Y_od)+2;i++) //changing positision of chars in array
+ {
+ Y_od_W[i+1]=Y_od_R[i];
+ }
+
+ Y_od_W[0]='m'; //adding id to parameter
+
+
+
+/////Preparing messages to send//////
+
+char send_Z[30];
+for (int i =0; i<sizeof(left_encoder_W);i++){
+ send_Z[i]=left_encoder_W[i];
+ }
+strcat(send_Z,right_encoder_W);
+strcat(send_Z,left_sensor_W);
+strcat(send_Z,front_sensor_W);
+strcat(send_Z,right_sensor_W);
+strcat(send_Z,X_od_W);
+
+char send_Q[40];
+for (int i =0; i<sizeof(infrared_0_W);i++){
+ send_Q[i]=infrared_0_W[i];
+ }
+strcat(send_Q,infrared_1_W);
+strcat(send_Q,infrared_2_W);
+strcat(send_Q,infrared_3_W);
+strcat(send_Q,infrared_4_W);
+strcat(send_Q,infrared_5_W);
+strcat(send_Q,Y_od_W);
+
+
+
+/////Sending messages//////
+ radio.stopListening();
+ radio.write( &send_Z, sizeof(send_Z));
+ radio.write( &send_Q, sizeof(send_Q) );
+ radio.startListening();
+ }
///////////////////////////////////////////////////////////////////////////////////////////////
@@ -958,70 +878,42 @@
pwm_buzzer.period_us(500);
pwm_buzzer.pulsewidth_us(0);
+
//LED white
pwm_led_whi.period_us(500);
pwm_led_whi.pulsewidth_us(0);
}
-
/**
* Initializes all the pins and all the modules necessary
+ *
+ * @param channel - Which RF channel to comunicate on, 0-125.
+ *\note If you are not using RF module put random number.
+ * \warning Channel on Robot and Board has to be the same.
*/
-void initRobot(void)
-{
+void initRobot(int channel)
+{
+ pc.printf("Battery level: \n\r");
+ init_nRF(channel);
init_robot_pins();
enable_dc_dc_boost();
- init_Infrared();
- initEncoders();
- config_init_nrf();
+ wait_ms(100); //wait for read wait(>=150ms);
enable_dc_dc_boost();
+ measure_always_on();
wait_ms(100); //wait for read wait(>=150ms);
- measure_always_on();
+
+ init_Infrared();
float value = value_of_Batery();
+
+ thread.start(odometry_thread);
+
pc.printf("Initialization Successful \n\r");
pc.printf("Battery level: %f \n\r",value);
if(value < 3.0) {
pc.printf(" WARNING: BATTERY NEEDS CHARGING ");
}
-
// float level = value_of_Batery();
// sendValue(int(level*100));
-}
-
-
-////////////////////////////////////////////////////
-
-/**
- * Updates the position and orientation of the robot based on the data from the encoders
- *
- * Note: Needs to be calibrated for each robot, in this case the radius of the whells is 3.55
- * and the distance between them is 7.4
- */
-void Odometria()
-{
- long int ticks1d=R_encoder();
- long int ticks1e=L_encoder();
-
- long int D_ticks=ticks1d - ticks2d;
- long int E_ticks=ticks1e - ticks2e;
-
- ticks2d=ticks1d;
- ticks2e=ticks1e;
-
- float D_cm= (float)D_ticks*((3.25*3.1415)/4096);
- float L_cm= (float)E_ticks*((3.25*3.1415)/4096);
-
- float CM=(D_cm + L_cm)/2;
-
- theta +=(D_cm - L_cm)/7.18;
-
- theta = atan2(sin(theta), cos(theta));
-
- // meter entre 0
-
- X += CM*cos(theta);
- Y += CM*sin(theta);
-
}
\ No newline at end of file
