Moving dildo with motor driven skeleton

skeleton-without-hull-servo-bi1So far we have used vibration motors for our sex toys. Vibration motors are cheap, powerful, easy to control and robust actuators. That’s why they are part of most sex toys. But what about moving or touching  objects. Obviously we need some mechanics, maybe joints and gears? Or is there a simple option? A skeleton?

I realized the idea for using some type of skeleton for moving a dildo when I saw the video of a naked Pleo – one of the best artificial life forms ever.

skeleton-hull-servo-body-interaction-board

On www.thingiverse.com you will find more inspiration for using a skeleton to move something. The design is very simple.

The skeleton is composed of a number of vortexes. The holes are for connecting all vortexes and a servo with a nylon wire or similar.

backbone_skeleton_24

In addition we need a handle where the vortexes are fastened to. There is also space for a servo. Then use a nylon wire to connect the vortexes with the servo. You can drive the servo with a Arduino development board or you use the body interaction development board as described here.

servo_handle_b

The servo should turn only 15-30 degree or so. If you use the body interaction development board please copy the following code and upload the code to the board.

#include <TinyServo.h>

// servo control with the body interaction development board using the TinyServo library
// -- adaption of the demo script by
// tylernt@gmail.com's ATTiny Hardware Timer Assisted Servo Library v1.0 20-Nov-13
// http://forum.arduino.cc/index.php?action=dlattach;topic=198337.0;attach=71790

const byte SERVOS = 1; // number of servos is 1
const byte servoPin[SERVOS] = { 7 }; // servo is connected to PA1 which is pin 7
#define SERVO 0 // our servo is given the name "SERVO"

void setup() {
 setupServos();
}

void loop() {
 moveServo(SERVO, 0); // move servo to 0°
 delay(1000);
 moveServo(SERVO, 30); // move servo to 30°
 delay(2000);
}

In addition we need a wrapping for the skeleton. This can be made using these two forms (download STL files).

nonmech

Use flexible silicone and poor it in the form. The thickness of the wrapping is a bit too large – it rather hinders the skeleton in its movements. But it works!

sceleton-hull

Now we can put everything together.

 

Download on Thingiverse: http://www.thingiverse.com/thing:1736282

 

Tinker with Tinkercad!
Form: https://tinkercad.com/things/e8yscABu9Al
Skeleton: https://tinkercad.com/things/dfbMQsE4Mtl
Servo handle: https://tinkercad.com/things/5EHHrqM5sqC

YouTube: https://youtu.be/F1b8bGbuSHw

Exploring the internet of (sex) things 1

The internet of things – or short IOT – is getting popular. IOT is a network of physical things like vehicles, buildings, but also everyday objects like lamps, refrigerators. IOT allows objects to be sensed and controlled remotely across the Internet. As a result the physical world will be integrated into the internet and computer systems.

Popular examples are home axiomatization or collection of environmental data.  Even sex toy industry use the internet to connect sex toy users which are far away of each other (like the OhMiBod blueMotion). The vision of remote sex driven by technology is also known as Teledildonics. Unfortunately I didn’t pay much attention to this movement which goes back to 1975. body interaction focused more on wireless connected sex toys for users having sex together and want to integrate his and her’s sex toy. You will find a lot of information at Kyle Machulis site Metafetish. Also have a look at the annual conference Arse Elektronika which focus on the intersection of technology and sex.

In this blog I have already shown how to connect the body interaction development board to the internet. Now I will present some first steps into IOT. I will use the NodeMCU development board which is based on the popular ESP8266 System on a chip. The ESP is a wi-fi enabled microcontroller where you can connect sensors and actuators. It can connect to your wi-fi access point and home and it can be an access point itself and host eg. an internet server.

In my explorations I will try to find out if a IOT sex toy is useful for DIY sex toy community.

In this blog post we will use the ESP8266 as a wi-fi server. The server will connect to your wi-fi access point at home.

Building a bread board prototype

nodemcu prototype breadboard

Material needed

  • bread board, wires
  • Node MCU or similar
  • small vibration motor (or LED), eg the Lilipad vibration motor
  • optional: accelerometer  MPU9265
  • optional: another LED and a resistor

WIre MPU9265

mpu-92-65Connect

  • SCL (on MPU9265) and D1 (on NodeMCU),
  • SDA and D2,
  • VCC and 3V3
  • GND and GND

 

Wire vibration motor

Connect

  • D7 (node MCU) with vibration motor (+) and
  • GND (NodeMCU) and (-)

