├── README.md ├── case ├── openscad │ ├── protogasm_base.scad │ ├── protogasm_lid.scad │ └── protogasm_param.scad └── stl │ ├── protogasm_base.stl │ └── protogasm_lid.stl ├── nogasm_code └── nogasm_code.ino ├── pcb ├── BOM.md ├── assembled-bottom.jpg ├── assembled-top.jpg ├── assembly_notes.md ├── layout.png ├── protogasm.brd ├── protogasm.sch └── schematic.png ├── user_guide └── Nogasm User Guide.pdf └── vibrator ├── DIY brass eccentric mass.pdf ├── README.md ├── finishing jig.STL ├── handle.STL ├── head.STL └── vibrator.png /README.md: -------------------------------------------------------------------------------- 1 | # protogasm 2 | Software and hardware for Arduino-based orgasm prediction / detection ... on protoboard! 3 | 4 | The nogasm is an amazing toy. I wanted to make something easier to hack and more accessible to the homebuilder. Fortunately headcrabned was kind enough to open source the whole thing. 5 | 6 | I ported it the Arduino Uno, and hacked around on perfboard until I had it working. It works great and only requires a handful of readily available through-hole components. 7 | 8 | Some aspects have been simplified compared to the original electronics: 9 | * The DIP switches have been eliminated. Options are configured in the source instead. 10 | * The RGB backlit rotary encoder has been replaced with a more common unlit one. The mode is still visible on the LED ring. 11 | * It has more LEDs! NeoPixel Rings with 24 LEDs are the right size for the project. 12 | 13 | ## Getting started 14 | 15 | * [RTFM](user_guide/Nogasm%20User%20Guide.pdf) 16 | * [Build the vibrator](vibrator/) 17 | * [Build the control board](pcb/assembly_notes.md) 18 | * [Print the case for the controller](case/) 19 | 20 | #### Fine print 21 | This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International Licence, available at http://creativecommons.org/licenses/by-nc/4.0/. 22 | -------------------------------------------------------------------------------- /case/openscad/protogasm_base.scad: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- LICENSE 2 | // This "3D Printed Case for Arduino Uno, Leonardo" by Zygmunt Wojcik is licensed 3 | // under the Creative Commons Attribution-ShareAlike 3.0 Unported License. 4 | // To view a copy of this license, visit 5 | // http://creativecommons.org/licenses/by-sa/3.0/ 6 | // or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. 7 | 8 | 9 | include 10 | 11 | //------------------------------------------------------------------------- MODULES 12 | module pcbLeg() { 13 | translate([0, 0, 0]) 14 | difference() { 15 | cylinder(h = floorHeight + pcbPositionZ, r1=5.5/2, r2 = 4.5/2); 16 | } 17 | } 18 | 19 | 20 | //------------------------------------------------------------------------- MAIN BLOCK 21 | difference() 22 | { 23 | // ADD 24 | union() 25 | { 26 | // Add Base 27 | linear_extrude(height = height/2, convexity = 10) 28 | minkowski() 29 | { 30 | square([width, wide], center = true); 31 | circle(roundR); 32 | } 33 | } 34 | // SUBSTRACT 35 | union() 36 | { 37 | // Lift floor height 38 | translate([0, 0, floorHeight]) 39 | { 40 | // Cut Base hole 41 | linear_extrude(height = height/2, convexity = 10) 42 | minkowski() 43 | { 44 | square([width, wide], center = true); 45 | circle(roundR - pillarSize); 46 | } 47 | // Cut upper block lock 48 | difference() { 49 | translate([0, 0, height/2 - floorHeight - blockLockSize]) { 50 | cylinder(h = blockLockSize+gap, r=width); 51 | } 52 | translate([0, 0, height/2 - floorHeight - blockLockSize - gap*2]) { 53 | linear_extrude(height = blockLockSize+gap*4, convexity = 10) 54 | minkowski() { 55 | square([width, wide], center=true); 56 | circle(roundR - layerWidth*4); 57 | } 58 | } 59 | } 60 | // Cut x panels 61 | for (i = [0 : 180 : 180]) 62 | rotate([0, 0, i]) 63 | translate([width/2 + roundR - pillarSize/2 - layerWidth*7, 0, 0]) 64 | { 65 | // Cut X panel hole 66 | translate([0, 0, height/2]) 67 | cube([pillarSize, sidePanelXWidth, height], center=true); 68 | 69 | // Cut X, Y srew holes 70 | for (i = [wide/2, -wide/2]) 71 | { 72 | translate([-(roundR - pillarSize/2 - layerWidth*7), i, - floorHeight]) 73 | if (i>0) 74 | { 75 | rotate([0, 0, 45]) 76 | translate([screwHoleRoundR, 0, 0]) 77 | { 78 | cylinder(h = height*2, r=screwExt/2, center=true); 79 | cylinder(h = 5, 80 | r1 = (screwHead + (screwHead - screwExt))/2, 81 | r2 = screwExt/2, center=true); 82 | } 83 | } 84 | else 85 | { 86 | rotate([0, 0, -45]) 87 | translate([screwHoleRoundR, 0, 0]) 88 | { 89 | cylinder(h = height*2, r=screwExt/2, center=true); 90 | cylinder(h = 5, 91 | r1 = (screwHead + (screwHead - screwExt))/2, 92 | r2 = screwExt/2, center=true); 93 | } 94 | } 95 | } 96 | } 97 | // Cut Y panels 98 | for (i = [90 : 180 : 270]) 99 | rotate([0, 0, i]) 100 | translate([wide/2 + roundR - pillarSize/2 - layerWidth*7, 0, 0]) 101 | { 102 | // Cut Y panel hole 103 | translate([0, 0, height/2]) 104 | cube([pillarSize, sidePanelYWidth, height], center=true); 105 | } 106 | 107 | // Cut USB and Power holes 108 | // translate to pcb position 109 | translate([-pcbPositionX, -pcbWide/2, pcbPositionZ + pcbHeight]) 110 | { 111 | // cut power hole 112 | translate([0, powerJackPosition, (powerJackHeight-2)/2]) 113 | cube([10, powerJackWide, powerJackHeight], center=true); 114 | 115 | // cut usb hole 116 | translate([0, usbHolePosition, (usbHeight-2)/2]) 117 | cube([10, usbWide, usbHeight], center=true); 118 | } 119 | } 120 | } 121 | } 122 | 123 | //------------------------------------------------------------------------- ADD PCB LEGS 124 | // Translate to pcbPositionX 125 | translate([-pcbPositionX, -pcbWide/2, 0]) 126 | 127 | difference() 128 | { 129 | // ADD 130 | union() 131 | { 132 | // Add pcb legs 133 | for(i=[ [13.97, 2.54, 0], 134 | [15.24, 50.8, 0], 135 | [66.04, 35.56, 0], 136 | [66.04, 7.62, 0] ]) 137 | { 138 | translate(i) 139 | pcbLeg(); 140 | } 141 | // Add pcb holders 142 | for(i=[ [13.97, 2.54, 0], 143 | [15.24, 50.8, 0], 144 | [66.04, 35.56, 0], 145 | [66.04, 7.62, 0] ]) 146 | { 147 | translate(i) 148 | cylinder(h=floorHeight+pcbPositionZ+1.5, r=1.2); 149 | } 150 | } 151 | // SUBSTRACT 152 | union() 153 | { 154 | // 155 | } 156 | } 157 | -------------------------------------------------------------------------------- /case/openscad/protogasm_lid.scad: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- LICENSE 2 | // This "3D Printed Case for Arduino Uno, Leonardo" by Zygmunt Wojcik is licensed 3 | // under the Creative Commons Attribution-ShareAlike 3.0 Unported License. 4 | // To view a copy of this license, visit 5 | // http://creativecommons.org/licenses/by-sa/3.0/ 6 | // or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. 7 | 8 | 9 | //------------------------------------------------------------------------- SHARED PARAMETERS 10 | $fn=100; // resolution 11 | 12 | circleD = 21; // round corner circle diameter 13 | roundR = circleD/2; // round corner circle radius 14 | triangleH = (sqrt(3)*(circleD))/2; // triangle height to calculate other variables 15 | 16 | layerHeight = 0.25; // some variariables are multiple of layer height and width 17 | layerWidth = 0.5; 18 | 19 | screwExt = 3.4; // screw through hole diameter 20 | verConnectionHoleR = 1.2; // screw thread hole radius 21 | screwHead = 6; // screw head hole diameter 22 | 23 | gap = layerHeight/2; 24 | 25 | floorHeight = 1.8; // 6*0.25 layer + 0.3 first layer 26 | 27 | height = 20.6; // case height 28 | innerHeight = height - floorHeight*2; 29 | 30 | pillarSize = roundR-0.01; // corner pillar size 31 | 32 | // dimensions of minkowski's inner square 33 | // these are NOT case dimensions 34 | // to calculate external case dimesions add 2 * roundR 35 | // 55.3 + (2*10.5) = 76.3 36 | width = 55.3; 37 | wide = 55.3; 38 | 39 | blockLockSize = 2; // middle connection lock size 40 | 41 | // side cutting panels size 42 | sidePanelXWidth = wide; 43 | sidePanelYWidth = width; 44 | 45 | // screw hole position from centre of the corner round circle 46 | screwHoleRoundR = roundR - layerWidth*4 - (triangleH/2 - layerWidth*4)/2; 47 | 48 | // prints dimensions of the case 49 | echo("width", width + roundR*2); // total width 50 | echo("wide", wide + roundR*2); // total wide 51 | 52 | // UNO PCB dimensions 53 | pcbWide=53.3; 54 | pcbLenght=68.58; 55 | pcbHeight=1.64; 56 | usbHolePosition=38.1; 57 | usbHeight=10.8 + 2; 58 | usbWide=11.43 + 2; 59 | powerJackPosition=7.62; 60 | powerJackWide=8.9 +2; 61 | powerJackHeight=10.8 +2; 62 | 63 | pcbPositionX = width/2 + roundR - layerWidth*7 - gap*4; 64 | pcbPositionZ = 2.5; 65 | 66 | extra_headroom = 9.36; 67 | 68 | knob_position = [-1.27,0,0]; 69 | 70 | //------------------------------------------------------------------------- MAIN BLOCK 71 | difference() 72 | { 73 | // ADD 74 | union() 75 | { 76 | // Add Base 77 | linear_extrude(height = height/2 + blockLockSize + extra_headroom, convexity = 10) 78 | minkowski() 79 | { 80 | square([width, wide], center = true); 81 | circle(roundR); 82 | } 83 | } 84 | // SUBSTRACT 85 | union() 86 | { 87 | // lift floor height 88 | translate([0, 0, floorHeight]) 89 | { 90 | // Cut base inner hole 91 | linear_extrude(height = height + extra_headroom, convexity = 10) 92 | minkowski() 93 | { 94 | square([width, wide], center = true); 95 | circle(roundR - pillarSize); 96 | } 97 | // Cut block lock 98 | translate([0, 0, height/2 - blockLockSize + extra_headroom]) 99 | linear_extrude(height = height + extra_headroom, convexity = 10) 100 | minkowski() 101 | { 102 | square([width, wide], center = true); 103 | circle(roundR - layerWidth*3); 104 | } 105 | // Cut x panels 106 | for (i = [0 : 180 : 180]) 107 | rotate([0, 0, i]) 108 | translate([width/2 + roundR - pillarSize/2 - layerWidth*7, 0, 0]) 109 | { 110 | // Cut X panel hole 111 | translate([0, 0, (height+extra_headroom)/2 ]) 112 | cube([pillarSize, sidePanelXWidth, height + extra_headroom], center=true); 113 | 114 | // Cut X, Y srew holes 115 | for (i = [wide/2, -wide/2]) 116 | { 117 | translate([-(roundR - pillarSize/2 - layerWidth*7), i, 0]) 118 | if (i>0) 119 | { 120 | rotate([0, 0, 45]) 121 | translate([screwHoleRoundR, 0, 0]) 122 | cylinder(h=height/2 + extra_headroom, r=verConnectionHoleR); 123 | } 124 | else 125 | { 126 | rotate([0, 0, -45]) 127 | translate([screwHoleRoundR, 0, 0]) 128 | cylinder(h=height/2 + extra_headroom, r=verConnectionHoleR); 129 | } 130 | } 131 | } 132 | // Cut Y panels 133 | for (i = [90 : 180 : 270]) 134 | rotate([0, 0, i]) 135 | translate([wide/2 + roundR - pillarSize/2 - layerWidth*7, 0, 0]) 136 | { 137 | // Cut Y panel hole 138 | translate([0, 0, (height+extra_headroom)/2]) 139 | cube([pillarSize, sidePanelYWidth, height+extra_headroom], center=true); 140 | } 141 | 142 | // Cut USB and Power holes 143 | // Rotate due to panel upside down 144 | mirror([0, 1 , 0]) 145 | 146 | // translate to pcb position 147 | translate([-pcbPositionX, -pcbWide/2, height - pcbPositionZ -pcbHeight - 4 + extra_headroom]) 148 | { 149 | // Cut power hole 150 | translate([0, powerJackPosition+10, -(powerJackHeight-2)/2]) 151 | cube([10, powerJackWide+20, powerJackHeight], center=true); 152 | // Cut usb hole 153 | translate([0, usbHolePosition, -(usbHeight-2)/2]) 154 | cube([10, usbWide, usbHeight], center=true); 155 | 156 | } 157 | } 158 | //Knob hole 159 | translate(knob_position) 160 | cylinder(h=20, r = 8/2, center=true); 161 | 162 | } 163 | } 164 | 165 | difference() { 166 | // Knob boss 167 | translate(knob_position) 168 | cylinder(h = floorHeight + 2, r=12/2); 169 | 170 | //Knob hole 171 | translate(knob_position) 172 | cylinder(h=20, r = 8/2, center=true); 173 | 174 | } -------------------------------------------------------------------------------- /case/openscad/protogasm_param.scad: -------------------------------------------------------------------------------- 1 | // ----------------------------------------------------------------------- LICENSE 2 | // This "3D Printed Case for Arduino Uno, Leonardo" by Zygmunt Wojcik is licensed 3 | // under the Creative Commons Attribution-ShareAlike 3.0 Unported License. 4 | // To view a copy of this license, visit 5 | // http://creativecommons.org/licenses/by-sa/3.0/ 6 | // or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. 7 | 8 | 9 | //------------------------------------------------------------------------- SHARED PARAMETERS 10 | $fn=100; // resolution 11 | 12 | circleD = 21; // round corner circle diameter 13 | roundR = circleD/2; // round corner circle radius 14 | triangleH = (sqrt(3)*(circleD))/2; // triangle height to calculate other variables 15 | 16 | layerHeight = 0.25; // some variariables are multiple of layer height and width 17 | layerWidth = 0.5; 18 | 19 | screwExt = 3.4; // screw through hole diameter 20 | verConnectionHoleR = 1.2; // screw thread hole radius 21 | screwHead = 6; // screw head hole diameter 22 | 23 | gap = layerHeight/2; 24 | 25 | floorHeight = 1.8; // 6*0.25 layer + 0.3 first layer 26 | 27 | height = 20.6; // case height 28 | innerHeight = height - floorHeight*2; 29 | 30 | pillarSize = roundR-0.01; // corner pillar size 31 | 32 | // dimensions of minkowski's inner square 33 | // these are NOT case dimensions 34 | // to calculate external case dimesions add 2 * roundR 35 | // 55.3 + (2*10.5) = 76.3 36 | width = 55.3; 37 | wide = 55.3; 38 | 39 | blockLockSize = 2; // middle connection lock size 40 | 41 | // side cutting panels size 42 | sidePanelXWidth = wide; 43 | sidePanelYWidth = width; 44 | 45 | // screw hole position from centre of the corner round circle 46 | screwHoleRoundR = roundR - layerWidth*4 - (triangleH/2 - layerWidth*4)/2; 47 | 48 | // prints dimensions of the case 49 | echo("width", width + roundR*2); // total width 50 | echo("wide", wide + roundR*2); // total wide 51 | 52 | // UNO PCB dimensions 53 | pcbWide=53.3; 54 | pcbLenght=68.58; 55 | pcbHeight=1.64; 56 | usbHolePosition=38.1; 57 | usbHeight=10.8 + 2; 58 | usbWide=11.43 + 2; 59 | powerJackPosition=7.62; 60 | powerJackWide=8.9 +2; 61 | powerJackHeight=10.8 +2; 62 | 63 | pcbPositionX = width/2 + roundR - layerWidth*7 - gap*4; 64 | pcbPositionZ = 2.5; -------------------------------------------------------------------------------- /nogasm_code/nogasm_code.ino: -------------------------------------------------------------------------------- 1 | // Protogasm Code, forked from Nogasm Code Rev. 3 2 | /* Drives a vibrator and uses changes in pressure of an inflatable buttplug 3 | * to estimate a user's closeness to orgasm, and turn off the vibrator 4 | * before that point. 5 | * A state machine updating at 60Hz creates different modes and option menus 6 | * that can be identified by the color of the LEDs, especially the RGB LED 7 | * in the central button/encoder knob. 8 | * 9 | * [Red] Manual Vibrator Control 10 | * [Blue] Automatic vibrator edging, knob adjusts orgasm detection sensitivity 11 | * [Green] Setting menu for maximum vibrator speed in automatic mode 12 | * [White] Debubbing menu to show data from the pressure sensor ADC 13 | * [Off] While still plugged in, holding the button down for >3 seconds turns 14 | * the whole device off, until the button is pressed again. 15 | * 16 | * Settings like edging sensitivity, or maximum motor speed are stored in EEPROM, 17 | * so they are saved through power-cycling. 18 | * 19 | * In the automatic edging mode, the vibrator speed will linearly ramp up to full 20 | * speed (set in the green menu) over 30 seconds. If a near-orgasm is detected, 21 | * the vibrator abruptly turns off for 15 seconds, then begins ramping up again. 22 | * 23 | * The motor will beep during power on/off, and if the plug pressure rises above 24 | * the maximum the board can read - this condition could lead to a missed orgasm 25 | * if unchecked. The analog gain for the sensor is adjustable via a trimpot to 26 | * accomidate different types of plugs that have higher/lower resting pressures. 27 | * 28 | * Motor speed, current pressure, and average pressure are reported via USB serial 29 | * at 115200 baud. Timestamps can also be enabled, from the main loop. 30 | * 31 | * There is some framework for more features like an adjustable "cool off" time 32 | * other than the default 15 seconds, and options for LED brightness and enabling/ 33 | * disabling beeps. 34 | * 35 | * Note - Do not set all the LEDs to white at full brightness at once 36 | * (RGB 255,255,255) It may overheat the voltage regulator and cause the board 37 | * to reset. 38 | */ 39 | //=======Libraries=============================== 40 | #include 41 | #include 42 | #include "FastLED.h" 43 | #include "RunningAverage.h" 44 | 45 | //=======Hardware Setup=============================== 46 | //LEDs 47 | #define NUM_LEDS 24 48 | #define LED_PIN 10 49 | #define LED_TYPE WS2812B 50 | #define COLOR_ORDER GRB 51 | #define BRIGHTNESS 50 //Subject to change, limits current that the LEDs draw 52 | 53 | //Encoder 54 | #define ENC_SW 5 //Pushbutton on the encoder 55 | Encoder myEnc(3, 2); //Quadrature inputs 56 | #define ENC_SW_UP HIGH 57 | #define ENC_SW_DOWN LOW 58 | 59 | //Motor 60 | #define MOTPIN 9 61 | 62 | //Pressure Sensor Analog In 63 | #define BUTTPIN A0 64 | // Sampling 4x and not dividing keeps the samples from the Arduino Uno's 10 bit 65 | // ADC in a similar range to the Teensy LC's 12-bit ADC. This helps ensure the 66 | // feedback algorithm will behave similar to the original. 67 | #define OVERSAMPLE 4 68 | #define ADC_MAX 1023 69 | 70 | //=======Software/Timing options===================== 71 | #define FREQUENCY 60 //Update frequency in Hz 72 | #define LONG_PRESS_MS 600 //ms requirements for a long press, to move to option menus 73 | #define V_LONG_PRESS_MS 2500 //ms for a very long press, which turns the device off 74 | 75 | //Update/render period 76 | #define period (1000/FREQUENCY) 77 | #define longBtnCount (LONG_PRESS_MS / period) 78 | 79 | //Running pressure average array length and update frequency 80 | #define RA_HIST_SECONDS 25 81 | #define RA_FREQUENCY 6 82 | #define RA_TICK_PERIOD (FREQUENCY / RA_FREQUENCY) 83 | RunningAverage raPressure(RA_FREQUENCY*RA_HIST_SECONDS); 84 | int sensitivity = 0; //orgasm detection sensitivity, persists through different states 85 | 86 | //=======State Machine Modes========================= 87 | #define MANUAL 1 88 | #define AUTO 2 89 | #define OPT_SPEED 3 90 | #define OPT_RAMPSPD 4 91 | #define OPT_BEEP 5 92 | #define OPT_PRES 6 93 | 94 | 95 | //Button states - no press, short press, long press 96 | #define BTN_NONE 0 97 | #define BTN_SHORT 1 98 | #define BTN_LONG 2 99 | #define BTN_V_LONG 3 100 | 101 | 102 | uint8_t state = MANUAL; 103 | //=======Global Settings============================= 104 | #define MOT_MAX 255 // Motor PWM maximum 105 | #define MOT_MIN 20 // Motor PWM minimum. It needs a little more than this to start. 106 | 107 | CRGB leds[NUM_LEDS]; 108 | 109 | int pressure = 0; 110 | int avgPressure = 0; //Running 25 second average pressure 111 | //int bri =100; //Brightness setting 112 | int rampTimeS = 30; //Ramp-up time, in seconds 113 | #define DEFAULT_PLIMIT 600 114 | int pLimit = DEFAULT_PLIMIT; //Limit in change of pressure before the vibrator turns off 115 | int maxSpeed = 255; //maximum speed the motor will ramp up to in automatic mode 116 | float motSpeed = 0; //Motor speed, 0-255 (float to maintain smooth ramping to low speeds) 117 | 118 | //=======EEPROM Addresses============================ 119 | //128b available on teensy LC 120 | #define BEEP_ADDR 1 121 | #define MAX_SPEED_ADDR 2 122 | #define SENSITIVITY_ADDR 3 123 | //#define RAMPSPEED_ADDR 4 //For now, ramp speed adjustments aren't implemented 124 | 125 | //=======Setup======================================= 126 | //Beep out tones over the motor by frequency (1047,1396,2093) may work well 127 | void beep_motor(int f1, int f2, int f3){ 128 | analogWrite(MOTPIN, 0); 129 | tone(MOTPIN, f1); 130 | delay(250); 131 | tone(MOTPIN, f2); 132 | delay(250); 133 | tone(MOTPIN, f3); 134 | delay(250); 135 | noTone(MOTPIN); 136 | analogWrite(MOTPIN,motSpeed); 137 | } 138 | 139 | void setup() { 140 | pinMode(ENC_SW, INPUT); //Pin to read when encoder is pressed 141 | digitalWrite(ENC_SW, HIGH); // Encoder switch pullup 142 | 143 | analogReference(EXTERNAL); 144 | 145 | // Classic AVR based Arduinos have a PWM frequency of about 490Hz which 146 | // causes the motor to whine. Change the prescaler to achieve 31372Hz. 147 | sbi(TCCR1B, CS10); 148 | cbi(TCCR1B, CS11); 149 | cbi(TCCR1B, CS12); 150 | 151 | pinMode(MOTPIN,OUTPUT); //Enable "analog" out (PWM) 152 | 153 | pinMode(BUTTPIN,INPUT); //default is 10 bit resolution (1024), 0-3.3 154 | 155 | raPressure.clear(); //Initialize a running pressure average 156 | 157 | digitalWrite(MOTPIN, LOW);//Make sure the motor is off 158 | 159 | delay(3000); // 3 second delay for recovery 160 | 161 | Serial.begin(115200); 162 | 163 | FastLED.addLeds(leds, NUM_LEDS).setCorrection(TypicalLEDStrip); 164 | // limit power draw to .6A at 5v... Didn't seem to work in my FastLED version though 165 | //FastLED.setMaxPowerInVoltsAndMilliamps(5,DEFAULT_PLIMIT); 166 | FastLED.setBrightness(BRIGHTNESS); 167 | 168 | //Recall saved settings from memory 169 | sensitivity = EEPROM.read(SENSITIVITY_ADDR); 170 | maxSpeed = min(EEPROM.read(MAX_SPEED_ADDR),MOT_MAX); //Obey the MOT_MAX the first power cycle after chaning it. 171 | beep_motor(1047,1396,2093); //Power on beep 172 | } 173 | 174 | //=======LED Drawing Functions================= 175 | 176 | //Draw a "cursor", one pixel representing either a pressure or encoder position value 177 | //C1,C2,C3 are colors for each of 3 revolutions over the 13 LEDs (39 values) 178 | void draw_cursor_3(int pos,CRGB C1, CRGB C2, CRGB C3){ 179 | pos = constrain(pos,0,NUM_LEDS*3-1); 180 | int colorNum = pos/NUM_LEDS; //revolution number 181 | int cursorPos = pos % NUM_LEDS; //place on circle, from 0-12 182 | switch(colorNum){ 183 | case 0: 184 | leds[cursorPos] = C1; 185 | break; 186 | case 1: 187 | leds[cursorPos] = C2; 188 | break; 189 | case 2: 190 | leds[cursorPos] = C3; 191 | break; 192 | } 193 | } 194 | 195 | //Draw a "cursor", one pixel representing either a pressure or encoder position value 196 | void draw_cursor(int pos,CRGB C1){ 197 | pos = constrain(pos,0,NUM_LEDS-1); 198 | leds[pos] = C1; 199 | } 200 | 201 | //Draw 3 revolutions of bars around the LEDs. From 0-39, 3 colors 202 | void draw_bars_3(int pos,CRGB C1, CRGB C2, CRGB C3){ 203 | pos = constrain(pos,0,NUM_LEDS*3-1); 204 | int colorNum = pos/NUM_LEDS; //revolution number 205 | int barPos = pos % NUM_LEDS; //place on circle, from 0-12 206 | switch(colorNum){ 207 | case 0: 208 | fill_gradient_RGB(leds,0,C1,barPos,C1); 209 | //leds[barPos] = C1; 210 | break; 211 | case 1: 212 | fill_gradient_RGB(leds,0,C1,barPos,C2); 213 | break; 214 | case 2: 215 | fill_gradient_RGB(leds,0,C2,barPos,C3); 216 | break; 217 | } 218 | } 219 | 220 | //Provide a limited encoder reading corresponting to tacticle clicks on the knob. 221 | //Each click passes through 4 encoder pulses. This reduces it to 1 pulse per click 222 | int encLimitRead(int minVal, int maxVal){ 223 | if(myEnc.read()>maxVal*4)myEnc.write(maxVal*4); 224 | else if(myEnc.read() pLimit) { 254 | motSpeed = -.5*(float)rampTimeS*((float)FREQUENCY*motIncrement);//Stay off for a while (half the ramp up time) 255 | } 256 | else if (motSpeed < (float)maxSpeed) { 257 | motSpeed += motIncrement; 258 | } 259 | if (motSpeed > MOT_MIN) { 260 | analogWrite(MOTPIN, (int) motSpeed); 261 | } else { 262 | analogWrite(MOTPIN, 0); 263 | } 264 | 265 | int presDraw = map(constrain(pressure - avgPressure, 0, pLimit),0,pLimit,0,NUM_LEDS*3); 266 | draw_bars_3(presDraw, CRGB::Green,CRGB::Yellow,CRGB::Red); 267 | draw_cursor_3(knob, CRGB(50,50,200),CRGB::Blue,CRGB::Purple); 268 | 269 | } 270 | 271 | //Setting menu for adjusting the maximum vibrator speed automatic mode will ramp up to 272 | void run_opt_speed() { 273 | Serial.println("speed settings"); 274 | int knob = encLimitRead(0,NUM_LEDS-1); 275 | motSpeed = map(knob, 0, NUM_LEDS-1, 0., (float)MOT_MAX); 276 | analogWrite(MOTPIN, motSpeed); 277 | maxSpeed = motSpeed; //Set the maximum ramp-up speed in automatic mode 278 | //Little animation to show ramping up on the LEDs 279 | static int visRamp = 0; 280 | if(visRamp <= FREQUENCY*NUM_LEDS-1) visRamp += 16; 281 | else visRamp = 0; 282 | draw_bars_3(map(visRamp,0,(NUM_LEDS-1)*FREQUENCY,0,knob),CRGB::Green,CRGB::Green,CRGB::Green); 283 | } 284 | 285 | //Not yet added, but adjusts how quickly the vibrator turns back on after being triggered off 286 | void run_opt_rampspd() { 287 | Serial.println("rampSpeed"); 288 | } 289 | 290 | //Also not completed, option for enabling/disabling beeps 291 | void run_opt_beep() { 292 | Serial.println("Brightness Settings"); 293 | } 294 | 295 | //Simply display the pressure analog voltage. Useful for debugging sensitivity issues. 296 | void run_opt_pres() { 297 | int p = map(analogRead(BUTTPIN),0,ADC_MAX,0,NUM_LEDS-1); 298 | draw_cursor(p,CRGB::White); 299 | } 300 | 301 | //Poll the knob click button, and check for long/very long presses as well 302 | uint8_t check_button(){ 303 | static bool lastBtn = ENC_SW_DOWN; 304 | static unsigned long keyDownTime = 0; 305 | uint8_t btnState = BTN_NONE; 306 | bool thisBtn = digitalRead(ENC_SW); 307 | 308 | //Detect single presses, no repeating, on keyup 309 | if(thisBtn == ENC_SW_DOWN && lastBtn == ENC_SW_UP){ 310 | keyDownTime = millis(); 311 | } 312 | 313 | if (thisBtn == ENC_SW_UP && lastBtn == ENC_SW_DOWN) { //there was a keyup 314 | if((millis()-keyDownTime) >= V_LONG_PRESS_MS){ 315 | btnState = BTN_V_LONG; 316 | } 317 | else if((millis()-keyDownTime) >= LONG_PRESS_MS){ 318 | btnState = BTN_LONG; 319 | } 320 | else{ 321 | btnState = BTN_SHORT; 322 | } 323 | } 324 | 325 | lastBtn = thisBtn; 326 | return btnState; 327 | } 328 | 329 | //run the important/unique parts of each state. Also, set button LED color. 330 | void run_state_machine(uint8_t state){ 331 | switch (state) { 332 | case MANUAL: 333 | run_manual(); 334 | break; 335 | case AUTO: 336 | run_auto(); 337 | break; 338 | case OPT_SPEED: 339 | run_opt_speed(); 340 | break; 341 | case OPT_RAMPSPD: 342 | run_opt_rampspd(); 343 | break; 344 | case OPT_BEEP: 345 | run_opt_beep(); 346 | break; 347 | case OPT_PRES: 348 | run_opt_pres(); 349 | break; 350 | default: 351 | run_manual(); 352 | break; 353 | } 354 | } 355 | 356 | //Switch between state machine states, and reset the encoder position as necessary 357 | //Returns the next state to run. Very long presses will turn the system off (sort of) 358 | uint8_t set_state(uint8_t btnState, uint8_t state){ 359 | if(btnState == BTN_NONE){ 360 | return state; 361 | } 362 | if(btnState == BTN_V_LONG){ 363 | //Turn the device off until woken up by the button 364 | Serial.println("power off"); 365 | fill_gradient_RGB(leds,0,CRGB::Black,NUM_LEDS-1,CRGB::Black);//Turn off LEDS 366 | FastLED.show(); 367 | analogWrite(MOTPIN, 0); 368 | beep_motor(2093,1396,1047); 369 | analogWrite(MOTPIN, 0); //Turn Motor off 370 | while(!digitalRead(ENC_SW))delay(1); 371 | beep_motor(1047,1396,2093); 372 | return MANUAL ; 373 | } 374 | else if(btnState == BTN_SHORT){ 375 | switch(state){ 376 | case MANUAL: 377 | myEnc.write(sensitivity);//Whenever going into auto mode, keep the last sensitivity 378 | motSpeed = 0; //Also reset the motor speed to 0 379 | return AUTO; 380 | case AUTO: 381 | myEnc.write(0);//Whenever going into manual mode, set the speed to 0. 382 | motSpeed = 0; 383 | EEPROM.update(SENSITIVITY_ADDR, sensitivity); 384 | return MANUAL; 385 | case OPT_SPEED: 386 | myEnc.write(0); 387 | EEPROM.update(MAX_SPEED_ADDR, maxSpeed); 388 | //return OPT_RAMPSPD; 389 | //return OPT_BEEP; 390 | motSpeed = 0; 391 | analogWrite(MOTPIN, motSpeed); //Turn the motor off for the white pressure monitoring mode 392 | return OPT_PRES; //Skip beep and rampspeed settings for now 393 | case OPT_RAMPSPD: //Not yet implimented 394 | //motSpeed = 0; 395 | //myEnc.write(0); 396 | return OPT_BEEP; 397 | case OPT_BEEP: 398 | myEnc.write(0); 399 | return OPT_PRES; 400 | case OPT_PRES: 401 | myEnc.write(map(maxSpeed,0,255,0,4*(NUM_LEDS)));//start at saved value 402 | return OPT_SPEED; 403 | } 404 | } 405 | else if(btnState == BTN_LONG){ 406 | switch (state) { 407 | case MANUAL: 408 | myEnc.write(map(maxSpeed,0,255,0,4*(NUM_LEDS)));//start at saved value 409 | return OPT_SPEED; 410 | case AUTO: 411 | myEnc.write(map(maxSpeed,0,255,0,4*(NUM_LEDS)));//start at saved value 412 | return OPT_SPEED; 413 | case OPT_SPEED: 414 | myEnc.write(0); 415 | return MANUAL; 416 | case OPT_RAMPSPD: 417 | return MANUAL; 418 | case OPT_BEEP: 419 | return MANUAL; 420 | case OPT_PRES: 421 | myEnc.write(0); 422 | return MANUAL; 423 | } 424 | } 425 | else return MANUAL; 426 | } 427 | 428 | //=======Main Loop============================= 429 | void loop() { 430 | static uint8_t state = MANUAL; 431 | static int sampleTick = 0; 432 | //Run this section at the update frequency (default 60 Hz) 433 | if (millis() % period == 0) { 434 | delay(1); 435 | 436 | sampleTick++; //Add pressure samples to the running average slower than 60Hz 437 | if (sampleTick % RA_TICK_PERIOD == 0) { 438 | raPressure.addValue(pressure); 439 | avgPressure = raPressure.getAverage(); 440 | } 441 | 442 | pressure=0; 443 | for(uint8_t i=OVERSAMPLE; i; --i) { 444 | pressure += analogRead(BUTTPIN); 445 | if(i) { // Don't delay after the last sample 446 | delay(1); // Spread samples out a little 447 | } 448 | } 449 | fadeToBlackBy(leds,NUM_LEDS,20); //Create a fading light effect. LED buffer is not otherwise cleared 450 | uint8_t btnState = check_button(); 451 | state = set_state(btnState,state); //Set the next state based on this state and button presses 452 | run_state_machine(state); 453 | FastLED.show(); //Update the physical LEDs to match the buffer in software 454 | 455 | //Alert that the Pressure voltage amplifier is railing, and the trim pot needs to be adjusted 456 | if(pressure > 4030)beep_motor(2093,2093,2093); //Three high beeps 457 | 458 | //Report pressure and motor data over USB for analysis / other uses. timestamps disabled by default 459 | //Serial.print(millis()); //Timestamp (ms) 460 | //Serial.print(","); 461 | Serial.print(motSpeed); //Motor speed (0-255) 462 | Serial.print(","); 463 | Serial.print(pressure); //(Original ADC value - 12 bits, 0-4095) 464 | Serial.print(","); 465 | Serial.println(avgPressure); //Running average of (default last 25 seconds) pressure 466 | 467 | } 468 | } 469 | -------------------------------------------------------------------------------- /pcb/BOM.md: -------------------------------------------------------------------------------- 1 | | Part | Value | Description | Mouser | Amazon | 2 | | ---- | -------------- | -------------------------------------------- | -------------------- | ------------------------------------ | 3 | | C1 | 0.1u | CAPACITOR, American symbol | 80-C320C104K5R | https://www.amazon.com/dp/B007SVHFXO | 4 | | D1 | 1N5818-B | 1.0A SCHOTTKY BARRIER RECTIFIER | 512-1N5818 | https://www.amazon.com/dp/B00MMY5VFQ | 5 | | PS1 | MPX5050GP | Integrated Silicon Pressure Sensor | 841-MPX5050GP | https://www.amazon.com/dp/B005T5KNDK | 6 | | Q1 | FQP30N06L | Power MOSFET N-Channel | 512-FQP30N06L | https://www.amazon.com/dp/B00MMY2E7E | 7 | | R1 | 100K | RESISTOR, American symbol | 660-MF1/4DC1003F | https://www.amazon.com/dp/B003UC4FSS | 8 | | SW1 | Rotary encoder | Rotary Encoder w/ switch (EC12D or similar) | 652-PEC11R-4115F-S18 | https://www.amazon.com/dp/B0197X1UZY | 9 | | TM1 | 10K | Trimmer Potentiometer | 652-3306P-1-103 | https://www.amazon.com/dp/B00SWK15KE | 10 | | U1 | ARDUINOR3PERF | Electronics Salon Arduino Uno R3 Perfboard | | https://www.amazon.com/dp/B01J1KM3RM | 11 | | -- | NEOPIXEL RING | Adafruit 24 RGB LED Neopixel Ring | | https://www.amazon.com/dp/B00K9M3WXG | 12 | -------------------------------------------------------------------------------- /pcb/assembled-bottom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/night-howler/protogasm/c72ab1a48b5132878632f50aef034491cd599e1a/pcb/assembled-bottom.jpg -------------------------------------------------------------------------------- /pcb/assembled-top.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/night-howler/protogasm/c72ab1a48b5132878632f50aef034491cd599e1a/pcb/assembled-top.jpg -------------------------------------------------------------------------------- /pcb/assembly_notes.md: -------------------------------------------------------------------------------- 1 | protogasm_layout.png shows how I build my boards - the wire goes into the hole 2 | next to a component's leg and is then bent down to meet the leg. 3 | 4 | Cut the mounting tabs off of the rotary encoder and install it at the center of 5 | the board. The center pin should point at Arduino pin 12. Squeeze the pins 6 | together slightly so they go into columns 8 and 13. 7 | 8 | The trimpot goes with its center leg directly connected to the AREF hole. 9 | 10 | The MOSFET goes on the back of the board on column 12. The center pin should be 11 | aligned with VIN. 12 | 13 | The pressure sensor is installed with the pins bent the wrong way. If you 14 | install it the right way there isn't enough clearance for the hose barb. Pin 1 15 | (notched) goes in column 9, two holes up from the SCL pin. The mounting ears 16 | need to be removed to provide clearance for the USB and power connectors on the 17 | Arduino. I simply clipped them off with wire cutters. 18 | 19 | Install the remaining passives and wiring. 20 | 21 | Push the pin headers into the Arudino, then set the perfboard on top. Solder a 22 | couple pins from each strip. Do it quickly and just use a dab of solder to tack 23 | it in place or you'll risk damaging the Arduino's connectors. Remove the 24 | perfboard from the Arduino, solder the remaining pins, then go back and clean up 25 | the ones you tacked. 26 | 27 | The Neopixel Ring is installed on three .100 breakaway header pins for PWR, GND, 28 | and OUT. Do not install a pin on IN because it will short against the USB port. 29 | The pins need to tilt slightly so place the Neopixel Ring on them to hold them 30 | in the correct orientation before soldering them to the board. 31 | 32 | The power out to the motor is taken from either side of the diode. I made a 33 | short cable with a connector and soldered it to the pins. 34 | -------------------------------------------------------------------------------- /pcb/layout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/night-howler/protogasm/c72ab1a48b5132878632f50aef034491cd599e1a/pcb/layout.png -------------------------------------------------------------------------------- /pcb/protogasm.brd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | White: Top components 145 | Yellow: Bottom components 146 | Red: Top wiring 147 | Cyan: Bottom wiring 148 | 149 | Vias indicate where wires are 150 | soldered to perfboardand and 151 | are folded on the opposite side. 152 | Ring GND 153 | Ring PWR 154 | Ring OUT 155 | 156 | 157 | NeoPixel Ring DATA IN is here 158 | but DO NOT use a pin header in 159 | this location. It will short against 160 | the USB port. Solder the wire to 161 | the ring. 162 | 163 | 164 | Motor connection 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | >NAME 190 | >VALUE 191 | 3 192 | 1 193 | 194 | 195 | 196 | 197 | <b>Resistors, Capacitors, Inductors</b><p> 198 | Based on the previous libraries: 199 | <ul> 200 | <li>r.lbr 201 | <li>cap.lbr 202 | <li>cap-fe.lbr 203 | <li>captant.lbr 204 | <li>polcap.lbr 205 | <li>ipc-smd.lbr 206 | </ul> 207 | All SMD packages are defined according to the IPC specifications and CECC<p> 208 | <author>Created by librarian@cadsoft.de</author><p> 209 | <p> 210 | for Electrolyt Capacitors see also :<p> 211 | www.bccomponents.com <p> 212 | www.panasonic.com<p> 213 | www.kemet.com<p> 214 | http://www.secc.co.jp/pdf/os_e/2004/e_os_all.pdf <b>(SANYO)</b> 215 | <p> 216 | for trimmer refence see : <u>www.electrospec-inc.com/cross_references/trimpotcrossref.asp</u><p> 217 | 218 | <table border=0 cellspacing=0 cellpadding=0 width="100%" cellpaddding=0> 219 | <tr valign="top"> 220 | 221 | <! <td width="10">&nbsp;</td> 222 | <td width="90%"> 223 | 224 | <b><font color="#0000FF" size="4">TRIM-POT CROSS REFERENCE</font></b> 225 | <P> 226 | <TABLE BORDER=0 CELLSPACING=1 CELLPADDING=2> 227 | <TR> 228 | <TD COLSPAN=8> 229 | <FONT SIZE=3 FACE=ARIAL><B>RECTANGULAR MULTI-TURN</B></FONT> 230 | </TD> 231 | </TR> 232 | <TR> 233 | <TD ALIGN=CENTER> 234 | <B> 235 | <FONT SIZE=3 FACE=ARIAL color="#FF0000">BOURNS</FONT> 236 | </B> 237 | </TD> 238 | <TD ALIGN=CENTER> 239 | <B> 240 | <FONT SIZE=3 FACE=ARIAL color="#FF0000">BI&nbsp;TECH</FONT> 241 | </B> 242 | </TD> 243 | <TD ALIGN=CENTER> 244 | <B> 245 | <FONT SIZE=3 FACE=ARIAL color="#FF0000">DALE-VISHAY</FONT> 246 | </B> 247 | </TD> 248 | <TD ALIGN=CENTER> 249 | <B> 250 | <FONT SIZE=3 FACE=ARIAL color="#FF0000">PHILIPS/MEPCO</FONT> 251 | </B> 252 | </TD> 253 | <TD ALIGN=CENTER> 254 | <B> 255 | <FONT SIZE=3 FACE=ARIAL color="#FF0000">MURATA</FONT> 256 | </B> 257 | </TD> 258 | <TD ALIGN=CENTER> 259 | <B> 260 | <FONT SIZE=3 FACE=ARIAL color="#FF0000">PANASONIC</FONT> 261 | </B> 262 | </TD> 263 | <TD ALIGN=CENTER> 264 | <B> 265 | <FONT SIZE=3 FACE=ARIAL color="#FF0000">SPECTROL</FONT> 266 | </B> 267 | </TD> 268 | <TD ALIGN=CENTER> 269 | <B> 270 | <FONT SIZE=3 FACE=ARIAL color="#FF0000">MILSPEC</FONT> 271 | </B> 272 | </TD><TD>&nbsp;</TD> 273 | </TR> 274 | <TR> 275 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3 > 276 | 3005P<BR> 277 | 3006P<BR> 278 | 3006W<BR> 279 | 3006Y<BR> 280 | 3009P<BR> 281 | 3009W<BR> 282 | 3009Y<BR> 283 | 3057J<BR> 284 | 3057L<BR> 285 | 3057P<BR> 286 | 3057Y<BR> 287 | 3059J<BR> 288 | 3059L<BR> 289 | 3059P<BR> 290 | 3059Y<BR></FONT> 291 | </TD> 292 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 293 | -<BR> 294 | 89P<BR> 295 | 89W<BR> 296 | 89X<BR> 297 | 89PH<BR> 298 | 76P<BR> 299 | 89XH<BR> 300 | 78SLT<BR> 301 | 78L&nbsp;ALT<BR> 302 | 56P&nbsp;ALT<BR> 303 | 78P&nbsp;ALT<BR> 304 | T8S<BR> 305 | 78L<BR> 306 | 56P<BR> 307 | 78P<BR></FONT> 308 | </TD> 309 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 310 | -<BR> 311 | T18/784<BR> 312 | 783<BR> 313 | 781<BR> 314 | -<BR> 315 | -<BR> 316 | -<BR> 317 | 2199<BR> 318 | 1697/1897<BR> 319 | 1680/1880<BR> 320 | 2187<BR> 321 | -<BR> 322 | -<BR> 323 | -<BR> 324 | -<BR></FONT> 325 | </TD> 326 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 327 | -<BR> 328 | 8035EKP/CT20/RJ-20P<BR> 329 | -<BR> 330 | RJ-20X<BR> 331 | -<BR> 332 | -<BR> 333 | -<BR> 334 | 1211L<BR> 335 | 8012EKQ&nbsp;ALT<BR> 336 | 8012EKR&nbsp;ALT<BR> 337 | 1211P<BR> 338 | 8012EKJ<BR> 339 | 8012EKL<BR> 340 | 8012EKQ<BR> 341 | 8012EKR<BR></FONT> 342 | </TD> 343 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 344 | -<BR> 345 | 2101P<BR> 346 | 2101W<BR> 347 | 2101Y<BR> 348 | -<BR> 349 | -<BR> 350 | -<BR> 351 | -<BR> 352 | -<BR> 353 | -<BR> 354 | -<BR> 355 | -<BR> 356 | 2102L<BR> 357 | 2102S<BR> 358 | 2102Y<BR></FONT> 359 | </TD> 360 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 361 | -<BR> 362 | EVMCOG<BR> 363 | -<BR> 364 | -<BR> 365 | -<BR> 366 | -<BR> 367 | -<BR> 368 | -<BR> 369 | -<BR> 370 | -<BR> 371 | -<BR> 372 | -<BR> 373 | -<BR> 374 | -<BR> 375 | -<BR></FONT> 376 | </TD> 377 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 378 | -<BR> 379 | 43P<BR> 380 | 43W<BR> 381 | 43Y<BR> 382 | -<BR> 383 | -<BR> 384 | -<BR> 385 | -<BR> 386 | 40L<BR> 387 | 40P<BR> 388 | 40Y<BR> 389 | 70Y-T602<BR> 390 | 70L<BR> 391 | 70P<BR> 392 | 70Y<BR></FONT> 393 | </TD> 394 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 395 | -<BR> 396 | -<BR> 397 | -<BR> 398 | -<BR> 399 | -<BR> 400 | -<BR> 401 | -<BR> 402 | -<BR> 403 | RT/RTR12<BR> 404 | RT/RTR12<BR> 405 | RT/RTR12<BR> 406 | -<BR> 407 | RJ/RJR12<BR> 408 | RJ/RJR12<BR> 409 | RJ/RJR12<BR></FONT> 410 | </TD> 411 | </TR> 412 | <TR> 413 | <TD COLSPAN=8>&nbsp; 414 | </TD> 415 | </TR> 416 | <TR> 417 | <TD COLSPAN=8> 418 | <FONT SIZE=4 FACE=ARIAL><B>SQUARE MULTI-TURN</B></FONT> 419 | </TD> 420 | </TR> 421 | <TR> 422 | <TD ALIGN=CENTER> 423 | <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> 424 | </TD> 425 | <TD ALIGN=CENTER> 426 | <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> 427 | </TD> 428 | <TD ALIGN=CENTER> 429 | <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> 430 | </TD> 431 | <TD ALIGN=CENTER> 432 | <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> 433 | </TD> 434 | <TD ALIGN=CENTER> 435 | <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> 436 | </TD> 437 | <TD ALIGN=CENTER> 438 | <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> 439 | </TD> 440 | <TD ALIGN=CENTER> 441 | <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> 442 | </TD> 443 | <TD ALIGN=CENTER> 444 | <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> 445 | </TD> 446 | </TR> 447 | <TR> 448 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 449 | 3250L<BR> 450 | 3250P<BR> 451 | 3250W<BR> 452 | 3250X<BR> 453 | 3252P<BR> 454 | 3252W<BR> 455 | 3252X<BR> 456 | 3260P<BR> 457 | 3260W<BR> 458 | 3260X<BR> 459 | 3262P<BR> 460 | 3262W<BR> 461 | 3262X<BR> 462 | 3266P<BR> 463 | 3266W<BR> 464 | 3266X<BR> 465 | 3290H<BR> 466 | 3290P<BR> 467 | 3290W<BR> 468 | 3292P<BR> 469 | 3292W<BR> 470 | 3292X<BR> 471 | 3296P<BR> 472 | 3296W<BR> 473 | 3296X<BR> 474 | 3296Y<BR> 475 | 3296Z<BR> 476 | 3299P<BR> 477 | 3299W<BR> 478 | 3299X<BR> 479 | 3299Y<BR> 480 | 3299Z<BR></FONT> 481 | </TD> 482 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 483 | -<BR> 484 | 66P&nbsp;ALT<BR> 485 | 66W&nbsp;ALT<BR> 486 | 66X&nbsp;ALT<BR> 487 | 66P&nbsp;ALT<BR> 488 | 66W&nbsp;ALT<BR> 489 | 66X&nbsp;ALT<BR> 490 | -<BR> 491 | 64W&nbsp;ALT<BR> 492 | -<BR> 493 | 64P&nbsp;ALT<BR> 494 | 64W&nbsp;ALT<BR> 495 | 64X&nbsp;ALT<BR> 496 | 64P<BR> 497 | 64W<BR> 498 | 64X<BR> 499 | 66X&nbsp;ALT<BR> 500 | 66P&nbsp;ALT<BR> 501 | 66W&nbsp;ALT<BR> 502 | 66P<BR> 503 | 66W<BR> 504 | 66X<BR> 505 | 67P<BR> 506 | 67W<BR> 507 | 67X<BR> 508 | 67Y<BR> 509 | 67Z<BR> 510 | 68P<BR> 511 | 68W<BR> 512 | 68X<BR> 513 | 67Y&nbsp;ALT<BR> 514 | 67Z&nbsp;ALT<BR></FONT> 515 | </TD> 516 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 517 | 5050<BR> 518 | 5091<BR> 519 | 5080<BR> 520 | 5087<BR> 521 | -<BR> 522 | -<BR> 523 | -<BR> 524 | -<BR> 525 | -<BR> 526 | -<BR> 527 | -<BR> 528 | T63YB<BR> 529 | T63XB<BR> 530 | -<BR> 531 | -<BR> 532 | -<BR> 533 | 5887<BR> 534 | 5891<BR> 535 | 5880<BR> 536 | -<BR> 537 | -<BR> 538 | -<BR> 539 | T93Z<BR> 540 | T93YA<BR> 541 | T93XA<BR> 542 | T93YB<BR> 543 | T93XB<BR> 544 | -<BR> 545 | -<BR> 546 | -<BR> 547 | -<BR> 548 | -<BR></FONT> 549 | </TD> 550 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 551 | -<BR> 552 | -<BR> 553 | -<BR> 554 | -<BR> 555 | -<BR> 556 | -<BR> 557 | -<BR> 558 | -<BR> 559 | -<BR> 560 | -<BR> 561 | 8026EKP<BR> 562 | 8026EKW<BR> 563 | 8026EKM<BR> 564 | 8026EKP<BR> 565 | 8026EKB<BR> 566 | 8026EKM<BR> 567 | 1309X<BR> 568 | 1309P<BR> 569 | 1309W<BR> 570 | 8024EKP<BR> 571 | 8024EKW<BR> 572 | 8024EKN<BR> 573 | RJ-9P/CT9P<BR> 574 | RJ-9W<BR> 575 | RJ-9X<BR> 576 | -<BR> 577 | -<BR> 578 | -<BR> 579 | -<BR> 580 | -<BR> 581 | -<BR> 582 | -<BR></FONT> 583 | </TD> 584 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 585 | -<BR> 586 | -<BR> 587 | -<BR> 588 | -<BR> 589 | -<BR> 590 | -<BR> 591 | -<BR> 592 | -<BR> 593 | -<BR> 594 | -<BR> 595 | 3103P<BR> 596 | 3103Y<BR> 597 | 3103Z<BR> 598 | 3103P<BR> 599 | 3103Y<BR> 600 | 3103Z<BR> 601 | -<BR> 602 | -<BR> 603 | -<BR> 604 | -<BR> 605 | -<BR> 606 | -<BR> 607 | 3105P/3106P<BR> 608 | 3105W/3106W<BR> 609 | 3105X/3106X<BR> 610 | 3105Y/3106Y<BR> 611 | 3105Z/3105Z<BR> 612 | 3102P<BR> 613 | 3102W<BR> 614 | 3102X<BR> 615 | 3102Y<BR> 616 | 3102Z<BR></FONT> 617 | </TD> 618 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 619 | -<BR> 620 | -<BR> 621 | -<BR> 622 | -<BR> 623 | -<BR> 624 | -<BR> 625 | -<BR> 626 | -<BR> 627 | -<BR> 628 | -<BR> 629 | -<BR> 630 | -<BR> 631 | -<BR> 632 | -<BR> 633 | -<BR> 634 | -<BR> 635 | -<BR> 636 | -<BR> 637 | -<BR> 638 | -<BR> 639 | -<BR> 640 | -<BR> 641 | EVMCBG<BR> 642 | EVMCCG<BR> 643 | -<BR> 644 | -<BR> 645 | -<BR> 646 | -<BR> 647 | -<BR> 648 | -<BR> 649 | -<BR> 650 | -<BR></FONT> 651 | </TD> 652 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 653 | 55-1-X<BR> 654 | 55-4-X<BR> 655 | 55-3-X<BR> 656 | 55-2-X<BR> 657 | -<BR> 658 | -<BR> 659 | -<BR> 660 | -<BR> 661 | -<BR> 662 | -<BR> 663 | -<BR> 664 | -<BR> 665 | -<BR> 666 | -<BR> 667 | -<BR> 668 | -<BR> 669 | 50-2-X<BR> 670 | 50-4-X<BR> 671 | 50-3-X<BR> 672 | -<BR> 673 | -<BR> 674 | -<BR> 675 | 64P<BR> 676 | 64W<BR> 677 | 64X<BR> 678 | 64Y<BR> 679 | 64Z<BR> 680 | -<BR> 681 | -<BR> 682 | -<BR> 683 | -<BR> 684 | -<BR></FONT> 685 | </TD> 686 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 687 | RT/RTR22<BR> 688 | RT/RTR22<BR> 689 | RT/RTR22<BR> 690 | RT/RTR22<BR> 691 | RJ/RJR22<BR> 692 | RJ/RJR22<BR> 693 | RJ/RJR22<BR> 694 | RT/RTR26<BR> 695 | RT/RTR26<BR> 696 | RT/RTR26<BR> 697 | RJ/RJR26<BR> 698 | RJ/RJR26<BR> 699 | RJ/RJR26<BR> 700 | RJ/RJR26<BR> 701 | RJ/RJR26<BR> 702 | RJ/RJR26<BR> 703 | RT/RTR24<BR> 704 | RT/RTR24<BR> 705 | RT/RTR24<BR> 706 | RJ/RJR24<BR> 707 | RJ/RJR24<BR> 708 | RJ/RJR24<BR> 709 | RJ/RJR24<BR> 710 | RJ/RJR24<BR> 711 | RJ/RJR24<BR> 712 | -<BR> 713 | -<BR> 714 | -<BR> 715 | -<BR> 716 | -<BR> 717 | -<BR> 718 | -<BR></FONT> 719 | </TD> 720 | </TR> 721 | <TR> 722 | <TD COLSPAN=8>&nbsp; 723 | </TD> 724 | </TR> 725 | <TR> 726 | <TD COLSPAN=8> 727 | <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> 728 | </TD> 729 | </TR> 730 | <TR> 731 | <TD ALIGN=CENTER> 732 | <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> 733 | </TD> 734 | <TD ALIGN=CENTER> 735 | <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> 736 | </TD> 737 | <TD ALIGN=CENTER> 738 | <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> 739 | </TD> 740 | <TD ALIGN=CENTER> 741 | <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> 742 | </TD> 743 | <TD ALIGN=CENTER> 744 | <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> 745 | </TD> 746 | <TD ALIGN=CENTER> 747 | <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> 748 | </TD> 749 | <TD ALIGN=CENTER> 750 | <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> 751 | </TD> 752 | <TD ALIGN=CENTER> 753 | <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> 754 | </TD> 755 | </TR> 756 | <TR> 757 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 758 | 3323P<BR> 759 | 3323S<BR> 760 | 3323W<BR> 761 | 3329H<BR> 762 | 3329P<BR> 763 | 3329W<BR> 764 | 3339H<BR> 765 | 3339P<BR> 766 | 3339W<BR> 767 | 3352E<BR> 768 | 3352H<BR> 769 | 3352K<BR> 770 | 3352P<BR> 771 | 3352T<BR> 772 | 3352V<BR> 773 | 3352W<BR> 774 | 3362H<BR> 775 | 3362M<BR> 776 | 3362P<BR> 777 | 3362R<BR> 778 | 3362S<BR> 779 | 3362U<BR> 780 | 3362W<BR> 781 | 3362X<BR> 782 | 3386B<BR> 783 | 3386C<BR> 784 | 3386F<BR> 785 | 3386H<BR> 786 | 3386K<BR> 787 | 3386M<BR> 788 | 3386P<BR> 789 | 3386S<BR> 790 | 3386W<BR> 791 | 3386X<BR></FONT> 792 | </TD> 793 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 794 | 25P<BR> 795 | 25S<BR> 796 | 25RX<BR> 797 | 82P<BR> 798 | 82M<BR> 799 | 82PA<BR> 800 | -<BR> 801 | -<BR> 802 | -<BR> 803 | 91E<BR> 804 | 91X<BR> 805 | 91T<BR> 806 | 91B<BR> 807 | 91A<BR> 808 | 91V<BR> 809 | 91W<BR> 810 | 25W<BR> 811 | 25V<BR> 812 | 25P<BR> 813 | -<BR> 814 | 25S<BR> 815 | 25U<BR> 816 | 25RX<BR> 817 | 25X<BR> 818 | 72XW<BR> 819 | 72XL<BR> 820 | 72PM<BR> 821 | 72RX<BR> 822 | -<BR> 823 | 72PX<BR> 824 | 72P<BR> 825 | 72RXW<BR> 826 | 72RXL<BR> 827 | 72X<BR></FONT> 828 | </TD> 829 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 830 | -<BR> 831 | -<BR> 832 | -<BR> 833 | T7YB<BR> 834 | T7YA<BR> 835 | -<BR> 836 | -<BR> 837 | -<BR> 838 | -<BR> 839 | -<BR> 840 | -<BR> 841 | -<BR> 842 | -<BR> 843 | -<BR> 844 | -<BR> 845 | -<BR> 846 | -<BR> 847 | TXD<BR> 848 | TYA<BR> 849 | TYP<BR> 850 | -<BR> 851 | TYD<BR> 852 | TX<BR> 853 | -<BR> 854 | 150SX<BR> 855 | 100SX<BR> 856 | 102T<BR> 857 | 101S<BR> 858 | 190T<BR> 859 | 150TX<BR> 860 | 101<BR> 861 | -<BR> 862 | -<BR> 863 | 101SX<BR></FONT> 864 | </TD> 865 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 866 | ET6P<BR> 867 | ET6S<BR> 868 | ET6X<BR> 869 | RJ-6W/8014EMW<BR> 870 | RJ-6P/8014EMP<BR> 871 | RJ-6X/8014EMX<BR> 872 | TM7W<BR> 873 | TM7P<BR> 874 | TM7X<BR> 875 | -<BR> 876 | 8017SMS<BR> 877 | -<BR> 878 | 8017SMB<BR> 879 | 8017SMA<BR> 880 | -<BR> 881 | -<BR> 882 | CT-6W<BR> 883 | CT-6H<BR> 884 | CT-6P<BR> 885 | CT-6R<BR> 886 | -<BR> 887 | CT-6V<BR> 888 | CT-6X<BR> 889 | -<BR> 890 | -<BR> 891 | 8038EKV<BR> 892 | -<BR> 893 | 8038EKX<BR> 894 | -<BR> 895 | -<BR> 896 | 8038EKP<BR> 897 | 8038EKZ<BR> 898 | 8038EKW<BR> 899 | -<BR></FONT> 900 | </TD> 901 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 902 | -<BR> 903 | -<BR> 904 | -<BR> 905 | 3321H<BR> 906 | 3321P<BR> 907 | 3321N<BR> 908 | 1102H<BR> 909 | 1102P<BR> 910 | 1102T<BR> 911 | RVA0911V304A<BR> 912 | -<BR> 913 | RVA0911H413A<BR> 914 | RVG0707V100A<BR> 915 | RVA0607V(H)306A<BR> 916 | RVA1214H213A<BR> 917 | -<BR> 918 | -<BR> 919 | -<BR> 920 | -<BR> 921 | -<BR> 922 | -<BR> 923 | -<BR> 924 | -<BR> 925 | -<BR> 926 | 3104B<BR> 927 | 3104C<BR> 928 | 3104F<BR> 929 | 3104H<BR> 930 | -<BR> 931 | 3104M<BR> 932 | 3104P<BR> 933 | 3104S<BR> 934 | 3104W<BR> 935 | 3104X<BR></FONT> 936 | </TD> 937 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 938 | EVMQ0G<BR> 939 | EVMQIG<BR> 940 | EVMQ3G<BR> 941 | EVMS0G<BR> 942 | EVMQ0G<BR> 943 | EVMG0G<BR> 944 | -<BR> 945 | -<BR> 946 | -<BR> 947 | EVMK4GA00B<BR> 948 | EVM30GA00B<BR> 949 | EVMK0GA00B<BR> 950 | EVM38GA00B<BR> 951 | EVMB6<BR> 952 | EVLQ0<BR> 953 | -<BR> 954 | EVMMSG<BR> 955 | EVMMBG<BR> 956 | EVMMAG<BR> 957 | -<BR> 958 | -<BR> 959 | EVMMCS<BR> 960 | -<BR> 961 | -<BR> 962 | -<BR> 963 | -<BR> 964 | -<BR> 965 | EVMM1<BR> 966 | -<BR> 967 | -<BR> 968 | EVMM0<BR> 969 | -<BR> 970 | -<BR> 971 | EVMM3<BR></FONT> 972 | </TD> 973 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 974 | -<BR> 975 | -<BR> 976 | -<BR> 977 | 62-3-1<BR> 978 | 62-1-2<BR> 979 | -<BR> 980 | -<BR> 981 | -<BR> 982 | -<BR> 983 | -<BR> 984 | -<BR> 985 | -<BR> 986 | -<BR> 987 | -<BR> 988 | -<BR> 989 | -<BR> 990 | 67R<BR> 991 | -<BR> 992 | 67P<BR> 993 | -<BR> 994 | -<BR> 995 | -<BR> 996 | -<BR> 997 | 67X<BR> 998 | 63V<BR> 999 | 63S<BR> 1000 | 63M<BR> 1001 | -<BR> 1002 | -<BR> 1003 | 63H<BR> 1004 | 63P<BR> 1005 | -<BR> 1006 | -<BR> 1007 | 63X<BR></FONT> 1008 | </TD> 1009 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1010 | -<BR> 1011 | -<BR> 1012 | -<BR> 1013 | RJ/RJR50<BR> 1014 | RJ/RJR50<BR> 1015 | RJ/RJR50<BR> 1016 | -<BR> 1017 | -<BR> 1018 | -<BR> 1019 | -<BR> 1020 | -<BR> 1021 | -<BR> 1022 | -<BR> 1023 | -<BR> 1024 | -<BR> 1025 | -<BR> 1026 | -<BR> 1027 | -<BR> 1028 | -<BR> 1029 | -<BR> 1030 | -<BR> 1031 | -<BR> 1032 | -<BR> 1033 | -<BR> 1034 | -<BR> 1035 | -<BR> 1036 | -<BR> 1037 | -<BR> 1038 | -<BR> 1039 | -<BR> 1040 | -<BR> 1041 | -<BR> 1042 | -<BR> 1043 | -<BR></FONT> 1044 | </TD> 1045 | </TR> 1046 | </TABLE> 1047 | <P>&nbsp;<P> 1048 | <TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3> 1049 | <TR> 1050 | <TD COLSPAN=7> 1051 | <FONT color="#0000FF" SIZE=4 FACE=ARIAL><B>SMD TRIM-POT CROSS REFERENCE</B></FONT> 1052 | <P> 1053 | <FONT SIZE=4 FACE=ARIAL><B>MULTI-TURN</B></FONT> 1054 | </TD> 1055 | </TR> 1056 | <TR> 1057 | <TD> 1058 | <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> 1059 | </TD> 1060 | <TD> 1061 | <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> 1062 | </TD> 1063 | <TD> 1064 | <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> 1065 | </TD> 1066 | <TD> 1067 | <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> 1068 | </TD> 1069 | <TD> 1070 | <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> 1071 | </TD> 1072 | <TD> 1073 | <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> 1074 | </TD> 1075 | <TD> 1076 | <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> 1077 | </TD> 1078 | </TR> 1079 | <TR> 1080 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1081 | 3224G<BR> 1082 | 3224J<BR> 1083 | 3224W<BR> 1084 | 3269P<BR> 1085 | 3269W<BR> 1086 | 3269X<BR></FONT> 1087 | </TD> 1088 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1089 | 44G<BR> 1090 | 44J<BR> 1091 | 44W<BR> 1092 | 84P<BR> 1093 | 84W<BR> 1094 | 84X<BR></FONT> 1095 | </TD> 1096 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1097 | -<BR> 1098 | -<BR> 1099 | -<BR> 1100 | ST63Z<BR> 1101 | ST63Y<BR> 1102 | -<BR></FONT> 1103 | </TD> 1104 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1105 | -<BR> 1106 | -<BR> 1107 | -<BR> 1108 | ST5P<BR> 1109 | ST5W<BR> 1110 | ST5X<BR></FONT> 1111 | </TD> 1112 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1113 | -<BR> 1114 | -<BR> 1115 | -<BR> 1116 | -<BR> 1117 | -<BR> 1118 | -<BR></FONT> 1119 | </TD> 1120 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1121 | -<BR> 1122 | -<BR> 1123 | -<BR> 1124 | -<BR> 1125 | -<BR> 1126 | -<BR></FONT> 1127 | </TD> 1128 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1129 | -<BR> 1130 | -<BR> 1131 | -<BR> 1132 | -<BR> 1133 | -<BR> 1134 | -<BR></FONT> 1135 | </TD> 1136 | </TR> 1137 | <TR> 1138 | <TD COLSPAN=7>&nbsp; 1139 | </TD> 1140 | </TR> 1141 | <TR> 1142 | <TD COLSPAN=7> 1143 | <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> 1144 | </TD> 1145 | </TR> 1146 | <TR> 1147 | <TD> 1148 | <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> 1149 | </TD> 1150 | <TD> 1151 | <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> 1152 | </TD> 1153 | <TD> 1154 | <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> 1155 | </TD> 1156 | <TD> 1157 | <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> 1158 | </TD> 1159 | <TD> 1160 | <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> 1161 | </TD> 1162 | <TD> 1163 | <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> 1164 | </TD> 1165 | <TD> 1166 | <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> 1167 | </TD> 1168 | </TR> 1169 | <TR> 1170 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1171 | 3314G<BR> 1172 | 3314J<BR> 1173 | 3364A/B<BR> 1174 | 3364C/D<BR> 1175 | 3364W/X<BR> 1176 | 3313G<BR> 1177 | 3313J<BR></FONT> 1178 | </TD> 1179 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1180 | 23B<BR> 1181 | 23A<BR> 1182 | 21X<BR> 1183 | 21W<BR> 1184 | -<BR> 1185 | 22B<BR> 1186 | 22A<BR></FONT> 1187 | </TD> 1188 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1189 | ST5YL/ST53YL<BR> 1190 | ST5YJ/5T53YJ<BR> 1191 | ST-23A<BR> 1192 | ST-22B<BR> 1193 | ST-22<BR> 1194 | -<BR> 1195 | -<BR></FONT> 1196 | </TD> 1197 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1198 | ST-4B<BR> 1199 | ST-4A<BR> 1200 | -<BR> 1201 | -<BR> 1202 | -<BR> 1203 | ST-3B<BR> 1204 | ST-3A<BR></FONT> 1205 | </TD> 1206 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1207 | -<BR> 1208 | EVM-6YS<BR> 1209 | EVM-1E<BR> 1210 | EVM-1G<BR> 1211 | EVM-1D<BR> 1212 | -<BR> 1213 | -<BR></FONT> 1214 | </TD> 1215 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1216 | G4B<BR> 1217 | G4A<BR> 1218 | TR04-3S1<BR> 1219 | TRG04-2S1<BR> 1220 | -<BR> 1221 | -<BR> 1222 | -<BR></FONT> 1223 | </TD> 1224 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1225 | -<BR> 1226 | -<BR> 1227 | DVR-43A<BR> 1228 | CVR-42C<BR> 1229 | CVR-42A/C<BR> 1230 | -<BR> 1231 | -<BR></FONT> 1232 | </TD> 1233 | </TR> 1234 | </TABLE> 1235 | <P> 1236 | <FONT SIZE=4 FACE=ARIAL><B>ALT =&nbsp;ALTERNATE</B></FONT> 1237 | <P> 1238 | 1239 | &nbsp; 1240 | <P> 1241 | </td> 1242 | </tr> 1243 | </table> 1244 | 1245 | 1246 | <b>CAPACITOR</b><p> 1247 | grid 2.5 mm, outline 2.5 x 5 mm 1248 | 1249 | 1250 | 1251 | 1252 | 1253 | 1254 | 1255 | 1256 | 1257 | 1258 | 1259 | 1260 | 1261 | 1262 | 1263 | 1264 | 1265 | 1266 | >NAME 1267 | >VALUE 1268 | 1269 | 1270 | <b>RESISTOR</b><p> 1271 | type 0207, grid 10 mm 1272 | 1273 | 1274 | 1275 | 1276 | 1277 | 1278 | 1279 | 1280 | 1281 | 1282 | 1283 | 1284 | 1285 | 1286 | 1287 | 1288 | 1289 | 1290 | 1291 | 1292 | >NAME 1293 | >VALUE 1294 | 1295 | 1296 | 1297 | 1298 | 1299 | 1300 | <b>Diodes</b><p> 1301 | Based on the following sources: 1302 | <ul> 1303 | <li>Motorola : www.onsemi.com 1304 | <li>Fairchild : www.fairchildsemi.com 1305 | <li>Philips : www.semiconductors.com 1306 | <li>Vishay : www.vishay.de 1307 | </ul> 1308 | <author>Created by librarian@cadsoft.de</author> 1309 | 1310 | 1311 | <b>DO41</b> 7.6mm x 2mm<p> 1312 | Source: http://www.diodes.com/datasheets/ds23001.pdf 1313 | 1314 | 1315 | 1316 | 1317 | 1318 | 1319 | 1320 | 1321 | 1322 | 1323 | 1324 | 1325 | 1326 | 1327 | 1328 | >NAME 1329 | >VALUE 1330 | 1331 | 1332 | 1333 | 1334 | 1335 | 1336 | 1337 | <b>Power Transistors</b><p> 1338 | <author>Created by librarian@cadsoft.de</author> 1339 | 1340 | 1341 | <b>Molded Package</b><p> 1342 | grid 2.54 mm 1343 | 1344 | 1345 | 1346 | 1347 | 1348 | 1349 | 1350 | 1351 | 1352 | 1353 | 1354 | 1355 | 1356 | 1357 | 1358 | 1359 | 1360 | 1361 | 1362 | 1363 | 1364 | 1365 | >NAME 1366 | >VALUE 1367 | A17,5mm 1368 | 1369 | 1370 | 1371 | 1372 | 1373 | 1374 | 1375 | 1376 | 1377 | 1378 | 1379 | 1380 | 1381 | 1382 | ALPS Switch from Markus Faust &lt;mfaust@htwm.de&gt;<p> 1383 | Source: EC12E.scr from eagle.support.ger on news.cadsoft.de at 08.10.2007 1384 | 1385 | 1386 | ALPS rotary encoder<br> 1387 | EC12E series with push-on switch 1388 | 1389 | 1390 | 1391 | 1392 | 1393 | 1394 | 1395 | 1396 | 1397 | 1398 | 1399 | >NAME 1400 | >VALUE 1401 | 1402 | 1403 | 1404 | 1405 | 1406 | 1407 | 1408 | 1409 | 1410 | 1411 | 1412 | 1413 | 1414 | 1415 | 1416 | 1417 | 1418 | 1419 | 1420 | 1421 | 1422 | 1423 | 1424 | 1425 | 1426 | 1427 | 1428 | 1429 | 1430 | 1431 | 1432 | 1433 | 1434 | 1435 | 1436 | 1437 | 1438 | 1439 | 1440 | 1441 | 1442 | 1443 | 1444 | 1445 | 1446 | 1447 | 1448 | 1449 | 1450 | 1451 | 1452 | RST 1453 | 3v 1454 | 5v 1455 | Gnd 1456 | Vin 1457 | Analog In 1458 | 0 1459 | 1 1460 | 2 1461 | 3 1462 | 4 1463 | 5 1464 | ARef 1465 | gnd 1466 | 13 1467 | 12 1468 | 11 1469 | 10 1470 | 9 1471 | 8 1472 | 7 1473 | 6 1474 | 5 1475 | 4 1476 | 3 1477 | 2 1478 | 1 1479 | 0 1480 | Digital I/O 1481 | Digital I/O 1482 | SCL 1483 | SDA 1484 | IOr 1485 | 1486 | 1487 | 1488 | 1489 | 1490 | 1491 | 1492 | 1493 | 1494 | 1495 | 1496 | 1497 | 1498 | 1499 | 1500 | 1501 | 1502 | 1503 | 1504 | 1505 | 1506 | 1507 | 1508 | 1509 | 1510 | 1511 | 1512 | 1513 | 1514 | 1515 | 1516 | 1517 | 1518 | 1519 | 1520 | 1521 | 1522 | 1523 | 1524 | 1525 | 1526 | 1527 | 1528 | 1529 | 1530 | 1531 | 1532 | 1533 | 1534 | 1535 | 1536 | 1537 | 1538 | 1539 | 1540 | 1541 | 1542 | 1543 | 1544 | 1545 | 1546 | 1547 | 1548 | 1549 | 1550 | 1551 | 1552 | 1553 | 1554 | 1555 | 1556 | 1557 | 1558 | 1559 | 1560 | 1561 | 1562 | 1563 | 1564 | 1565 | 1566 | 1567 | 1568 | 1569 | <h1>Freescale Semiconductor MPX series pressure sensors</h1> 1570 | 1571 | <p>Created by <a href="mailto:bkilian@interia.pl">bkilian@interia.pl</a> (Poland)</p> 1572 | 1573 | 1574 | Pressure Side Ported (AP, GP) Unibody Package 867B-04 1575 | <br>Horizontal Mount 1576 | 1577 | 1578 | 1579 | 1580 | 1581 | 1582 | 1583 | 1584 | 1585 | 1586 | 1587 | 1588 | 1589 | 1590 | 1591 | 1592 | 1593 | 1594 | 1595 | 1596 | 1597 | 1598 | 1599 | 1600 | 1601 | 1602 | 1603 | 1604 | 1605 | 1606 | 1607 | 1608 | 1609 | 1610 | 1611 | 1612 | 1613 | 1614 | 1615 | 1616 | 1617 | 1618 | 1619 | 1620 | 1621 | 1622 | 1623 | 1624 | 1625 | 1626 | 1627 | 1628 | 1629 | 1630 | 1631 | 1632 | 1633 | 1634 | 1635 | 1636 | 1637 | 1638 | 1639 | 1640 | 1641 | >NAME 1642 | >VALUE 1643 | 1644 | 1645 | 1646 | 1647 | 1648 | 1649 | 1650 | 1651 | 1652 | 1653 | 1654 | 1655 | 1656 | 1657 | 1658 | <b>EAGLE Design Rules</b> 1659 | <p> 1660 | Die Standard-Design-Rules sind so gewählt, dass sie für 1661 | die meisten Anwendungen passen. Sollte ihre Platine 1662 | besondere Anforderungen haben, treffen Sie die erforderlichen 1663 | Einstellungen hier und speichern die Design Rules unter 1664 | einem neuen Namen ab. 1665 | <b>EAGLE Design Rules</b> 1666 | <p> 1667 | The default Design Rules have been set to cover 1668 | a wide range of applications. Your particular design 1669 | may have different requirements, so please make the 1670 | necessary adjustments and save your customized 1671 | design rules under a new name. 1672 | 1673 | 1674 | 1675 | 1676 | 1677 | 1678 | 1679 | 1680 | 1681 | 1682 | 1683 | 1684 | 1685 | 1686 | 1687 | 1688 | 1689 | 1690 | 1691 | 1692 | 1693 | 1694 | 1695 | 1696 | 1697 | 1698 | 1699 | 1700 | 1701 | 1702 | 1703 | 1704 | 1705 | 1706 | 1707 | 1708 | 1709 | 1710 | 1711 | 1712 | 1713 | 1714 | 1715 | 1716 | 1717 | 1718 | 1719 | 1720 | 1721 | 1722 | 1723 | 1724 | 1725 | 1726 | 1727 | 1728 | 1729 | 1730 | 1731 | 1732 | 1733 | 1734 | 1735 | 1736 | 1737 | 1738 | 1739 | 1740 | 1741 | 1742 | 1743 | 1744 | 1745 | 1746 | 1747 | 1748 | 1749 | 1750 | 1751 | 1752 | 1753 | 1754 | 1755 | 1756 | 1757 | 1758 | 1759 | 1760 | 1761 | 1762 | 1763 | 1764 | 1765 | 1766 | 1767 | 1768 | 1769 | 1770 | 1771 | 1772 | 1773 | 1774 | 1775 | 1776 | 1777 | 1778 | 1779 | 1780 | 1781 | 1782 | 1783 | 1784 | 1785 | 1786 | 1787 | 1788 | 1789 | 1790 | 1791 | 1792 | 1793 | 1794 | 1795 | 1796 | 1797 | 1798 | 1799 | 1800 | 1801 | 1802 | 1803 | 1804 | 1805 | 1806 | 1807 | 1808 | 1809 | 1810 | 1811 | 1812 | 1813 | 1814 | 1815 | 1816 | 1817 | 1818 | 1819 | 1820 | 1821 | 1822 | 1823 | 1824 | 1825 | 1826 | 1827 | 1828 | 1829 | 1830 | 1831 | 1832 | 1833 | 1834 | 1835 | 1836 | 1837 | 1838 | 1839 | 1840 | 1841 | 1842 | 1843 | 1844 | 1845 | 1846 | 1847 | 1848 | 1849 | 1850 | 1851 | 1852 | 1853 | 1854 | 1855 | 1856 | 1857 | 1858 | 1859 | 1860 | 1861 | 1862 | 1863 | 1864 | 1865 | 1866 | 1867 | 1868 | 1869 | 1870 | 1871 | 1872 | 1873 | 1874 | 1875 | 1876 | 1877 | 1878 | 1879 | 1880 | 1881 | 1882 | 1883 | 1884 | 1885 | 1886 | 1887 | 1888 | 1889 | 1890 | 1891 | 1892 | 1893 | 1894 | 1895 | 1896 | 1897 | 1898 | 1899 | 1900 | 1901 | 1902 | 1903 | 1904 | 1905 | 1906 | 1907 | 1908 | 1909 | 1910 | 1911 | 1912 | 1913 | 1914 | 1915 | 1916 | 1917 | 1918 | 1919 | 1920 | 1921 | 1922 | 1923 | 1924 | 1925 | 1926 | 1927 | 1928 | 1929 | 1930 | 1931 | 1932 | 1933 | 1934 | 1935 | 1936 | 1937 | 1938 | 1939 | 1940 | 1941 | 1942 | 1943 | 1944 | 1945 | 1946 | 1947 | 1948 | 1949 | 1950 | 1951 | 1952 | 1953 | 1954 | 1955 | 1956 | 1957 | 1958 | 1959 | 1960 | 1961 | 1962 | 1963 | 1964 | 1965 | 1966 | 1967 | 1968 | 1969 | 1970 | 1971 | 1972 | 1973 | 1974 | 1975 | 1976 | 1977 | 1978 | 1979 | 1980 | 1981 | 1982 | 1983 | 1984 | 1985 | 1986 | 1987 | 1988 | 1989 | 1990 | 1991 | 1992 | 1993 | 1994 | 1995 | 1996 | 1997 | 1998 | 1999 | 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 | 2027 | 2028 | 2029 | 2030 | 2031 | 2032 | 2033 | 2034 | 2035 | 2036 | 2037 | 2038 | 2039 | 2040 | 2041 | 2042 | 2043 | 2044 | 2045 | 2046 | Since Version 6.2.2 text objects can contain more than one line, 2047 | which will not be processed correctly with this version. 2048 | 2049 | 2050 | 2051 | -------------------------------------------------------------------------------- /pcb/schematic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/night-howler/protogasm/c72ab1a48b5132878632f50aef034491cd599e1a/pcb/schematic.png -------------------------------------------------------------------------------- /user_guide/Nogasm User Guide.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/night-howler/protogasm/c72ab1a48b5132878632f50aef034491cd599e1a/user_guide/Nogasm User Guide.pdf -------------------------------------------------------------------------------- /vibrator/DIY brass eccentric mass.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/night-howler/protogasm/c72ab1a48b5132878632f50aef034491cd599e1a/vibrator/DIY brass eccentric mass.pdf -------------------------------------------------------------------------------- /vibrator/README.md: -------------------------------------------------------------------------------- 1 | The "handle.STL" and "head.STL" are the main parts of the vibrator, ready for 2 | 3D printing. 3 | 4 | The vibrator is made from a Mabuchi RS-555PH motor, with an eccentric mass 5 | pressed onto the shaft. These can be purchased pre-assembled, or built from the 6 | motor and some .88" to 1" diameter cylindrical brass stock. 7 | 8 | The vibrator case is compatible with attachments designed for the Hitachi Magic 9 | Wand. The motor is press-fit or glued into the two halves of the case. 10 | 11 | * Print the parts. 12 | * Install an eccentric weight on the motor's shaft. 13 | * Solder or crimp wires to the motor. 14 | * Pull wires through the small hole in the side of the housing. 15 | * Press firmly to assemble. 16 | -------------------------------------------------------------------------------- /vibrator/finishing jig.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/night-howler/protogasm/c72ab1a48b5132878632f50aef034491cd599e1a/vibrator/finishing jig.STL -------------------------------------------------------------------------------- /vibrator/handle.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/night-howler/protogasm/c72ab1a48b5132878632f50aef034491cd599e1a/vibrator/handle.STL -------------------------------------------------------------------------------- /vibrator/head.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/night-howler/protogasm/c72ab1a48b5132878632f50aef034491cd599e1a/vibrator/head.STL -------------------------------------------------------------------------------- /vibrator/vibrator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/night-howler/protogasm/c72ab1a48b5132878632f50aef034491cd599e1a/vibrator/vibrator.png --------------------------------------------------------------------------------