From b35dcf0039beb3e09223e7973e626fb67430eadc Mon Sep 17 00:00:00 2001 From: Jonas Arnold Date: Thu, 6 Oct 2022 16:14:59 +0200 Subject: [PATCH 1/5] automatic position calculation for dictionary initialization, added offset correction parameter for init, improved test function --- ADIS_tinyK22_SplitFlap/source/application.c | 28 +++--- ADIS_tinyK22_SplitFlap/source/splitflap.c | 98 ++++++++++----------- ADIS_tinyK22_SplitFlap/source/splitflap.h | 10 ++- 3 files changed, 71 insertions(+), 65 deletions(-) diff --git a/ADIS_tinyK22_SplitFlap/source/application.c b/ADIS_tinyK22_SplitFlap/source/application.c index 1183c76..bb40569 100644 --- a/ADIS_tinyK22_SplitFlap/source/application.c +++ b/ADIS_tinyK22_SplitFlap/source/application.c @@ -72,21 +72,25 @@ 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"); + SF_MoveMotorToZeroPosition(splitflap0, 2); + PRINTF("Init of motors done.\n\n"); + + // go through the following letters + char* letters[] = {"J", "O", "N", "A", "S", "!"}; + 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)); + } } + /* TEST PATTERN */ /*while(1) { if(SF_GetMagSensorAtZeroPosition(splitflap0)){ diff --git a/ADIS_tinyK22_SplitFlap/source/splitflap.c b/ADIS_tinyK22_SplitFlap/source/splitflap.c index 6145e97..47510b9 100644 --- a/ADIS_tinyK22_SplitFlap/source/splitflap.c +++ b/ADIS_tinyK22_SplitFlap/source/splitflap.c @@ -20,46 +20,47 @@ void SF_InitConfig(void){ ((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 + addItem(splitFlapDict, SF_SPACE, (int32_t*)0); + addItem(splitFlapDict, SF_A, (int32_t*)(int32_t)(stepsPerSegment * 1.0 + 0.5)); // +0.5 so that the rounding is + addItem(splitFlapDict, SF_B, (int32_t*)(int32_t)(stepsPerSegment * 2.0 + 0.5)); // done correctly + addItem(splitFlapDict, SF_C, (int32_t*)(int32_t)(stepsPerSegment * 3.0 + 0.5)); + addItem(splitFlapDict, SF_D, (int32_t*)(int32_t)(stepsPerSegment * 4.0 + 0.5)); + addItem(splitFlapDict, SF_E, (int32_t*)(int32_t)(stepsPerSegment * 5.0 + 0.5)); + addItem(splitFlapDict, SF_F, (int32_t*)(int32_t)(stepsPerSegment * 6.0 + 0.5)); + addItem(splitFlapDict, SF_G, (int32_t*)(int32_t)(stepsPerSegment * 7.0 + 0.5)); + addItem(splitFlapDict, SF_H, (int32_t*)(int32_t)(stepsPerSegment * 8.0 + 0.5)); + addItem(splitFlapDict, SF_I, (int32_t*)(int32_t)(stepsPerSegment * 9.0 + 0.5)); + addItem(splitFlapDict, SF_J, (int32_t*)(int32_t)(stepsPerSegment * 10.0 + 0.5)); + addItem(splitFlapDict, SF_K, (int32_t*)(int32_t)(stepsPerSegment * 11.0 + 0.5)); + addItem(splitFlapDict, SF_L, (int32_t*)(int32_t)(stepsPerSegment * 12.0 + 0.5)); + addItem(splitFlapDict, SF_M, (int32_t*)(int32_t)(stepsPerSegment * 13.0 + 0.5)); + addItem(splitFlapDict, SF_N, (int32_t*)(int32_t)(stepsPerSegment * 14.0 + 0.5)); + addItem(splitFlapDict, SF_O, (int32_t*)(int32_t)(stepsPerSegment * 15.0 + 0.5)); + addItem(splitFlapDict, SF_P, (int32_t*)(int32_t)(stepsPerSegment * 16.0 + 0.5)); + addItem(splitFlapDict, SF_Q, (int32_t*)(int32_t)(stepsPerSegment * 17.0 + 0.5)); + addItem(splitFlapDict, SF_R, (int32_t*)(int32_t)(stepsPerSegment * 18.0 + 0.5)); + addItem(splitFlapDict, SF_S, (int32_t*)(int32_t)(stepsPerSegment * 19.0 + 0.5)); + addItem(splitFlapDict, SF_T, (int32_t*)(int32_t)(stepsPerSegment * 20.0 + 0.5)); + addItem(splitFlapDict, SF_U, (int32_t*)(int32_t)(stepsPerSegment * 21.0 + 0.5)); + addItem(splitFlapDict, SF_V, (int32_t*)(int32_t)(stepsPerSegment * 22.0 + 0.5)); + addItem(splitFlapDict, SF_W, (int32_t*)(int32_t)(stepsPerSegment * 23.0 + 0.5)); + addItem(splitFlapDict, SF_X, (int32_t*)(int32_t)(stepsPerSegment * 24.0 + 0.5)); + addItem(splitFlapDict, SF_Y, (int32_t*)(int32_t)(stepsPerSegment * 25.0 + 0.5)); + addItem(splitFlapDict, SF_Z, (int32_t*)(int32_t)(stepsPerSegment * 26.0 + 0.5)); + addItem(splitFlapDict, SF_0, (int32_t*)(int32_t)(stepsPerSegment * 27.0 + 0.5)); + addItem(splitFlapDict, SF_1, (int32_t*)(int32_t)(stepsPerSegment * 28.0 + 0.5)); + addItem(splitFlapDict, SF_2, (int32_t*)(int32_t)(stepsPerSegment * 29.0 + 0.5)); + addItem(splitFlapDict, SF_3, (int32_t*)(int32_t)(stepsPerSegment * 30.0 + 0.5)); + addItem(splitFlapDict, SF_4, (int32_t*)(int32_t)(stepsPerSegment * 31.0 + 0.5)); + addItem(splitFlapDict, SF_5, (int32_t*)(int32_t)(stepsPerSegment * 32.0 + 0.5)); + addItem(splitFlapDict, SF_6, (int32_t*)(int32_t)(stepsPerSegment * 33.0 + 0.5)); + addItem(splitFlapDict, SF_7, (int32_t*)(int32_t)(stepsPerSegment * 34.0 + 0.5)); + addItem(splitFlapDict, SF_8, (int32_t*)(int32_t)(stepsPerSegment * 35.0 + 0.5)); + addItem(splitFlapDict, SF_9, (int32_t*)(int32_t)(stepsPerSegment * 36.0 + 0.5)); + addItem(splitFlapDict, SF_EXCLAMATION, (int32_t*)(int32_t)(stepsPerSegment * 37.0 + 0.5)); + addItem(splitFlapDict, SF_QUESTION, (int32_t*)(int32_t)(stepsPerSegment * 38.0 + 0.5)); + addItem(splitFlapDict, SF_COLON, (int32_t*)(int32_t)(stepsPerSegment * 39.0 + 0.5)); } void SF_DeInitConfig(void){ @@ -79,12 +80,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, int8_t offsetSegments){ int numStepsMoved = 0; // move out of sensor @@ -102,7 +101,9 @@ bool SF_MoveMotorToZeroPosition(SF_Handle_t instance){ // one more segment if not already one round if(numStepsMoved < SPLITFLAP_STEPS_ONE_ROUND){ - for(int i=0; imotor); McuWait_Waitms(20); numStepsMoved++; @@ -115,11 +116,10 @@ bool SF_MoveMotorToZeroPosition(SF_Handle_t instance){ } void SF_MoveSteps(SF_Handle_t instance, int32_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 +140,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 +150,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..4de8ea6 100644 --- a/ADIS_tinyK22_SplitFlap/source/splitflap.h +++ b/ADIS_tinyK22_SplitFlap/source/splitflap.h @@ -16,8 +16,9 @@ /****** 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 40 +#define SPLITFLAP_STEPS_PER_SEGMENT (float)SPLITFLAP_STEPS_ONE_ROUND/(float)SPLITFLAP_AMOUNT_OF_SEGMENTS /****** TYPES ******/ @@ -50,8 +51,9 @@ 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) + * with the offsetSegments parameter, the amount of segments to offset can be given */ +bool SF_MoveMotorToZeroPosition(SF_Handle_t instance, int8_t offsetSegments); /* split flap moves number of steps maybe uint16_t? */ void SF_MoveSteps(SF_Handle_t instance, int32_t steps); From 78618a02251e269331c57d8471c80b02759ca04c Mon Sep 17 00:00:00 2001 From: Jonas Arnold Date: Fri, 7 Oct 2022 08:57:49 +0200 Subject: [PATCH 2/5] simplified initialization of dictionary, added logging, removed splitflaps_flaps.h --- ADIS_tinyK22_SplitFlap/source/splitflap.c | 60 ++++++------------- ADIS_tinyK22_SplitFlap/source/splitflap.h | 6 +- .../source/splitflap_flaps.h | 55 ----------------- 3 files changed, 21 insertions(+), 100 deletions(-) delete mode 100644 ADIS_tinyK22_SplitFlap/source/splitflap_flaps.h diff --git a/ADIS_tinyK22_SplitFlap/source/splitflap.c b/ADIS_tinyK22_SplitFlap/source/splitflap.c index 47510b9..8e6cd13 100644 --- a/ADIS_tinyK22_SplitFlap/source/splitflap.c +++ b/ADIS_tinyK22_SplitFlap/source/splitflap.c @@ -7,13 +7,19 @@ */ #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(); @@ -21,46 +27,16 @@ void SF_InitConfig(void){ ((dict_t*)splitFlapDict)->value=NULL; ((dict_t*)splitFlapDict)->next=NULL; float stepsPerSegment = SPLITFLAP_STEPS_PER_SEGMENT; // do division once - addItem(splitFlapDict, SF_SPACE, (int32_t*)0); - addItem(splitFlapDict, SF_A, (int32_t*)(int32_t)(stepsPerSegment * 1.0 + 0.5)); // +0.5 so that the rounding is - addItem(splitFlapDict, SF_B, (int32_t*)(int32_t)(stepsPerSegment * 2.0 + 0.5)); // done correctly - addItem(splitFlapDict, SF_C, (int32_t*)(int32_t)(stepsPerSegment * 3.0 + 0.5)); - addItem(splitFlapDict, SF_D, (int32_t*)(int32_t)(stepsPerSegment * 4.0 + 0.5)); - addItem(splitFlapDict, SF_E, (int32_t*)(int32_t)(stepsPerSegment * 5.0 + 0.5)); - addItem(splitFlapDict, SF_F, (int32_t*)(int32_t)(stepsPerSegment * 6.0 + 0.5)); - addItem(splitFlapDict, SF_G, (int32_t*)(int32_t)(stepsPerSegment * 7.0 + 0.5)); - addItem(splitFlapDict, SF_H, (int32_t*)(int32_t)(stepsPerSegment * 8.0 + 0.5)); - addItem(splitFlapDict, SF_I, (int32_t*)(int32_t)(stepsPerSegment * 9.0 + 0.5)); - addItem(splitFlapDict, SF_J, (int32_t*)(int32_t)(stepsPerSegment * 10.0 + 0.5)); - addItem(splitFlapDict, SF_K, (int32_t*)(int32_t)(stepsPerSegment * 11.0 + 0.5)); - addItem(splitFlapDict, SF_L, (int32_t*)(int32_t)(stepsPerSegment * 12.0 + 0.5)); - addItem(splitFlapDict, SF_M, (int32_t*)(int32_t)(stepsPerSegment * 13.0 + 0.5)); - addItem(splitFlapDict, SF_N, (int32_t*)(int32_t)(stepsPerSegment * 14.0 + 0.5)); - addItem(splitFlapDict, SF_O, (int32_t*)(int32_t)(stepsPerSegment * 15.0 + 0.5)); - addItem(splitFlapDict, SF_P, (int32_t*)(int32_t)(stepsPerSegment * 16.0 + 0.5)); - addItem(splitFlapDict, SF_Q, (int32_t*)(int32_t)(stepsPerSegment * 17.0 + 0.5)); - addItem(splitFlapDict, SF_R, (int32_t*)(int32_t)(stepsPerSegment * 18.0 + 0.5)); - addItem(splitFlapDict, SF_S, (int32_t*)(int32_t)(stepsPerSegment * 19.0 + 0.5)); - addItem(splitFlapDict, SF_T, (int32_t*)(int32_t)(stepsPerSegment * 20.0 + 0.5)); - addItem(splitFlapDict, SF_U, (int32_t*)(int32_t)(stepsPerSegment * 21.0 + 0.5)); - addItem(splitFlapDict, SF_V, (int32_t*)(int32_t)(stepsPerSegment * 22.0 + 0.5)); - addItem(splitFlapDict, SF_W, (int32_t*)(int32_t)(stepsPerSegment * 23.0 + 0.5)); - addItem(splitFlapDict, SF_X, (int32_t*)(int32_t)(stepsPerSegment * 24.0 + 0.5)); - addItem(splitFlapDict, SF_Y, (int32_t*)(int32_t)(stepsPerSegment * 25.0 + 0.5)); - addItem(splitFlapDict, SF_Z, (int32_t*)(int32_t)(stepsPerSegment * 26.0 + 0.5)); - addItem(splitFlapDict, SF_0, (int32_t*)(int32_t)(stepsPerSegment * 27.0 + 0.5)); - addItem(splitFlapDict, SF_1, (int32_t*)(int32_t)(stepsPerSegment * 28.0 + 0.5)); - addItem(splitFlapDict, SF_2, (int32_t*)(int32_t)(stepsPerSegment * 29.0 + 0.5)); - addItem(splitFlapDict, SF_3, (int32_t*)(int32_t)(stepsPerSegment * 30.0 + 0.5)); - addItem(splitFlapDict, SF_4, (int32_t*)(int32_t)(stepsPerSegment * 31.0 + 0.5)); - addItem(splitFlapDict, SF_5, (int32_t*)(int32_t)(stepsPerSegment * 32.0 + 0.5)); - addItem(splitFlapDict, SF_6, (int32_t*)(int32_t)(stepsPerSegment * 33.0 + 0.5)); - addItem(splitFlapDict, SF_7, (int32_t*)(int32_t)(stepsPerSegment * 34.0 + 0.5)); - addItem(splitFlapDict, SF_8, (int32_t*)(int32_t)(stepsPerSegment * 35.0 + 0.5)); - addItem(splitFlapDict, SF_9, (int32_t*)(int32_t)(stepsPerSegment * 36.0 + 0.5)); - addItem(splitFlapDict, SF_EXCLAMATION, (int32_t*)(int32_t)(stepsPerSegment * 37.0 + 0.5)); - addItem(splitFlapDict, SF_QUESTION, (int32_t*)(int32_t)(stepsPerSegment * 38.0 + 0.5)); - addItem(splitFlapDict, SF_COLON, (int32_t*)(int32_t)(stepsPerSegment * 39.0 + 0.5)); + + // 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); + addItem(splitFlapDict, SF_Letters[i], (int32_t*)position); + PRINTF("Letter '%s': Position %i\n", SF_Letters[i], (int)position); + } } void SF_DeInitConfig(void){ @@ -102,7 +78,7 @@ bool SF_MoveMotorToZeroPosition(SF_Handle_t instance, int8_t offsetSegments){ // one more segment if not already one round if(numStepsMoved < SPLITFLAP_STEPS_ONE_ROUND){ // +0.5 so that the rounding is done correctly - int8_t offsetSteps = (int8_t)((float)offsetSegments*SPLITFLAP_STEPS_PER_SEGMENT + 0.5); + int8_t offsetSteps = offsetSegments * SPLITFLAP_STEPS_ONE_ROUND/SPLITFLAP_AMOUNT_OF_SEGMENTS; // (int8_t)((float)offsetSegments*SPLITFLAP_STEPS_PER_SEGMENT + 0.5); for(int i=0; i < offsetSteps; i++){ McuULN2003_IncStep(((SF_t*)instance)->motor); McuWait_Waitms(20); diff --git a/ADIS_tinyK22_SplitFlap/source/splitflap.h b/ADIS_tinyK22_SplitFlap/source/splitflap.h index 4de8ea6..0a28ac3 100644 --- a/ADIS_tinyK22_SplitFlap/source/splitflap.h +++ b/ADIS_tinyK22_SplitFlap/source/splitflap.h @@ -12,13 +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 512 -#define SPLITFLAP_AMOUNT_OF_SEGMENTS 40 -#define SPLITFLAP_STEPS_PER_SEGMENT (float)SPLITFLAP_STEPS_ONE_ROUND/(float)SPLITFLAP_AMOUNT_OF_SEGMENTS +#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 ******/ @@ -36,7 +37,6 @@ typedef struct { McuGPIO_Config_t magSensorConfig; } SF_Config_t; - /****** FUNCTIONS ******/ /* initializes dictonary with splitflap flaps position */ void SF_InitConfig(void); 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_ */ From 759d1424e565122f403356c5f733e371157e35a1 Mon Sep 17 00:00:00 2001 From: Jonas Arnold Date: Fri, 7 Oct 2022 09:16:19 +0200 Subject: [PATCH 3/5] removed old test pattern, added check if init was successful --- ADIS_tinyK22_SplitFlap/source/application.c | 22 +++++++-------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/ADIS_tinyK22_SplitFlap/source/application.c b/ADIS_tinyK22_SplitFlap/source/application.c index bb40569..1fa4d08 100644 --- a/ADIS_tinyK22_SplitFlap/source/application.c +++ b/ADIS_tinyK22_SplitFlap/source/application.c @@ -73,8 +73,13 @@ void App_Init(void){ void App_Run(void){ PRINTF("Initializing split flap motors.\n"); - SF_MoveMotorToZeroPosition(splitflap0, 2); - PRINTF("Init of motors done.\n\n"); + bool successfulInit = SF_MoveMotorToZeroPosition(splitflap0, 2); + PRINTF("Init of motors done. Success = %s\n\n", successfulInit ? "true" : "false"); + + // if init failed => stop + if(successfulInit == false){ + return; + } // go through the following letters char* letters[] = {"J", "O", "N", "A", "S", "!"}; @@ -88,19 +93,6 @@ void App_Run(void){ PRINTF("Position after move is is %i\n", (int)SF_GetMotorPosition(splitflap0)); } } - - - - /* TEST PATTERN */ - /*while(1) { - if(SF_GetMagSensorAtZeroPosition(splitflap0)){ - McuLED_On(LED_blue); - } else { - McuLED_Off(LED_blue); - } - - McuWait_Waitms(10); // wait for 10 ms - }*/ } From b1720426e4ace51abaf2d4612c6d46ff1d3c997a Mon Sep 17 00:00:00 2001 From: Jonas Arnold Date: Fri, 7 Oct 2022 10:19:58 +0200 Subject: [PATCH 4/5] init: changed from offsetSegments to offsetSteps to allow more granularity, fixed bug in init (numStepsMoved counter), changed steps parameter data types to unsigned (only positive steps allowed) --- ADIS_tinyK22_SplitFlap/source/application.c | 2 +- ADIS_tinyK22_SplitFlap/source/splitflap.c | 12 +++++------- ADIS_tinyK22_SplitFlap/source/splitflap.h | 9 +++++---- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/ADIS_tinyK22_SplitFlap/source/application.c b/ADIS_tinyK22_SplitFlap/source/application.c index 1fa4d08..bd31d75 100644 --- a/ADIS_tinyK22_SplitFlap/source/application.c +++ b/ADIS_tinyK22_SplitFlap/source/application.c @@ -73,7 +73,7 @@ void App_Init(void){ void App_Run(void){ PRINTF("Initializing split flap motors.\n"); - bool successfulInit = SF_MoveMotorToZeroPosition(splitflap0, 2); + bool successfulInit = SF_MoveMotorToZeroPosition(splitflap0, 20); PRINTF("Init of motors done. Success = %s\n\n", successfulInit ? "true" : "false"); // if init failed => stop diff --git a/ADIS_tinyK22_SplitFlap/source/splitflap.c b/ADIS_tinyK22_SplitFlap/source/splitflap.c index 8e6cd13..75e63bc 100644 --- a/ADIS_tinyK22_SplitFlap/source/splitflap.c +++ b/ADIS_tinyK22_SplitFlap/source/splitflap.c @@ -59,7 +59,7 @@ SF_Handle_t SF_Init(SF_Config_t* instance, int id){ return splitflap; } -bool SF_MoveMotorToZeroPosition(SF_Handle_t instance, int8_t offsetSegments){ +bool SF_MoveMotorToZeroPosition(SF_Handle_t instance, uint16_t offsetSteps){ int numStepsMoved = 0; // move out of sensor @@ -68,30 +68,28 @@ bool SF_MoveMotorToZeroPosition(SF_Handle_t instance, int8_t offsetSegments){ 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){ - // +0.5 so that the rounding is done correctly - int8_t offsetSteps = offsetSegments * SPLITFLAP_STEPS_ONE_ROUND/SPLITFLAP_AMOUNT_OF_SEGMENTS; // (int8_t)((float)offsetSegments*SPLITFLAP_STEPS_PER_SEGMENT + 0.5); for(int i=0; i < offsetSteps; i++){ McuULN2003_IncStep(((SF_t*)instance)->motor); 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){ diff --git a/ADIS_tinyK22_SplitFlap/source/splitflap.h b/ADIS_tinyK22_SplitFlap/source/splitflap.h index 0a28ac3..7132b85 100644 --- a/ADIS_tinyK22_SplitFlap/source/splitflap.h +++ b/ADIS_tinyK22_SplitFlap/source/splitflap.h @@ -52,11 +52,12 @@ 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) - * with the offsetSegments parameter, the amount of segments to offset can be given */ -bool SF_MoveMotorToZeroPosition(SF_Handle_t instance, int8_t offsetSegments); + * 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); From 929240dd9fccc4330c5118c8ef6a7d9b75865ca3 Mon Sep 17 00:00:00 2001 From: Jonas Arnold Date: Fri, 7 Oct 2022 12:43:02 +0200 Subject: [PATCH 5/5] added rounding, added alphabet test, adapted offset to SplitFlap 37 --- ADIS_tinyK22_SplitFlap/.cproject | 2 +- ADIS_tinyK22_SplitFlap/source/application.c | 6 +++++- ADIS_tinyK22_SplitFlap/source/splitflap.c | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) 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 bd31d75..e650d6e 100644 --- a/ADIS_tinyK22_SplitFlap/source/application.c +++ b/ADIS_tinyK22_SplitFlap/source/application.c @@ -73,7 +73,7 @@ void App_Init(void){ void App_Run(void){ PRINTF("Initializing split flap motors.\n"); - bool successfulInit = SF_MoveMotorToZeroPosition(splitflap0, 20); + bool successfulInit = SF_MoveMotorToZeroPosition(splitflap0, 12); PRINTF("Init of motors done. Success = %s\n\n", successfulInit ? "true" : "false"); // if init failed => stop @@ -83,6 +83,10 @@ void App_Run(void){ // 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){ diff --git a/ADIS_tinyK22_SplitFlap/source/splitflap.c b/ADIS_tinyK22_SplitFlap/source/splitflap.c index 75e63bc..a1a7543 100644 --- a/ADIS_tinyK22_SplitFlap/source/splitflap.c +++ b/ADIS_tinyK22_SplitFlap/source/splitflap.c @@ -33,7 +33,7 @@ void SF_InitConfig(void){ 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); + 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); }