Welcome to Hackster!
Hackster is a community dedicated to learning hardware, from beginner to pro. Join us, it's free!
palnagy
Published © GPL3+

Filter Wheel Automation (Astronomy)

A solution to automate an otherwise manual filter wheel, to slide the needed filter into the light train.

IntermediateFull instructions provided1,376
Filter Wheel Automation (Astronomy)

Things used in this project

Hardware components

Arduino Nano R3
Arduino Nano R3
×1
LCD 1602 on I2C
×1
Generic 4x4 keyboard
×1
Dual H-Bridge motor drivers L298
SparkFun Dual H-Bridge motor drivers L298
×1
i2c eeprom module
×1

Hand tools and fabrication machines

Soldering iron (generic)
Soldering iron (generic)

Story

Read more

Schematics

Hand Controller Schematic

It's all modules, no discrete elements.

Code

The code

C/C++
The source code of the hand controller
#define FILTERWHEEL_WELCOME_SCREEN_FIRST_LINE  "FilterWheel v0.4"
#define FILTERWHEEL_WELCOME_SCREEN_SECOND_LINE " csillagtura.ro "


//#define FILTERWHEEL_PROJECT_DEBUG_MODE





#include <AT24Cxx.h>

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

#define EEPROM_I2C_ADDRESS 0x50

AT24Cxx eep(EEPROM_I2C_ADDRESS, 32);


LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

//=================== PINS ======================

#define PIN_MOTOR_RIGHT A0
#define PIN_MOTOR_LEFT A1


#define PIN_ROW_0 12
#define PIN_ROW_1 11
#define PIN_ROW_2 10
#define PIN_ROW_3  9

#define PIN_COL_0 8
#define PIN_COL_1 7
#define PIN_COL_2 6
#define PIN_COL_3 5

#define PIN_OPTO_ENABLE 4

#define PIN_OPTO_INPUT A2

#define PIN_MYSERIAL_TX 3
#define PIN_MYSERIAL_RX 2






//====================== KEYBOARD ==========================
#define KEYBOARD_INPUT_LEN 10
char keyboardInput[KEYBOARD_INPUT_LEN];
int keyboardCursorRead = 0;
int keyboardCursorWrite = 0;
int keyboardCurrentColumn = 0;
const char keyboardKeys[16] = {'1','2','3','A','4','5','6','B','7','8','9','C','*','0','#','D'};

char currentKey = 0;



char keyboardCandidate = 0;
char keyboardPreviousCandidate = 0;
int keyboardCandidateObservedCount = 0;




void keyboardInsert(char c){
  int prev = keyboardCursorWrite - 1;
  if (prev == -1){
    prev = KEYBOARD_INPUT_LEN - 1;
  }
  if (keyboardInput[prev] == c){
    return ;
  }
  keyboardInput[keyboardCursorWrite] = c;
  keyboardCursorWrite++;
  if (keyboardCursorWrite >= KEYBOARD_INPUT_LEN ){
    keyboardCursorWrite = 0;
  }
}

void keyboardInit(){
  pinMode(PIN_ROW_0, INPUT_PULLUP);
  pinMode(PIN_ROW_1, INPUT_PULLUP);
  pinMode(PIN_ROW_2, INPUT_PULLUP);
  pinMode(PIN_ROW_3, INPUT_PULLUP);

  pinMode(PIN_COL_0, OUTPUT);
  pinMode(PIN_COL_1, OUTPUT);
  pinMode(PIN_COL_2, OUTPUT);
  pinMode(PIN_COL_3, OUTPUT);

  digitalWrite(PIN_COL_0, HIGH);
  digitalWrite(PIN_COL_1, HIGH);
  digitalWrite(PIN_COL_2, HIGH);
  digitalWrite(PIN_COL_3, HIGH);
} 

