diff --git a/ADIS_tinyK22_SplitFlap/.cproject b/ADIS_tinyK22_SplitFlap/.cproject index b78e347..538e3ad 100644 --- a/ADIS_tinyK22_SplitFlap/.cproject +++ b/ADIS_tinyK22_SplitFlap/.cproject @@ -343,7 +343,7 @@ - + diff --git a/ADIS_tinyK22_SplitFlap/source/application.c b/ADIS_tinyK22_SplitFlap/source/application.c index 1183c76..e650d6e 100644 --- a/ADIS_tinyK22_SplitFlap/source/application.c +++ b/ADIS_tinyK22_SplitFlap/source/application.c @@ -72,31 +72,31 @@ void App_Init(void){ /* Application run */ void App_Run(void){ - PRINTF("Initializing split flap motors."); - SF_MoveMotorToZeroPosition(splitflap0); - PRINTF("Init of motors done."); - - // go through the whole dictionary - char* letters[] = {"A", "B", "C", "A"}; - - for(int i = 0; i < 4; i++){ - McuWait_Waitms(1000); - PRINTF("Moving to letter '%s', position is %i", letters[i], (int)SF_GetMotorPosition(splitflap0)); - SF_MoveToFlap(splitflap0, letters[i]); - PRINTF("Position is %i", (int)SF_GetMotorPosition(splitflap0)); - } - + PRINTF("Initializing split flap motors.\n"); + bool successfulInit = SF_MoveMotorToZeroPosition(splitflap0, 12); + PRINTF("Init of motors done. Success = %s\n\n", successfulInit ? "true" : "false"); - /* TEST PATTERN */ - /*while(1) { - if(SF_GetMagSensorAtZeroPosition(splitflap0)){ - McuLED_On(LED_blue); - } else { - McuLED_Off(LED_blue); - } + // if init failed => stop + if(successfulInit == false){ + return; + } - McuWait_Waitms(10); // wait for 10 ms - }*/ + // go through the following letters + char* letters[] = {"J", "O", "N", "A", "S", "!"}; + //char* letters[] = { " ", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", + // "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", + // "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", + // "!", "?", ":"}; + PRINTF("Amount of letters %i\n", sizeof(letters)/sizeof(letters[0])); + + while(1){ + for(int i = 0; i < sizeof(letters)/sizeof(letters[0]); i++){ + McuWait_Waitms(1000); + PRINTF("Moving to letter '%s', position is %i\n", letters[i], (int)SF_GetMotorPosition(splitflap0)); + SF_MoveToFlap(splitflap0, letters[i]); + PRINTF("Position after move is is %i\n", (int)SF_GetMotorPosition(splitflap0)); + } + } } diff --git a/ADIS_tinyK22_SplitFlap/source/splitflap.c b/ADIS_tinyK22_SplitFlap/source/splitflap.c index 6145e97..a1a7543 100644 --- a/ADIS_tinyK22_SplitFlap/source/splitflap.c +++ b/ADIS_tinyK22_SplitFlap/source/splitflap.c @@ -7,59 +7,36 @@ */ #include "splitflap.h" +#include "fsl_debug_console.h" #include "McuULN2003.h" #include #include "McuWait.h" #include "lib/dict.h" -#include "splitflap_flaps.h" +/* dynamic dictionary for the letters of the dictionary */ static dict_t **splitFlapDict; +/* all letters of the splitflap in the correct order */ +static char* SF_Letters[] = { " ", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", + "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", + "!", "?", ":"}; void SF_InitConfig(void){ splitFlapDict = dictAlloc(); ((dict_t*)splitFlapDict)->key=NULL; ((dict_t*)splitFlapDict)->value=NULL; ((dict_t*)splitFlapDict)->next=NULL; - addItem(splitFlapDict, SF_A, (int32_t*)13); - addItem(splitFlapDict, SF_B, (int32_t*)26); - addItem(splitFlapDict, SF_C, (int32_t*)39); - addItem(splitFlapDict, SF_D, (int32_t*)52); - addItem(splitFlapDict, SF_E, (int32_t*)65); - addItem(splitFlapDict, SF_F, (int32_t*)78); - addItem(splitFlapDict, SF_G, (int32_t*)91); - addItem(splitFlapDict, SF_H, (int32_t*)104); - addItem(splitFlapDict, SF_I, (int32_t*)117); - addItem(splitFlapDict, SF_J, (int32_t*)130); - addItem(splitFlapDict, SF_K, (int32_t*)143); - addItem(splitFlapDict, SF_L, (int32_t*)156); - addItem(splitFlapDict, SF_M, (int32_t*)169); - addItem(splitFlapDict, SF_N, (int32_t*)182); - addItem(splitFlapDict, SF_O, (int32_t*)195); - addItem(splitFlapDict, SF_P, (int32_t*)208); - addItem(splitFlapDict, SF_Q, (int32_t*)221); - addItem(splitFlapDict, SF_R, (int32_t*)234); - addItem(splitFlapDict, SF_S, (int32_t*)247); - addItem(splitFlapDict, SF_T, (int32_t*)260); - addItem(splitFlapDict, SF_U, (int32_t*)273); - addItem(splitFlapDict, SF_V, (int32_t*)286); - addItem(splitFlapDict, SF_W, (int32_t*)299); - addItem(splitFlapDict, SF_X, (int32_t*)312); - addItem(splitFlapDict, SF_Y, (int32_t*)325); - addItem(splitFlapDict, SF_Z, (int32_t*)338); - addItem(splitFlapDict, SF_0, (int32_t*)351); - addItem(splitFlapDict, SF_1, (int32_t*)364); - addItem(splitFlapDict, SF_2, (int32_t*)377); - addItem(splitFlapDict, SF_3, (int32_t*)390); - addItem(splitFlapDict, SF_4, (int32_t*)403); - addItem(splitFlapDict, SF_5, (int32_t*)416); - addItem(splitFlapDict, SF_6, (int32_t*)429); - addItem(splitFlapDict, SF_7, (int32_t*)442); - addItem(splitFlapDict, SF_8, (int32_t*)455); - addItem(splitFlapDict, SF_9, (int32_t*)468); - addItem(splitFlapDict, SF_EXCLAMATION, (int32_t*)481); - addItem(splitFlapDict, SF_QUESTION, (int32_t*)494); - addItem(splitFlapDict, SF_COLON, (int32_t*)507); - addItem(splitFlapDict, SF_SPACE, (int32_t*)0); + float stepsPerSegment = SPLITFLAP_STEPS_PER_SEGMENT; // do division once + + // add all splitflap flaps to the dictionary, calculating the position automatically + // print out for debugging + PRINTF("Splitflap positioning data is automatically calculated:\n"); + for(int i = 0; i < SPLITFLAP_AMOUNT_OF_SEGMENTS; i ++){ + // + 0.5 so the rounding is done correctly + int32_t position = (stepsPerSegment * (float)i + 0.5); + addItem(splitFlapDict, SF_Letters[i], (int32_t*)position); + PRINTF("Letter '%s': Position %i\n", SF_Letters[i], (int)position); + } } void SF_DeInitConfig(void){ @@ -79,12 +56,10 @@ SF_Handle_t SF_Init(SF_Config_t* instance, int id){ splitflap->motor = McuULN2003_InitMotor(&instance->motorConfig); splitflap->id = id; - /* TODO IMPLEMENT ACTUAL INITIALIZATION of Motor */ - return splitflap; } -bool SF_MoveMotorToZeroPosition(SF_Handle_t instance){ +bool SF_MoveMotorToZeroPosition(SF_Handle_t instance, uint16_t offsetSteps){ int numStepsMoved = 0; // move out of sensor @@ -93,33 +68,32 @@ bool SF_MoveMotorToZeroPosition(SF_Handle_t instance){ McuWait_Waitms(20); } - // turn until sensor is on + // turn until sensor is on and not reached one full rotation already (timeout) while(SF_GetMagSensorAtZeroPosition((SF_t*)instance) == false && numStepsMoved < SPLITFLAP_STEPS_ONE_ROUND ){ McuULN2003_IncStep(((SF_t*)instance)->motor); McuWait_Waitms(20); numStepsMoved++; } - // one more segment if not already one round + // offset after init if(numStepsMoved < SPLITFLAP_STEPS_ONE_ROUND){ - for(int i=0; imotor); McuWait_Waitms(20); - numStepsMoved++; } } McuULN2003_SetPos(((SF_t*)instance)->motor, 0); McuULN2003_PowerOff(((SF_t*)instance)->motor); + // success if less than one rotation return numStepsMoved < SPLITFLAP_STEPS_ONE_ROUND; } -void SF_MoveSteps(SF_Handle_t instance, int32_t steps){ - +void SF_MoveSteps(SF_Handle_t instance, uint32_t steps){ // run move with acceleration & deceleration McuULN2003_AccelerationStart(((SF_t*)instance)->motor); while(steps>0){ - if(McuULN2003_StepCallback(((SF_t*)instance)->motor, true) == true){ + if(McuULN2003_StepCallback(((SF_t*)instance)->motor, true)){ steps--; } McuWait_Waitms(1); @@ -140,7 +114,7 @@ void SF_MoveToFlap(SF_Handle_t instance, char* flap){ // get flap pos from dictonary int32_t flapPos = (int32_t)getItem(*splitFlapDict, flap); // get current motor pos - int32_t currentPos = SF_GetMotorPosition(instance); + int32_t currentPos = SF_GetMotorPosition(instance) % SPLITFLAP_STEPS_ONE_ROUND; // calc steps to move int32_t stepsToReachFlap = 0; // not already there @@ -150,12 +124,12 @@ void SF_MoveToFlap(SF_Handle_t instance, char* flap){ }else if(flapPos > currentPos){ stepsToReachFlap = flapPos - currentPos; } - SF_MoveSteps(((SF_t*)instance)->motor, stepsToReachFlap); + SF_MoveSteps(instance, stepsToReachFlap); } } int32_t SF_GetMotorPosition(SF_Handle_t instance){ - return McuULN2003_GetPos(((SF_t*)instance)->motor) % SPLITFLAP_STEPS_ONE_ROUND; + return McuULN2003_GetPos(((SF_t*)instance)->motor); } void SF_Deinit(SF_Handle_t instance){ diff --git a/ADIS_tinyK22_SplitFlap/source/splitflap.h b/ADIS_tinyK22_SplitFlap/source/splitflap.h index 9ee2f52..7132b85 100644 --- a/ADIS_tinyK22_SplitFlap/source/splitflap.h +++ b/ADIS_tinyK22_SplitFlap/source/splitflap.h @@ -12,12 +12,14 @@ #include "McuULN2003.h" #include "McuGPIO.h" #include "lib/dict.h" +#include /****** SETTINGS ******/ #define SPLITFLAP_CONFIG_USE_FREERTOS_HEAP 0 -#define SPLITFLAP_STEPS_ONE_ROUND 520 // 40 segments a 13 steps -#define SPLITFLAP_STEPS_PER_SEGMENT 13 +#define SPLITFLAP_STEPS_ONE_ROUND 512 +#define SPLITFLAP_AMOUNT_OF_SEGMENTS (sizeof(SF_Letters)/sizeof(SF_Letters[0])) +#define SPLITFLAP_STEPS_PER_SEGMENT ((float)SPLITFLAP_STEPS_ONE_ROUND/(float)SPLITFLAP_AMOUNT_OF_SEGMENTS) /****** TYPES ******/ @@ -35,7 +37,6 @@ typedef struct { McuGPIO_Config_t magSensorConfig; } SF_Config_t; - /****** FUNCTIONS ******/ /* initializes dictonary with splitflap flaps position */ void SF_InitConfig(void); @@ -50,11 +51,13 @@ SF_Handle_t SF_Init(SF_Config_t* instance, int id); /* Moves split flap slowly to zero position. * returns true if the move was successful, false if not - * (depending on if the sensor was hit before one round) */ -bool SF_MoveMotorToZeroPosition(SF_Handle_t instance); + * (depending on if the sensor was hit before one round) + * offsetSteps: amount of steps to offset from magnet sensor positive flank position + * After moving to zero position, the current position of the motor is set to 0 */ +bool SF_MoveMotorToZeroPosition(SF_Handle_t instance, uint16_t offsetSteps); -/* split flap moves number of steps maybe uint16_t? */ -void SF_MoveSteps(SF_Handle_t instance, int32_t steps); +/* split flap moves number of steps (uint, since only forward moves are allowed) */ +void SF_MoveSteps(SF_Handle_t instance, uint32_t steps); /* get mag sensor state. returns true if sensor is at zero position, otherwise false */ bool SF_GetMagSensorAtZeroPosition(SF_Handle_t instance); diff --git a/ADIS_tinyK22_SplitFlap/source/splitflap_flaps.h b/ADIS_tinyK22_SplitFlap/source/splitflap_flaps.h deleted file mode 100644 index 33e4fe5..0000000 --- a/ADIS_tinyK22_SplitFlap/source/splitflap_flaps.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * splitflap_display.h - * - * Created on: 30 Sep 2022 - * Author: simon - */ - -#ifndef SPLITFLAP_FLAPS_H_ -#define SPLITFLAP_FLAPS_H_ - -#include -#define SF_A "A" -#define SF_B "B" -#define SF_C "C" -#define SF_D "D" -#define SF_E "E" -#define SF_F "F" -#define SF_G "G" -#define SF_H "H" -#define SF_I "I" -#define SF_J "J" -#define SF_K "K" -#define SF_L "L" -#define SF_M "M" -#define SF_N "N" -#define SF_O "O" -#define SF_P "P" -#define SF_Q "Q" -#define SF_R "R" -#define SF_S "S" -#define SF_T "T" -#define SF_U "U" -#define SF_V "V" -#define SF_W "W" -#define SF_X "X" -#define SF_Y "Y" -#define SF_Z "Z" -#define SF_0 "0" -#define SF_1 "1" -#define SF_2 "2" -#define SF_3 "3" -#define SF_4 "4" -#define SF_5 "5" -#define SF_6 "6" -#define SF_7 "7" -#define SF_8 "8" -#define SF_9 "9" -#define SF_EXCLAMATION "!" -#define SF_QUESTION "?" -#define SF_COLON ":" -#define SF_SPACE " " - - - -#endif /* SPLITFLAP_FLAPS_H_ */