Go Down

Topic: Poner 3 programas en uno solo (Read 340 times) previous topic - next topic

ogonbar

May 18, 2018, 04:15 pm Last Edit: May 23, 2018, 12:08 am by surbyte
Hola tengo 3 programas de Arduino para controlar un robot submarino que tiene dos motores de avance y retroceso y un motor de subir y bajar, con puente en H pero los tengo independientes y tengo que ponerlos en unos solo ¿Cómo lo puedo hacer?

Les pongo a continuación los 3 programas:
El primero es:

Code: [Select]
int b;
void setup() {
 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);
 Serial.begin(9600);
}

void loop() {
 b = analogRead(A2);
 Serial.println(b);
 
 if (analogRead(A2) < 400) {
   digitalWrite(8, LOW);
   digitalWrite(9, HIGH);
 }
 else if (analogRead(A2) > 600) {
   digitalWrite(8, HIGH);
   digitalWrite(9, LOW);
 }
 else {
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);
 }
}



El segundo es:

Code: [Select]
// Joystick analógico XY con pulsador

void setup() {
 Serial.begin(9600);
}

void loop() {
 Serial.print("Eje X: ");
 Serial.print(analogRead(A0));
 Serial.print(" Eje Y: ");
 Serial.println(analogRead(A1));
 delay(500);
}



y el tercero es:


Code: [Select]
// Joystick con dos motores y 4 direcciones.

void setup() {
 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
}

void loop() {
 if (analogRead(A1) > 400 && analogRead(A1) < 600) {
   if (analogRead(A0) < 400) {
     digitalWrite(2, LOW);
     digitalWrite(3, HIGH);
     digitalWrite(4, LOW);
     digitalWrite(5, HIGH);
   }
   else if (analogRead(A0) > 600) {
     digitalWrite(2, HIGH);
     digitalWrite(3, LOW);
     digitalWrite(4, HIGH);
     digitalWrite(5, LOW);
   }
   else {
     digitalWrite(2, LOW);
     digitalWrite(3, LOW);
     digitalWrite(4, LOW);
     digitalWrite(5, LOW);
   }
 }

 if(analogRead(A0) > 400 && analogRead(A0) < 600) {
   if (analogRead(A1) < 400) {
     digitalWrite(2, LOW);
     digitalWrite(3, HIGH);
     digitalWrite(4, HIGH);
     digitalWrite(5, LOW);
   }
   else if (analogRead(A1) > 600) {
     digitalWrite(2, HIGH);
     digitalWrite(3, LOW);
     digitalWrite(4, LOW);
     digitalWrite(5, HIGH);
   }
   else {
     digitalWrite(2, LOW);
     digitalWrite(3, LOW);
     digitalWrite(4, LOW);
     digitalWrite(5, LOW);
   }
 }
}




Moderador: Código editado con etiquetas

surbyte


Metaconta

Diría que haría un mismo programa con tres funciones que hacen de tres programas en uno.

oceam2


oceam2

#4
May 22, 2018, 11:23 pm Last Edit: May 23, 2018, 12:07 am by surbyte
Te quedaría el programa así:

Code: [Select]
#if defined ARDUINO_SAM_DUE
#include <FreeRTOS_ARM.h>
#else
#include <FreeRTOS_AVR.h>
#endif

//Variables
TaskHandle_t xHandle_1, xHandle_2,xHandle_3;
int b;
void vPeriodicTask1();
void vPeriodicTask2();
void vPeriodicTask3();

void setup() {
 
 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 Serial.begin(9600);
   
 //FreeRTOS
 if (xTaskCreate(vPeriodicTask1, "primero", 300, NULL, tskIDLE_PRIORITY + 1, &xHandle_1) == pdPASS) { NULL; }
 if (xTaskCreate(vPeriodicTask2, "segundo", 300, NULL, tskIDLE_PRIORITY + 1, &xHandle_2) == pdPASS) { NULL; }
 if (xTaskCreate(vPeriodicTask3, "tercero", 300, NULL, tskIDLE_PRIORITY + 1, &xHandle_2) == pdPASS) { NULL; }

 vTaskStartScheduler();

 for (;;);

}

// Tarea 1
void vPeriodicTask1(void *pvParameters)
{
 static char sString[80];

 TickType_t xLastWakeTime = xTaskGetTickCount();

 for (;;)
 {

     b = analogRead(A2);
 Serial.println(b);
 
 if (analogRead(A2) < 400) {
   digitalWrite(8, LOW);
   digitalWrite(9, HIGH);
 }
 else if (analogRead(A2) > 600) {
   digitalWrite(8, HIGH);
   digitalWrite(9, LOW);
 }
 else {
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);
 }
       
       vTaskDelayUntil(&xLastWakeTime, (50 / portTICK_PERIOD_MS));
     }
}

// Tarea 2
void vPeriodicTask2(void *pvParameters)
{
 static char sString[80];

 TickType_t xLastWakeTime = xTaskGetTickCount();

 for (;;)
 {
     Serial.print("Eje X: ");
 Serial.print(analogRead(A0));
 Serial.print(" Eje Y: ");
 Serial.println(analogRead(A1));
 delay(500);
       
       vTaskDelayUntil(&xLastWakeTime, (50 / portTICK_PERIOD_MS));
     }
}

// Tarea 3
void vPeriodicTask3(void *pvParameters)
{

 TickType_t xLastWakeTime = xTaskGetTickCount();

 for (;;)
 {
    if (analogRead(A1) > 400 && analogRead(A1) < 600) {
   if (analogRead(A0) < 400) {
     digitalWrite(2, LOW);
     digitalWrite(3, HIGH);
     digitalWrite(4, LOW);
     digitalWrite(5, HIGH);
   }
   else if (analogRead(A0) > 600) {
     digitalWrite(2, HIGH);
     digitalWrite(3, LOW);
     digitalWrite(4, HIGH);
     digitalWrite(5, LOW);
   }
   else {
     digitalWrite(2, LOW);
     digitalWrite(3, LOW);
     digitalWrite(4, LOW);
     digitalWrite(5, LOW);
   }
 }

 if(analogRead(A0) > 400 && analogRead(A0) < 600) {
   if (analogRead(A1) < 400) {
     digitalWrite(2, LOW);
     digitalWrite(3, HIGH);
     digitalWrite(4, HIGH);
     digitalWrite(5, LOW);
   }
   else if (analogRead(A1) > 600) {
     digitalWrite(2, HIGH);
     digitalWrite(3, LOW);
     digitalWrite(4, LOW);
     digitalWrite(5, HIGH);
   }
   else {
     digitalWrite(2, LOW);
     digitalWrite(3, LOW);
     digitalWrite(4, LOW);
     digitalWrite(5, LOW);
   }
 }
       
       vTaskDelayUntil(&xLastWakeTime, (50 / portTICK_PERIOD_MS));
     }
}

void loop() {}



Moderador: Código editado con etiquetas

surbyte

He visto respuestas de todo tipo pero a alguien que no puede poner 3 sketchs juntos le recomiendas usar FreeRTOS?

Perdona pero no me parece una sugerencia para un novato.

Go Up