void keyboardProcess(){
  digitalWrite(PIN_COL_0, keyboardCurrentColumn == 0 ? LOW: HIGH);
  digitalWrite(PIN_COL_1, keyboardCurrentColumn == 1 ? LOW: HIGH);
  digitalWrite(PIN_COL_2, keyboardCurrentColumn == 2 ? LOW: HIGH);
  digitalWrite(PIN_COL_3, keyboardCurrentColumn == 3 ? LOW: HIGH);
  if (keyboardCurrentColumn == 0){
    //full cycle, reset
    keyboardCandidate = 0;
  }
  if (digitalRead(PIN_ROW_0) == LOW){
    keyboardCandidate = keyboardKeys[ 0*4 + keyboardCurrentColumn ];
  }
  if (digitalRead(PIN_ROW_1) == LOW){
    keyboardCandidate = keyboardKeys[ 1*4 + keyboardCurrentColumn ];
  }
  if (digitalRead(PIN_ROW_2) == LOW){
    keyboardCandidate = keyboardKeys[ 2*4 + keyboardCurrentColumn ];
  }
  if (digitalRead(PIN_ROW_3) == LOW){
    keyboardCandidate = keyboardKeys[ 3*4 + keyboardCurrentColumn ];
  }
  
  keyboardCurrentColumn++;
  if (keyboardCurrentColumn > 3){    
    keyboardCurrentColumn = 0;
  }

  if (0 == keyboardCurrentColumn){
    //a full cycle has been done
    if (keyboardCandidate == keyboardPreviousCandidate){
      if (keyboardCandidateObservedCount > 100){
        //we have a keypress
        keyboardInsert(keyboardCandidate);
        keyboardCandidateObservedCount = 0;        
      }else{
        keyboardCandidateObservedCount++;
      }
    }else{
      keyboardCandidateObservedCount = 0;
      keyboardPreviousCandidate = keyboardCandidate;
    }
  }


  //Serial.print(candidate);
}

char keyboardGetCurrentKey(){
  char r = 0;
  if (keyboardCursorRead != keyboardCursorWrite){
    r = keyboardInput[keyboardCursorRead];
    keyboardCursorRead = keyboardCursorWrite;    
  };
  return r;
}



#define OPTO_CHANGE_OBSERVED 1
#define OPTO_NO_CHANGE_OBSERVED 0
    
typedef struct OptoObserver {
  unsigned int changes;
  unsigned int observingSameStateCounter;
  byte observingState;
  byte observingPreviousState;
  byte currentState;
  byte optoIsObserving;  
} OptoObserver;

OptoObserver optoObserver;


void optoStart(){
    digitalWrite(PIN_OPTO_ENABLE, HIGH);
    optoObserver.observingState = (digitalRead(PIN_OPTO_INPUT) == HIGH) ? 1 : 0;
    optoObserver.observingPreviousState = optoObserver.observingState;
    optoObserver.optoIsObserving = 1;
}

void optoStop(){
  optoObserver.optoIsObserving = 0;
  digitalWrite(PIN_OPTO_ENABLE, LOW);
}

void optoInit(){
  pinMode(PIN_OPTO_INPUT, INPUT_PULLUP);
  pinMode(PIN_OPTO_ENABLE, OUTPUT);  
  digitalWrite(PIN_OPTO_ENABLE, LOW);
  optoObserver.optoIsObserving = 0;
}

byte optoObserverProcess(){
  byte rez = OPTO_NO_CHANGE_OBSERVED;
  if (1 == optoObserver.optoIsObserving){
    optoObserver.observingState = (digitalRead(PIN_OPTO_INPUT) == HIGH) ? 1 : 0;
    if (optoObserver.observingState == optoObserver.observingPreviousState){
      optoObserver.observingSameStateCounter++;
      if (optoObserver.observingSameStateCounter > 200){
        optoObserver.observingSameStateCounter = 200;
      } 
      if (optoObserver.observingSameStateCounter > 100){
        if (optoObserver.currentState != optoObserver.observingState){
          optoObserver.currentState = optoObserver.observingState;
          //we have an event here
          optoObserver.changes++;
          rez = OPTO_CHANGE_OBSERVED;
          /*
          lcd.setCursor(0,1);
          char n[10];
          itoa(changes, n, 10);
          lcd.print(n);
          lcd.print("     ");
          */
        }
      } 
    }else{
      optoObserver.observingSameStateCounter = 0;
    }
    optoObserver.observingPreviousState = optoObserver.observingState;
  }else{
    // the opto is turned off
  }
  return rez;
}





