ouais ok

Dependents:   roboticLab_withclass_3_July

Fork of ISR_Mini-explorer by ISR UC

Committer:
Ludwigfr
Date:
Tue Jul 11 16:54:58 2017 +0000
Revision:
2:92ca9a6a1d4e
Parent:
1:b81277897a5b
Child:
3:b996cbe5dabd
11/07; 16:54

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ISR 0:15a30802e719 1 /** @file */
ISR 0:15a30802e719 2 //AUTOR: Fernando Pais
ISR 0:15a30802e719 3 //MAIL: ferpais2508@gmail.com
ISR 0:15a30802e719 4 //DATA: 6/6/2016
ISR 0:15a30802e719 5 // VERSÃO 6.4.0
ISR 0:15a30802e719 6 //
ISR 0:15a30802e719 7 //Alterações: Problema de compatibilidade entre encoder e infravermelho resolvido
ISR 0:15a30802e719 8 // Odometria actualizada automaticamente
ISR 0:15a30802e719 9 // Valor da bateria verificado na inicialização
ISR 0:15a30802e719 10 // Motores movem-se de 0 a 1000 para melhor difrenciação
ISR 0:15a30802e719 11 //
ISR 0:15a30802e719 12
ISR 0:15a30802e719 13 //#include "mbed.h"
ISR 0:15a30802e719 14 //#include "init.h"
ISR 0:15a30802e719 15 //#define _USE_MATH_DEFINES
ISR 0:15a30802e719 16 # define M_PI 3.14159265358979323846 /* pi */
ISR 0:15a30802e719 17 #include <math.h>
ISR 0:15a30802e719 18 #include <string.h>
ISR 0:15a30802e719 19 #include "VCNL40x0.h"
ISR 0:15a30802e719 20 #include "nRF24L01P.h"
ISR 0:15a30802e719 21
ISR 0:15a30802e719 22 void Odometria();
Ludwigfr 1:b81277897a5b 23 void OdometriaKalman(float* R_cm, float* L_cm);
ISR 0:15a30802e719 24
ISR 0:15a30802e719 25 // classes adicionais
ISR 0:15a30802e719 26 nRF24L01P my_nrf24l01p(PTD2, PTD3, PTD1, PTC13, PTC12, PTA13);
ISR 0:15a30802e719 27 VCNL40x0 VCNL40x0_Device (PTC9, PTC8, VCNL40x0_ADDRESS);
ISR 0:15a30802e719 28 Timeout timeout;
ISR 0:15a30802e719 29
ISR 0:15a30802e719 30 Serial pc(PTE0,PTE1);
ISR 0:15a30802e719 31 I2C i2c(PTC9,PTC8);
ISR 0:15a30802e719 32 I2C i2c1(PTC11,PTC10);
ISR 0:15a30802e719 33
ISR 0:15a30802e719 34 // Variables needed by the lib
ISR 0:15a30802e719 35 unsigned int ProxiValue=0;
ISR 0:15a30802e719 36 short int prev_R=0;
ISR 0:15a30802e719 37 short int prev_L=0;
ISR 0:15a30802e719 38 long int total_R=0;
ISR 0:15a30802e719 39 long int total_L=0;
ISR 0:15a30802e719 40 long int ticks2d=0;
ISR 0:15a30802e719 41 long int ticks2e=0;
ISR 0:15a30802e719 42 float X=20;
ISR 0:15a30802e719 43 float Y=20;
ISR 0:15a30802e719 44 float AtractX = 0;
ISR 0:15a30802e719 45 float AtractY = 0;
ISR 0:15a30802e719 46 float theta=0;
ISR 0:15a30802e719 47 int sensor_left=0;
ISR 0:15a30802e719 48 int sensor_front=0;
ISR 0:15a30802e719 49 int sensor_right=0;
ISR 0:15a30802e719 50 short int flag=0;
ISR 0:15a30802e719 51 int IRobot=0;
ISR 0:15a30802e719 52 int JRobot=0;
ISR 0:15a30802e719 53
Ludwigfr 2:92ca9a6a1d4e 54 float D_cm=0;
Ludwigfr 2:92ca9a6a1d4e 55 float L_cm=0;
Ludwigfr 2:92ca9a6a1d4e 56
ISR 0:15a30802e719 57 //SAIDAS DIGITAIS (normal)
ISR 0:15a30802e719 58 DigitalOut q_pha_mot_rig (PTE4,0); //Phase Motor Right
ISR 0:15a30802e719 59 DigitalOut q_sleep_mot_rig (PTE3,0); //Nano Sleep Motor Right
ISR 0:15a30802e719 60 DigitalOut q_pha_mot_lef (PTA17,0); //Phase Motor Left
ISR 0:15a30802e719 61 DigitalOut q_sleep_mot_lef (PTB11,0); //Nano Sleep Motor Left
ISR 0:15a30802e719 62 DigitalOut q_pow_ena_i2c_p (PTE2,0); //Power Enable i2c FET P (0- enable 1-disable)
ISR 0:15a30802e719 63 DigitalOut q_pow_ena_mic_p (PTA14,0); //Power enable Micro FET P (0- enable 1-disable)
ISR 0:15a30802e719 64 DigitalOut q_pow_as5600_n (PTC6,1); //AS5600 Power MOSFET N (1- enable 0-disable)
ISR 0:15a30802e719 65 DigitalOut q_pow_as5600_p (PTC5,0); //AS5600 Power MOSFET P (0- enable 1-disable)
ISR 0:15a30802e719 66 DigitalOut q_pow_spi (PTC4,0); //SPI Power MOSFET P (0- enable 1-disable)
ISR 0:15a30802e719 67 DigitalOut q_ena_mppt (PTC0,0); //Enable MPPT Control (0- enable 1-disable)
ISR 0:15a30802e719 68 DigitalOut q_boost_ps (PTC7,1); //Boost Power Save (1- enable 0-disable)
ISR 0:15a30802e719 69 DigitalOut q_tca9548_reset (PTC3,1); //Reset TCA9548 (1- enable 0-disable)
ISR 0:15a30802e719 70 DigitalOut power_36khz (PTD0,0); //Power enable pic12f - 36khz (0- enable 1-disable)
ISR 0:15a30802e719 71
ISR 0:15a30802e719 72
ISR 0:15a30802e719 73 // ********************************************************************
ISR 0:15a30802e719 74 // ********************************************************************
ISR 0:15a30802e719 75 //DEFINIÇÃO DE ENTRADAS E SAIDAS DO ROBOT
ISR 0:15a30802e719 76 //ENTRADAS DIGITAIS (normal input)
ISR 0:15a30802e719 77 DigitalIn i_enc_dir_rig (PTB8); //Encoder Right Direction
ISR 0:15a30802e719 78 DigitalIn i_enc_dir_lef (PTB9); //Encoder Left Direction
ISR 0:15a30802e719 79 DigitalIn i_micro_sd_det (PTC16); //MICRO SD Card Detect
ISR 0:15a30802e719 80 DigitalIn i_mppt_fail (PTE5); //Fail MPPT Signal
ISR 0:15a30802e719 81 DigitalIn i_usb_volt (PTB10); //USB Voltage detect
ISR 0:15a30802e719 82 DigitalIn i_sup_cap_est (PTB19); //Supercap State Charger
ISR 0:15a30802e719 83 DigitalIn i_li_ion_est (PTB18); //Li-ion State Charger
ISR 0:15a30802e719 84
ISR 0:15a30802e719 85
ISR 0:15a30802e719 86 // ********************************************************************
ISR 0:15a30802e719 87 //ENTRADAS DIGITAIS (external interrupt)
ISR 0:15a30802e719 88 InterruptIn i_int_mpu9250 (PTA15); //Interrupt MPU9250
ISR 0:15a30802e719 89 InterruptIn i_int_isl29125 (PTA16); //Interrupt ISL29125 Color S.
ISR 0:15a30802e719 90 InterruptIn i_mic_f_l (PTD7); //Interrupt Comp Micro F L
ISR 0:15a30802e719 91 InterruptIn i_mic_f_r (PTD6); //Interrupt Comp Micro F R
ISR 0:15a30802e719 92 InterruptIn i_mic_r_c (PTD5); //Interrupt Comp Micro R C
ISR 0:15a30802e719 93
ISR 0:15a30802e719 94
ISR 0:15a30802e719 95 // ********************************************************************
ISR 0:15a30802e719 96 //ENTRADAS ANALOGICAS
ISR 0:15a30802e719 97 AnalogIn a_enc_rig (PTC2); //Encoder Left Output_AS_MR
ISR 0:15a30802e719 98 AnalogIn a_enc_lef (PTC1); //Encoder Right Output_AS_ML
ISR 0:15a30802e719 99 AnalogIn a_mic_f_l (PTB0); //Analog microphone F L
ISR 0:15a30802e719 100 AnalogIn a_mic_f_r (PTB1); //Analog microphone F R
ISR 0:15a30802e719 101 AnalogIn a_mic_r_c (PTB2); //Analog microphone R C
ISR 0:15a30802e719 102 AnalogIn a_temp_bat (PTB3); //Temperature Battery
ISR 0:15a30802e719 103
ISR 0:15a30802e719 104
ISR 0:15a30802e719 105 // ********************************************************************
ISR 0:15a30802e719 106
ISR 0:15a30802e719 107 //PWM OR DIGITAL OUTPUT NORMAL
ISR 0:15a30802e719 108 //DigitalOut q_led_whi (PTE29); //Led white pwm
ISR 0:15a30802e719 109 DigitalOut q_led_red_fro (PTA4); //Led Red Front
ISR 0:15a30802e719 110 DigitalOut q_led_gre_fro (PTA5); //Led Green Front
ISR 0:15a30802e719 111 DigitalOut q_led_blu_fro (PTA12); //Led Blue Front
ISR 0:15a30802e719 112 DigitalOut q_led_red_rea (PTD4); //Led Red Rear
ISR 0:15a30802e719 113 DigitalOut q_led_gre_rea (PTA1); //Led Green Rear
ISR 0:15a30802e719 114 DigitalOut q_led_blu_rea (PTA2); //Led Blue Rear
ISR 0:15a30802e719 115
ISR 0:15a30802e719 116
ISR 0:15a30802e719 117 //SAIDAS DIGITAIS (pwm)
ISR 0:15a30802e719 118 PwmOut pwm_mot_rig (PTE20); //PWM Enable Motor Right
ISR 0:15a30802e719 119 PwmOut pwm_mot_lef (PTE31); //PWM Enable Motor Left
ISR 0:15a30802e719 120 PwmOut pwm_buzzer (PTE21); //Buzzer PWM
ISR 0:15a30802e719 121 PwmOut pwm_led_whi (PTE29); //Led white pwm
ISR 0:15a30802e719 122
ISR 0:15a30802e719 123 // ********************************************************************
ISR 0:15a30802e719 124 //SAIDAS ANALOGICAS
ISR 0:15a30802e719 125 AnalogOut dac_comp_mic (PTE30); //Dac_Comparator MIC
ISR 0:15a30802e719 126
ISR 0:15a30802e719 127
ISR 0:15a30802e719 128 /* Powers up all the VCNL4020. */
ISR 0:15a30802e719 129 void init_Infrared()
ISR 0:15a30802e719 130 {
ISR 0:15a30802e719 131 VCNL40x0_Device.SetCurrent (20); // Set current to 200mA
ISR 0:15a30802e719 132 }
ISR 0:15a30802e719 133
ISR 0:15a30802e719 134 /**
ISR 0:15a30802e719 135 * Selects the wich infrared to comunicate.
ISR 0:15a30802e719 136 *
ISR 0:15a30802e719 137 * @param ch - Infrared to read (1..5)
ISR 0:15a30802e719 138 */
ISR 0:15a30802e719 139 void tca9548_select_ch(char ch)
ISR 0:15a30802e719 140 {
ISR 0:15a30802e719 141 char ch_f[1];
ISR 0:15a30802e719 142 char addr=0xE0;
ISR 0:15a30802e719 143
ISR 0:15a30802e719 144 if(ch==0)
ISR 0:15a30802e719 145 ch_f[0]=1;
ISR 0:15a30802e719 146
ISR 0:15a30802e719 147 if(ch>=1)
ISR 0:15a30802e719 148 ch_f[0]=1<<ch;
ISR 0:15a30802e719 149
ISR 0:15a30802e719 150 i2c.start();
ISR 0:15a30802e719 151 i2c.write(addr,ch_f,1);
ISR 0:15a30802e719 152 i2c.stop();
ISR 0:15a30802e719 153 }
ISR 0:15a30802e719 154
ISR 0:15a30802e719 155
ISR 0:15a30802e719 156 /**
ISR 0:15a30802e719 157 * Get ADC value of the chosen infrared.
ISR 0:15a30802e719 158 *
ISR 0:15a30802e719 159 * @param ch - Infrared to read (1..5)
ISR 0:15a30802e719 160 *
ISR 0:15a30802e719 161 * Note: for the values of ch it reads (0-right, ... ,4-left, 5-back)
ISR 0:15a30802e719 162 */
ISR 0:15a30802e719 163 long int read_Infrared(char ch) // 0-direita 4-esquerda 5-tras
ISR 0:15a30802e719 164 {
ISR 0:15a30802e719 165 tca9548_select_ch(ch);
ISR 0:15a30802e719 166 VCNL40x0_Device.ReadProxiOnDemand (&ProxiValue); // read prox value on demand
ISR 0:15a30802e719 167
ISR 0:15a30802e719 168 return ProxiValue;
ISR 0:15a30802e719 169 }
ISR 0:15a30802e719 170
ISR 0:15a30802e719 171 ///////////////////////////////////////////////////////////////////////////////////////////////
ISR 0:15a30802e719 172 /////////////////////////////////// MOTOR ///////////////////////////////////////////
ISR 0:15a30802e719 173 ///////////////////////////////////////////////////////////////////////////////////////////////
ISR 0:15a30802e719 174
ISR 0:15a30802e719 175 // Calculo do Duty tem de ser revisto, o motor aguenta 6 V e o max definido aqui ronda os 4.2 V
ISR 0:15a30802e719 176 // consultar pag 39 e 95
ISR 0:15a30802e719 177
ISR 0:15a30802e719 178 /**
ISR 0:15a30802e719 179 * Sets speed and direction of the left motor.
ISR 0:15a30802e719 180 *
ISR 0:15a30802e719 181 * @param Dir - Direction of movement, 0 for back, or 1 for fron
ISR 0:15a30802e719 182 * @param Speed - Percentage of speed of the motor (1..100)
ISR 0:15a30802e719 183 *
ISR 0:15a30802e719 184 * Note: Because of differences in the motors they need to be calibrated, test the robot going front and back
ISR 0:15a30802e719 185 * at different speeds and see if it makes a straigth line
ISR 0:15a30802e719 186 */
ISR 0:15a30802e719 187 void leftMotor(short int Dir,short int Speed)
ISR 0:15a30802e719 188 {
ISR 0:15a30802e719 189 float Duty;
ISR 0:15a30802e719 190
ISR 0:15a30802e719 191 if(Dir==1) {
ISR 0:15a30802e719 192 q_pha_mot_lef=0; //Andar em frente
ISR 0:15a30802e719 193 if(Speed>1000) //limite de segurança
ISR 0:15a30802e719 194 Speed=1000;
ISR 0:15a30802e719 195 if(Speed>0) {
ISR 0:15a30802e719 196 Duty=Speed*.082 +35; // 35 = minimo para o motor rodar
ISR 0:15a30802e719 197 q_sleep_mot_lef=1; //Nano Sleep Motor Left
ISR 0:15a30802e719 198 pwm_mot_lef.pulsewidth_us(Duty*5);
ISR 0:15a30802e719 199 } else {
ISR 0:15a30802e719 200 q_sleep_mot_lef=0;
ISR 0:15a30802e719 201 }
ISR 0:15a30802e719 202 }
ISR 0:15a30802e719 203 if(Dir==0) {
ISR 0:15a30802e719 204 q_pha_mot_lef=1; //Andar para tras
ISR 0:15a30802e719 205
ISR 0:15a30802e719 206 if(Speed>1000) //limite de segurança
ISR 0:15a30802e719 207 Speed=1000;
ISR 0:15a30802e719 208 if(Speed>0) {
ISR 0:15a30802e719 209 Duty=Speed*.082 +35; // 35 = minimo para o motor rodar
ISR 0:15a30802e719 210 q_sleep_mot_lef=1; //Nano Sleep Motor Left
ISR 0:15a30802e719 211 pwm_mot_lef.pulsewidth_us(Duty*5);
ISR 0:15a30802e719 212 } else {
ISR 0:15a30802e719 213 q_sleep_mot_lef=0;
ISR 0:15a30802e719 214 }
ISR 0:15a30802e719 215 }
ISR 0:15a30802e719 216 }
ISR 0:15a30802e719 217
ISR 0:15a30802e719 218
ISR 0:15a30802e719 219 /**
ISR 0:15a30802e719 220 * Sets speed and direction of the right motor.
ISR 0:15a30802e719 221 *
ISR 0:15a30802e719 222 * @param Dir - Direction of movement, 0 for back, or 1 for fron
ISR 0:15a30802e719 223 * @param Speed - Percentage of speed of the motor (1..100)
ISR 0:15a30802e719 224 *
ISR 0:15a30802e719 225 * Note: Because of differences in the motors they need to be calibrated, test the robot going front and back
ISR 0:15a30802e719 226 * at different speeds and see if it makes a straigth line
ISR 0:15a30802e719 227 */
ISR 0:15a30802e719 228 void rightMotor(short int Dir,short int Speed)
ISR 0:15a30802e719 229 {
ISR 0:15a30802e719 230 float Duty;
ISR 0:15a30802e719 231
ISR 0:15a30802e719 232 if(Dir==1) {
ISR 0:15a30802e719 233 q_pha_mot_rig=0; //Andar em frente
ISR 0:15a30802e719 234
ISR 0:15a30802e719 235 if(Speed>1000) //limite de segurança
ISR 0:15a30802e719 236 Speed=1000;
ISR 0:15a30802e719 237 if(Speed>0) {
ISR 0:15a30802e719 238 Duty=Speed*.082 +35; // 35 = minimo para o motor rodar
ISR 0:15a30802e719 239 q_sleep_mot_rig=1; //Nano Sleep Motor Right
ISR 0:15a30802e719 240 pwm_mot_rig.pulsewidth_us(Duty*5);
ISR 0:15a30802e719 241 } else {
ISR 0:15a30802e719 242 q_sleep_mot_rig=0;
ISR 0:15a30802e719 243 }
ISR 0:15a30802e719 244 }
ISR 0:15a30802e719 245 if(Dir==0) {
ISR 0:15a30802e719 246 q_pha_mot_rig=1; //Andar para tras
ISR 0:15a30802e719 247
ISR 0:15a30802e719 248
ISR 0:15a30802e719 249 if(Speed>1000) //limite de segurança
ISR 0:15a30802e719 250 Speed=1000;
ISR 0:15a30802e719 251 if(Speed>0) {
ISR 0:15a30802e719 252 Duty=Speed*.082 +35; // 35 = minimo para o motor rodar
ISR 0:15a30802e719 253 q_sleep_mot_rig=1; //Nano Sleep Motor Right
ISR 0:15a30802e719 254 pwm_mot_rig.pulsewidth_us(Duty*5);
ISR 0:15a30802e719 255 } else {
ISR 0:15a30802e719 256 q_sleep_mot_rig=0;
ISR 0:15a30802e719 257 }
ISR 0:15a30802e719 258 }
ISR 0:15a30802e719 259 }
ISR 0:15a30802e719 260
ISR 0:15a30802e719 261
ISR 0:15a30802e719 262 ///////////////////////////////////////////////////////////////////////////////////////////////
ISR 0:15a30802e719 263 /////////////////////////////////// ENCODER ///////////////////////////////////////////
ISR 0:15a30802e719 264 ///////////////////////////////////////////////////////////////////////////////////////////////
ISR 0:15a30802e719 265
ISR 0:15a30802e719 266 /**
ISR 0:15a30802e719 267 * Reads Position of left magnetic encoder.
ISR 0:15a30802e719 268 *
ISR 0:15a30802e719 269 * @return The absolute position of the left wheel encoder (0..4095)
ISR 0:15a30802e719 270 */
ISR 0:15a30802e719 271 long int read_L_encoder()
ISR 0:15a30802e719 272 {
ISR 0:15a30802e719 273
ISR 0:15a30802e719 274 char data_r_2[5];
ISR 0:15a30802e719 275
ISR 0:15a30802e719 276 i2c.start();
ISR 0:15a30802e719 277 i2c.write(0x6C);
ISR 0:15a30802e719 278 i2c.write(0x0C);
ISR 0:15a30802e719 279 i2c.read(0x6D,data_r_2,4,0);
ISR 0:15a30802e719 280 i2c.stop();
ISR 0:15a30802e719 281
ISR 0:15a30802e719 282 short int val1=data_r_2[0];
ISR 0:15a30802e719 283 short int val2=data_r_2[1];
ISR 0:15a30802e719 284 val1=(val1&0xf)*256;
ISR 0:15a30802e719 285 long int final=(val2+val1);
ISR 0:15a30802e719 286
ISR 0:15a30802e719 287 return final;
ISR 0:15a30802e719 288 }
ISR 0:15a30802e719 289
ISR 0:15a30802e719 290
ISR 0:15a30802e719 291 /**
ISR 0:15a30802e719 292 * Reads Position of right magnetic encoder.
ISR 0:15a30802e719 293 *
ISR 0:15a30802e719 294 * @return The absolute position of the right wheel encoder (0..4095)
ISR 0:15a30802e719 295 */
ISR 0:15a30802e719 296 long int read_R_encoder()
ISR 0:15a30802e719 297 {
ISR 0:15a30802e719 298
ISR 0:15a30802e719 299 char data_r_2[5];
ISR 0:15a30802e719 300
ISR 0:15a30802e719 301 i2c1.start();
ISR 0:15a30802e719 302 i2c1.write(0x6C);
ISR 0:15a30802e719 303 i2c1.write(0x0C);
ISR 0:15a30802e719 304 i2c1.read(0x6D,data_r_2,4,0);
ISR 0:15a30802e719 305 i2c1.stop();
ISR 0:15a30802e719 306
ISR 0:15a30802e719 307 short int val1=data_r_2[0];
ISR 0:15a30802e719 308 short int val2=data_r_2[1];
ISR 0:15a30802e719 309 val1=(val1&0xf)*256;
ISR 0:15a30802e719 310 long int final=(val2+val1);
ISR 0:15a30802e719 311
ISR 0:15a30802e719 312 return final;
ISR 0:15a30802e719 313 }
ISR 0:15a30802e719 314
ISR 0:15a30802e719 315
ISR 0:15a30802e719 316 /**
ISR 0:15a30802e719 317 * Calculates and returns the value of the right "incremental" encoder.
ISR 0:15a30802e719 318 *
ISR 0:15a30802e719 319 * @return The value of "tics" of the right encoder since it was initialized
ISR 0:15a30802e719 320 */
ISR 0:15a30802e719 321 long int incremental_R_encoder()
ISR 0:15a30802e719 322 {
ISR 0:15a30802e719 323 short int next_R=read_R_encoder(); // Reads curent value of the encoder
ISR 0:15a30802e719 324 short int dif=next_R-prev_R; // Calculates the diference from last reading
ISR 0:15a30802e719 325
ISR 0:15a30802e719 326 if(dif>3000) { // Going back and pass zero
ISR 0:15a30802e719 327 total_R=total_R-4096+dif;
ISR 0:15a30802e719 328 }
ISR 0:15a30802e719 329 if(dif<3000&&dif>0) { // Going front
ISR 0:15a30802e719 330 total_R=total_R+dif;
ISR 0:15a30802e719 331 }
ISR 0:15a30802e719 332 if(dif<-3000) { // Going front and pass zero
ISR 0:15a30802e719 333 total_R=total_R+4096+dif;
ISR 0:15a30802e719 334 }
ISR 0:15a30802e719 335 if(dif>-3000&&dif<0) { // going back
ISR 0:15a30802e719 336 total_R=total_R+dif;
ISR 0:15a30802e719 337 }
ISR 0:15a30802e719 338 prev_R=next_R; // Sets last reading for next iteration
ISR 0:15a30802e719 339
ISR 0:15a30802e719 340 return total_R;
ISR 0:15a30802e719 341 }
ISR 0:15a30802e719 342
ISR 0:15a30802e719 343
ISR 0:15a30802e719 344 /**
ISR 0:15a30802e719 345 * Calculates and returns the value of the left "incremental" encoder.
ISR 0:15a30802e719 346 *
ISR 0:15a30802e719 347 * @return The value of "tics" of the left encoder since it was initialized
ISR 0:15a30802e719 348 */
ISR 0:15a30802e719 349 long int incremental_L_encoder()
ISR 0:15a30802e719 350 {
ISR 0:15a30802e719 351 short int next_L=read_L_encoder(); // Reads curent value of the encoder
ISR 0:15a30802e719 352 short int dif=-next_L+prev_L; // Calculates the diference from last reading
ISR 0:15a30802e719 353
ISR 0:15a30802e719 354 if(dif>3000) { // Going back and pass zero
ISR 0:15a30802e719 355 total_L=total_L-4096+dif;
ISR 0:15a30802e719 356 }
ISR 0:15a30802e719 357 if(dif<3000&&dif>0) { // Going front
ISR 0:15a30802e719 358 total_L=total_L+dif;
ISR 0:15a30802e719 359 }
ISR 0:15a30802e719 360 if(dif<-3000) { // Going front and pass zero
ISR 0:15a30802e719 361 total_L=total_L+4096+dif;
ISR 0:15a30802e719 362 }
ISR 0:15a30802e719 363 if(dif>-3000&&dif<0) { // going back
ISR 0:15a30802e719 364 total_L=total_L+dif;
ISR 0:15a30802e719 365 }
ISR 0:15a30802e719 366 prev_L=next_L; // Sets last reading for next iteration
ISR 0:15a30802e719 367
ISR 0:15a30802e719 368 return total_L;
ISR 0:15a30802e719 369 }
ISR 0:15a30802e719 370
ISR 0:15a30802e719 371
ISR 0:15a30802e719 372 /**
ISR 0:15a30802e719 373 * Calculate the value of both encoder "incremental" every 10 ms.
ISR 0:15a30802e719 374 */
ISR 0:15a30802e719 375 void timer_event() //10ms interrupt
ISR 0:15a30802e719 376 {
ISR 0:15a30802e719 377 timeout.attach(&timer_event,0.01);
ISR 0:15a30802e719 378 if(flag==0) {
ISR 0:15a30802e719 379 incremental_R_encoder();
ISR 0:15a30802e719 380 incremental_L_encoder();
ISR 0:15a30802e719 381 }
ISR 0:15a30802e719 382 Odometria();
ISR 0:15a30802e719 383
ISR 0:15a30802e719 384 return;
ISR 0:15a30802e719 385 }
ISR 0:15a30802e719 386
ISR 0:15a30802e719 387
ISR 0:15a30802e719 388 /**
ISR 0:15a30802e719 389 * Set the initial position for the "incremental" enconder and "starts" them.
ISR 0:15a30802e719 390 */
ISR 0:15a30802e719 391 void initEncoders()
ISR 0:15a30802e719 392 {
ISR 0:15a30802e719 393 prev_R=read_R_encoder();
ISR 0:15a30802e719 394 prev_L=read_L_encoder();
ISR 0:15a30802e719 395 timeout.attach(&timer_event,0.01);
ISR 0:15a30802e719 396 }
ISR 0:15a30802e719 397
ISR 0:15a30802e719 398
ISR 0:15a30802e719 399 /**
ISR 0:15a30802e719 400 * Returns to the user the value of the right "incremental" encoder.
ISR 0:15a30802e719 401 *
ISR 0:15a30802e719 402 * @return The value of "tics" of the right encoder since it was initialized
ISR 0:15a30802e719 403 */
ISR 0:15a30802e719 404 long int R_encoder()
ISR 0:15a30802e719 405 {
ISR 0:15a30802e719 406 wait(0.0001);
ISR 0:15a30802e719 407
ISR 0:15a30802e719 408 return total_R;
ISR 0:15a30802e719 409 }
ISR 0:15a30802e719 410
ISR 0:15a30802e719 411 /**
ISR 0:15a30802e719 412 * Returns to the user the value of the right "incremental" encoder.
ISR 0:15a30802e719 413 *
ISR 0:15a30802e719 414 * @return The value of "tics" of the right encoder since it was initialized
ISR 0:15a30802e719 415 */
ISR 0:15a30802e719 416 long int L_encoder()
ISR 0:15a30802e719 417 {
ISR 0:15a30802e719 418 wait(0.0001);
ISR 0:15a30802e719 419
ISR 0:15a30802e719 420 return total_L;
ISR 0:15a30802e719 421 }
ISR 0:15a30802e719 422
ISR 0:15a30802e719 423
ISR 0:15a30802e719 424 ///////////////////////////////////////////////////////////////////////////////////////////////
ISR 0:15a30802e719 425 /////////////////////////////////// BATTERY ///////////////////////////////////////////
ISR 0:15a30802e719 426 ///////////////////////////////////////////////////////////////////////////////////////////////
ISR 0:15a30802e719 427
ISR 0:15a30802e719 428 /**
ISR 0:15a30802e719 429 * Reads adc of the battery.
ISR 0:15a30802e719 430 *
ISR 0:15a30802e719 431 * @param addr - Address to read
ISR 0:15a30802e719 432 * @return The voltage of the batery
ISR 0:15a30802e719 433 */
ISR 0:15a30802e719 434 long int read16_mcp3424(char addr)
ISR 0:15a30802e719 435 {
ISR 0:15a30802e719 436 char data[4];
ISR 0:15a30802e719 437 i2c1.start();
ISR 0:15a30802e719 438 i2c1.read(addr,data,3);
ISR 0:15a30802e719 439 i2c1.stop();
ISR 0:15a30802e719 440
ISR 0:15a30802e719 441 return(((data[0]&127)*256)+data[1]);
ISR 0:15a30802e719 442 }
ISR 0:15a30802e719 443
ISR 0:15a30802e719 444 /**
ISR 0:15a30802e719 445 * Reads adc of the battery.
ISR 0:15a30802e719 446 *
ISR 0:15a30802e719 447 * @param n_bits - Resolution of measure
ISR 0:15a30802e719 448 * @param ch - Chose value to read, if voltage or current of solar or batery
ISR 0:15a30802e719 449 * @param gain -
ISR 0:15a30802e719 450 * @param addr - Address to write to
ISR 0:15a30802e719 451 */
ISR 0:15a30802e719 452 void write_mcp3424(int n_bits, int ch, int gain, char addr) //chanel 1-4 write -> 0xD0
ISR 0:15a30802e719 453 {
ISR 0:15a30802e719 454
ISR 0:15a30802e719 455 int chanel_end=(ch-1)<<5; //shift left
ISR 0:15a30802e719 456 char n_bits_end=0;
ISR 0:15a30802e719 457
ISR 0:15a30802e719 458 if(n_bits==12) {
ISR 0:15a30802e719 459 n_bits_end=0;
ISR 0:15a30802e719 460 } else if(n_bits==14) {
ISR 0:15a30802e719 461 n_bits_end=1;
ISR 0:15a30802e719 462 } else if(n_bits==16) {
ISR 0:15a30802e719 463 n_bits_end=2;
ISR 0:15a30802e719 464 } else {
ISR 0:15a30802e719 465 n_bits_end=3;
ISR 0:15a30802e719 466 }
ISR 0:15a30802e719 467 n_bits_end=n_bits_end<<2; //shift left
ISR 0:15a30802e719 468
ISR 0:15a30802e719 469 char data[1];
ISR 0:15a30802e719 470 data[0]= (char)chanel_end | (char)n_bits_end | (char)(gain-1) | 128;
ISR 0:15a30802e719 471 i2c1.start();
ISR 0:15a30802e719 472 i2c1.write(addr,data,1);
ISR 0:15a30802e719 473 i2c1.stop();
ISR 0:15a30802e719 474 }
ISR 0:15a30802e719 475
ISR 0:15a30802e719 476
ISR 0:15a30802e719 477 /**
ISR 0:15a30802e719 478 * Reads adc of the battery.
ISR 0:15a30802e719 479 *
ISR 0:15a30802e719 480 * @return The voltage of the batery
ISR 0:15a30802e719 481 */
ISR 0:15a30802e719 482 float value_of_Batery()
ISR 0:15a30802e719 483 {
ISR 0:15a30802e719 484 float R1=75000.0;
ISR 0:15a30802e719 485 float R2=39200.0;
ISR 0:15a30802e719 486 float R3=178000.0;
ISR 0:15a30802e719 487 float Gain=1.0;
ISR 0:15a30802e719 488 write_mcp3424(16,3,1,0xd8);
ISR 0:15a30802e719 489 float cha3_v2=read16_mcp3424(0xd9); //read voltage
ISR 0:15a30802e719 490 float Vin_v_battery=(((cha3_v2*2.048)/32767))/Gain;
ISR 0:15a30802e719 491 float Vin_b_v_battery=(-((-Vin_v_battery)*(R1*R2 + R1*R3 + R2*R3))/(R1*R2));
ISR 0:15a30802e719 492 Vin_b_v_battery=(Vin_b_v_battery-0.0)*1.00268;
ISR 0:15a30802e719 493
ISR 0:15a30802e719 494 return Vin_b_v_battery;
ISR 0:15a30802e719 495 }
ISR 0:15a30802e719 496
ISR 0:15a30802e719 497 ///////////////////////////////////////////////////////////////////////////////////////////////
ISR 0:15a30802e719 498 /////////////////////////////// RF COMUNICATION ///////////////////////////////////////
ISR 0:15a30802e719 499 ///////////////////////////////////////////////////////////////////////////////////////////////
ISR 0:15a30802e719 500
ISR 0:15a30802e719 501
ISR 0:15a30802e719 502 /**
ISR 0:15a30802e719 503 * Initializes the NRF24 module for comunication.
ISR 0:15a30802e719 504 *
ISR 0:15a30802e719 505 * Note: if the module is broken or badly connected this init will cause the code to stop,
ISR 0:15a30802e719 506 * if all these messages don't appear thats the case
ISR 0:15a30802e719 507 */
ISR 0:15a30802e719 508 void config_init_nrf()
ISR 0:15a30802e719 509 {
ISR 0:15a30802e719 510 my_nrf24l01p.powerUp(); // powers module
ISR 0:15a30802e719 511 my_nrf24l01p.setRfFrequency (2400); // channel 0 (2400-0 ... 2516-116)
ISR 0:15a30802e719 512 my_nrf24l01p.setTransferSize(10); // number of bytes to be transfer
ISR 0:15a30802e719 513 my_nrf24l01p.setCrcWidth(8);
ISR 0:15a30802e719 514 my_nrf24l01p.enableAutoAcknowledge(NRF24L01P_PIPE_P0); // pipe where data transfer occurs (0..6)
ISR 0:15a30802e719 515 pc.printf( "nRF24L01+ Frequency : %d MHz\r\n", my_nrf24l01p.getRfFrequency() );
ISR 0:15a30802e719 516 pc.printf( "nRF24L01+ Data Rate : %d kbps\r\n", my_nrf24l01p.getAirDataRate() );
ISR 0:15a30802e719 517 pc.printf( "nRF24L01+ TX Address : 0x%010llX\r\n", my_nrf24l01p.getTxAddress() );
ISR 0:15a30802e719 518 pc.printf( "nRF24L01+ RX Address : 0x%010llX\r\n", my_nrf24l01p.getRxAddress() );
ISR 0:15a30802e719 519 pc.printf( "nRF24L01+ CrC Width : %d CrC\r\n", my_nrf24l01p.getCrcWidth() );
ISR 0:15a30802e719 520 pc.printf( "nRF24L01+ TransferSize : %d Paket Size\r\n", my_nrf24l01p.getTransferSize () );
ISR 0:15a30802e719 521 my_nrf24l01p.setReceiveMode();
ISR 0:15a30802e719 522 my_nrf24l01p.enable();
ISR 0:15a30802e719 523 pc.printf( "Setup complete, Starting While loop\r\n");
ISR 0:15a30802e719 524 }
ISR 0:15a30802e719 525
ISR 0:15a30802e719 526
ISR 0:15a30802e719 527 /**
ISR 0:15a30802e719 528 * Receives a number from the Arduino.
ISR 0:15a30802e719 529 *
ISR 0:15a30802e719 530 * @return The value send by the arduino
ISR 0:15a30802e719 531 */
ISR 0:15a30802e719 532 double receiveValue(void)
ISR 0:15a30802e719 533 {
ISR 0:15a30802e719 534 char temp[4];
ISR 0:15a30802e719 535 double Val;
ISR 0:15a30802e719 536 bool ok=0;
ISR 0:15a30802e719 537 my_nrf24l01p.setTransferSize(4);
ISR 0:15a30802e719 538 my_nrf24l01p.setReceiveMode();
ISR 0:15a30802e719 539 my_nrf24l01p.enable();
ISR 0:15a30802e719 540 do {
ISR 0:15a30802e719 541 if(my_nrf24l01p.readable(NRF24L01P_PIPE_P0)) {
ISR 0:15a30802e719 542 ok = my_nrf24l01p.read( NRF24L01P_PIPE_P0,temp, 4);
ISR 0:15a30802e719 543 }
ISR 0:15a30802e719 544 } while(ok==0);
ISR 0:15a30802e719 545
ISR 0:15a30802e719 546 //transformation of temp to convert to original value
ISR 0:15a30802e719 547 if(temp[0]==0) // if first elemente is 0 then its negative
ISR 0:15a30802e719 548 Val = double(-(int(temp[1])+int(temp[2])*255+int(temp[3])*255*255));
ISR 0:15a30802e719 549 else // else its positive
ISR 0:15a30802e719 550 Val = double(int(temp[1])+int(temp[2])*255+int(temp[3])*255*255);
ISR 0:15a30802e719 551
ISR 0:15a30802e719 552 return Val;
ISR 0:15a30802e719 553 }
ISR 0:15a30802e719 554
ISR 0:15a30802e719 555
ISR 0:15a30802e719 556 /**
ISR 0:15a30802e719 557 * Sends a number to the Arduino
ISR 0:15a30802e719 558 *
ISR 0:15a30802e719 559 * @param Value - number to be sent to the Arduino
ISR 0:15a30802e719 560 */
ISR 0:15a30802e719 561 void sendValue(long int Value)
ISR 0:15a30802e719 562 {
ISR 0:15a30802e719 563 bool ok=0; // comunication sucess, o if failed 1 if sucessfull
ISR 0:15a30802e719 564 // double math=Value/65025; // temporary variable save results
ISR 0:15a30802e719 565 int zero=1; // 1 byte, ( - ) if 0 ( + ) if 1
ISR 0:15a30802e719 566 int one=0; // 2 byte (0..255), multiplied by 1
ISR 0:15a30802e719 567 int two=0; // 3 byte (0..255), multiplied by 255
ISR 0:15a30802e719 568 int three=0; // 4 byte (0..255), multiplied by 255*255
ISR 0:15a30802e719 569
ISR 0:15a30802e719 570 //transformation of Value to send correctly through pipe
ISR 0:15a30802e719 571 if (Value<0) {
ISR 0:15a30802e719 572 zero=0;
ISR 0:15a30802e719 573 Value=abs(Value);
ISR 0:15a30802e719 574 }
ISR 0:15a30802e719 575 // Value=abs(Value);
ISR 0:15a30802e719 576
ISR 0:15a30802e719 577 double math=Value/65025; // temporary variable save results
ISR 0:15a30802e719 578
ISR 0:15a30802e719 579 if(math<1) {
ISR 0:15a30802e719 580 math=Value/255;
ISR 0:15a30802e719 581 if(math<1) {
ISR 0:15a30802e719 582 two=0;
ISR 0:15a30802e719 583 one=Value;
ISR 0:15a30802e719 584 } else {
ISR 0:15a30802e719 585 two=(int)math;
ISR 0:15a30802e719 586 one=Value % 255;
ISR 0:15a30802e719 587 }
ISR 0:15a30802e719 588 } else {
ISR 0:15a30802e719 589 three=(int)math;
ISR 0:15a30802e719 590 math=Value/255;
ISR 0:15a30802e719 591 if(math<1) {
ISR 0:15a30802e719 592 two=0;
ISR 0:15a30802e719 593 one=Value;
ISR 0:15a30802e719 594 } else {
ISR 0:15a30802e719 595 two=(int)math;
ISR 0:15a30802e719 596 one=Value % 255;
ISR 0:15a30802e719 597 }
ISR 0:15a30802e719 598 }
ISR 0:15a30802e719 599 char temp[4]= {(int)zero,(int)one,(int)two,(int)three};
ISR 0:15a30802e719 600
ISR 0:15a30802e719 601 // Apagar depois de testar mais vezes
ISR 0:15a30802e719 602 // pc.printf("1 inidice...%i...\r", temp[0]);
ISR 0:15a30802e719 603 // pc.printf("2 inidice...%i...\r", temp[1]);
ISR 0:15a30802e719 604 // pc.printf("3 inidice...%i...\r", temp[2]);
ISR 0:15a30802e719 605 // pc.printf("4 inidice...%i...\r", temp[3]);
ISR 0:15a30802e719 606
ISR 0:15a30802e719 607 my_nrf24l01p.setTransferSize(4);
ISR 0:15a30802e719 608 my_nrf24l01p.setTransmitMode();
ISR 0:15a30802e719 609 my_nrf24l01p.enable();
ISR 0:15a30802e719 610 do {
ISR 0:15a30802e719 611 ok = my_nrf24l01p.write( NRF24L01P_PIPE_P0,temp, 4);
ISR 0:15a30802e719 612 if(ok==1)
ISR 0:15a30802e719 613 pc.printf("Done.....%i...\r", Value);
ISR 0:15a30802e719 614 else {
ISR 0:15a30802e719 615 pc.printf("Failed\r");
ISR 0:15a30802e719 616 wait(1);
ISR 0:15a30802e719 617 }
ISR 0:15a30802e719 618 } while(ok==0);
ISR 0:15a30802e719 619 }
ISR 0:15a30802e719 620
ISR 0:15a30802e719 621 /**
ISR 0:15a30802e719 622 * Sends matrix to arduino.
ISR 0:15a30802e719 623 *
ISR 0:15a30802e719 624 * @param matrix - Matrix of numbers to send [0..255]
ISR 0:15a30802e719 625 * @param row - Number of rows
ISR 0:15a30802e719 626 * @param column - Number of columns
ISR 0:15a30802e719 627 */
ISR 0:15a30802e719 628 void sendMatrix(int (*matrix)[18],int row , int column)
ISR 0:15a30802e719 629 {
ISR 0:15a30802e719 630 short ok=0;
ISR 0:15a30802e719 631 short int i =0;
ISR 0:15a30802e719 632 short int j=0;
ISR 0:15a30802e719 633 short int byte=0;
ISR 0:15a30802e719 634 int members=column*row;
ISR 0:15a30802e719 635 char message[32]= {0};
ISR 0:15a30802e719 636 pc.printf("J ...%d... \r",members);
ISR 0:15a30802e719 637
ISR 0:15a30802e719 638 my_nrf24l01p.setTransferSize(32);
ISR 0:15a30802e719 639 my_nrf24l01p.setTransmitMode();
ISR 0:15a30802e719 640 my_nrf24l01p.enable();
ISR 0:15a30802e719 641
ISR 0:15a30802e719 642 do {
ISR 0:15a30802e719 643 int* point = matrix[j];
ISR 0:15a30802e719 644
ISR 0:15a30802e719 645 do {
ISR 0:15a30802e719 646 message[byte]= point[i];
ISR 0:15a30802e719 647 if (byte==31 || (i+1)*(j+1)==members) {
ISR 0:15a30802e719 648
ISR 0:15a30802e719 649 do {
ISR 0:15a30802e719 650 ok = my_nrf24l01p.write( NRF24L01P_PIPE_P0,message, 32);
ISR 0:15a30802e719 651 if(ok==0)
ISR 0:15a30802e719 652 wait(1);
ISR 0:15a30802e719 653
ISR 0:15a30802e719 654 } while(ok==0);
ISR 0:15a30802e719 655
ISR 0:15a30802e719 656 byte=-1;
ISR 0:15a30802e719 657 }
ISR 0:15a30802e719 658
ISR 0:15a30802e719 659 byte++;
ISR 0:15a30802e719 660 i++;
ISR 0:15a30802e719 661
ISR 0:15a30802e719 662 } while(i<column);
ISR 0:15a30802e719 663
ISR 0:15a30802e719 664 i=0;
ISR 0:15a30802e719 665 j++;
ISR 0:15a30802e719 666 } while(j<row);
ISR 0:15a30802e719 667
ISR 0:15a30802e719 668 }
ISR 0:15a30802e719 669
ISR 0:15a30802e719 670 ///////////////////////////////////////////////////////////////////////////////////////////////
ISR 0:15a30802e719 671 ////////////////////////////////// Sonar ////////////////////////////////////////////
ISR 0:15a30802e719 672 ///////////////////////////////////////////////////////////////////////////////////////////////
ISR 0:15a30802e719 673 // Commands of operation with ultrasonic module
ISR 0:15a30802e719 674
ISR 0:15a30802e719 675 // WRITE OPTION:
ISR 0:15a30802e719 676 // ENABLE DC DC CONVERTER - 0x0C;
ISR 0:15a30802e719 677 // DISABLE DC DC CONVERTER - 0x0B;
ISR 0:15a30802e719 678 // START MEASURE LEFT SENSOR - 0x0A;
ISR 0:15a30802e719 679 // START MEASURE FRONT SENSOR - 0x09;
ISR 0:15a30802e719 680 // START MEASURE RIGHT SENSOR - 0x08;
ISR 0:15a30802e719 681 // SENSORS ALWAYS MEASURE ON - 0x07;
ISR 0:15a30802e719 682 // SENSORS ALWAYS MEASURE OFF - 0x06;
ISR 0:15a30802e719 683
ISR 0:15a30802e719 684 // READ OPTION:
ISR 0:15a30802e719 685 // GET MEASURE OF LEFT SENSOR - 0x05;
ISR 0:15a30802e719 686 // GET MEASURE OF FRONT SENSOR - 0x04;
ISR 0:15a30802e719 687 // GET MEASURE OF IGHT SENSOR - 0x03;
ISR 0:15a30802e719 688 // GET STATUS SENSORS ALWAYS MEASURE - 0x02;
ISR 0:15a30802e719 689 // GET STATUS DC DC CONVERTER - 0x01;
ISR 0:15a30802e719 690
ISR 0:15a30802e719 691 void enable_dc_dc_boost()
ISR 0:15a30802e719 692 {
ISR 0:15a30802e719 693 char data[1];
ISR 0:15a30802e719 694 data[0]= 0x0C;
ISR 0:15a30802e719 695 wait_ms(1);
ISR 0:15a30802e719 696 i2c1.start();
ISR 0:15a30802e719 697 i2c1.write(0x30,data,1);
ISR 0:15a30802e719 698 i2c1.stop();
ISR 0:15a30802e719 699 i2c1.start();
ISR 0:15a30802e719 700 i2c1.write(0x30,data,1);
ISR 0:15a30802e719 701 i2c1.stop();
ISR 0:15a30802e719 702 }
ISR 0:15a30802e719 703
ISR 0:15a30802e719 704
ISR 0:15a30802e719 705 void disable_dc_dc_boost()
ISR 0:15a30802e719 706 {
ISR 0:15a30802e719 707 char data[1];
ISR 0:15a30802e719 708 data[0]= 0x0B;
ISR 0:15a30802e719 709 wait_ms(1);
ISR 0:15a30802e719 710 i2c1.start();
ISR 0:15a30802e719 711 i2c1.write(0x30,data,1);
ISR 0:15a30802e719 712 i2c1.stop();
ISR 0:15a30802e719 713 }
ISR 0:15a30802e719 714
ISR 0:15a30802e719 715
ISR 0:15a30802e719 716 void start_read_left_sensor()
ISR 0:15a30802e719 717 {
ISR 0:15a30802e719 718 char data[1];
ISR 0:15a30802e719 719 data[0]= 0x0A;
ISR 0:15a30802e719 720 wait_ms(1);
ISR 0:15a30802e719 721 i2c1.start();
ISR 0:15a30802e719 722 i2c1.write(0x30,data,1);
ISR 0:15a30802e719 723 i2c1.stop();
ISR 0:15a30802e719 724 }
ISR 0:15a30802e719 725
ISR 0:15a30802e719 726
ISR 0:15a30802e719 727 void start_read_front_sensor()
ISR 0:15a30802e719 728 {
ISR 0:15a30802e719 729 char data[1];
ISR 0:15a30802e719 730 data[0]= 0x09;
ISR 0:15a30802e719 731 wait_ms(1);
ISR 0:15a30802e719 732 i2c1.start();
ISR 0:15a30802e719 733 i2c1.write(0x30,data,1);
ISR 0:15a30802e719 734 i2c1.stop();
ISR 0:15a30802e719 735 }
ISR 0:15a30802e719 736
ISR 0:15a30802e719 737
ISR 0:15a30802e719 738 void start_read_right_sensor()
ISR 0:15a30802e719 739 {
ISR 0:15a30802e719 740 char data[1];
ISR 0:15a30802e719 741 data[0]= 0x08;
ISR 0:15a30802e719 742 wait_ms(1);
ISR 0:15a30802e719 743 i2c1.start();
ISR 0:15a30802e719 744 i2c1.write(0x30,data,1);
ISR 0:15a30802e719 745 i2c1.stop();
ISR 0:15a30802e719 746 }
ISR 0:15a30802e719 747
ISR 0:15a30802e719 748
ISR 0:15a30802e719 749 void measure_always_on() // left, front, right
ISR 0:15a30802e719 750 {
ISR 0:15a30802e719 751 char data[1];
ISR 0:15a30802e719 752 data[0]= 0x07;
ISR 0:15a30802e719 753 wait_ms(1);
ISR 0:15a30802e719 754 i2c1.start();
ISR 0:15a30802e719 755 i2c1.write(0x30,data,1);
ISR 0:15a30802e719 756 i2c1.stop();
ISR 0:15a30802e719 757 }
ISR 0:15a30802e719 758
ISR 0:15a30802e719 759
ISR 0:15a30802e719 760 void measure_always_off()
ISR 0:15a30802e719 761 {
ISR 0:15a30802e719 762 char data[1];
ISR 0:15a30802e719 763 data[0]= 0x06;
ISR 0:15a30802e719 764 wait_ms(1);
ISR 0:15a30802e719 765 i2c1.start();
ISR 0:15a30802e719 766 i2c1.write(0x30,data,1);
ISR 0:15a30802e719 767 i2c1.stop();
ISR 0:15a30802e719 768 }
ISR 0:15a30802e719 769
ISR 0:15a30802e719 770 /**
ISR 0:15a30802e719 771 * Returns left sensor value
ISR 0:15a30802e719 772 */
ISR 0:15a30802e719 773 static unsigned int get_distance_left_sensor()
ISR 0:15a30802e719 774 {
ISR 0:15a30802e719 775
ISR 0:15a30802e719 776 static char data_r[3];
ISR 0:15a30802e719 777 static unsigned int aux;
ISR 0:15a30802e719 778 flag=1;
ISR 0:15a30802e719 779
ISR 0:15a30802e719 780 data_r[0]= 0x05;
ISR 0:15a30802e719 781 wait_ms(1);
ISR 0:15a30802e719 782 i2c1.start();
ISR 0:15a30802e719 783 i2c1.write(0x30,data_r,1);
ISR 0:15a30802e719 784 i2c1.stop();
ISR 0:15a30802e719 785 wait_ms(10);
ISR 0:15a30802e719 786 i2c1.start();
ISR 0:15a30802e719 787 i2c1.read(0x31,data_r,2,0);
ISR 0:15a30802e719 788 i2c1.stop();
ISR 0:15a30802e719 789
ISR 0:15a30802e719 790 aux=(data_r[0]*256)+data_r[1];
ISR 0:15a30802e719 791 flag=0;
ISR 0:15a30802e719 792 return aux;
ISR 0:15a30802e719 793 // sensor_left=aux;
ISR 0:15a30802e719 794 // pc.printf("\nDistance Left Sensor: %u mm",aux); //0 - 2500mm
ISR 0:15a30802e719 795
ISR 0:15a30802e719 796 }
ISR 0:15a30802e719 797
ISR 0:15a30802e719 798
ISR 0:15a30802e719 799 /**
ISR 0:15a30802e719 800 * Returns front sensor value
ISR 0:15a30802e719 801 */
ISR 0:15a30802e719 802 static unsigned int get_distance_front_sensor()
ISR 0:15a30802e719 803 {
ISR 0:15a30802e719 804
ISR 0:15a30802e719 805 static char data_r[3];
ISR 0:15a30802e719 806 static unsigned int aux;
ISR 0:15a30802e719 807 flag=1;
ISR 0:15a30802e719 808 data_r[0]= 0x04;
ISR 0:15a30802e719 809 wait_ms(1);
ISR 0:15a30802e719 810 i2c1.start();
ISR 0:15a30802e719 811 i2c1.write(0x30,data_r,1);
ISR 0:15a30802e719 812 i2c1.stop();
ISR 0:15a30802e719 813 wait_ms(10);
ISR 0:15a30802e719 814 i2c1.start();
ISR 0:15a30802e719 815 i2c1.read(0x31,data_r,2,0);
ISR 0:15a30802e719 816 i2c1.stop();
ISR 0:15a30802e719 817
ISR 0:15a30802e719 818 aux=(data_r[0]*256)+data_r[1];
ISR 0:15a30802e719 819 flag=0;
ISR 0:15a30802e719 820 return aux;
ISR 0:15a30802e719 821 // sensor_front=aux;
ISR 0:15a30802e719 822 // pc.printf("\nDistance Front Sensor: %u mm",aux); //0 - 2500mm
ISR 0:15a30802e719 823
ISR 0:15a30802e719 824 }
ISR 0:15a30802e719 825
ISR 0:15a30802e719 826
ISR 0:15a30802e719 827 /**
ISR 0:15a30802e719 828 * Returns right sensor value
ISR 0:15a30802e719 829 */
ISR 0:15a30802e719 830 static unsigned int get_distance_right_sensor()
ISR 0:15a30802e719 831 {
ISR 0:15a30802e719 832
ISR 0:15a30802e719 833 static char data_r[3];
ISR 0:15a30802e719 834 static unsigned int aux;
ISR 0:15a30802e719 835 flag=1;
ISR 0:15a30802e719 836
ISR 0:15a30802e719 837 data_r[0]= 0x03;
ISR 0:15a30802e719 838 wait_ms(1);
ISR 0:15a30802e719 839 i2c1.start();
ISR 0:15a30802e719 840 i2c1.write(0x30,data_r,1);
ISR 0:15a30802e719 841 i2c1.stop();
ISR 0:15a30802e719 842 wait_ms(10);
ISR 0:15a30802e719 843 i2c1.start();
ISR 0:15a30802e719 844 i2c1.read(0x31,data_r,2,0);
ISR 0:15a30802e719 845 i2c1.stop();
ISR 0:15a30802e719 846
ISR 0:15a30802e719 847 aux=(data_r[0]*256)+data_r[1];
ISR 0:15a30802e719 848 flag=0;
ISR 0:15a30802e719 849 return aux;
ISR 0:15a30802e719 850 // sensor_right=aux;
ISR 0:15a30802e719 851 // pc.printf("\nDistance Right Sensor: %u \r",aux); //0 - 2500mm
ISR 0:15a30802e719 852
ISR 0:15a30802e719 853 }
ISR 0:15a30802e719 854
ISR 0:15a30802e719 855
ISR 0:15a30802e719 856 void get_status_always_measure()
ISR 0:15a30802e719 857 {
ISR 0:15a30802e719 858
ISR 0:15a30802e719 859 static char data_r[3];
ISR 0:15a30802e719 860 static unsigned int aux;
ISR 0:15a30802e719 861
ISR 0:15a30802e719 862 data_r[0]= 0x02;
ISR 0:15a30802e719 863 wait_ms(1);
ISR 0:15a30802e719 864 i2c1.start();
ISR 0:15a30802e719 865 i2c1.write(0x30,data_r,1);
ISR 0:15a30802e719 866 i2c1.stop();
ISR 0:15a30802e719 867 wait_ms(10);
ISR 0:15a30802e719 868 i2c1.start();
ISR 0:15a30802e719 869 i2c1.read(0x31,data_r,2,0);
ISR 0:15a30802e719 870 i2c1.stop();
ISR 0:15a30802e719 871
ISR 0:15a30802e719 872 aux=data_r[0];
ISR 0:15a30802e719 873 pc.printf("\nStatus of read always on/off: %u ",aux); //0 (off) - 1 (on)
ISR 0:15a30802e719 874
ISR 0:15a30802e719 875 }
ISR 0:15a30802e719 876
ISR 0:15a30802e719 877
ISR 0:15a30802e719 878 void get_status_dcdc_converter()
ISR 0:15a30802e719 879 {
ISR 0:15a30802e719 880
ISR 0:15a30802e719 881 static char data_r[3];
ISR 0:15a30802e719 882 static unsigned int aux;
ISR 0:15a30802e719 883
ISR 0:15a30802e719 884 data_r[0]= 0x01;
ISR 0:15a30802e719 885 wait_ms(1);
ISR 0:15a30802e719 886 i2c1.start();
ISR 0:15a30802e719 887 i2c1.write(0x30,data_r,1);
ISR 0:15a30802e719 888 i2c1.stop();
ISR 0:15a30802e719 889 wait_ms(10);
ISR 0:15a30802e719 890 i2c1.start();
ISR 0:15a30802e719 891 i2c1.read(0x31,data_r,2,0);
ISR 0:15a30802e719 892 i2c1.stop();
ISR 0:15a30802e719 893
ISR 0:15a30802e719 894 aux=data_r[0];
ISR 0:15a30802e719 895 pc.printf("\nStatus of DC/DC Converter: %u ",aux); //0 (off) - 1 (on)
ISR 0:15a30802e719 896
ISR 0:15a30802e719 897 }
ISR 0:15a30802e719 898
ISR 0:15a30802e719 899
ISR 0:15a30802e719 900 ///////////////////////////////////////////////////////////////////////////////////////////////
ISR 0:15a30802e719 901 ////////////////////////////////// MISC. ////////////////////////////////////////////
ISR 0:15a30802e719 902 ///////////////////////////////////////////////////////////////////////////////////////////////
ISR 0:15a30802e719 903
ISR 0:15a30802e719 904
ISR 0:15a30802e719 905 /**
ISR 0:15a30802e719 906 * Initializes the necessary robot pins
ISR 0:15a30802e719 907 */
ISR 0:15a30802e719 908 void init_robot_pins()
ISR 0:15a30802e719 909 {
ISR 0:15a30802e719 910
ISR 0:15a30802e719 911 //SAIDAS DIGITAIS (normal)
ISR 0:15a30802e719 912 //q_pha_mot_rig=0; //Phase Motor Right
ISR 0:15a30802e719 913 //q_sleep_mot_rig=0; //Nano Sleep Motor Right
ISR 0:15a30802e719 914 //q_pha_mot_lef=0; //Phase Motor Left
ISR 0:15a30802e719 915 //q_sleep_mot_lef=0; //Nano Sleep Motor Left
ISR 0:15a30802e719 916 //q_pow_ena_i2c_p=0; //Power Enable i2c FET P
ISR 0:15a30802e719 917 //q_pow_ena_mic_p=0; //Power enable Micro FET P
ISR 0:15a30802e719 918 //q_pow_as5600_n=1; //AS5600 Power MOSFET N
ISR 0:15a30802e719 919 //q_pow_as5600_p=0; //AS5600 Power MOSFET P
ISR 0:15a30802e719 920 //q_pow_spi=0; //SPI Power MOSFET P
ISR 0:15a30802e719 921 //q_ena_mppt=0; //Enable MPPT Control
ISR 0:15a30802e719 922 //q_boost_ps=1; //Boost Power Save
ISR 0:15a30802e719 923 //q_tca9548_reset=1; //Reset TCA9548
ISR 0:15a30802e719 924
ISR 0:15a30802e719 925 //SAIDAS DIGITAIS (normal)
ISR 0:15a30802e719 926 q_pha_mot_rig=0; //Phase Motor Right
ISR 0:15a30802e719 927 q_sleep_mot_rig=0; //Nano Sleep Motor Right
ISR 0:15a30802e719 928 q_pha_mot_lef=0; //Phase Motor Left
ISR 0:15a30802e719 929 q_sleep_mot_lef=0; //Nano Sleep Motor Left
ISR 0:15a30802e719 930
ISR 0:15a30802e719 931 q_pow_ena_i2c_p=0; //Power Enable i2c FET P
ISR 0:15a30802e719 932 q_pow_ena_mic_p=0; //Power enable Micro FET P
ISR 0:15a30802e719 933 q_pow_as5600_p=0; //AS5600 Power MOSFET P
ISR 0:15a30802e719 934 // q_pow_spi=0; //SPI Power MOSFET P
ISR 0:15a30802e719 935 q_pow_as5600_n=1; //AS5600 Power MOSFET N
ISR 0:15a30802e719 936
ISR 0:15a30802e719 937
ISR 0:15a30802e719 938 q_ena_mppt=0; //Enable MPPT Control
ISR 0:15a30802e719 939 q_boost_ps=1; //Boost Power Save
ISR 0:15a30802e719 940 q_tca9548_reset=1; //Reset TCA9548
ISR 0:15a30802e719 941
ISR 0:15a30802e719 942 //Leds caso seja saida digital:
ISR 0:15a30802e719 943 q_led_red_fro=1; //Led Red Front (led off)
ISR 0:15a30802e719 944 q_led_gre_fro=1; //Led Green Front (led off)
ISR 0:15a30802e719 945 q_led_blu_fro=1; //Led Blue Front (led off)
ISR 0:15a30802e719 946 q_led_red_rea=1; //Led Red Rear (led off)
ISR 0:15a30802e719 947 q_led_gre_rea=1; //Led Green Rear (led off)
ISR 0:15a30802e719 948 q_led_blu_rea=1; //Led Blue Rear (led off)r
ISR 0:15a30802e719 949
ISR 0:15a30802e719 950
ISR 0:15a30802e719 951 //********************************************************************
ISR 0:15a30802e719 952 //SAIDAS DIGITAIS (pwm)
ISR 0:15a30802e719 953 //PWM Enable Motor Right
ISR 0:15a30802e719 954 pwm_mot_rig.period_us(500);
ISR 0:15a30802e719 955 pwm_mot_rig.pulsewidth_us(0);
ISR 0:15a30802e719 956
ISR 0:15a30802e719 957 //PWM Enable Motor Left
ISR 0:15a30802e719 958 pwm_mot_lef.period_us(500);
ISR 0:15a30802e719 959 pwm_mot_lef.pulsewidth_us(0);
ISR 0:15a30802e719 960
ISR 0:15a30802e719 961 //Buzzer PWM
ISR 0:15a30802e719 962 pwm_buzzer.period_us(500);
ISR 0:15a30802e719 963 pwm_buzzer.pulsewidth_us(0);
ISR 0:15a30802e719 964
ISR 0:15a30802e719 965 //LED white
ISR 0:15a30802e719 966 pwm_led_whi.period_us(500);
ISR 0:15a30802e719 967 pwm_led_whi.pulsewidth_us(0);
ISR 0:15a30802e719 968
ISR 0:15a30802e719 969 }
ISR 0:15a30802e719 970
ISR 0:15a30802e719 971
ISR 0:15a30802e719 972 /**
ISR 0:15a30802e719 973 * Initializes all the pins and all the modules necessary
ISR 0:15a30802e719 974 */
ISR 0:15a30802e719 975 void initRobot(void)
ISR 0:15a30802e719 976 {
ISR 0:15a30802e719 977 init_robot_pins();
ISR 0:15a30802e719 978 enable_dc_dc_boost();
ISR 0:15a30802e719 979 init_Infrared();
ISR 0:15a30802e719 980 initEncoders();
ISR 0:15a30802e719 981 config_init_nrf();
ISR 0:15a30802e719 982 enable_dc_dc_boost();
ISR 0:15a30802e719 983 wait_ms(100); //wait for read wait(>=150ms);
ISR 0:15a30802e719 984 measure_always_on();
ISR 0:15a30802e719 985 float value = value_of_Batery();
ISR 0:15a30802e719 986 pc.printf("Initialization Successful \n\r");
ISR 0:15a30802e719 987 pc.printf("Battery level: %f \n\r",value);
ISR 0:15a30802e719 988 if(value < 3.0) {
ISR 0:15a30802e719 989 pc.printf(" WARNING: BATTERY NEEDS CHARGING ");
ISR 0:15a30802e719 990 }
ISR 0:15a30802e719 991
ISR 0:15a30802e719 992 // float level = value_of_Batery();
ISR 0:15a30802e719 993 // sendValue(int(level*100));
ISR 0:15a30802e719 994
ISR 0:15a30802e719 995 }
ISR 0:15a30802e719 996
ISR 0:15a30802e719 997
ISR 0:15a30802e719 998 ////////////////////////////////////////////////////
ISR 0:15a30802e719 999
ISR 0:15a30802e719 1000 /**
ISR 0:15a30802e719 1001 * Updates the position and orientation of the robot based on the data from the encoders
ISR 0:15a30802e719 1002 *
ISR 0:15a30802e719 1003 * Note: Needs to be calibrated for each robot, in this case the radius of the whells is 3.55
ISR 0:15a30802e719 1004 * and the distance between them is 7.4
ISR 0:15a30802e719 1005 */
ISR 0:15a30802e719 1006 void Odometria()
ISR 0:15a30802e719 1007 {
ISR 0:15a30802e719 1008 long int ticks1d=R_encoder();
ISR 0:15a30802e719 1009 long int ticks1e=L_encoder();
Ludwigfr 2:92ca9a6a1d4e 1010 //pc.printf("\r\nticks1d:%f",ticks1d);
Ludwigfr 2:92ca9a6a1d4e 1011 //pc.printf("\r\nticks1e:%f",ticks1d);
ISR 0:15a30802e719 1012 long int D_ticks=ticks1d - ticks2d;
ISR 0:15a30802e719 1013 long int E_ticks=ticks1e - ticks2e;
Ludwigfr 2:92ca9a6a1d4e 1014 //pc.printf("\r\nD_ticks:%f",D_ticks);
Ludwigfr 2:92ca9a6a1d4e 1015 //pc.printf("\r\nE_ticks:%f",E_ticks);
ISR 0:15a30802e719 1016 ticks2d=ticks1d;
ISR 0:15a30802e719 1017 ticks2e=ticks1e;
ISR 0:15a30802e719 1018
Ludwigfr 2:92ca9a6a1d4e 1019 D_cm= (float)D_ticks*((3.25*3.1415)/4096);
Ludwigfr 2:92ca9a6a1d4e 1020 L_cm= (float)E_ticks*((3.25*3.1415)/4096);
Ludwigfr 2:92ca9a6a1d4e 1021 //pc.printf("\r\nD_cm:%f",D_cm);
Ludwigfr 2:92ca9a6a1d4e 1022 //pc.printf("\r\nL_cm:%f",L_cm);
ISR 0:15a30802e719 1023 float CM=(D_cm + L_cm)/2;
Ludwigfr 2:92ca9a6a1d4e 1024 //pc.printf("\r\nCM:%f",CM);
ISR 0:15a30802e719 1025 theta +=(D_cm - L_cm)/7.18;
ISR 0:15a30802e719 1026 theta = atan2(sin(theta), cos(theta));
ISR 0:15a30802e719 1027
ISR 0:15a30802e719 1028 // meter entre 0
ISR 0:15a30802e719 1029 X += CM*cos(theta);
ISR 0:15a30802e719 1030 Y += CM*sin(theta);
ISR 0:15a30802e719 1031
Ludwigfr 1:b81277897a5b 1032 }
Ludwigfr 1:b81277897a5b 1033
Ludwigfr 1:b81277897a5b 1034 void OdometriaKalman(float* R_cm, float* L_cm)
Ludwigfr 1:b81277897a5b 1035 {
Ludwigfr 1:b81277897a5b 1036 long int ticks1d=R_encoder();
Ludwigfr 1:b81277897a5b 1037 long int ticks1e=L_encoder();
Ludwigfr 1:b81277897a5b 1038
Ludwigfr 1:b81277897a5b 1039 long int D_ticks=ticks1d - ticks2d;
Ludwigfr 1:b81277897a5b 1040 long int E_ticks=ticks1e - ticks2e;
Ludwigfr 1:b81277897a5b 1041
Ludwigfr 1:b81277897a5b 1042 ticks2d=ticks1d;
Ludwigfr 1:b81277897a5b 1043 ticks2e=ticks1e;
Ludwigfr 1:b81277897a5b 1044
Ludwigfr 2:92ca9a6a1d4e 1045 float D_cm= (float)D_ticks*((3.25*3.1415)/4096);
Ludwigfr 2:92ca9a6a1d4e 1046 float E_cm= (float)E_ticks*((3.25*3.1415)/4096);
Ludwigfr 2:92ca9a6a1d4e 1047
Ludwigfr 2:92ca9a6a1d4e 1048 float CM=(D_cm + E_cm)/2;
Ludwigfr 2:92ca9a6a1d4e 1049
Ludwigfr 2:92ca9a6a1d4e 1050 theta +=(D_cm - E_cm)/7.18;
Ludwigfr 2:92ca9a6a1d4e 1051
Ludwigfr 2:92ca9a6a1d4e 1052 theta = atan2(sin(theta), cos(theta));
Ludwigfr 1:b81277897a5b 1053
Ludwigfr 2:92ca9a6a1d4e 1054 // meter entre 0
Ludwigfr 2:92ca9a6a1d4e 1055
Ludwigfr 2:92ca9a6a1d4e 1056 X += CM*cos(theta);
Ludwigfr 2:92ca9a6a1d4e 1057 Y += CM*sin(theta);
Ludwigfr 2:92ca9a6a1d4e 1058
Ludwigfr 2:92ca9a6a1d4e 1059 *R_cm= D_cm;
Ludwigfr 2:92ca9a6a1d4e 1060 *L_cm= E_cm;
ISR 0:15a30802e719 1061 }