// Arduino C sketch for the ChipDesign SDR Antenna // // The ChipDesign SDR antenna can be mounted on Arduino Uno micro-controller compatible // boards and can be powered and interfaced over USB using any programming language // supported by the Arduino platform. The varactors are connected to the low-pass filtered // PWM ouput pins 3, 5, and 6 of the Arduino platform. Using the analogWrite() function, the // reverse bias voltage of the varactors can be set between 0 and 5 V. // // The preprogrammed RF varactor diode bias settings are only valid for MCU boards with // 5V / 8-bit PWM. For MCU boards with 3.3V / 16-bit PWM, the amplitude control words (ACW) // have to be rescaled as follows: ACW*5/3.3*2^16/2^8. // The use of a different microcontroller board might detune the frequency. // The 450 MHz, 1575.42 MHz (GPS L1) and 2600 MHz frequency bands are not covered. // // In addition to C, following (graphical) programming languages are also supported: // Labview: http://sine.ni.com/nips/cds/view/p/lang/en/nid/209835 // Mathematica: http://playground.arduino.cc/Interfacing/Mathematica // MATLAB: http://www.mathworks.nl/matlabcentral/fileexchange/32374-matlab-support-package-for-arduino--aka-arduinoio-package- // Python: http://playground.arduino.cc/Interfacing/Python // RF Varactor Diode Biasing const int varactorLeftPin = 3; const int varactorTopPin = 5; const int varactorRightPin = 6; int varactorLeftValue = 255; int varactorTopValue = 255; int varactorRightValue = 255; int setValue = 1; // USB Communication //// echo "*IDN?" > /dev/ttyACM0 const int USBLED=13; String inputString=""; String programString="SWEEP"; boolean stringComplete=false; void setup() { // USB Communication pinMode(USBLED, OUTPUT); Serial.begin(9600); inputString.reserve(200); } void loop() { digitalWrite(USBLED, LOW); if (stringComplete) { if (inputString.equals("*IDN?")==1) { // format: "manufacturer,model number,serial number,firmware revision number" Serial.println("ChipDesign,SDRA1,1,000001,A.00.01"); // TODO Return real model number, serial number, firmware revision number } else if (inputString.equals("MAXIMUM REVERSE BIAS")==1) { //Serial.write(printf("Bias settings: %i, %i, %i\n",255, 255, 255)); Serial.println("Bias settings:"); Serial.println("255"); Serial.println("255"); Serial.println("255"); programString = inputString; } else if (inputString.equals("FREQ:700")==1) { Serial.println("Tuned to 700 MHz..."); programString = inputString; } else if (inputString.equals("FREQ:866")==1) { Serial.println("Tuned to 866 MHz..."); programString = inputString; } else if (inputString.equals("FREQ:900")==1) { Serial.println("Tuned to 900 MHz..."); programString = inputString; } else if (inputString.equals("FREQ:1227")==1) { Serial.println("Tuned to 1227 MHz..."); programString = inputString; } else if (inputString.equals("FREQ:1452")==1) { Serial.println("Tuned to 1452 MHz..."); programString = inputString; } else if (inputString.equals("FREQ:1492")==1) { Serial.println("Tuned to 1492 MHz..."); programString = inputString; } else if (inputString.equals("FREQ:1575")==1) { Serial.println("Tuned to 1575 MHz..."); programString = inputString; } else if (inputString.equals("FREQ:1800")==1) { Serial.println("Tuned to 1800 MHz..."); programString = inputString; } else if (inputString.equals("FREQ:1900")==1) { Serial.println("Tuned to 1900 MHz..."); programString = inputString; } else if (inputString.equals("FREQ:2100")==1) { Serial.println("Tuned to 2100 MHz..."); programString = inputString; } else if (inputString.equals("FREQ:2320")==1) { Serial.println("Tuned to 2320 MHz..."); programString = inputString; } else if (inputString.equals("FREQ:2345")==1) { Serial.println("Tuned to 2345 MHz..."); programString = inputString; } else if (inputString.equals("FREQ:2450")==1) { Serial.println("Tuned to 2450 MHz..."); programString = inputString; } else if (inputString.equals("FREQ:2600")==1) { Serial.println("Tuned to 2600 MHz..."); programString = inputString; } else if (inputString.equals("SWEEP")==1) { Serial.println("Sweeping..."); programString = inputString; varactorLeftValue = 255; varactorTopValue = 255; varactorRightValue = 255; } else { if (setValue==1) { Serial.println("Manual tuning..."); programString = "MANUAL"; varactorLeftValue = inputString.toInt(); //Serial.write(printf("Bias settings: %i, %i, %i\n",varactorLeftValue, varactorTopValue, varactorRightValue)); Serial.println("Bias settings:"); Serial.println(varactorLeftValue); Serial.println(varactorTopValue); Serial.println(varactorRightValue); setValue = 2; } else if (setValue==2) { varactorTopValue = inputString.toInt(); //Serial.write(printf("Bias settings: %i, %i, %i\n",varactorLeftValue, varactorTopValue, varactorRightValue)); Serial.println("Bias settings:"); Serial.println(varactorLeftValue); Serial.println(varactorTopValue); Serial.println(varactorRightValue); setValue = 3; } else if (setValue==3) { varactorRightValue = inputString.toInt(); //Serial.write(printf("Bias settings: %i, %i, %i\n",varactorLeftValue, varactorTopValue, varactorRightValue)); Serial.println("Bias settings:"); Serial.println(varactorLeftValue); Serial.println(varactorTopValue); Serial.println(varactorRightValue); setValue = 1; } } // clear the string: inputString=""; stringComplete=false; } if (programString.equals("MANUAL")==1) { analogWrite(varactorLeftPin, varactorLeftValue); analogWrite(varactorTopPin, varactorTopValue); analogWrite(varactorRightPin, varactorRightValue); } else if (programString.equals("MAXIMUM REVERSE BIAS")==1) { varactorLeftValue = 255; varactorTopValue = 255; varactorRightValue = 255; analogWrite(varactorLeftPin, varactorLeftValue); analogWrite(varactorTopPin, varactorTopValue); analogWrite(varactorRightPin, varactorRightValue); } else if (programString.equals("FREQ:700")==1) { varactorLeftValue = 168; varactorTopValue = 10; varactorRightValue = 168; analogWrite(varactorLeftPin, varactorLeftValue); analogWrite(varactorTopPin, varactorTopValue); analogWrite(varactorRightPin, varactorRightValue); } else if (programString.equals("FREQ:866")==1) { varactorLeftValue = 106; varactorTopValue = 106; varactorRightValue = 106; analogWrite(varactorLeftPin, varactorLeftValue); analogWrite(varactorTopPin, varactorTopValue); analogWrite(varactorRightPin, varactorRightValue); } else if (programString.equals("FREQ:900")==1) { varactorLeftValue = 255; varactorTopValue = 255; varactorRightValue = 255; analogWrite(varactorLeftPin, varactorLeftValue); analogWrite(varactorTopPin, varactorTopValue); analogWrite(varactorRightPin, varactorRightValue); } else if (programString.equals("FREQ:1227")==1) { varactorLeftValue = 116; varactorTopValue = 116; varactorRightValue = 116; analogWrite(varactorLeftPin, varactorLeftValue); analogWrite(varactorTopPin, varactorTopValue); analogWrite(varactorRightPin, varactorRightValue); } else if (programString.equals("FREQ:1452")==1) { varactorLeftValue = 255; varactorTopValue = 255; varactorRightValue = 255; analogWrite(varactorLeftPin, varactorLeftValue); analogWrite(varactorTopPin, varactorTopValue); analogWrite(varactorRightPin, varactorRightValue); } else if (programString.equals("FREQ:1492")==1) { varactorLeftValue = 1; varactorTopValue = 1; varactorRightValue = 1; analogWrite(varactorLeftPin, varactorLeftValue); analogWrite(varactorTopPin, varactorTopValue); analogWrite(varactorRightPin, varactorRightValue); } else if (programString.equals("FREQ:1575")==1) { varactorLeftValue = 2; varactorTopValue = 0; varactorRightValue = 2; analogWrite(varactorLeftPin, varactorLeftValue); analogWrite(varactorTopPin, varactorTopValue); analogWrite(varactorRightPin, varactorRightValue); } else if (programString.equals("FREQ:1800")==1) { varactorLeftValue = 0; varactorTopValue = 106; varactorRightValue = 0; analogWrite(varactorLeftPin, varactorLeftValue); analogWrite(varactorTopPin, varactorTopValue); analogWrite(varactorRightPin, varactorRightValue); } else if (programString.equals("FREQ:1900")==1) { varactorLeftValue = 163; varactorTopValue = 1; varactorRightValue = 2; analogWrite(varactorLeftPin, varactorLeftValue); analogWrite(varactorTopPin, varactorTopValue); analogWrite(varactorRightPin, varactorRightValue); } else if (programString.equals("FREQ:2100")==1) { varactorLeftValue = 0; varactorTopValue = 2; varactorRightValue = 216; analogWrite(varactorLeftPin, varactorLeftValue); analogWrite(varactorTopPin, varactorTopValue); analogWrite(varactorRightPin, varactorRightValue); } else if (programString.equals("FREQ:2320")==1) { varactorLeftValue = 20; varactorTopValue = 192; varactorRightValue = 14; analogWrite(varactorLeftPin, varactorLeftValue); analogWrite(varactorTopPin, varactorTopValue); analogWrite(varactorRightPin, varactorRightValue); } else if (programString.equals("FREQ:2345")==1) { varactorLeftValue = 74; varactorTopValue = 253; varactorRightValue = 13; analogWrite(varactorLeftPin, varactorLeftValue); analogWrite(varactorTopPin, varactorTopValue); analogWrite(varactorRightPin, varactorRightValue); } else if (programString.equals("FREQ:2450")==1) { varactorLeftValue = 74; varactorTopValue = 253; varactorRightValue = 13; analogWrite(varactorLeftPin, varactorLeftValue); analogWrite(varactorTopPin, varactorTopValue); analogWrite(varactorRightPin, varactorRightValue); } else if (programString.equals("FREQ:2600")==1) { varactorLeftValue = 20; varactorTopValue = 192; varactorRightValue = 14; analogWrite(varactorLeftPin, varactorLeftValue); analogWrite(varactorTopPin, varactorTopValue); analogWrite(varactorRightPin, varactorRightValue); } else if (programString.equals("SWEEP")==1) { sweep(); } } void sweep() { analogWrite(varactorLeftPin, varactorLeftValue); analogWrite(varactorTopPin, varactorTopValue); analogWrite(varactorRightPin, varactorRightValue); //Serial.write(printf("Bias settings: %i, %i, %i\n",varactorLeftValue, varactorTopValue, varactorRightValue)); Serial.println("Bias settings:"); Serial.println(varactorLeftValue); Serial.println(varactorTopValue); Serial.println(varactorRightValue); delay(10000); if (varactorRightValue >= 5) { varactorRightValue -= 5; } else { varactorRightValue = 255; if (varactorTopValue >= 5) { varactorTopValue -= 5; } else { varactorTopValue = 255; if (varactorLeftValue >= 5) { varactorLeftValue -= 5; } else { varactorLeftValue = 255; } } } } void serialEvent() { digitalWrite(USBLED, HIGH); while (Serial.available()) { char inChar = (char)Serial.read(); if (inChar=='\n') { stringComplete=true; } else if (inChar > 126) { } else { inputString+=inChar; } } }