inline int chrToDir(char dir){
  if (dir == 'L'){
    return 1;
  }else{
    return -1;
  };
}

void(* resetFunc) (void) = 0; //declare reset function @ address 0



#define NUMBER_1_FILTER_INDEX_CHARACTER '\1'
#define NUMBER_2_FILTER_INDEX_CHARACTER '\2'
#define NUMBER_3_FILTER_INDEX_CHARACTER '\3'
#define NUMBER_4_FILTER_INDEX_CHARACTER '\4'
#define NUMBER_5_FILTER_INDEX_CHARACTER '\5'
#define MOTOR_IS_STATIONARY_CHARACTER   '\6'
#define MOTOR_BACKSLASH_CHARACTER       '\7'


byte customBackslash[8] = {
  0b00000,
  0b10000,
  0b01000,
  0b00100,
  0b00010,
  0b00001,
  0b00000,
  0b00000
};
byte customDot[8] = {
  0b00000,
  0b00000,
  0b00100,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000
};
/*
byte customOneFilterIndex[8] = {
  0b01000,
  0b11000,
  0b01001,
  0b01000,
  0b01001,
  0b11100,
  0b00000,
  0b00000
};

byte customTwoFilterIndex[8] = {
  0b01100,
  0b10100,
  0b00101,
  0b01000,
  0b10001,
  0b11100,
  0b00000,
  0b00000
};
*/

byte customOneFilterIndex[8] = {
  0b01000,
  0b11000,
  0b01000,
  0b01000,
  0b11100,
  0b00000,
  0b00000,
  0b00000
};

byte customTwoFilterIndex[8] = {
  0b01000,
  0b10100,
  0b00100,
  0b01000,
  0b11100,
  0b00000,
  0b00000,
  0b00000
};

byte customThreeFilterIndex[8] = {
  0b11000,
  0b00100,
  0b01000,
  0b00100,
  0b11000,
  0b00000,
  0b00000,
  0b00000
};

byte customFourFilterIndex[8] = {
  0b00100,
  0b01100,
  0b10100,
  0b11110,
  0b00100,
  0b00000,
  0b00000,
  0b00000
};

byte customFiveFilterIndex[8] = {
  0b11100,
  0b10000,
  0b11100,
  0b00100,
  0b11000,
  0b00000,
  0b00000,
  0b00000
};

inline void customCharsInit(){
  lcd.createChar((byte) MOTOR_BACKSLASH_CHARACTER, customBackslash);
  lcd.createChar((byte) MOTOR_IS_STATIONARY_CHARACTER, customDot);
  lcd.createChar((byte) NUMBER_1_FILTER_INDEX_CHARACTER, customOneFilterIndex);
  lcd.createChar((byte) NUMBER_2_FILTER_INDEX_CHARACTER, customTwoFilterIndex);
  lcd.createChar((byte) NUMBER_3_FILTER_INDEX_CHARACTER, customThreeFilterIndex);
  lcd.createChar((byte) NUMBER_4_FILTER_INDEX_CHARACTER, customFourFilterIndex);
  lcd.createChar((byte) NUMBER_5_FILTER_INDEX_CHARACTER, customFiveFilterIndex);

}


//=================== MOTOR =====================
const char motorMovingCharacters[4] = {
   '/', '-', MOTOR_BACKSLASH_CHARACTER, '|'
};
int motorMovingCharactersCursor = 0;
int motorIsMoving = 0;
unsigned long int motorOldMillis = 0;




byte motorStoppedFlag = 0;

