/* This Software is used as IO Expansion for LinuxCNC. Here i am using an Mega 2560. It can use as many digital & analog Inputs, Outputs and PWM Outputs as your Arduino can handle. I also generate "virtual Pins" by using latching Potentiometers, which are connected to one analog Pin, but are read in Hal as individual Pins. The Send Protocol is : Inputs are encoded with Letter 'I' Keep alive Signal is send with Letter 'E' Outputs are encoded with Letter 'O' PWM Outputs are encoded with Letter 'P' Analog Inputs are encoded with Letter 'A' Latching Potentiometers are encoded with Letter 'L' Absolute Encoder input is encoded with Letter 'K' */ //###IO's### #define INPUTS #ifdef INPUTS const int Inputs = 16; //number of inputs using internal Pullup resistor. (short to ground to trigger) int InPinmap[] = {32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48}; #endif #define OUTPUTS #ifdef OUTPUTS const int Outputs = 9; //number of outputs int OutPinmap[] = {10,9,8,7,6,5,4,3,2,21}; #endif #define PWMOUTPUTS #ifdef PWMOUTPUTS const int PwmOutput = 2; //number of outputs int PwmOutPinmap[] = {12,11}; #endif #define AINPUTS #ifdef AINPUTS const int AInputs = 1; int AInPinmap[] = {A3}; //Potentiometer for SpindleSpeed override #endif #define LPOTIS #ifdef LPOTIS const int LPotis = 2; int LPotiPins[LPotis][2] = { {A1,8}, //Latching Knob Spindle Overdrive on A1, has 9 Positions {A2,3} //Latching Knob Feed Resolution on A2, has 4 Positions }; #endif #define ABSENCODER #ifdef ABSENCODER const int AbsEncPins[] = {27,28,31,29,30}; //1,2,4,8,16 #endif #define STATUSLED #ifdef STATUSLED const int StatLedPin = 13; //Pin for Status LED const int StatLedErrDel[] = {1000,10}; //Blink Timing for Status LED Error (no connection) #endif //###Misc Settings### const int timeout = 10000; // timeout after 10 sec not receiving Stuff #define DEBUG //Variables for Saving States #ifdef INPUTS int InState[Inputs]; int oldInState[Inputs]; #endif #ifdef OUTPUTS int OutState[Outputs]; int oldOutState[Outputs]; #endif #ifdef AINPUTS int oldAinput[AInputs]; #endif #ifdef LPOTIS int oldLpoti[LPotis]; #endif #ifdef ABSENCODER int oldAbsEncState; #endif //### global Variables setup### //Diese variablen nicht von außen anfassen unsigned long oldmillis = 0; unsigned long newcom = 0; unsigned long lastcom = 0; #define STATE_CMD 0 #define STATE_IO 1 #define STATE_VALUE 2 byte state = STATE_CMD; char inputbuffer[5]; byte bufferIndex = 0; char cmd = 0; uint16_t io = 0; uint16_t value = 0; void setup() { #ifdef ABSENCODER pinMode(AbsEncPins[0], INPUT_PULLUP); pinMode(AbsEncPins[1], INPUT_PULLUP); pinMode(AbsEncPins[2], INPUT_PULLUP); pinMode(AbsEncPins[3], INPUT_PULLUP); pinMode(AbsEncPins[4], INPUT_PULLUP); #endif #ifdef INPUTS //setting Inputs with internal Pullup Resistors for(int i= 0; i timeout){ StatLedErr(); } } void StatLedErr(){ unsigned long newMillis = millis(); if (newMillis - oldmillis >= StatLedErrDel[0]){ digitalWrite(StatLedPin, HIGH); } if (newMillis - oldmillis >= StatLedErrDel[0]+StatLedErrDel[1]){{ digitalWrite(StatLedPin, LOW); oldmillis = newMillis; } } } void sendData(char sig, int pin, int state){ Serial.print(sig); Serial.print(pin); Serial.print(":"); Serial.println(state); } void flushSerial(){ while (Serial.available() > 0) { Serial.read(); } } /* void readData(){ int pin = 0; int state = 0; byte terminated = false; if (Serial.available() > 0) { char inChar = Serial.read(); Serial.println(inChar); if (inChar == 'o'){ Serial.println("O erkannt"); while (!terminated && comalive()){ inChar = Serial.read(); if (inChar == ':'){ } } if (inChar == 'p'){ Serial.println("p erkannt"); sig = 'p'; } } } } */ void writeOutputs(){ for(int x = 0; x 0){ current = Serial.read(); switch(state){ case STATE_CMD: if(isCmdChar(current)){ cmd = current; state = STATE_IO; bufferIndex = 0; } break; case STATE_IO: if(isDigit(current)){ inputbuffer[bufferIndex++] = current; }else if(current == ':'){ inputbuffer[bufferIndex] = 0; io = atoi(inputbuffer); state = STATE_VALUE; bufferIndex = 0; }else{ Serial.print("Ungültiges zeichen: "); Serial.println(current); } break; case STATE_VALUE: if(isDigit(current)){ inputbuffer[bufferIndex++] = current; }else if(current == '\n'){ inputbuffer[bufferIndex] = 0; value = atoi(inputbuffer); commandReceived(cmd, io, value); state = STATE_CMD; }else{ Serial.print("Ungültiges zeichen: "); Serial.println(current); } break; } } }