Wire LED

Connect:

  • D3 (NodeMCU) and LED (long end)
  • LED (short end) and resistor
  • resistor and GND (NodeMCU)

Using the Arduino IDE

NodeMCU and all other ESP8266 boards are not supported by Arduino. But you can use the Arduino board manager to add other development boards. This short Tutorial explains the necessary steps: http://www.instructables.com/id/Quick-Start-to-Nodemcu-ESP8266-on-Arduino-IDE/

Connect the NodeMCU to your access point (WLAN router)

Upload script to NodeMCU

Copy the code to Arduino IDE.

Within the sketch you have to change the constants SSID and password. Use the same SSID as you would do to connect your smart phone or computer to the internet.

Select your NodeMCU and the port. Connect your computer and the NodeMCU with USB wire. Upload the script to NodeMCU

#include <ESP8266WiFi.h>
#include <Wire.h>
 
#define MPU9250_ADDRESS 0x68
#define MAG_ADDRESS 0x0C
 
#define GYRO_FULL_SCALE_250_DPS 0x00 
#define GYRO_FULL_SCALE_500_DPS 0x08
#define GYRO_FULL_SCALE_1000_DPS 0x10
#define GYRO_FULL_SCALE_2000_DPS 0x18
 
#define ACC_FULL_SCALE_2_G 0x00 
#define ACC_FULL_SCALE_4_G 0x08
#define ACC_FULL_SCALE_8_G 0x10
#define ACC_FULL_SCALE_16_G 0x18
 
const char* ssid = "????"; // Enter the name of your Access point
const char* password = "????"; //Enter the password SSID 
int ledPin = 0; // NodeMCU pad D3 = GPI0 
int motorPin= 13; // NodeMCU pad D7 = GPIO 13
double sinusValue=0;

// define constants for four different vibration modes
const int off_mode=0;
const int max_mode =1;
const int sinus_mode =2;
const int motion_mode =3;

int motor_mode =off_mode;

WiFiServer server(80);

 // This function read Nbytes bytes from I2C device at address Address. 
// Put read bytes starting at register Register in the Data array. 
void I2Cread(uint8_t Address, uint8_t Register, uint8_t Nbytes, uint8_t* Data)
{
 // Set register address
 Wire.beginTransmission(Address);
 Wire.write(Register);
 Wire.endTransmission();
 
 // Read Nbytes
 Wire.requestFrom(Address, Nbytes); 
 uint8_t index=0;
 while (Wire.available())
 Data[index++]=Wire.read();
}

// Write a byte (Data) in device (Address) at register (Register)
void I2CwriteByte(uint8_t Address, uint8_t Register, uint8_t Data)
{
 // Set register address
 Wire.beginTransmission(Address);
 Wire.write(Register);
 Wire.write(Data);
 Wire.endTransmission();
}

void setup() {

 Wire.begin();
 // NodeMCU D1 = GPIO5 connected to MCU9265 SCL 
 // NodeMCU D2 = GPIO4 connected to MCU9265 SDA
 Wire.pins(5,4); 
 Serial.begin(115200);
 
 // Configure gyroscope range
 I2CwriteByte(MPU9250_ADDRESS,27,GYRO_FULL_SCALE_2000_DPS);
 // Configure accelerometers range
 I2CwriteByte(MPU9250_ADDRESS,28,ACC_FULL_SCALE_16_G);
 // Set by pass mode for the magnetometers
 I2CwriteByte(MPU9250_ADDRESS,0x37,0x02);
 
 // Request first magnetometer single measurement
 I2CwriteByte(MAG_ADDRESS,0x0A,0x01);
 
 Serial.begin(115200);
 delay(10);
 
 pinMode(ledPin, OUTPUT);
 digitalWrite(ledPin, LOW);
 
 pinMode(motorPin, OUTPUT);
 analogWrite(motorPin, 0);
 
 // Connect to WiFi network
 Serial.println();
 Serial.println();
 Serial.print("Connecting to ");
 Serial.println(ssid);
 
 WiFi.begin(ssid, password);
 
 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 }
 Serial.println("");
 Serial.println("WiFi connected");
 
 // Start the server
 server.begin();
 Serial.println("Server started");
 
 // Print the IP address
 Serial.print("Use this URL to connect: ");
 Serial.print("http://");
 Serial.print(WiFi.localIP());
 Serial.println("/");
 
}

int16_t ax,ay,az,ax1,ay1,az1,gx,gy,gz,gx1,gy1,gz1; 
int valueMotor; //vibrator motor speed 0-1023