void motorStop(byte updateScreen){
  optoStop();
  motorIsMoving = 0;
  motorSetDirectionPinsStateByDir(motorIsMoving);
  if (1 == updateScreen){
    motorDrawMovementStatus();
  }
  motorStoppedFlag = 1;
}


void motorInit(){
  pinMode(PIN_MOTOR_LEFT, OUTPUT);
  pinMode(PIN_MOTOR_RIGHT, OUTPUT);
  motorStop(0);
  customCharsInit();
}




#include <SoftwareSerial.h>
SoftwareSerial mySerial(PIN_MYSERIAL_RX, PIN_MYSERIAL_TX);


const int READ_BUFFER_LEN = 96;
char filterWheelSerialReadBuffer[READ_BUFFER_LEN];
char mySerialReadBuffer[READ_BUFFER_LEN];





inline void mySerial_process(){
  while (mySerial.available() > 0){
    char c = mySerial.read();
    if (c == '#'){
      mySerialReadBuffer[0] = 0; 
    }else{
      if (c == '/'){
        Serial.println("message from upstairs");
        Serial.println(mySerialReadBuffer);
        command_process(mySerialReadBuffer, 1);
      }else{
        //continue to concat
        int n = strlen(mySerialReadBuffer);
        if (n < READ_BUFFER_LEN - 2) {
          mySerialReadBuffer[n] = c;
          mySerialReadBuffer[n + 1] = 0;
        }
      }
    }    
  }
}


inline void process_Serial(){
  while (Serial.available() > 0) {
    char c = Serial.read();
    if (c == '#') {
      filterWheelSerialReadBuffer[0] = 0;
    } else {
      if (c == '/') {
        command_process(filterWheelSerialReadBuffer, 0);
        //mySerial.write(filterWheelSerialReadBuffer);
      } else {
        //continue to concat
        int n = strlen(filterWheelSerialReadBuffer);
        if (n < READ_BUFFER_LEN - 2) {
          filterWheelSerialReadBuffer[n] = c;
          filterWheelSerialReadBuffer[n + 1] = 0;
        }
      }
    }
  };
}


inline void serialInit(){
  Serial.begin(9600);
  mySerial.begin(4800);
}

inline void serialProcess(){
  process_Serial();  
  mySerial_process();
}
  
  


void motorProcess(){
  if (0 != motorIsMoving){
    unsigned long int m = millis();
    if (m > motorOldMillis+500){
      motorOldMillis = m;
      motorMovingCharactersCursor++;
      if (motorMovingCharactersCursor >= 4){
        motorMovingCharactersCursor = 0;
      }
      motorDrawMovementStatus();
    }
  }
  if (1 == motorStoppedFlag){
    motorStoppedFlag = 0;
    mySerial.println("#?fw:motstopd?/");
  }
}
void motorStart(int dir){
  if (dir == 0){
    motorIsMoving = 0;
  }else{
    optoStart();
    
    if (dir > 0){
      motorIsMoving = 1;
    }else{
      motorIsMoving = -1;
    };
  }
  motorDrawMovementStatus();
  motorSetDirectionPinsStateByDir(motorIsMoving);
  if (dir == 0){
    motorStop(1);
  }  
}

inline void motorStartChrDir(char dir){
  motorStart(chrToDir(dir));
}

void motorSetDirectionPinsStateByDir(int dir){
    digitalWrite(PIN_MOTOR_RIGHT, dir > 0 ? HIGH : LOW);
    digitalWrite(PIN_MOTOR_LEFT, dir < 0 ? HIGH : LOW);
};

inline void motorPause(byte doPause){
  motorSetDirectionPinsStateByDir((doPause == 0) ? motorIsMoving : 0);
}

void motorDrawMovementStatus(){
    motorPause(1);
    lcd.setCursor(3,0);
    lcd.print(
      (0 != motorIsMoving ) ? 
        motorMovingCharacters[motorMovingCharactersCursor] : 
        MOTOR_IS_STATIONARY_CHARACTER
    );
    motorPause(0);
}




