FRDM-KL46Z_Pasos Es un programa que permite controlar un Motor a Pasos en sus diferntes modos de operación y tampbien permite controlar un Motor de CD en Modo ON-OFF Adelante y Atrás
Dependencies: mbed Debounced tsi_sensor TSI TextLCD MMA8451Q USBDevice
Diff: main.cpp
- Revision:
- 1:e7f73d96ddde
- Parent:
- 0:a935d23434d9
--- a/main.cpp Fri May 11 02:33:01 2018 +0000 +++ b/main.cpp Fri Jun 28 17:52:12 2019 +0000 @@ -1,88 +1,444 @@ -/******************************************************************************* -* -* ARCHIVO: main.cpp -* -* PROYECTO: FRDM-KL46Z_USBMouse -* -* PROCESADOR: MKL46Z256VLL4 -* -* HERRAMIENTA: Mbed -* -* DESCRIPCION: El programa emula a un mouse USB. Utiliza el acelerómetro para -* detectar el movimieto y el TSI para simular los botones. -* Una vez descargado el programa cambiar el Cable del SDA al USB -* -* AUTOR(ES): Antulio Morgado Valle -* -* VERSION: 1.0 -* -* REVISION: 0 -* -* RELEASE: 0 -* -* BUG & FIXES: -* -* FECHA: 10/20/2014 -* -*******************************************************************************/ +/* ########################################################################### +** Archivo : main.c +** Proyecto : FRDM-KL46Z_Pasos +** Procesador : MKL46Z256VLL4 +** Herramienta : Mbed +** Version : Driver 01.01 +** Compilador : GNU C Compiler +** Fecha/Hora : 14-07-2015, 11:48, # CodeGen: 0 +** Descripción : +** El programa genera las diferentes secuencias para operar un motor a pasos +** (Stepper Motor). +** Este programa tiene 3 modos de operación: +** 1) Medio Paso +** 2) Pasos Completo +** 3) Pasos Wave +** Además puede girar en el sentido horario o anti horario +** Componentes : GPIO, Timer, etc . +** Configuraciones : Includes, Stacks y Drivers externos +** Autores : +** ATEAM Development Group: +** - Antulio Morgado Valle +** +** Versión : Beta +** Revisión : A +** Release : 0 +** Bugs & Fixes : +** Date : 20/10/2019 +** Added support for Led_RGB +** 22/09/2018 +** Added LCD Menu, Beta version (with bugs) +** +** ###########################################################################*/ +/* +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +: Includes +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +*/ #include "mbed.h" -#include "USBMouse.h" //libreria para la Interface USB -#include "TSISensor.h" //libreria Touch Sensor Interface -#include "MMA8451Q.h" //libreria para la interface del acelerómetro -#define MMA8451_I2C_ADDRESS (0x1d<<1) +#include "MKL46Z4.h" +#include "stdio.h" +#include "string.h" +#include "TSISensor.h" // Libreria para Touch Sensor Interface +#include "TextLCD.h" // Libreria para escritura en LCD +#include "I2C.h" // Libreria para la interface I2C +#include "SPI.h" // Libreria para la interface SPI +#include "Serial.h" // Libreria para la interface Serial +#include "MMA8451Q.h" // Libreria para el Acelerómetro + +#include "stdio.h" +/* +:............................................................................... +: Definiciones +:............................................................................... +*/ +#define MMA8451_I2C_ADDRESS (0x1d<<1) // Dirección del Acelerómetro + +#define Modo_Wave 3 +#define Paso_Doble 2 +#define Paso_Completo 1 +#define Medio_Paso 0 +#define Sentido_Horario 1 +#define Sentido_Antihorario 0 +#define On 0 +#define Off 1 +#define TRUE 1 +#define FALSE 0 +#define DO2 0.0078125 // 128 Hz +#define DOs2 0.0073740180703125 // 136 Hz +#define RE2 0.006960146234375 // 144 Hz +#define REs2 0.0065695032421875 // 152 Hz +#define MI2 0.006200785359375 // 161 Hz +#define FA2 0.005852762015625 // 171 Hz +#define FAs2 0.0055242717265625 // 181 Hz +#define SOL2 0.0052142181796875 // 192 Hz +#define SOLs2 0.0049215666015625 // 203 Hz +#define LA2 0.004645340296875 // 215 Hz +#define LAs2 0.004384617375 // 228 Hz +#define SI2 0.0041385277109375 // 242 Hz +#define DO3 0.00390625 // 256 Hz +#define DOs3 0.00368700903515625 // 271 Hz +#define RE3 0.0034800731171875 // 287 Hz +#define REs3 0.00328475162109375 // 304 Hz +#define MI3 0.0031003926796875 // 323 Hz +#define FA3 0.0029263810078125 // 342 Hz +#define FAs3 0.0055242717265625 // 362 Hz +#define SOL3 0.00260710908984375 // 384 Hz +#define SOLs3 0.00246078330078125 // 406 Hz +#define LA3 0.0023226701484375 // 431 Hz +#define LAs3 0.0021923086875 // 456 Hz +#define SI3 0.00206926385546875 // 483 Hz +#define DO4 0.00390625 // 512 Hz +#define DOs4 0.001843504517578125 // 542 Hz +#define RE4 0.00174003655859375 // 575 Hz +#define REs4 0.001642375810546875 // 609 Hz +#define MI4 0.00155019633984375 // 645 Hz +#define FA4 0.00146319050390625 // 683 Hz +#define FAs4 0.001381067931640625 // 724 Hz +#define SOL4 0.001303554544921875 // 767 Hz +#define SOLs4 0.001230391650390625 // 813 Hz +#define LA4 0.00116133507421875 // 861 Hz +#define LAs4 0.00109615434375 // 912 Hz +#define SI4 0.001034631927734375 // 966 Hz +#define DO5 0.001953125 // 1024 Hz +/* ++------------------------------------------------------------------------------- +| Configuración de Puertos ++------------------------------------------------------------------------------- +*/ +Ticker Barrido; // Interrupción del Timer +BusOut Salidas(PTE19, PTE18, PTE17, PTE16); // Salidas a las bobinas: A /A B /B +DigitalOut Led_Azul (PTE2); // Definición para el Led Azul +DigitalOut Led_Verde (PTE3); // Definición para el Led Verde +DigitalOut Led_Rojo (PTE6); // Definición para el Led Rojo +DigitalOut Green_Led (PTD5); // Led de Actividad del Programa +DigitalOut Red_Led (PTE29); // Led de Actividad del Programa +DigitalIn Adelante (PTC3, PullUp); // Switch para mover hacia Adelante +DigitalIn Atras (PTC12,PullUp); // Switch para mover hacia Atras +BusIn Modo (PTB18,PTB19); // Modo de operación de los motores +PwmOut Backlight (PTD2); // Activacion Backlight del LCD +PwmOut Buzzer (PTE31); // Salida del Buzzer + +/* +** ------------------------------------------------------------------- +** Inicialización de los Pines de Funciones Especiales. +** ------------------------------------------------------------------- +*/ +TSISensor tsi; //activa el Touch Sensor Interface + +// Host PC Communication channels +Serial terminal(USBTX, USBRX); // USB Terminal Interface Tx, Rx +//Serial terminal(PTA2,PTA1); // Terminal Serial +//Serial terminal(PTE0, PTE1); // Tx, Rx Using MAX3232 or BlueTooth +//Serial terminal(PTE22, PTE23); +// -------- Bluetooth Communication support -------- +Serial bluetooth(PTE0, PTE1); // Tx, Rx + +/************************************************* +* Inicializa la biblioteca TextLCD con los números de los pines de la interface +* Board Freedom FRDM-KL25Z +* IDE Mbed On Line Compiler +* LCD SPI SN74595 +* Pin Board LCD +* SPI_MOSI SER (white) +* SPI_MISO none (blue) +* SPI_CLK SRCLK +* SPI_PCS RCLK +* 5V 5V (red) +* GND GND (black) +* LCD I2C PCF8574A +* Pin Board LCD +* I2C_SCL SCL (white) + resistance pull-up 4.7k +* I2C_SDA SDA (blue) + resistance pull-up 4.7k +* 5V 5V (red) +* GND GND (black) +* LCD Port PTE +* LCD Port PTC +***************************************************/ +// -------- I2C Communication --------- +//I2C i2c_LCD(PTC2,PTC1); // SDA, SCL + +// -------- SPI Communication --------- +//SPI spi_LCD(PTD6,PTD7,PTD5,PTD4); // MOSI, MISO, SCLK, SSEL + +//--------- LCD instantiation ----------- +//TextLCD_SPI lcd(&spi_LCD, PTD4, TextLCD::LCD16x4, TextLCD::HD44780); // SPI bus, SN74595 expander, CS pin, LCD Type +//TextLCD_I2C lcd(&i2c_LCD, 0x7E, TextLCD::LCD20x4); // I2C bus, PCF8574A Arduino Shield, LCD Type +TextLCD lcd(PTC6, PTC7, PTC8, PTC9, PTC10, PTC11, TextLCD::LCD20x4); // 4bit bus: rs, e, d4-d7 +/* ++------------------------------------------------------------------------------- +| Variables Globales de Usuario ++------------------------------------------------------------------------------- +*/ +uint8_t paso; +uint8_t No_Pasos; +uint8_t Revoluciones; +uint8_t Sentido; +uint8_t modo_paso; +uint16_t Velocidad=50000; +char Cadena[20]; +char Modo_0[]="Medio Paso\n\r"; +char Modo_1[]="Paso Completo\n\r"; +char Modo_2[]="Medio Paso\n\r"; +char Modo_3[]="Modo Wave\n\r"; +char Modo_4[]="Antihorario \n\r"; +char Modo_5[]="Horario \n\r"; +uint8_t Unipolar[8] = {0x01,0x03,0x02,0x06, + 0x04,0x0C,0x08,0x09} ; // Unipolar +uint8_t Bipolar[4] = {0x05,0x09,0x0A,0x06} ; // BiPolar +uint8_t Wave_Drive[4] = {0x01,0x02,0x04,0x08} ; // Modo Onda +uint8_t Modo_Completo[4] = {0x03,0x06,0x0C,0x09} ; // Paso Doble +bool Flag; +uint8_t dummy; +/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +| Definición de Funciones Prototipo y Rutinas de los Vectores de Interrupción +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +*/ +void Barrido_OnInterrupt(void); // Rutina de Atención al Ticker +void Buzzer_SetPeriodMode(float Periodo,bool Estado); +void outstrg(char *ap_cad); +void Despliega_L1(char *ap_cad); +void Despliega_L2(char *ap_cad); +void Despliega_L3(char *ap_cad); +void Despliega_L4(char *ap_cad); -USBMouse mouse; //activa la función del mouse USB -TSISensor tsi; //activa el Touch Sensor Interface +/* END Events */ // Rutinas de Atención a Interrupciones + + /* #=============================================================================== | | P R O G R A M A P R I N C I P A L | -#================================================================================ +#=============================================================================== */ -int main() +int main() { + /* Write your code here */ + Barrido.attach_us(&Barrido_OnInterrupt, Velocidad); // Le asigna el periodo de barrido cada 10 ms + No_Pasos=0,paso=0,modo_paso=Medio_Paso; // Configuración de Arranque del Motor + Red_Led = Off; //Apaga Led's de los botones + Green_Led = Off; + terminal.baud(115200); //velocidad de transmisión para la terminal serial + /* Configufración del Display LCD */ /* Mucho OjO !!! */ +// spi_LCD.frequency(100000); // Frecuencia de operación para el SPI (100KHz) +// spi_LCD.format(8,0); // Modo de Operación para el SPI +// i2c_LCD.frequency(100000); // Frecuencia de operación para el I2C (100KHz) +// i2c_LCD.start(); // Inicio de operación para el I2C + lcd.printf(" MOTOR A PASOS"); //mensaje a desplegar en el LCD + terminal.printf(" MOTOR A PASOS\n\r\n"); + Buzzer=Off; // Apaga el Buzzer + Flag=TRUE; // Enciende la bandera + while(1) + { + if (Flag==TRUE) + { + outstrg ("MODO DEL MOTOR A PASOS: "); + if (modo_paso==Modo_Wave) strcpy (Cadena,Modo_3); + if (modo_paso==Paso_Doble) strcpy (Cadena,Modo_2); + if (modo_paso==Paso_Completo) strcpy (Cadena,Modo_1); + if (modo_paso==Medio_Paso) strcpy (Cadena,Modo_0); + outstrg (Cadena); + outstrg ("SENTIDO DEL MOTOR: "); + if (Sentido==Sentido_Antihorario) strcpy (Cadena, Modo_4); + if (Sentido==Sentido_Horario) strcpy (Cadena, Modo_5); + outstrg (Cadena); + dummy=sprintf(Cadena,"Paso: %3d \n\r",paso); + Despliega_L2 (Cadena); + outstrg (Cadena); + dummy=sprintf(Cadena,"No. Pasos: %3d \n\r",No_Pasos); + Despliega_L3 (Cadena); + outstrg (Cadena); + dummy=sprintf(Cadena,"Vueltas: %3d \n\r",Revoluciones); + Despliega_L4 (Cadena); + outstrg (Cadena); +// outstrg (Cadena); + Flag=FALSE ; +// if (tsi.readPercentage()!=0.0) Backlight = 1.0-tsi.readPercentage(); // Lee el TSI y cambia el Backlight del LCD + if (tsi.readPercentage()!=0.0) Velocidad = (1.0-tsi.readPercentage())*65535; // Lee el TSI y cambia la velocidad del motor + wait(0.1); + + } // End Flag + } // End While +} // End Main +/* END Pasos */ +/* END main() */ +/* +................................................................................ +: Rutinas de los Vectores de Interrupción +................................................................................ +*/ + // Las Rutinas de Atención a Interrupcion van aquí ! + +void Barrido_OnInterrupt(void) // Rutina de Atención al Ticker { - MMA8451Q acc(PTE25,PTE24,MMA8451_I2C_ADDRESS); //DATO,RELOJ,DIRECCION - int16_t x = 0; - int16_t y = 0; - int32_t desplazamiento = 5; - float boton = 0; - bool izquierda = 0; - bool centro = 0; - bool derecha = 0; - - while (1) +// if (paso>8)paso=0; +// Buzzer_SetPeriodMode(LA4,FALSE); // Apaga el Buzzer + modo_paso=Modo; + if (Flag==FALSE) + { + if (Atras==FALSE) // Se presionó el Botón Izquierdo? { - x = acc.getAccX()*(desplazamiento+5); - y = -acc.getAccY()*desplazamiento; - mouse.move(y,x); - boton = tsi.readPercentage(); - izquierda = 0; - derecha = 0; - if (boton > 0.0) + Red_Led=On; + Sentido=Sentido_Antihorario; + if (modo_paso==Modo_Wave) // Modo: WAVE DRIVE + { + Buzzer_SetPeriodMode(DO2,TRUE); + Buzzer=On; // Enciende el Buzzer + if (paso==0) paso=3; + else paso-- ; + Salidas=Wave_Drive[paso]; + + } + if (modo_paso==Paso_Completo) // Modo: FULL STEP + { + Buzzer_SetPeriodMode(MI2,TRUE); + Buzzer=On; // Enciende el Buzzer + if (paso==0) paso=6; + else + { + paso--; + paso--; + } + Salidas=(Unipolar [paso]); + } + if (modo_paso==Medio_Paso) // Modo: HALF STEP + { + Buzzer_SetPeriodMode(SOL2,TRUE); + Buzzer=On; // Enciende el Buzzer + if (paso==0) paso=7; + else paso-- ; + Salidas=(Unipolar [paso]); + } + if (modo_paso==Paso_Doble) // Modo: DOUBLE STEP + { + Buzzer_SetPeriodMode(LAs2,TRUE); + Buzzer=On; // Enciende el Buzzer + if (paso==0) paso=3; + else paso-- ; + Salidas=Bipolar[paso]; + + } + No_Pasos-- ; + Red_Led = Off; // Apaga Led's de los botones + } + Flag=TRUE; + if (Adelante==FALSE) // Se presionó el Botón Derecho? + { + Green_Led=On; + Sentido=Sentido_Horario; + if (modo_paso==Modo_Wave) // Modo: WAVE DRIVE + { + Buzzer_SetPeriodMode(DO3,TRUE); + Buzzer=On; // Enciende el Buzzer + if (paso==3) paso=0; + else paso++ ; + Salidas=(Wave_Drive [paso]); + } + if (modo_paso==Paso_Completo) // Modo: FULL STEP + { + Buzzer_SetPeriodMode(MI3,TRUE); + Buzzer=On; // Enciende el Buzzer + if (paso==6) paso=0; + else + { + paso++; + paso++; + } + Salidas=(Unipolar [paso]); + } + if (modo_paso==Medio_Paso) // Modo: HALF STEP { - if (tsi.readPercentage() < 0.3) derecha = 1; // Lee el TSI para buscar el boton derecho -// if (tsi.readPercentage() >=0.33 <=0.66) centro = 1; // Lee el TSI para buscar el boton central - if (tsi.readPercentage() > 0.7) izquierda = 1; // Lee el TSI para buscar el boton izquierdo - } - if (izquierda) mouse.click(MOUSE_LEFT); // Activa el click del botón izquierdo - if (derecha) mouse.click(MOUSE_RIGHT); // Activa el click del botón derecho - wait(0.001); - } + Buzzer_SetPeriodMode(SOL3,TRUE); + Buzzer=On; // Enciende el Buzzer + if (paso==7) paso=0; + else paso++ ; + Salidas=(Unipolar [paso]); + } + if (modo_paso==Paso_Doble) // Modo: DOUBLE STEP + { + Buzzer_SetPeriodMode(LAs3,TRUE); + Buzzer=On; // Enciende el Buzzer + if (paso==3) paso=0; + else paso++ ; + Salidas=Bipolar[paso]; + + } + No_Pasos++ ; + } + //Flag=TRUE; + Green_Led = Off; //Apaga Led's de los botones + } + if (No_Pasos==180) Revoluciones++; + Flag=TRUE ; } +/* END Events */ + +/* +________________________________________________________________________________ +| +| Funciones Prototipo +|_______________________________________________________________________________ +*/ + // Las Funciones Prototipo van aquí ! + +void Buzzer_SetPeriodMode(float Periodo,bool Estado) +{ + Buzzer.period(Periodo); + Buzzer.pulsewidth(Periodo/2); + if (Estado==1)Buzzer=0.5; + if (Estado==0)Buzzer=0.0; +} + + +void outstrg(char *ap_cad) +{ + while(*ap_cad) + { + while(!terminal.writeable()); + terminal.putc(*ap_cad++); + printf("%s",*ap_cad); + } +} + +void Despliega_L1(char *ap_cad) +{ + lcd.locate(0,1); //Coloca cursor de la LCD al inicio de la Linea 1. + lcd.printf("", *ap_cad); //Imprime mensaje en la LCD. +} +void Despliega_L2(char *ap_cad) +{ + lcd.locate(0,2); //Coloca cursor de la LCD al inicio de la Linea 2. + lcd.printf("", *ap_cad); //Imprime mensaje en la LCD. +} +void Despliega_L3(char *ap_cad) +{ + lcd.locate(0,3); //Coloca cursor de la LCD al inicio de la Linea 3. + lcd.printf("", *ap_cad); //Imprime mensaje en la LCD. +} +void Despliega_L4(char *ap_cad) +{ + lcd.locate(0,4); //Coloca cursor de la LCD al inicio de la Linea 4. + lcd.printf("", *ap_cad); //Imprime mensaje en la LCD. +} +/* END Routines */ + +/* END program */ /* +-------------------------------------------------------------------------------- | EJERCICIO | -| 1.- Modificar el programa para que acepte tambien las funciones: - mouse.doubleclick(MOUSE_LEFT); -| 2.- Agregar al programa la función de scroll utilizando el botón central y el eje z -| utilizar MOUSE_MIDDLE +| 1.- Habilitar el módulo TSI para cambiar la velocidad del motor. +| 2.- Habilitar el programa para que despligue los datos en la pantalla LCD: +| ++------------------------------------------------------------------------------- +| EXAMEN | -| Sugerencia: Revisar USBMouse.cpp y USBMouse.h -| -+-------------------------------------------------------------------------------- +| 1.- Modificar el programa para que envie datos y se pueda modificar a traves +| del teléfono celular por medio de la interface Bluetooth. +| Suerte! ++------------------------------------------------------------------------------- | | T H E A N T U L I U S T E A M | Research, Development, Systems Equipment, Support & Spare Parts I n c. @@ -91,4 +447,5 @@ | This program is licensed under rules of | THE BEANERS TECHNOLOGIES PROYECT +------------------------------------------------------------------------------- -*/ \ No newline at end of file +*/ +/* END Mbed */ \ No newline at end of file