void loop() {
 
 // Read accelerometer and gyroscope
 uint8_t Buf[14];
 I2Cread(MPU9250_ADDRESS,0x3B,14,Buf);
 
 // Create 16 bits values from 8 bits data
 
 // Accelerometer
 ax=-(Buf[0]<<8 | Buf[1]);
 ay=-(Buf[2]<<8 | Buf[3]);
 az=Buf[4]<<8 | Buf[5];
 
 // Gyroscope
 gx=-(Buf[8]<<8 | Buf[9]);
 gy=-(Buf[10]<<8 | Buf[11]);
 gz=Buf[12]<<8 | Buf[13];

 // when in "motion_mode" the vibration motor is controlled by motion
 if (motor_mode==motion_mode) {
 int v = 0;
 v=sqrt(pow(ax-ax1,2)+pow(ay-ay1,2)+pow(az-az1,2)); //calculate motion vector
 // adjust vibration motor speed
 // if motion vector > 5000 raise speed by 25
 // otherwise lover speed by 10
 // adjust these constants to your needs
 if (v > 5000) {valueMotor=valueMotor+25;} else {valueMotor=valueMotor-10;}
 if (valueMotor<500) {valueMotor=500;} //values must be above 500 otherwise the motor is off
 if (valueMotor>1023) {valueMotor=1023;} // values higher than 1023 are not supported
 analogWrite(motorPin, valueMotor); // set motor speed
 
 Serial.print("v: ");
 Serial.print(v);
 Serial.print(", valueMotor: ");
 Serial.println(valueMotor);
 delay(200);

 // save values
 ax1=ax;
 ay1=ay;
 az1=az;
 gx1=gx;
 gy1=gy;
 gz1=gz;
 }

 // change vibration motor speed according to a sinus curve
 if (motor_mode==sinus_mode) {
 sinusValue=sinusValue+.01;
 delay(20);
 int sin_tmp = ((sin(sinusValue)+1)*.5*(1023-500))+500;
 Serial.println(sin_tmp);
 analogWrite(motorPin, sin_tmp);
 valueMotor=sin_tmp;
 }
 
 // Check if a client has connected
 WiFiClient client = server.available();
 if (!client) {
 return;
 }
 
 // Wait until the client sends some data
 Serial.println("new client");
 while(!client.available()){
 delay(1);
 }
 
 // Read the first line of the request
 String request = client.readStringUntil('\r');
 Serial.println(request);
 client.flush();
 
 // Match the request
 
 int valueLED = LOW;
 if (request.indexOf("/LED=ON") != -1) {
 digitalWrite(ledPin, HIGH);
 valueLED = HIGH;
 }
 if (request.indexOf("/LED=OFF") != -1) {
 digitalWrite(ledPin, LOW);
 valueLED = LOW;
 }

 if (request.indexOf("/MOTOR=MAX") != -1) {
 analogWrite(motorPin, 1023);
 valueMotor = 1023;
 motor_mode=max_mode;
 }
 if (request.indexOf("/MOTOR=OFF") != -1) {
 analogWrite(motorPin, 0);
 valueMotor = 0;
 motor_mode=off_mode;
 }

 if (request.indexOf("/MOTOR=SINUS") != -1) {
 motor_mode=sinus_mode;
 }

 if (request.indexOf("/MOTOR=MOTION") != -1) {
 motor_mode=motion_mode;
 valueMotor=600;
 }
 
 // Return the response
 client.println("HTTP/1.1 200 OK");
 client.println("Content-Type: text/html");
 client.println(""); // do not forget this one
 client.println("<!DOCTYPE HTML>");
 client.println("<html>");
 
 client.print("Led pin is now: ");
 
 if(valueLED == HIGH) {
 client.print("On");
 } else {
 client.print("Off");
 }
 
 client.print("<br>Motor pin is now: ");
 client.print(valueMotor);

 client.println("<br><br>");
 client.println("<a href=\"/LED=ON\"\"><button>Turn On </button></a>");
 client.println("<a href=\"/LED=OFF\"\"><button>Turn Off </button></a><br><br>"); 
 client.println("<a href=\"/MOTOR=MAX\"\"><button>Motor Max </button></a>");
 client.println("<a href=\"/MOTOR=OFF\"\"><button>Motor Off </button></a>"); 
 client.println("<a href=\"/MOTOR=SINUS\"\"><button>Motor sinus curve </button></a>");
 client.println("<a href=\"/MOTOR=MOTION\"\"><button>Motor motion controlled </button></a><br>"); 
 client.println("</html>");
 
 delay(1);
 Serial.println("Client disonnected");
 Serial.println("");
 
}