// ================ WHEEL ====================

#define WHEEL_FILTERCOUNT 5
// N position: the number visible on the side,
// F position: the filter actually loaded
// F(N) = N % 5 + 1
#define COUNT_OF_CHANGES_BETWEEN_POSITIONS 123

#define WHEEL_FILTER_NAMES_ITEMSIZE 5
#define WHEEL_FILTER_NAMES_CHAR_ARRAY_SIZE ( WHEEL_FILTERCOUNT * WHEEL_FILTER_NAMES_ITEMSIZE )
#define WHEEL_FILTER_POSITION_ADDRESS 14
#define WHEEL_FILTER_NAMES_CHAR_ARRAY_ADDR (WHEEL_FILTER_POSITION_ADDRESS+2)
char wheelFilterNamesCharArray[WHEEL_FILTER_NAMES_CHAR_ARRAY_SIZE];
byte wheelNamesReadFromEEPROM = 0;

void wheelSaveNPosition(byte p){
    eep.write(WHEEL_FILTER_POSITION_ADDRESS, p);
};

byte wheelReadNPosition(){
    signed char p = eep.read(WHEEL_FILTER_POSITION_ADDRESS);
    if (p < 1){
      return 1;
    }
    if (p > WHEEL_FILTERCOUNT){
      return 1;
    }
    return p;
};


void wheelNamesToSerial(int destinationSerial){
  #define FILTERNAMES_HEAD "?filtrNs="
  #define FILTERNAMES_TAIL "?"
  if (0 == destinationSerial){
    Serial.print('#');
    Serial.print(FILTERNAMES_HEAD);
    for (uint16_t i=0; i<WHEEL_FILTER_NAMES_CHAR_ARRAY_SIZE; i++){
      Serial.print(wheelFilterNamesCharArray[i]);
    }
    Serial.print(FILTERNAMES_TAIL);
    Serial.println('/');
  }
  if (1 == destinationSerial){
    //this guy may be slower, so just enqueue some
    Serial.println("destination is 1");
    mySerial.print('#');
    mySerial.print(FILTERNAMES_HEAD);
    for (uint16_t i=0; i<WHEEL_FILTER_NAMES_CHAR_ARRAY_SIZE; i++){
      mySerial.print(wheelFilterNamesCharArray[i]);
    }
    mySerial.print(FILTERNAMES_TAIL);
    mySerial.println('/');
  }
}

void wheelNamesWrite(){  
  Serial.println("writing to eeprom");
  wheelNamesToSerial(0);
  for (uint16_t i=0; i<WHEEL_FILTER_NAMES_CHAR_ARRAY_SIZE; i++){
    eep.write(WHEEL_FILTER_NAMES_CHAR_ARRAY_ADDR + i, wheelFilterNamesCharArray[i]);
  }
  wheelNamesReadFromEEPROM = 0;
}

void wheelNamesRead(int destinationSerial){
  for (uint16_t i=0; i<WHEEL_FILTER_NAMES_CHAR_ARRAY_SIZE; i++){
    wheelFilterNamesCharArray[i] = eep.read(WHEEL_FILTER_NAMES_CHAR_ARRAY_ADDR + i);
  }
  wheelNamesToSerial(destinationSerial);
}

void wheelNamesCachedRead(){
    if (0 == wheelNamesReadFromEEPROM){
      wheelNamesReadFromEEPROM = 1;
      wheelNamesRead(-1);
    }
}



