Utilizando a Nucleo F103RB com um módulo LCD e um Joystick para interface

Dependencies:   mbed

Revision:
0:bf743d54917c
Child:
2:6a1762df0288
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Jun 09 00:35:52 2020 +0000
@@ -0,0 +1,271 @@
+//                                           /
+//                        _,.------....___,.' ',.-.
+//                     ,-'          _,.--"        |
+//                   ,'         _.-'              .
+//                  /   ,     ,'                   `
+//                 .   /     /                     ``.
+//                 |  |     .                       \.\
+//       ____      |___._.  |       __               \ `.
+//     .'    `---""       ``"-.--"'`  \               .  \
+//    .  ,            __               `              |   .
+//    `,'         ,-"'  .               \             |    L
+//   ,'          '    _.'                -._          /    |
+//  ,`-.    ,".   `--'                      >.      ,'     |
+// . .'\'   `-'       __    ,  ,-.         /  `.__.-      ,'
+// ||:, .           ,'  ;  /  / \ `        `.    .      .'/
+// j|:D  \          `--'  ' ,'_  . .         `.__, \   , /
+// L:_  |                 .  "' :_;                `.'.'
+//.    ""'                  """""'                    V
+// `.                                 .    `.   _,..  `
+//   `,_   .    .                _,-'/    .. `,'   __  `
+//    ) \`._        ___....----"'  ,'   .'  \ |   '  \  .
+//   /   `. "`-.--"'         _,' ,'     `---' |    `./  |
+//  .   _  `""'--.._____..--"   ,             '         |
+//  | ." `. `-.                /-.           /          ,
+//  | `._.'    `,_            ;  /         ,'          .
+// .'          /| `-.        . ,'         ,           ,
+// '-.__ __ _,','    '`-..___;-...__   ,.'\ ____.___.'
+// `"^--'..'   '-`-^-'"--    `-^-'`.''"""""`.,^.`.--' 
+#include "mbed.h"
+#include "LCD_ka.h"
+#include "Joystick.h"
+#include "Motor_de_passo.h"
+
+Motor Xe(PB_13, PB_14, PB_15, PB_1, D9, D10, 'X'); // (IN1, IN2, IN3, IN4, Sensor 1, Sensor 2, Eixo)
+Joystick Joy(A1, A2, USER_BUTTON);        // (VRX, VRY, SW)
+LCD lcd(D6, D7, D2, D3, D4, D5);          // Para conectar como arduíno: (D8, D9, D4, D5, D6, D7); Para default: (D6, D7, D2, D3, D4, D5);
+InterruptIn mybutton(D8);  
+DigitalOut Rele(D11);
+
+/*
+                **************************
+                ***** INICIA FUNÇÕES *****
+                **************************
+*/
+
+void Loop_Horario();      // Loop para girar o motor no sentido horário
+void Loop_Anti_Horario(); // Loop para girar o motor no sentido anti-horário
+void Aumenta_Vel();       // Função que aumenta a velocidade
+void Diminui_Vel();       // Função que Diminui a velocidade
+void Tela_1();            // Seletor de velocidades e sentido de rotação
+void Tela_2();            // Modo Step (acesse pelo botão Select do shield)
+void Tela_Instrucao(int a);    // Tela de instrução para manuseio
+void Tela_Instrucao_1(int a);
+void Emergencia();
+void Loop_Menu();
+
+/*
+                 **************************
+                 **** INICIA VARIÁVEIS ****
+                 **************************
+*/
+double tempos[] = {0.2, 0.02, 0.002};            // Tempos para mudar a velocidade
+int t = 0;                                       // Variável que guarda a posição do tempo
+string porcentagem[] = {"0.1%", " 10%", "100%"}; // Porcentagens em uma string para printar
+int menu = 1;
+int t1 = 1;
+int t2 = 1;
+/*
+                 ************************
+                 **** LOOP PRINCIPAL ****
+                 ************************
+*/
+
+int main(){
+    if (mybutton == 1){
+        Emergencia();
+    }
+    mybutton.rise(&Emergencia);
+    Loop_Menu();
+}
+
+/*
+                 ************************
+                 **** DEFINE FUNÇÕES ****
+                 ************************
+*/
+
+void Loop_Menu(){
+    wait(0.2);
+    lcd.clc();
+    lcd.printf("> Modo Livre");
+    lcd.pos(2,1);
+    lcd.printf("> Modo Steps");
+    menu = 1;
+    lcd.home();
+    while(menu >= 1){
+        switch (Joy.ler_x())
+        {
+           case 0: lcd.cima(); wait(0.2); break;
+           case 1: lcd.baixo(); wait(0.2); break;
+        }
+        switch (Joy.ler_y())
+        {
+           case 0: lcd.direita(); wait(0.2); break;
+           case 1: lcd.esquerda(); wait(0.2); break;
+        }
+        switch (Joy.bot_select())
+        {
+           case 0: menu = 0;
+                   if ((lcd.Lepos()[1] == '1') && (lcd.Lepos()[3] == '1')){
+                        Tela_Instrucao(1);}
+                   if ((lcd.Lepos()[1] == '2') && (lcd.Lepos()[3] == '1')){
+                        Tela_Instrucao(2);}
+                        wait(0.2);  break;
+        }
+        if (menu == 2){
+            lcd.clc();
+            lcd.printf("> Modo Livre");
+            lcd.pos(2,1);
+            lcd.printf("> Modo Steps");
+            menu = 1;
+            lcd.home();
+        }
+    }
+    
+}
+
+void Loop_Horario(){ // Enquanto o valor de VRX for > 800 o motor continua girando.
+    while( Joy.ler_x() == 0){
+        Xe.Full();
+    }
+    Xe.mot = 0b0000;
+}
+
+void Loop_Anti_Horario(){ // Enquanto o valor de VRX for < 200 o motor continua girando
+    while( Joy.ler_x() == 1){
+        Xe.Full_();
+    }
+    Xe.mot = 0b0000;
+}
+
+void Aumenta_Vel(){ // Incrementa t em 1, muda a relação de tempo do Motor e printa o valor em porcentagem na tela
+    t++;
+    if (t == 3){
+        t = 2;
+    }
+    Xe.Tempo = tempos[t];
+    lcd.pos(2,13);
+    lcd.printf("%s", porcentagem[t]);
+}
+
+void Diminui_Vel(){ // Decrementa t em 1, muda a relação de tempo do Motor e printa o valor em porcentagem na tela
+    t--;
+    if (t == -1){
+        t = 0;
+    }
+    Xe.Tempo = tempos[t];
+    lcd.pos(2,13);
+    lcd.printf("%s", porcentagem[t]);
+}
+
+void Tela_1(){ // Função que define o funcionamento da tela 1
+    wait(0.2);
+    lcd.clc();
+    Xe.Tempo = tempos[t]; // Define o tempo inicial
+    lcd.putc(0x03); lcd.printf("Gira "); lcd.putc(0x05); // Insere a primeira linha do LCD
+    lcd.pos(2,1); lcd.putc(0x04); lcd.printf("Gira "); lcd.putc(0x06); // Insere a segunda linha do LCD
+    lcd.pos(1,9); lcd.putc(0xFF); lcd.pos(2,9); lcd.putc(0xFF);
+    lcd.pos(2,10); lcd.printf("Vel%s", porcentagem[t]); // Insere a parte de velocidade no LCD
+
+    while (t1 == 1){
+        switch (Joy.ler_x()) // Lê o valor de VRX
+        {
+            case 0: lcd.pos(1,8); lcd.putc(0x00); Loop_Horario(); lcd.pos(1,8); lcd.putc(0x80); wait(0.2); break;      // Se for > 800 Printa na tela um check da direção e gira o motor no sentido horário
+            case 1: lcd.pos(2,8); lcd.putc(0x00); Loop_Anti_Horario(); lcd.pos(2,8); lcd.putc(0x80); wait(0.2); break; // Se for < 200 Printa na tela um check da direção e gira o motor no sentido horário
+        }
+        switch (Joy.ler_y()) // Lê o valor de VRY
+        {
+            case 0: Aumenta_Vel(); wait(0.2); break; // Se for > 800 Printa na tela o valor em % e aumenta a velocidade
+            case 1: Diminui_Vel(); wait(0.2); break; // Se for < 200 Printa na tela o valor em % e Diminui a velocidade
+        }
+        switch (Joy.bot_select())
+        {
+            case 0: t1 = 2; break;
+        }
+    }
+}
+
+void Tela_2(){ // Função que define o funcionamento da tela 2
+    wait(0.2);
+    lcd.clc();
+    Xe.Tempo = tempos[t]; // Define o tempo inicial
+    Xe.Angulo = 0; // Reseta o ângulo ao entrar na tela
+    lcd.putc(0x03); lcd.printf("Gira "); lcd.putc(0x05); // Insere a primeira linha do LCD
+    lcd.pos(2,1); lcd.putc(0x04); lcd.printf("Gira "); lcd.putc(0x06); // Insere a segunda linha do LCD
+    lcd.pos(1,9); lcd.printf("Pos", Xe.Angulo ); // Insere a parte de velocidade no LCD
+    while (t2 == 1){
+        switch (Joy.ler_x()) // Lê o valor de VRX
+        {
+            case 0: lcd.pos(1,8); lcd.putc(0x00); Xe.Full(); lcd.pos(1,8); lcd.putc(0x80); lcd.pos(2,9); lcd.printf("%.1f",Xe.Angulo); break;      // Se for > 800 Printa na tela um check da direção e gira o motor no sentido horário
+            case 1: lcd.pos(2,8); lcd.putc(0x00); Xe.Full_(); lcd.pos(2,8); lcd.putc(0x80); lcd.pos(2,9); lcd.printf("%.1f",Xe.Angulo); break; // Se for < 200 Printa na tela um check da direção e gira o motor no sentido horário
+        }
+        switch (Joy.ler_y()) // Lê o valor de VRY
+        {
+            case 0: Aumenta_Vel(); wait(0.3); break; // Se for > 800 Printa na tela o valor em % e aumenta a velocidade
+            case 1: Diminui_Vel(); wait(0.3); break; // Se for < 200 Printa na tela o valor em % e Diminui a velocidade
+        }
+        switch (Joy.bot_select())
+        {
+            case 0: t2 = 2; break;
+        }
+    }
+}
+
+void Tela_Instrucao(int a){ // Função que define o funcionamento da tela 1
+    wait(0.2);
+    lcd.clc();
+    lcd.printf("Aperte o select para seguir");
+    int ti = 1;
+    while (ti == 1){
+        switch (Joy.bot_select())
+        {
+            case 0: ti = 2; Tela_Instrucao_1(a); break;
+        }
+                
+        if (menu == 2){ 
+            ti = 0;
+            Loop_Menu();
+        }
+    }
+}
+
+
+void Tela_Instrucao_1(int a){ // Função que define o funcionamento da tela 1
+    wait(0.2);
+    lcd.clc();
+    lcd.putc(0x03); lcd.printf("Gira "); lcd.putc(0x05); lcd.putc(0xFF); lcd.putc(0x04); lcd.printf("Gira "); lcd.putc(0x06); lcd.putc(0xFF);
+    lcd.putc(0x7F); lcd.printf("Velo +"); lcd.putc(0xFF); lcd.putc(0x7E); lcd.printf("Velo -"); lcd.putc(0xFF);
+    int ti1 = 1;
+    t1 = 1;
+    t2 = 1;
+    while (ti1 == 1){
+        switch (Joy.bot_select())
+        {
+            case 0: ti1 = 0;
+                    if (a == 1){
+                        Tela_1(); Loop_Menu();}
+                    if (a == 2){
+                        Tela_2(); Loop_Menu();}
+                break;
+        }
+        if (menu == 2){
+            ti1 = 0;
+            Loop_Menu();
+        }
+    }
+}
+
+void Emergencia(){
+    Rele = 1;
+    lcd.clc();
+    lcd.printf("!!!Emergencia!!!!!!pressionado!!");
+    while(mybutton == 1){
+        wait(0.2);
+    }
+    Rele = 0;
+    lcd.clc();
+    t1 = 2;
+    t2 = 2;
+    menu = 2;
+}