Controlling the vibrator prototype

After uploading the script above, open the serial monitor. After some time the NodeMCU will report “wifi connected”.

IOT wifi connectdNow start a browser. Use the URL which the NodeMCU reported eg. http://192.168.1.12/

 

If your smart phone is connected to the same Access point as your computer is, you can use your smart phone to control the prototype, too.

 

You can turn the LED on or off by pressing the “Turn On” and “Turn Off” buttons.

For controlling the motor you have 4 options

  • motor on
  • motor off
  • sinus curve (the motor will speed up and slow down according to a sinus curve)
  • motion controlled (more motion -> motor speeds up)

Summary

To build a vibrator prototype based on the ESP8266 MCU is very easy. You can use your Arduino IDE to upload scripts to the prototype. Then you can control the vibration motor through a browser. If you don’t want to use these external control options the vibrator prototype can be controlled by motion similar to the body interaction vibrator development board.

In this blog post series we will  explore other interesting features of the ESP8266:

  • the ESP8266 as an access point (no need for private or public access points)
  • over the air (OTA) uploading of sketches  (wireless – no USB connector needed)
  • MQTT protocol & server
  • Node-RED (visual IOT programming)
  • review of development boards for building IOT vibrators

WeVibe sends usage pattern over the internet

On the Def Con 24 two hackers that the WeVibe4 plus send a lot of usage data to the company. This is reported by EAN online. According to EAN online the following data are recorded and maybe stored in a database: how often you play with the vibe what setting you use how long you play for the temperature of the…

“An exploration of the sex toy DIY movement” – interview with EAN Online Erotic Industry

EAN_LogoRandolph Heil from EAN online interviewed Jacob from bodyinteraction.com. In the interview the DIX sex toy movements – its motivation and aims are discussed.  3d printing – and its future – as a method for making your own personal sex toy is described. Jacob gave some details about his story. The interview mention the Arduino software and hardware as a platform for sex tech products. Finally the future of (open source) sex toys is discussed. Read the interview here.

Sex toy patents arrived in the EU

Recently the EAN magazine interviewed Frank Ferrari from we-vibe. The US company was granted the patent EP1824440. They applied in 2005. It took so long “at least in part to the filing of several third-party observations”. The patent is for a couple vibrator with a specific form. A couple vibrator is defined as a sex toy which permits sexual intercourse while inserted into the vagina.

Is this a patent which will destroy open-source sex toys in generel as it happened to Comingle? I don’t think so. You can still make a vibrator and sell it as long as it doesn’t have the form and functionality.

But: If you are interested in building couple vibrators (like we-vibe define them) then you have a problem. I don’t think the patent forbids every sex toy which can be inserted into the vagina while having sexual intercourse  (sorry, but what is new about this??).

But if you design a similar form, equip it with vibrators then you definitely should consult your patent lawyer before selling it.

What is the unique about the form? Is it an innovation by we-vibe? Or is it rather a negative copy of a part of what we call genital area?

Or it is like giving a patent for T-shirts? A negative copy of the human upper body…

we-vibe-claim-1-700x350

Maybe this is not a good example to blame patents. Maybe the EU patent agency has done a good job to grant a rather specific than general patent. Maybe we-vibe had enormous R&D efforts. Or they need enourmous effort to bring it into the market. And then a company makes  a copy and sells it for the half of the price? Ok, then the we-vibe patent is ok.

My opinion:  Patents are not good for innovation. They prevent innovations to become reality. They hinder competition. They support rich companies with large law departments. They promote lawyers and the economy of patents.

New small fusion vibrator

fusion-small-side-viewThis is a small version of the fusion vibrator. The small fusion form for molding can be made with 3d printers with smaller volume. In addition the inlay for the body interaction development board is reduced in size, but there is still enough place for board and battery. Only about 120ml silicone are needed. The form was constructed in Tinkercad.

Modify the form in Tinkercad: all forms, inlay only, form only

Download the STL files for printing: round_something_06_final_inlay_improved. There are some artifacts but printing is fine on the daVinci 1.0.

Download and discuss in Thingiverse: http://www.thingiverse.com/thing:1589075

round_something_06_final

Please follow the instruction from the large fusion vibrator. When you poor the silicone into the form it is very important to keep the USB connector free from silicone. Even very small amounts can cause the USB connector to break apart from the board.  When the USB connector is broken then you cannot recharge the vibrator. Also be always very cautious when you plug-in or plug-out the USB connector.