byte wheelNamesToggleStatus = 1;
void wheelNamesToggle(){
  if (1 == wheelNamesToggleStatus){
    wheelNamesToggleStatus = 0;
    wheelDisplayNPosition(0);
    lcd.setCursor(0,1);
    lcd.print("ABCD:move #d:set");
  }else{
    wheelNamesToggleStatus = 1;
    wheelDisplayNPosition(0);
    wheelNamesCachedRead();
    lcd.setCursor(4,0);    
    int i = 0;
    i+= 2;
    lcd.print(' ');
    lcd.print(' ');
    lcd.print(' ');
    lcd.print(NUMBER_1_FILTER_INDEX_CHARACTER);
    lcd.print(wheelFilterNamesCharArray[i++]);
    lcd.print(wheelFilterNamesCharArray[i++]);
    lcd.print(wheelFilterNamesCharArray[i++]);
    lcd.print(' '); 
    i+= 2;
    lcd.print(NUMBER_2_FILTER_INDEX_CHARACTER);
    lcd.print(wheelFilterNamesCharArray[i++]);
    lcd.print(wheelFilterNamesCharArray[i++]);
    lcd.print(wheelFilterNamesCharArray[i++]);
    lcd.print(' ');
    lcd.setCursor(0,1);
    lcd.print(' ');
    lcd.print(' ');
    i += 2;
    lcd.print(NUMBER_3_FILTER_INDEX_CHARACTER);
    lcd.print(wheelFilterNamesCharArray[i++]);
    lcd.print(wheelFilterNamesCharArray[i++]);
    lcd.print(wheelFilterNamesCharArray[i++]);
    lcd.print(' ');
    i+= 2;
    lcd.print(NUMBER_4_FILTER_INDEX_CHARACTER);
    lcd.print(wheelFilterNamesCharArray[i++]);
    lcd.print(wheelFilterNamesCharArray[i++]);
    lcd.print(wheelFilterNamesCharArray[i++]);
    lcd.print(' ');
    i+= 2;
    lcd.print(NUMBER_5_FILTER_INDEX_CHARACTER);
    lcd.print(wheelFilterNamesCharArray[i++]);
    lcd.print(wheelFilterNamesCharArray[i++]);
    lcd.print(wheelFilterNamesCharArray[i++]);
    lcd.print(' ');    
  }
};  




int wheelPosition = 1;
int wheelStopAfter = 0;

void wheelReportNPositionToSerialPorts(int isSetting){
  Serial.print("#?wheel");
  if (1 == isSetting){
    Serial.print("Set");
  };
  Serial.print("Position=");
  Serial.print(wheelPosition);
  Serial.print("?/");
  mySerial.print("#?wheelPosition=");
  mySerial.print(wheelPosition);
  mySerial.print("?/");
};

void wheelDisplayNPosition(int isSetting){
  lcd.setCursor(0,0);
  lcd.print("N=");
  lcd.print(wheelPosition);
  lcd.print("       d:goto");
  motorDrawMovementStatus();
  wheelReportNPositionToSerialPorts(isSetting);
}

void wheelConsiderWeAreAtNPosition(int n){
  wheelPosition = n;
  wheelSaveNPosition(n);
  wheelDisplayNPosition(1);
};


void wheelMove(int dir, int count){
  optoObserver.changes = 0;
  wheelStopAfter = abs(count) * COUNT_OF_CHANGES_BETWEEN_POSITIONS - 1;
  if (wheelStopAfter < 0){
    wheelStopAfter = 0;
  }
  motorStart(dir);
  wheelPosition = wheelPosition + count*dir;
  while (wheelPosition > WHEEL_FILTERCOUNT){
    wheelPosition -= WHEEL_FILTERCOUNT;
  }
  while (wheelPosition < 1){
    wheelPosition += WHEEL_FILTERCOUNT;
  }
  wheelDisplayNPosition(0);
}

void wheelMoveFullCircleChrDir(char dir){
  wheelMove(chrToDir(dir), WHEEL_FILTERCOUNT);
};


inline void wheelMoveChrDir(char dir, int count){
  wheelMove(chrToDir(dir), count);
};


void wheelMarkInputStateChange(){
  if (wheelStopAfter > 0){
    wheelStopAfter--;
    if (wheelStopAfter == 0){
      motorStop(1);
    }
  }
}

