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.
Revision 0:0d288018309d, committed 2019-12-02
- Comitter:
- electrototo
- Date:
- Mon Dec 02 16:35:54 2019 +0000
- Commit message:
- Codigo actual;
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Mon Dec 02 16:35:54 2019 +0000
@@ -0,0 +1,269 @@
+#include "mbed.h"
+#include "tsi_sensor.h"
+
+#include "main.h"
+
+// Comunicación mediante XBee
+// Serial pc(PTE0, PTE1);
+
+// Comunicación mediante Serial
+Serial pc(USBTX, USBRX);
+
+// Comunicacion al GPS
+Serial gps(PTE22, PTE23);
+
+// ------ Configuracion de la maquina de toques ------
+DigitalOut taser(PTE5);
+
+InterruptIn emergency_stop(PTC7);
+DigitalIn enter_button(PTC0);
+
+float vel_setpoint = 0;
+float time_setpoint = 0;
+
+// ----------------------------------------------------
+
+
+// ------ Configuracion de LEDs ------
+DigitalOut slow_led(LED1);
+DigitalOut ok_led(LED2);
+DigitalOut booting_led(LED3);
+
+Ticker gps_status_ticker;
+bool status_set = false;
+bool led_tick = false;
+// -----------------------------------
+
+// definiciones para la lectura del gps
+char buffer[256];
+char gprmc_buffer[256];
+
+char type[7];
+
+bool readline = false;
+int i = 0;
+
+GPRMC_t data;
+// fin de las definiciones
+
+int main() {
+ gps.attach(&rcv_callback, Serial::RxIrq);
+
+ enter_button.mode(PullUp);
+ emergency_stop.rise(&stop_all);
+
+ slow_led = 1;
+ ok_led = 1;
+ booting_led = 1;
+
+ pc.printf("Ing. Vel:\n");
+ vel_setpoint = get_setpoint(enter_button, "%.3f km/h\n");
+
+ pc.printf("Ing. Tiempo:\n");
+ time_setpoint = get_setpoint(enter_button, "%.3f mins\n");
+
+ while(1) {
+ if (readline) {
+ readline = false;
+ i = 0;
+
+ memcpy(type, &buffer[0], 6);
+ type[6] = 0;
+
+
+ if (strcmp(type, "$GPRMC") == 0) {
+ strcpy(gprmc_buffer, buffer);
+
+ data = get_gprmc(gprmc_buffer);
+ print_gprmc(data);
+
+ if (data.valid) {
+ // Se apaga el LED de búsqueda
+
+ if (status_set) {
+ booting_led = 1;
+ gps_status_ticker.detach();
+ status_set = false;
+ }
+
+ if (data.vel < vel_setpoint) {
+ ok_led = 1;
+ slow_led = 0;
+
+ taser = 1;
+ }
+ else {
+ ok_led = 0;
+ slow_led = 1;
+
+ taser = 0;
+ }
+ }
+ else if (!status_set && !data.valid) {
+ // Se está buscando la señal de GPS
+ booting_led = 1;
+ gps_status_ticker.attach(&finding_gps, 2.5);
+ pc.printf("Ticker set...\n");
+
+ status_set = true;
+
+ ok_led = 1;
+ slow_led = 1;
+ }
+ }
+ }
+ }
+}
+
+void rcv_callback() {
+ char c;
+
+ while (gps.readable()) {
+ c = gps.getc();
+
+ if (c != '\n') {
+ buffer[i] = c;
+ }
+ else {
+ readline = true;
+ buffer[i] = 0;
+ }
+
+ i++;
+ }
+}
+
+void finding_gps() {
+ pc.printf("tick tock\n");
+
+ if (led_tick) {
+ booting_led = 1;
+ led_tick = false;
+ }
+ else {
+ booting_led = 0;
+ led_tick = true;
+ }
+}
+
+GPRMC_t get_gprmc(char *line) {
+ char *token;
+ int token_index = 0;
+
+ GPRMC_t gprmc;
+ gprmc.vel = -1;
+ gprmc.valid = false;
+
+ pc.printf("%s\n", line);
+ token = strtok(line, ",");
+
+ while (token != NULL) {
+ if (token_index == 2) {
+ if (strcmp(token, "A") == 0) {
+ gprmc.valid = true;
+ }
+ }
+
+ if (gprmc.valid) {
+ switch (token_index) {
+ case 3:
+ // lat
+ strcpy(gprmc.lat, token);
+ break;
+ case 4:
+ // NS
+ strcpy(gprmc.ns, token);
+ break;
+
+ case 5:
+ // lon
+ strcpy(gprmc.lon, token);
+ break;
+ case 6:
+ // EW
+ strcpy(gprmc.ew, token);
+ break;
+
+ case 7:
+ gprmc.vel = atof(token) * 1.852;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ token = strtok(NULL, ",");
+ token_index += 1;
+ }
+
+ pc.printf("\n");
+
+ return gprmc;
+}
+
+void print_gprmc(GPRMC_t packet) {
+ pc.printf("Valid: %d\n", packet.valid);
+
+ if (packet.valid) {
+ pc.printf("Lat: %s %s\n", packet.lat, packet.ns);
+ pc.printf("Lon: %s %s\n", packet.lon, packet.ew);
+ pc.printf("Spd: %.2f\n\n", packet.vel);
+ }
+}
+
+float get_setpoint(DigitalIn enter_button, char msg[]) {
+ TSIAnalogSlider tsi(PTB16, PTB17, 40);
+
+ float current_tsi = 0;
+ float prev_tsi = 0;
+ float dt_tsi = 0;
+
+ float rolling = 0;
+
+ float setpoint = 0;
+ float dt_setpoint = 0.5;
+
+ while (enter_button.read() != 0) {
+ // velocity setpoint
+ prev_tsi = current_tsi;
+ current_tsi = tsi.readPercentage();
+
+ rolling = 0.1 * rolling + current_tsi;
+ dt_tsi = prev_tsi - rolling;
+
+ if (prev_tsi > 0 && current_tsi > 0) {
+ if (dt_tsi > 0.01) {
+ if (setpoint + dt_setpoint <= 10) {
+ setpoint += dt_setpoint;
+ }
+ }
+
+ if (dt_tsi < -0.1) {
+ if (setpoint - dt_setpoint >= 0) {
+ setpoint -= dt_setpoint;
+ }
+ }
+
+ // cambiar a display
+ pc.printf(msg, setpoint);
+ }
+
+ wait(0.05);
+ }
+
+ return setpoint;
+}
+
+void send_gps_data() {
+ if (data.valid) {
+ pc.printf("{\"lat\": \"%s%s\", \"lon\": \"%s%s\", \"spd\": %.3f}\n", data.lat, data.ns, data.lon, data.ew, data.vel);
+ }
+}
+
+void stop_all() {
+ taser = 0;
+
+ // Cancela todo
+ while (1) {}
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.h Mon Dec 02 16:35:54 2019 +0000
@@ -0,0 +1,29 @@
+#ifndef GPSH
+#define GPSH
+
+typedef struct GPRMC_t {
+ char lat[11];
+ char lon[12];
+
+ char ew[3];
+ char ns[3];
+
+ float vel;
+ bool valid;
+} GPRMC_t;
+
+GPRMC_t get_gprmc(char *line);
+void print_gprmc(GPRMC_t packet);
+void rcv_callback();
+void finding_gps();
+
+// Para la seleccion del setpoint de velocidad y tiempo
+float get_setpoint(DigitalIn enter_button, char msg[]);
+
+// Paro de emergencia
+void stop_all();
+
+// Mandar informacion
+void send_gps_data(Serial connection, GPRMC_t pkt);
+
+#endif
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Dec 02 16:35:54 2019 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsi_sensor.lib Mon Dec 02 16:35:54 2019 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/Kojto/code/tsi_sensor/#976904559b5c