Merge branch 'main' of gitlab.enterpriselab.ch:adis_team_gueti_roaster/adis_projects into main

main
Simon Frei 4 years ago
commit 633ead6e9e
  1. 2
      ADIS_tinyK22_SplitFlap/.cproject
  2. 38
      ADIS_tinyK22_SplitFlap/source/application.c
  3. 82
      ADIS_tinyK22_SplitFlap/source/splitflap.c
  4. 17
      ADIS_tinyK22_SplitFlap/source/splitflap.h
  5. 55
      ADIS_tinyK22_SplitFlap/source/splitflap_flaps.h

@ -343,7 +343,7 @@
</folderInfo>
<sourceEntries>
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="CMSIS"/>
<entry excluding="TraceRecorder|minIni|HD44780|FreeRTOS/Source/portable/GCC/RISC-V|FreeRTOS/Source/portable/GCC/ARM_CM33|FatFS" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="McuLib"/>
<entry excluding="littleFS|LittlevGL|fonts|TraceRecorder|minIni|HD44780|FreeRTOS/Source/portable/GCC/RISC-V|FreeRTOS/Source/portable/GCC/ARM_CM33|FatFS" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="McuLib"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="board"/>
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="component"/>
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="device"/>

@ -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.");
PRINTF("Initializing split flap motors.\n");
bool successfulInit = SF_MoveMotorToZeroPosition(splitflap0, 12);
PRINTF("Init of motors done. Success = %s\n\n", successfulInit ? "true" : "false");
// go through the whole dictionary
char* letters[] = {"A", "B", "C", "A"};
// if init failed => stop
if(successfulInit == false){
return;
}
// 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]));
for(int i = 0; i < 4; i++){
while(1){
for(int i = 0; i < sizeof(letters)/sizeof(letters[0]); i++){
McuWait_Waitms(1000);
PRINTF("Moving to letter '%s', position is %i", letters[i], (int)SF_GetMotorPosition(splitflap0));
PRINTF("Moving to letter '%s', position is %i\n", letters[i], (int)SF_GetMotorPosition(splitflap0));
SF_MoveToFlap(splitflap0, letters[i]);
PRINTF("Position is %i", (int)SF_GetMotorPosition(splitflap0));
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
}*/
}

@ -7,59 +7,36 @@
*/
#include "splitflap.h"
#include "fsl_debug_console.h"
#include "McuULN2003.h"
#include <stdbool.h>
#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; i<SPLITFLAP_STEPS_PER_SEGMENT; i++){
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){
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){

@ -12,12 +12,14 @@
#include "McuULN2003.h"
#include "McuGPIO.h"
#include "lib/dict.h"
#include <string.h>
/****** 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);

@ -1,55 +0,0 @@
/*
* splitflap_display.h
*
* Created on: 30 Sep 2022
* Author: simon
*/
#ifndef SPLITFLAP_FLAPS_H_
#define SPLITFLAP_FLAPS_H_
#include <string.h>
#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_ */
Loading…
Cancel
Save