void wheelGotoNPosition(int n){
    int zeroBasedCurrentPosition = wheelPosition - 1;
    int zeroBasedDestination = n - 1;

    int delta = zeroBasedDestination - zeroBasedCurrentPosition;
    if (abs(delta) > WHEEL_FILTERCOUNT / 2){
      int s = delta < 0 ? -1 : 1;
      delta = (WHEEL_FILTERCOUNT - abs(delta))*(s*-1);      
    }
    /*
    lcd.setCursor(0,1);
    lcd.print("delta=");
    lcd.print(delta);
    lcd.print(" ");
    */
    wheelSaveNPosition(zeroBasedDestination + 1);
    wheelMove(-delta, -delta);
    wheelPosition = zeroBasedDestination + 1;
    wheelDisplayNPosition(1);    
}

int wheelNextKeyIsNSetter = 0;

void wheelMoveALittle(char dir, int steps){
    wheelStopAfter = steps;
    motorStartChrDir(dir);
}

void wheelNamesSetIndexZ(int zi, char * subname, int doWrite){
  if (zi < 0){
    return ;//invalid index
  }
  if (zi >= WHEEL_FILTERCOUNT){
    return ; // invalid index
  }
  #ifdef FILTERWHEEL_PROJECT_DEBUG_MODE
  Serial.print("Setting name ");
  Serial.print(zi);
  Serial.print(" to ");
  Serial.println(subname);
  #endif
  int i = zi*WHEEL_FILTER_NAMES_ITEMSIZE;
  wheelFilterNamesCharArray[i++] = zi+48+1;
  wheelFilterNamesCharArray[i++] = '=';  
  byte j=0;
  for (byte k=0; k<WHEEL_FILTER_NAMES_ITEMSIZE-2;k++){
    wheelFilterNamesCharArray[i+k] = (j<strlen(subname)) ? subname[j++] : ' ';
  }
  if (1 == doWrite){
    wheelNamesWrite();
  };
}




int command_process(const char * filterWheelSerialReadBuffer, int destinationSerial){  
  if (strncmp(filterWheelSerialReadBuffer, "filter", 6) == 0){
     wheelMoveChrDir(filterWheelSerialReadBuffer[6], 1);
     return 1;
  }
  if (strncmp(filterWheelSerialReadBuffer, "jump", 4) == 0){
    wheelMoveALittle(filterWheelSerialReadBuffer[4], 10);
    return 1;
  }
  if (strncmp(filterWheelSerialReadBuffer, "move", 4) == 0){
    wheelMoveALittle(filterWheelSerialReadBuffer[4], 4);
    return 1;
  }
  if (strncmp(filterWheelSerialReadBuffer, "step", 4) == 0){
    wheelMoveALittle(filterWheelSerialReadBuffer[4], 1);
    return 1;
  }
  
  if (strncmp(filterWheelSerialReadBuffer, "atn,", 4) == 0){
    wheelConsiderWeAreAtNPosition(filterWheelSerialReadBuffer[4] - 48);
    wheelStopAfter = 0;
    motorStop(1);
    return 1;
  }
  if (strncmp(filterWheelSerialReadBuffer, "goton,", 6) == 0){    
    wheelGotoNPosition(filterWheelSerialReadBuffer[6] - 48);
    return 1;
  }
  if (strncmp(filterWheelSerialReadBuffer, "goton=", 6) == 0){    
    wheelGotoNPosition(filterWheelSerialReadBuffer[6] - 48);
    return 1;
  }
  if (strncmp(filterWheelSerialReadBuffer, "wheren", 6) == 0){
    wheelReportNPositionToSerialPorts(0);
    return 1;
  }
  if (strncmp(filterWheelSerialReadBuffer, "eepnames?", 9) == 0){
    wheelNamesRead(destinationSerial);    
    return 1;
  }
  if (strncmp(filterWheelSerialReadBuffer, "name",4)==0){
    #ifdef DEBUG_MODE
    Serial.println(filterWheelSerialReadBuffer);
    #endif
    if (filterWheelSerialReadBuffer[4] == 's'){
      // names=a,b,c,d,e,f,g,h
      char subname[16];
      subname[0] = 0;
      int subnameIndex = 0;
      for (int i=6; i<64; i++){
        if ((filterWheelSerialReadBuffer[i] == ',') || (filterWheelSerialReadBuffer[i] == 0)){          
          wheelNamesSetIndexZ(subnameIndex, subname, 0);
          if (filterWheelSerialReadBuffer[i] == 0){
            wheelNamesWrite();
            return ;
          }
          subname[0] = 0;
          subnameIndex++;
        }else{
          int l = strlen(subname);
          if (l >= WHEEL_FILTER_NAMES_ITEMSIZE-1){
            l = WHEEL_FILTER_NAMES_ITEMSIZE-2;
          }
          subname[l] = filterWheelSerialReadBuffer[i];
          subname[l+1] = 0;
        }
      }
      //wheelNamesWrite();
    }else{
      // nameN=xyzqw
      strcat(filterWheelSerialReadBuffer, "   ");
      int n = filterWheelSerialReadBuffer[4] - 48;
      wheelNamesSetIndexZ(n-1, filterWheelSerialReadBuffer+6, 1);      
    }
    return 1;
  }  
  return 0;
}