Finally you can remove the overhanging parts from the inlay.

fusion-small-top-view

 

New vibrator design “fusion”

 

fusion-quer-look-throughbodyinteraction designed a lot of vibrating toys, some are usable as massage devices, some are explicit sex toys (vibrator ring, balls), some are experimental (collar). Everyone is motion controlled. If you have more than one they will influence each other remotely, eg. a vibrator and a vibrator ring.

unboxing-3

But a device like a classic big vibrator is still missing. So we designed the “fusion” which is approx 19cm long and up to 4+cm in diameter. It is called fusion as the case is made of silicone and 3d printed material (ABS).

fusion-quer-2

We have put the body interaction vibrator development board, motor and battery in a silicone form. There is an on/off switch – so when you travel the vibrator doesn’t wake up when it is moved. And you can charge the battery with a USB micro connector. There is a spacious inlay for the electronics, so it will be easy to get it done.

Pros:

  • easy to charge the battery via USB
  • on/off switch
  • hard handle
  • flexible upper part
  • large (if you like this)
  • ISP interface (“hacker port”) accessible

Cons:

  • only the silicone part of the form can be put under water for cleaning

What do you need?

  • 200 ml silicone with high shore A rate, eg. shore A 45 from silikonfabrik.de
  • optional: special colour for silicone molding
  • 3d print of the molding form, inlay and closure
  • tinker wire
  • body interaction vibrator development board with LiPo and motor (or similar Arduino boards)
  • bin for preparing the silicone, something to stir the silicone

How much is it?

  • Board, battery, motor: 30$ (buy at Tindie)
  • Silicone: 10$
  • 3d Prints: less than 5$

Step by step instructions

Step 1: Print out the inlay, the form and the enclosure

round_something_05_final

Download as zip-file: Fusion

Download at Thingiverse: http://www.thingiverse.com/thing:1505539

Step 2: Prepare the inlay: Insert the body interaction board and the LiPo battery

The body interaction vibrator development board is inserted into the provided rails. It it doesn’t fit in use a file to remove printing artefacts. Use some glue to fix the board. Then insert the battery and fix it.

Important: The Micro USB connector must be above the upper part of the inlay.

inlay with description

Step 3: fix the wires of the vibration motor

The vibration motor will hang down from the inlay as the inlay will be put in the form upside down. You can influence the position of the motor by shortening the wire or fixing the wire to e.g. to the battery. In this case the wire of the motor was threaded between battery and board. Therefore the  motor will be in the middle of the vibrator.

inlay-inner-partfusion-looking-through-2in the center there is the overmolded vibration motor

Step 5: Prepare the form

Use some tinker wire to “press” both parts of the form tight together.molding-form-emptyUse some wax to fix little holes in the form where the printer failed. (These are the white spots)

drying-form-with-wax

Step 6: Insert inlay into the form

There must be some space between inlay and form for the silicone.

Remark: The two wedge like forms at both sides of the inlay help to hold the inlay. The wedge can be removed after molding.inlay-in-molding-form

Step 7: Cast the silicone

Prepare the silicone as the producer recommends. It takes some time to pour the large amount of silicone into the narrow form. The silicone we use must be used within 10 minutes. So start at once after preparing the silicone.

Important: The USB micro connector, the switch and the ISP connector shouldn’t be dashed with silicone. If this happens remove the silicone. Maybe some silicone will remain behind. This can be removed later when the silicone is solid.molded

The battery is covered with silicone, the USB connecor and switch are not.drying-seen-from-top

Step 8: Remove the form

Remove the tinker wire. Remove overhanging part of the silicone. Carefully tear both parts of the form away. You can use a knife, but be careful not to “hurt” the vibrator. Remove overhanging silicone at the vibrator. Also remove the two wedge like forms at both sides of the inlay.

unboxing-fusionfusion looking through complete

Step 9: Install the closure

Now you can put the closure on the inlay. Fix the closure with glue. (Be careful! The USB connector is not very strong.) closed-inlayround_something_055_final_cap_onlyfusion-closure

Tinker, share and download from Tinkercad:

form and inlay: https://tinkercad.com/things/b8nQxRn4XWl

closure: https://tinkercad.com/things/dhgtgeaYG0B

Download as zip-file: Fusion

Download at Thingiverse:

http://www.thingiverse.com/thing:1505539

 

%d bloggers like this: