├── .gitignore ├── Firmware ├── README.md └── Wavebubble_2013 │ ├── Helper_Functions.ino │ └── Wavebubble_2013.ino ├── Hardware ├── Rev 1 Board.png ├── Rev 1 Schematic.png ├── Rev 1.brd └── Rev 1.sch └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore list for Eagle, a PCB layout tool 2 | 3 | # Backup files 4 | *.s#? 5 | *.b#? 6 | *.l#? 7 | 8 | # Eagle project file 9 | # It contains a serial number and references to the file structure 10 | # on your computer. 11 | # comment the following line if you want to have your project file included. 12 | eagle.epf 13 | 14 | # CAM files 15 | *.$$$ 16 | *.cmp 17 | *.ly2 18 | *.l15 19 | *.sol 20 | *.plc 21 | *.stc 22 | *.sts 23 | *.crc 24 | *.crs 25 | 26 | *.dri 27 | *.drl 28 | *.gpi 29 | *.pls 30 | 31 | *.drd 32 | *.drd.* 33 | 34 | *.info 35 | 36 | *.eps 37 | 38 | # hiding the datasheet folder 39 | Datasheets/* -------------------------------------------------------------------------------- /Firmware/README.md: -------------------------------------------------------------------------------- 1 | #Wavebubble 2013# 2 | Currently written in Arduino IDE v1.0.3 but should be compatable in all future versions. 3 | 4 | As the Wavebubble 2013 contains an ATMega32u4 it is functionally identical to an [Arduino Leonardo](http://arduino.cc/en/Main/ArduinoBoardLeonardo). This means that editing, compiling and programming the firmware is very easy and can be done in the [Arduino IDE](http://arduino.cc/en/main/software). This should hopefully remove nearly all the problems currently experienced when making the previous version of Wavebubbles. 5 | 6 | One of the core drivers for this version is to remove any strange software requirements, after all it is hard enough to procure all the parts and solder up a wavebubble, it needn't be hard to program it as well. Hopefully this will have the side benefit of granting easier access to modifying and improving the code to increase performance and add new features. 7 | 8 | ##Programming the Bootloader## 9 | To do this you will need: 10 | * Your Wavebubble 2013 11 | * A programmer with a 6 pin ISP cable, you can use an AVRISP, AVR ISP mkII, USBtinyISP, USBasp. 12 | * A computer with the Arduino IDE installed an the drivers for your chosen programmer. 13 | 14 | 1. Connect the programmer to the computer and the Wavebubble 2013. 15 | 2. Select the programmer from the dropdown list under "Programmer" in the "Tool" menu. 16 | 3. Select the Arduino Leonardo as the board: Tools > Board > Arduino Leonardo 17 | 4. Select Tools > Burn Bootloader to load the bootloader onto your Wavebubble 2013 board. 18 | 5. Wait for it to finish, then disconnect everything. 19 | 6. Plug the Wavebubble 2013 board directly into your computer. 20 | 7. Your PC will now ask you to load some divers. 21 | 8. Point your OS to the "\arduino-1.0.3\drivers\" directory and follow the prompts. 22 | 23 | ##Programming the Firmware## 24 | 25 | 1. Ensure that the code you wish to program onto the Wavebubble 2013 is open in the Arduino IDE. 26 | 2. Go to "Tools", then select "Board" from the dropdown. Then select "Arduino Leonardo". 27 | 3. Ensure that you've selected the correct serial port in "Serial Port" from the drop down "Tool" 28 | 4. Select upload and wait for the computer to upload the program to the board. 29 | -------------------------------------------------------------------------------- /Firmware/Wavebubble_2013/Helper_Functions.ino: -------------------------------------------------------------------------------- 1 | /* Program */ 2 | 3 | struct _program { 4 | union { 5 | struct { 6 | struct { 7 | unsigned int startFreq; 8 | unsigned int stopFreq; 9 | unsigned char offset; 10 | unsigned char magnitude; 11 | } lowBand; 12 | struct { 13 | unsigned int startFreq; 14 | unsigned int stopFreq; 15 | unsigned char offset; 16 | unsigned char magnitude; 17 | } highBand; 18 | }; 19 | unsigned char all[12]; 20 | }; 21 | }; 22 | 23 | //so it'd be newProg.lowBand.startFreq = 800; newProg.lowBand.stopFreq = 1200; etc 24 | 25 | struct _program getProgram(unsigned char progNum) { 26 | struct _program temp; 27 | 28 | EEPROM.read() 29 | 30 | return temp; 31 | } 32 | 33 | void setProgram(void) { 34 | return; 35 | } 36 | 37 | void printProgram(unsigned int progNum) { 38 | 39 | struct _program thing = getProgram(progNum); 40 | 41 | Serial.print("\n\nProgram id: "); 42 | Serial.print(progNum, DEC); 43 | Serial.print("\nLow Band\nStart Frequency: "); 44 | Serial.print(thing.lowBand.startFreq, DEC); 45 | Serial.print("MHz\nStop Frequency: "); 46 | Serial.print(thing.lowBand.stopFreq, DEC); 47 | Serial.print("MHz\nHigh Band\nStart Frequency: "); 48 | Serial.print(thing.highBand.startFreq, DEC); 49 | Serial.print("MHz\nStop Frequency: "); 50 | Serial.print(thing.highBand.stopFreq, DEC); 51 | Serial.print("MHz\nProgram is "); 52 | if((thing.lowBand.offset == 255 && thing.lowBand.magnitude == 255) || (thing.highBand.offset == 255 && thing.highBand.magnitude == 255)) Serial.print("not "); 53 | Serial.print("tuned.\n"); 54 | 55 | return; 56 | } 57 | 58 | 59 | /* LMX2433 PLL & Tuning */ 60 | 61 | void initLMX2433(); 62 | void setLMX2433(); 63 | void disLMX2433(); 64 | 65 | void setPotentiometer(unsigned char address, unsigned char value) { 66 | 67 | digitalWrite(CS_POT, LOW); 68 | SPI.transfer(0xF0 | address); 69 | SPI.transfer(value); 70 | digitalWrite(CS_POT, HIGH); 71 | 72 | return; 73 | } 74 | 75 | 76 | /* Serial User Interface */ 77 | enum _statusUI{ 78 | intro, 79 | menu, 80 | newProgram, 81 | tuneProgram, 82 | listProgram, 83 | delProgram, 84 | help, 85 | selfTest 86 | }; 87 | 88 | void serialUserInterface(void) { 89 | 90 | /* 91 | Try an have an event driven menu using status enumerations 92 | Ensure to include a built in test (BIT) optionfor running self checks on the hardware 93 | includes ensuring the tuning works, no flags are set when enabling channels etc 94 | */ 95 | } 96 | 97 | void builtInTest(void) { 98 | // print version numbers 99 | Serial.write(0x0C); // new page 100 | Serial.print("Built In self-Test\n\nFirmware verson: "); 101 | Serial.print(VERSION_MAJOR, DEC); 102 | Serial.print("."); 103 | Serial.print(VERSION_MINOR, DEC); 104 | Serial.print("."); 105 | Serial.print(VERSION_PATCH, DEC); 106 | 107 | // get updated charging status 108 | Serial.print("\n\nThe Wavebubble 2013 is currently "); 109 | switch (chargeStatus) 110 | { 111 | case none: 112 | Serial.print("not charging."); 113 | break; 114 | case usbLow: 115 | Serial.print("charging at 100mA."); 116 | break; 117 | case usbHigh: 118 | Serial.print("charging at 500mA."); 119 | break; 120 | case usbCharger: 121 | Serial.print("charging at 1000mA."); 122 | break; 123 | case complete: 124 | Serial.print("completed charging."); 125 | break; 126 | default: 127 | Serial.print("in an unknown charging state."); 128 | break; 129 | } 130 | 131 | // get updated bandLow status 132 | Serial.print("\n\nThe low band is currently "); 133 | switch (bandLow) 134 | { 135 | case idle: 136 | Serial.print("idle."); 137 | break; 138 | case fault: 139 | Serial.print("experiencing a fault."); 140 | break; 141 | case enabledVCO: 142 | Serial.print("only enabling the VCO."); 143 | break; 144 | case enabledPA: 145 | Serial.print("only enabling the PA."); 146 | break; 147 | case enabledBand: 148 | Serial.print("enabled and transmitting."); 149 | break; 150 | default: 151 | Serial.print("in an unknown state."); 152 | break; 153 | } 154 | 155 | // get updated bandHigh status 156 | Serial.print("\nThe high band is currently "); 157 | switch (bandHigh) 158 | { 159 | case idle: 160 | Serial.print("idle."); 161 | break; 162 | case fault: 163 | Serial.print("experiencing a fault."); 164 | break; 165 | case enabledVCO: 166 | Serial.print("only enabling the VCO."); 167 | break; 168 | case enabledPA: 169 | Serial.print("only enabling the PA."); 170 | break; 171 | case enabledBand: 172 | Serial.print("enabled and transmitting."); 173 | break; 174 | default: 175 | Serial.print("in an unknown state."); 176 | break; 177 | } 178 | 179 | Serial.print("\n\nThe current program is number: "); 180 | Serial.print(progNum, DEC); 181 | printProgram(progNum); 182 | 183 | // take over the outputs 184 | // check the frequency range of the low band 185 | // check the frequency range of the high band 186 | 187 | Serial.print("Built In self-Test is complete."); 188 | return; 189 | } 190 | 191 | -------------------------------------------------------------------------------- /Firmware/Wavebubble_2013/Wavebubble_2013.ino: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 4 | * 5 | */ 6 | #include 7 | #include 8 | #include 9 | 10 | #define VERSION_MAJOR 0 11 | #define VERSION_MINOR 1 12 | #define VERSION_PATCH 0 13 | 14 | /* Pin Map */ 15 | #define CS_POT 0 16 | #define CS_PLL 17 17 | //define MOSI 16 18 | //define MISO 14 19 | //define SCK 15 20 | #define EN_CHG 0 21 | #define FL_CHG 0 22 | //define SDA 2 23 | //define SCL 3 24 | #define INT 4 25 | #define FL_CH_A 0 26 | #define FL_CH_B 0 27 | #define EN_VCO_A 0 28 | #define EN_VCO_B 0 29 | #define EN_PA_A 0 30 | #define EN_PA_B 0 31 | #define CP_OUT_A A0 32 | #define CP_OUT_B A0 33 | #define DC_ADJ_A 0 34 | #define DC_ADJ_B 0 35 | #define STATUS 0 36 | 37 | /* Global Variables */ 38 | enum _chargeStatus {none, usbLow, usbHigh, usbCharger, complete} chargeStatus; 39 | enum _outputStatus {idle, fault, enabledVCO, enabledPA, enabledBand} bandLow, bandHigh; 40 | unsigned char progNum = 0xFF; 41 | 42 | /* Global Functions */ 43 | 44 | 45 | void setup(void) { 46 | 47 | pinMode(FL_CH_A, INPUT_PULLUP); 48 | pinMode(FL_CH_B, INPUT_PULLUP); 49 | pinMode(EN_VCO_A, OUTPUT); 50 | pinMode(EN_VCO_B, OUTPUT); 51 | pinMode(EN_PA_A, OUTPUT); 52 | pinMode(EN_PA_B, OUTPUT); 53 | pinMode(DC_ADJ_A, OUTPUT); 54 | pinMode(DC_ADJ_B, OUTPUT); 55 | 56 | pinMode(CP_OUT_A, INPUT); 57 | pinMode(CP_OUT_B, INPUT); 58 | 59 | pinMode(CS_PLL, OUTPUT); 60 | pinMode(CS_POT, OUTPUT); 61 | pinMode(SCK, OUTPUT); 62 | pinMode(MOSI, OUTPUT); 63 | pinMode(MISO, INPUT); 64 | 65 | pinMode(STATUS, OUTPUT); 66 | digitalWrite(STATUS, LOW); 67 | 68 | pinMode(SCL, OUTPUT); 69 | pinMode(SDA, OUTPUT); 70 | pinMode(INT, INPUT); 71 | Wire.begin(); 72 | 73 | pinMode(EN_CHG, INPUT); 74 | pinMode(FL_CHG, INPUT_PULLUP); 75 | 76 | digitalWrite(CS_POT, HIGH); 77 | digitalWrite(CS_PLL, HIGH); 78 | SPI.begin(); 79 | 80 | Serial.begin(115200); 81 | 82 | chargeStatus = none; 83 | bandLow = idle; 84 | bandHigh = idle; 85 | 86 | progNum = EEPROM.read(1023); 87 | EEPROM.write(1023, progNum + 1); 88 | for(int i = 0; i < progNum; i++) 89 | { 90 | digitalWrite(STATUS, HIGH); 91 | delay(500); 92 | digitalWrite(STATUS, LOW); 93 | delay(500); 94 | } 95 | 96 | digitalWrite(0, LOW); // set 555 97 | 98 | setPotentiometer(0, 0); // set pots 99 | setPotentiometer(1, 0); 100 | 101 | analogWrite(DC_ADJ_A, 0);// set PWM 102 | analogWrite(DC_ADJ_B, 0);// set PWM 103 | 104 | digitalWrite(EN_VCO_A, HIGH); // set VCOs 105 | digitalWrite(EN_VCO_B, HIGH); 106 | 107 | digitalWrite(EN_PA_A, HIGH); // set PAs 108 | digitalWrite(EN_PA_B, HIGH); 109 | 110 | bandLow = enabledBand; 111 | bandHigh = enabledBand; 112 | 113 | // disable PLL 114 | 115 | } 116 | 117 | void loop(void) { 118 | 119 | //stuff 120 | } 121 | 122 | 123 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /Hardware/Rev 1 Board.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinski1/Wavebubble-2013/7387fc6f309d6f24253b037f4491286018e6ce0b/Hardware/Rev 1 Board.png -------------------------------------------------------------------------------- /Hardware/Rev 1 Schematic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinski1/Wavebubble-2013/7387fc6f309d6f24253b037f4491286018e6ce0b/Hardware/Rev 1 Schematic.png -------------------------------------------------------------------------------- /Hardware/Rev 1.brd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinski1/Wavebubble-2013/7387fc6f309d6f24253b037f4491286018e6ce0b/Hardware/Rev 1.brd -------------------------------------------------------------------------------- /Hardware/Rev 1.sch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pinski1/Wavebubble-2013/7387fc6f309d6f24253b037f4491286018e6ce0b/Hardware/Rev 1.sch -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #Wavebubble 2013# 2 | 3 | Taking inspiration from Lady Ada's original [Wavebubble RC1 & RC1a](http://www.ladyada.net/make/wavebubble/) as well as the [Wavebubble 2010](http://www.ladyada.net/wiki/wavebubble/wave_bubble_2010). 4 | The core idea with this updated version is to make it easier to construct & program. 5 | 6 | ##Building One## 7 | As Radio Frequency (RF) jammers or inhibitors legal status varies from region to region there is a good chance that Wavebubble 2013s will never be available to buy as a finished product. Nor is it likely that they will be available as a kit. However by releasing the files it should be possible to build one for personal use. 8 | 9 | ###The Ingredients### 10 | * [ATMega32u4](http://www.atmel.com/devices/atmega32u4.aspx) - microcontroller to control everything, it's identical to an Arduino Leonardo. 11 | * [BQ24090](http://www.ti.com/product/bq24090) - smart Li-Ion battery charger, 4 different charge rates; 0mA, 100mA, 500mA & 1000mA 12 | * [NE555D](http://www.ti.com/product/ne555) - generates a sawtooth that will sweep the voltage controlled oscillators though the frequency bands. 13 | * [AD8402](http://www.analog.com/en/digital-to-analog-converters/digital-potentiometers/ad8402/products/product.html) - digital pot to change the sweep 14 | * [LT1935](http://www.linear.com/product/LT1935) - boost convertor with internal FET 15 | * [LMX2433](http://www.ti.com/product/lmx2433) - dual wide band PLL 16 | * [ROS-1300+](http://217.34.103.131/pdfs/ROS-1300+.pdf) - voltage controlled oscillator, 300MHz to 1300MHz 17 | * [ROS-2700-1819+](http://217.34.103.131/pdfs/ROS-2700-1819+.pdf) - voltage controlled oscillator, 1300MHz to 3000MHz 18 | * [GALI-84+](http://217.34.103.131/pdfs/GALI-84+.pdf) - wideband RF amplifier 19 | * [MIC2506](http://www.micrel.com/index.php/en/products/power-management-ics/power-switching/usb-power-switches/article/56-mic2506.html) - dual power switch, used for powering VCOs & PAs 20 | 21 | The full list of parts required will be listed in the Bill of Materials (BoM) in the Hardware folder. 22 | 23 | ###Build Instructions### 24 | There are none at present. However typical surface mount guidelines apply, start with the smallest pitch devices and finish with the larger devices. The Wavebubble 2013 is designed as a single sided board so it should be possible to solder in a reflow oven. 25 | 26 | ##Using One## 27 | *to do* 28 | 29 | ##Support## 30 | Try the Arduino [forums](http://forum.arduino.cc/) for problems relating to programming and burning the bootloader. 31 | 32 | Try the Adafruit Wavebubble [forums](http://forums.adafruit.com/viewforum.php?f=16) for problems relating to the hardware. 33 | 34 | ##Credits## 35 | Thanks to Lady Ada for the original design as well as the regular posters in the Adafruit Wavebubble forums. 36 | 37 | ##Licence## 38 | Creative Commons License
Wavebubble 2013 is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. 39 | 40 | This project is an [Open Source Hardware Project](http://www.oshwa.org/definition/). 41 | --------------------------------------------------------------------------------