void setup(){
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print(FILTERWHEEL_WELCOME_SCREEN_FIRST_LINE);
  lcd.setCursor(0,1);
  lcd.print(FILTERWHEEL_WELCOME_SCREEN_SECOND_LINE);
  optoInit();
  
  motorInit();

  serialInit();

  #ifndef FILTERWHEEL_PROJECT_DEBUG_MODE
  wheelNamesCachedRead();
  wheelPosition = wheelReadNPosition();
  delay(1000);
  #endif
  keyboardInit();
  lcd.setCursor(0,0);
  lcd.print("Set the cur. N  ");
  wheelNamesToggle();
  #ifdef FILTERWHEEL_PROJECT_DEBUG_MODE
  Serial.println("debug mode");
  wheelNamesRead(0);
  #endif
}




void loop() {
  if (OPTO_CHANGE_OBSERVED == optoObserverProcess()){
    wheelMarkInputStateChange();
  }  
  serialProcess();
  keyboardProcess();
  motorProcess();

  currentKey = keyboardGetCurrentKey();
  if (currentKey != 0){
    if (currentKey == '*'){
      wheelNamesToggle();
    }    
    if (currentKey == '0'){
      resetFunc();
    }
    if (0 != motorIsMoving){
      // do not execute keyboard commands
    }else{
      if ((currentKey >= 49) && (currentKey <= 57)){
        //if (currentKey == '8'){ wheelMoveFullCircleChrDir('R'); }
        if ((currentKey - 48) > WHEEL_FILTERCOUNT){
          //invalid filter N position, zero already handled
          return ;
        }
        if (1 == wheelNamesToggleStatus){
          wheelNamesToggle();
        }
        if (1 == wheelNextKeyIsNSetter){
          wheelConsiderWeAreAtNPosition(currentKey - 48);
          wheelStopAfter = 0;
          motorStop(1);
        }else{
          wheelGotoNPosition(currentKey - 48);          
        }
      }
      if (currentKey == '#'){
        if (1 == wheelNextKeyIsNSetter){
          wheelNextKeyIsNSetter = 0;
          wheelDisplayNPosition(0);
        }else{
          wheelNextKeyIsNSetter = 1;
          lcd.setCursor(2,0);
          lcd.print('?');
        }
      }else{
        wheelNextKeyIsNSetter = 0;
      }
      if (currentKey == 'A'){
        wheelMoveALittle('L', 4);
      }
      if (currentKey == 'D'){
        wheelMoveALittle('R', 4);
      }
      if (currentKey == 'B'){
        wheelMoveALittle('L', 2);
      }
      if (currentKey == 'C'){
          wheelMoveALittle('R', 2);
      }
    }
  }

}

Credits

palnagy
3 projects • 1 follower
Contact

Comments

Please log in or sign up to comment.