I'd like to start by thanking you for making this mod, Zitronen. I've been working with it off and on the last week and I'm having a ton of fun (and learning lots!). I'm finally going to be able to build the Kerbal Kontrol Panel I've been wanting! So things were going well. I've had the brakes, gear, lights, RCS, SAS, Abort, Stage, and throttle all working great on my breadboard circuit. Last night I tried adding an LCD screen with a serial backpack and things went south. When I have any code in for the LCD I can't use anything else. While in KSP I can see it finds the right port and all, but it says "No display found." Also, the lights stay off and none of the buttons work. I have the throttle set so it only comes from the controller, but when the LCD is programmed in, I can fully control from the keyboard. The controller doesn't even try. Also, the LCD screen says "0.00" but I'm guessing thats just from the "Setup" function? I've dabbled in programming for a long time, but I took a few years off due to school. I've also never messed with this sort of thing, especially the hardware end. Dealing with serial is totally new to me, so this is probably a dummy error. Specs: I have an Arduino Uno (The mega is on its way! ) The LCD is a 20x4 on pin 2 (I'll post the code too) I have THIS serial backpack on the LCD NOTE: I'm running out of pins and wire for my breadboard, so I don't have the LEDs functioning anymore. I've only altered the Output and the KSPIODemo12 tab for the LCD, so I'll include those two. MY CODE: #include <SoftwareSerial.h> SoftwareSerial lcd(3, 2); //LCD on pin 2 int k = 0; //Variable for the LCD update cycle //pins for LEDs #define GLED 5 //#define YLED 6 //#define RLED 7 //#define SASLED 11 //#define RCSLED 12 //#define CG1LED 13 //pins for input #define SASPIN 8 #define RCSPIN 9 //#define CG1PIN 10 #define THROTTLEPIN 0 #define STAGEPIN 7 #define ABORTPIN 10 #define LIGHTPIN 11 #define BRAKEPIN 12 #define GEARPIN 13 #define THROTTLEDB 4 //Throttle axis deadband //Input enums #define SAS 7 #define RCS 6 #define LIGHTS 5 #define GEAR 4 #define BRAKES 3 #define PRECISION 2 #define ABORT 1 #define STAGE 0 //Action group statuses #define AGSAS 0 #define AGRCS 1 #define AGLight 2 #define AGGear 3 #define AGBrakes 4 #define AGAbort 5 #define AGCustom01 6 #define AGCustom02 7 #define AGCustom03 8 #define AGCustom04 9 #define AGCustom05 10 #define AGCustom06 11 #define AGCustom07 12 #define AGCustom08 13 #define AGCustom09 14 #define AGCustom10 15 //macro #define details(name) (uint8_t*)&name,sizeof(name) //if no message received from KSP for more than 2s, go idle #define IDLETIMER 2000 #define CONTROLREFRESH 25 //warnings #define GWARN 9 //9G Warning #define GCAUTION 5 //5G Caution #define FUELCAUTION 10.0 //10% Fuel Caution #define FUELWARN 5.0 //5% Fuel warning unsigned long deadtime, deadtimeOld, controlTime, controlTimeOld; unsigned long now; boolean Connected = false; byte caution = 0, warning = 0, id; struct VesselData { byte id; //1 float AP; //2 float PE; //3 float SemiMajorAxis; //4 float SemiMinorAxis; //5 float VVI; //6 float e; //7 float inc; //8 float G; //9 long TAp; //10 long TPe; //11 float TrueAnomaly; //12 float Density; //13 long period; //14 float RAlt; //15 float Alt; //16 float Vsurf; //17 float Lat; //18 float Lon; //19 float LiquidFuelTot; //20 float LiquidFuel; //21 float OxidizerTot; //22 float Oxidizer; //23 float EChargeTot; //24 float ECharge; //25 float MonoPropTot; //26 float MonoProp; //27 float IntakeAirTot; //28 float IntakeAir; //29 float SolidFuelTot; //30 float SolidFuel; //31 float XenonGasTot; //32 float XenonGas; //33 float LiquidFuelTotS; //34 float LiquidFuelS; //35 float OxidizerTotS; //36 float OxidizerS; //37 uint32_t MissionTime; //38 float deltaTime; //39 float VOrbit; //40 uint32_t MNTime; //41 float MNDeltaV; //42 float Pitch; //43 float Roll; //44 float Heading; //45 uint16_t ActionGroups; //46 status bit order:SAS, RCS, Light, Gear, Brakes, Abort, Custom01 - 10 byte SOINumber; //47 SOI Number (decimal format: sun-planet-moon e.g. 130 = kerbin, 131 = mun) byte MaxOverHeat; //48 Max part overheat (% percent) float MachNumber; //49 float IAS; //50 Indicated Air Speed }; struct HandShakePacket { byte id; byte M1; byte M2; byte M3; }; struct ControlPacket { byte id; byte MainControls; //SAS RCS Lights Gear Brakes Precision Abort Stage byte Mode; //0 = stage, 1 = docking, 2 = map unsigned int ControlGroup; //control groups 1-10 in 2 bytes byte AdditionalControlByte1; //other stuff byte AdditionalControlByte2; int Pitch; //-1000 -> 1000 int Roll; //-1000 -> 1000 int Yaw; //-1000 -> 1000 int TX; //-1000 -> 1000 int TY; //-1000 -> 1000 int TZ; //-1000 -> 1000 int WheelSteer; //-1000 -> 1000 int Throttle; // 0 -> 1000 int WheelThrottle; // 0 -> 1000 }; HandShakePacket HPacket; VesselData VData; ControlPacket CPacket; void setup() { Serial.begin(38400); //LCD SETUP Serial.begin(9600); //Starts the serial for the LCD lcd.begin(9600); //Starts LCD lcd.write(254); //Calls special command lcd.write(0x10); //Sets BAUD to 38400 delay(500); //Waits 500 lcd.write(254); //Calls special command lcd.write(1); //Clears the LCD lcd.print(VData.G); //Displays the Gee forces (Only to start - output tab contains update function) initLEDS(); InitTxPackets(); controlsInit(); LEDSAllOff(); } void loop() { input(); output(); } void output() { now = millis(); controlTime = now - controlTimeOld; if (controlTime > CONTROLREFRESH){ controlTimeOld = now; controls(); } } void controls() { if (Connected) { if (digitalRead(SASPIN)) //--------- This is how you do main controls MainControls(SAS, HIGH); else MainControls(SAS, LOW); if (digitalRead(RCSPIN)) MainControls(RCS, HIGH); else MainControls(RCS, LOW); if (digitalRead(STAGEPIN)) MainControls(STAGE, HIGH); else MainControls(STAGE, LOW); if (digitalRead(ABORTPIN)) MainControls(ABORT, HIGH); else MainControls(ABORT, LOW); if (digitalRead(LIGHTPIN)) MainControls(LIGHTS, HIGH); else MainControls(LIGHTS, LOW); if (digitalRead(BRAKEPIN)) MainControls(BRAKES, HIGH); else MainControls(BRAKES, LOW); if (digitalRead(GEARPIN)) MainControls(GEAR, HIGH); else MainControls(GEAR, LOW); // if (digitalRead(CG1PIN)) //--------- This is how you do control groups // ControlGroups(1, HIGH); // else // ControlGroups(1, LOW); //This is an example of reading analog inputs to an axis, with deadband and limits CPacket.Throttle = constrain(map(analogRead(THROTTLEPIN),THROTTLEDB,1024-THROTTLEDB,0,1000),0, 1000); // This is so the LCD only gets every third packet (fixes refresh problem) if (k == 3){ UPLCD(); k=0; } else { k++; } KSPBoardSendData(details(CPacket)); } } void UPLCD() { lcd.write(254); //Calls the special command lcd.write(1); //Clears the screen lcd.print(VData.G); //Displays the Gee forces on screen } void controlsInit() { pinMode(SASPIN, INPUT_PULLUP); pinMode(RCSPIN, INPUT_PULLUP); // pinMode(CG1PIN, INPUT_PULLUP); pinMode(STAGEPIN, INPUT_PULLUP); pinMode(ABORTPIN, INPUT_PULLUP); pinMode(LIGHTPIN, INPUT_PULLUP); pinMode(BRAKEPIN, INPUT_PULLUP); pinMode(GEARPIN, INPUT_PULLUP); } void MainControls(byte n, boolean s) { if (s) CPacket.MainControls |= (1 << n); // forces nth bit of x to be 1. all other bits left alone. else CPacket.MainControls &= ~(1 << n); // forces nth bit of x to be 0. all other bits left alone. } void ControlGroups(byte n, boolean s) { if (s) CPacket.ControlGroup |= (1 << n); // forces nth bit of x to be 1. all other bits left alone. else CPacket.ControlGroup &= ~(1 << n); // forces nth bit of x to be 0. all other bits left alone. } The code probably looks messy, I'm going to clean it up once I get everything working and the Mega hooked up. Any ideas on what I'm doing wrong? I can send the logs too if you'd like, but they just say "Found on COM3" and then "No display". Thanks in advance for your help! And thanks for this awesome mod!