Sunday, November 22, 2015

NeoMickey: Mickey/Minnie Mouse ears using Adafruit's Neopixels by the Brain

This article will show you how to make my NeoMickey ears.  I made a set of ears for both my girlfriend and I to use at Disneyland.  The ears were a huge success and a lot of people wanted to know where to get them.  So this is my best attempt to answer that question.

If anyone makes these and takes them to Disneyland, I would love to see a picture of them in use.  Please post a comment or you can post to my G+ page. 

The cost breakdown is included below.  The ears should run off of 3 Duracell AAA batteries for approximately 3 hours.   Rechargeable batteries have far less life, so test them before you invest in batteries.  There are other battery options for more experienced arduino makers.

I would like to add an IR receiver to this project to integrate the colors into the Glow with the Show hats sold at Disneyland.  If anyone has made significant progress with the IR coding for arduino compatible boards, please leave a comment or contact me on google+.

This article was mistakenly deleted so I am re-writing the entire thing and thus pieces may be incomplete.  Leave a comment if something is not clear and I will update asap.

This guide assumes you already know how to upload a sketch to an arduino compatible board.  If you don't you will need to learn that first.  Also, uploading to a Trinket Pro board requires you to press the reset button just before uploading.  The Flora boards don't needs this as they work just like Arduino Uno boards.

The twinkle code I used for the inner neopixel strips was written by Balázs Suhajda found on Github



Obligatory Disclaimer:
While I shouldn't have to say this anyway....I am not responsible for anything you do.  I don't care if you burn your house down or worse.  This information is for educational purposes only and you are responsible for your own actions.
Physical Warning:
This task does involve some soldering.  If you have no desire to do that, then you can find someone that knows how to solder or just go do a different project.  You can always locate your nearest Hackerspace and there should be plenty of people there that can assist.
Copyright Warning:
This project is my intellectual property that I am giving to the open-source community for non-profit use only.  

Cost estimate:
This project is not exactly cheap.  The average mickey themed illuminated head piece sold at Disneyland costs at least $20 and costs $3-5 to mass produce.   This project is not designed for mass production and thus it's going to be more expensive.  Plus this project is intended to be heavy on the bling compared to most Disney junk.  So in general, this project is going to cost some cake.  Here is a basic breakdown of costs for this project.  See the end of this tutorial for potential cost saving alternatives ideas. 

So the cheapy, not-so-great version of this project is at least $61(after shipping) while the good version is $100 (after shipping).   It may not be cheap, but if you wanna turn some heads at Disneyland/Disney World, they are very much worth the effort and money.  

List of required/optional materials:
  • One 3v microcontroller board. For this tutorial I mainly refer to the Adafruit Flora but a Trinket Pro board will also work.  A Trinket Pro board is technically the best shape to fit on the alice band, but more difficult to use for inexperienced soldering.  You cannot use the smaller Trinket boards as there is not enough memory/flash.  Do NOT use 5v boards.  (see notes below)
  • Two sets of embroidery rings, 4-inch size, one set per ear (I recommend the wood versions, the plastic versions are harder to work with)
  • Silicone or super glue, clear in color
  • Wire strippers
  • Gorilla glue
  • Hot glue & hot glue gun (technically optional)
  • 2 meters of Adafruit Neopixels (60 pixels/meter)
  • Mini push button (optional)
  • One AAA battery pack
  • Exacto knife (or razor blade)
  • Minnie Mouse bow (only needed for the Minnie version.  either buy one or make one)
  • Flat packing material (for diffusion)
  • Bubble wrap material (or a clear plastic bag, the produce bags at grocery stores works great)
  • low voltage wire (cat5 cable works great, but always use threaded core, not solid core)
  • Alice Band
  • Binder clips
  • White and black zip ties, smallest size
  • Solder and soldering iron
  • Heat shrink and heat gun

First grab the embroidery rings and take them apart. You will be using the inner rings for the main project, and the outer rings will be used later for stencilling.  The inner rings will be referred to as "the rings" from this point.

Now take the neopixels and wrap them around the rings to measure the length of neopixels required for this project.   You need to cut two strips for each ring, one for the outside of the ring and one for the inside of the ring.  You should be able to get at least 18 pixels on the inner ring, and 20 pixels on the outer ring.

Cut the strips to their measured length.  The inner strip (the shorter one) should be unsheathed, so remove it from the plastic sheathing.  It's easier to just cut off the plastic cover but dont cut the strip.  The outer strip, however, needs that plastic sheathing so don't remove it unless you know what you are doing.


The neopixel strips have tiny arrows that point the direction of travel for the data signal.  So the first pixel points to the next.  Before the first pixel is the copper contact point to where the wires must be soldered.  See the image below as the strips are cut in the middle of the contact points.  This is where you must cut the strip.  The strips always come with a set of thick wires to connect to other devices.  These wires are too thick to work with here, and the sheathing is too thick at the very start.  So follow the example above and cut the strip starting after the first pixel or two. 

(image from Adafruit's site)

Take the strips and solder a low voltage wire to each contact point.  I advise you make the lengths of each wire at least 2 feet to start with.  This will give you lots of wiggle room later on.   You may need to cut away some of the plastic sheathing for the outer strip in order to attach the wires.

I recommend you use the same color wires for all the 5v (positive) contact points and another color for all the ground (negative) contact points on all four neopixel strips.   The data cables, however, should be all different colors as the program calls for 3 different software strips.   So two of the data cables will join together as one, and the other two cables are independent.  the coordinated use of cable colors will greatly help you later on.  

Once the wires are attached, first test them on your arduino if possible.  If you don't deal with neopixels a lot, then you will want to test them before you start gluing things.   

Test code: (adjust the pin assignments as needed.  refer to the NeoPixel uber guide for basic testing instructions.  you can use their test code or the code included below)
#include <Adafruit_NeoPixel.h>  // load the needed library
#define INPINLEFT 9    // pin for inner right ring 
#define INPINRIGHT 11  // pin for inner left ring 
#define OUTPIN 13      // pin for outer ring 
// 
#define Pixels 10      // # of pixels on inner ring 
#define OUTPixels 10   // # of pixels on outer ring 
Adafruit_NeoPixel stripL = Adafruit_NeoPixel(Pixels, INPINLEFT, NEO_GRB + NEO_KHZ800); 
Adafruit_NeoPixel stripR = Adafruit_NeoPixel(Pixels, INPINRIGHT, NEO_GRB + NEO_KHZ800); 
Adafruit_NeoPixel stripOUT = Adafruit_NeoPixel(OUTPixels, OUTPIN, NEO_GRB + NEO_KHZ800)
float redStatesL[Pixels]; float blueStatesL[Pixels]; float greenStatesL[Pixels]; float redStatesR[Pixels]; 
float blueStatesR[Pixels]; float greenStatesR[Pixels]; float fadeRate = 0.96; 
float a = 0; int f = 0; int state = 1; int count = 0; int loopcount = 0; int masterloop = 0; 
float b = 0; int g= 0; int h= 0; int i = 0; int x = 0; int y = 0; int z = 0; int wait = 5; 
int pause = 5; int count3 = 0; 

void setup() { 
  stripL.begin();  stripL.show(); // Initialize all pixels to 'off' 
  stripR.begin();  stripR.show(); // Initialize all pixels to 'off' 
  stripOUT.begin();  stripOUT.setBrightness(50); 
  stripOUT.show(); // Initialize all pixels to 'off' 
}  
void loop () 
{ stripL.setBrightness(255); 
stripR.setBrightness(255); 
      loopcount++; 
 if(loopcount == 4){ 
    b+=.5;   
    for(float f=0; f<OUTPixels; f++){ 
      stripOUT.setPixelColor(f, stripOUT.Color(170,0,170));   } 
      
      if(b==0){stripOUT.setPixelColor(b, stripOUT.Color(0,0,0));  
    stripOUT.setPixelColor(OUTPixels, stripOUT.Color(5,0,5));  
    stripOUT.setPixelColor(OUTPixels-1, stripOUT.Color(10,0,10));  
    stripOUT.setPixelColor(OUTPixels-2, stripOUT.Color(20,0,20));  
    stripOUT.setPixelColor(OUTPixels-3, stripOUT.Color(170,0,170));  // 
    }else if(b==1){stripOUT.setPixelColor(b, stripOUT.Color(0,0,0));  
    stripOUT.setPixelColor(b-1, stripOUT.Color(5,0,5));  
    stripOUT.setPixelColor(OUTPixels, stripOUT.Color(10,0,10));  
    stripOUT.setPixelColor(OUTPixels-1, stripOUT.Color(20,0,20));  
    stripOUT.setPixelColor(OUTPixels-2, stripOUT.Color(170,0,170));  // 
    }else if(b==2){stripOUT.setPixelColor(b, stripOUT.Color(0,0,0));  
    stripOUT.setPixelColor(b-1, stripOUT.Color(5,0,5));  
    stripOUT.setPixelColor(b-2, stripOUT.Color(10,0,10));  
    stripOUT.setPixelColor(OUTPixels, stripOUT.Color(20,0,20));  
    stripOUT.setPixelColor(OUTPixels-1, stripOUT.Color(170,0,170));  // 
    }else if(b==3){stripOUT.setPixelColor(b, stripOUT.Color(0,0,0));  
    stripOUT.setPixelColor(b-1, stripOUT.Color(5,0,5));  
    stripOUT.setPixelColor(b-2, stripOUT.Color(10,0,10));  
    stripOUT.setPixelColor(b-3, stripOUT.Color(20,0,20));  
    stripOUT.setPixelColor(OUTPixels, stripOUT.Color(170,0,170));  // 
    }else{ 
      stripOUT.setPixelColor(b, stripOUT.Color(0,0,0));   
      stripOUT.setPixelColor(b-1, stripOUT.Color(5,0,5)); 
      stripOUT.setPixelColor(b-2, stripOUT.Color(10,0,10)); 
      stripOUT.setPixelColor(b-3, stripOUT.Color(20,0,20)); 
      stripOUT.setPixelColor(b-4, stripOUT.Color(170,0,170));  } //                     
  loopcount=0; 
  } 
  if(b==OUTPixels){b=0;}   
} // end void loop

After a successful test, use the hot glue gun to glue together the contact points you just soldered on each strip.  This will both waterproof the contact points and also provide additional strength to keep the wires from coming loose.

Now use the hot glue gun and place glue around the inside of the ring.  Then quickly place the inner strip on that path of glue till it cools.   Next, add some gorilla glue to the outer face of the ring all the way around.  This glue won't dry fast so go slowly here and have the binder clips ready.  You want to position the outer strip so that the wires begin at the same place as the inner strip (see image below)

Once the outer strip is placed, use the binder clips to hold it in place.  Give it about an hour to fully dry.   Don't get the glue on the face of the outer strip because once it's dry it will block the light from the LEDs.
  

Do another test if possible to ensure the wires didn't come loose.

Now it's time to cut out some diffusion material.  The diffusion material I used is the packing material used for new monitors but you can also use the flat packing material found at walmart next to the bubble wrap.  If it's very thin, you'll want more than one layer.

Use the outer ring of the embroidery rings as a stencil for this material.  Use an exacto knife to cut out the stencils.

Once you have enough stencils cut, glue on one side using the silicone glue (super glue may not stick well to the plastic sheathing).  While it dries, put some weight on it to ensure all 360 degrees of glue is firmly attached.   After about 40 minutes, the glue should be plenty dry.   Before you attach the other side, first cut up some bubble wrap and place it inside the ring.  You really don't need much here.  The bubble wrap really goes a long way to help carry the light across the center of the ring.  Be careful using hot glue here as it may just melt the material.  So test it first. 
 
(left: no bubble wrap inserted yet.  right: bubble wrap inserted)

Once the bubble wrap has been placed, go ahead and add the other side of the diffusion material.   If you don't have any bubble wrap, you can use a clear plastic bag from the grocery store.

(both sides of diffusion material attached with bubble wrap inside)

Give the ears another test when fully dry. 


Now you need to decide on the positioning of the ears on the alice band.  Too high towards the center and it will look like round antennae while too low and you will look like Deamau5 instead of Mickey Mouse.  Once you find the ideal location, mark the alice band.

A note on the Alice Band:  You can technically use any alice band you want.  The band I am recommending above was the best for this project for two reasons.  1) it has a weave pattern which allowed me to just loop through the zip ties so I didnt have to drill any holes myself.  and 2) the band has a comb built into band which keeps the band firmly attached to your hair/head.  Keep in mind with the ears attached, the project will become somewhat top heavy, and the flat panels will easily catch a gust of wind.  So ensuring they stay affixed to your head is critical.  You don't want them them fall off and break .

Once you find the vertical positions, you need to decide exactly what part of the rings are going to make contact with the alice band.  Using the test code above, you will notice the rotating pattern of the outer strips of LEDs.   Both strips have a starting point, so you will need to make sure the starting point of each strip is identical on both sides.  After that, you need to ensure the direction of rotation pattern is going around clockwise on one ear and counter clockwise on the other ear.

Once you have that all figured out, you will see the point where the rings make contact with the alice band.  From there, you can use the white zip tie to poke a hole through the diffusion material just above the contact point of the ring.  Be careful here as neither the glue or diffusion material is very strong so don't let the zip tie pull off the diffusion material.  Zip tie the ring to the band where you marked it earlier and tighten the zip tie all the way.

Now let's extend the battery pack wires.  If you intend to use the JST connector as shown in the image below, then you will need to make the wire longer in order to reach the board on the other side of the alice band.  You can also buy a JST extension cable from Adafruit or other places. 

Per the image below, the Flora boards have an on/off switch as well.  This can be a more convenient switch compared to the battery pack.  However, if you are using the Trinket Pro board, it will not have an on/off switch (only a reset switch).   Another Flora advantage is you can connect the battery pack's JST cable directly into the JST jack on the Flora board as shown below.  This will allow you to use the on/off switch on the Flora.  However, if you connect the battery pack directly to the BATT and GND pins on the Flora board, you will not be able to use the on/off switch on the Flora.  It will simply always be ON while power is being fed to the board.



If you are not using the JST connector, or if you are using a Trinket Pro board instead, then just cut off the JST end and splice on an extension to the wires.   Once the battery pack has a long enough wire, you can attach the pack to the alice band.  Hot glue works very well here, but if you want room to change your mind, you can use gorilla glue instead. In any case, I suggest attaching it with a rubber band temporarily so you can test and adjust the positioning as needed.  If you glue the pack too low, you won't be able to reach the on/off switch.  I've made that mistake so be careful.  Also, too high and it could make contact with the ear above it, which could put stress on the pack's wires.

(This battery pack was glued too low so the on/off switch is hard to reach)


Now comes the very hard part...organizing the wires.

For a full set of ears, you will have 4 five-volt positive wires, 4 five-volt ground wires, 4 data wires, one positive battery wire, and one ground battery wire.

Between the Trinket Pro and Flora boards, their GPIO pin holes are small and can only fit one small wire.  So you will need to first splice together all the five-volt positive wires and join then to one new low voltage cable that will fit into the holes of the Trinket board.  Same will apply to the data wires for ONLY the outer strips.  The ground wires also need to be spliced into one wire, but you also need to add the ground wire for the battery pack into the group of ground wires.  From there you have all the single wires you will need to connect to the board.  Fyi, cat5 inner wires work perfectly for most boards.

Per the code below, here is how you need to connect the wires.
  • The ground wire goes to the GND pin
  • The 5v power wire (+5v) goes to the 3v pin
  • The wire for the outer strips go to pin 13 for Trinket Pro, or D10 on Flora
  • The wire for the left inner strip goes to pin 11 for Trinket Pro, or D6 for Flora
  • The wire for the right inner strip goes to pin 9 for Trinket Pro, or D12 for Flora
  • (optional) If you want to change programs with a push button, then solder in the push button on pins 6 and 3 on the Trinket Pro.  For Flora boards, use D9 and the adjacent GND pin, and change the code's INbutton to 9. 
You will need to adjust the below code (at the very top) to change the pin numbers depending on your board.  For the Flora boards, leave out the D in the pin number.  So for pin D9, just use 9.  Once the pin numbers have been adjusted to fit your board, you can upload the code to your board.

If you are making both Minnie and Mickey ears, then you will want to change the color of the outer LEDs.  The Minnie code below is set to pink.  So I used blue for the Mickey ears, but you can use whatever color you want.  To adjust the code, locate and change all the text that reads Color(10,0,10) .  From here, change the numbers to match the correct RGB values.

Blue = 0,0,255
Pink = 170,0,170
Red = 255,0,0
Green = 0,255,0
##include <Adafruit_NeoPixel.h>  
#define INPINLEFT 9    // GPIO pin for inner right strip 
#define INPINRIGHT 11  // GPIO pin for inner left strip 
#define OUTPIN 13      // GPIO pin for BOTH outer strips 
int bright = 255      // brightness assignment 0-255 
// 
#define Pixels 18      // # of pixels on the inner stripas
#define OUTPixels 20   // # of pixels on the outer strips
#define INbutton 6   // # input button (detects the button press)  
#define lowButton 3   // # LOW button  (aka ground), leave as is for Flora (ie not needed)
Adafruit_NeoPixel stripL = Adafruit_NeoPixel(Pixels, INPINLEFT, NEO_GRB + NEO_KHZ800); 
Adafruit_NeoPixel stripR = Adafruit_NeoPixel(Pixels, INPINRIGHT, NEO_GRB + NEO_KHZ800); 
Adafruit_NeoPixel stripOUT = Adafruit_NeoPixel(OUTPixels, OUTPIN, NEO_GRB + NEO_KHZ800); 
  
float redStatesL[Pixels]; float blueStatesL[Pixels]; float greenStatesL[Pixels]; 
float redStatesR[Pixels]; float blueStatesR[Pixels]; float greenStatesR[Pixels]; 
float fadeRate = 0.96; float a = 0; int f = 0; int state = 1; int count = 0; 
int loopcount = 0; int masterloop = 0; int cycle = 1; float b = 0; 
int g= 0; int h= 0; int i = 0; int x = 0; int y = 0; int z = 0; int wait = 5; 
int pause = 5; int count3 = 0; 

void setup() {
  stripL.begin();  stripL.show(); // Initialize all pixels to 'off' 
  stripR.begin();  stripR.show(); // Initialize all pixels to 'off' 
  stripOUT.begin();  stripOUT.setBrightness(50); 
  stripOUT.show(); // Initialize all pixels to 'off' 
 digitalWrite(INbutton, HIGH); 
   
  for(uint16_t l = 0; l < Pixels; l++)  
  { 
    redStatesL[l] = 0; 
    greenStatesL[l] = 0; 
    blueStatesL[l] = 0; 
  } 
void loop ()  { 
if(cycle>3){cycle=1;}  
  int sensor = digitalRead(INbutton); 
if(sensor == LOW){ delay(500); cycle++; }  
  
if(cycle==1){ 
stripL.setBrightness(bright ); 
stripR.setBrightness(bright ); 
      loopcount++; 
 if(loopcount == 3){ 
    b+=.5;    
    for(float f=0; f<OUTPixels; f++){ 
      stripOUT.setPixelColor(f, stripOUT.Color(170,0,170));  } 
      if(b==0){stripOUT.setPixelColor(b, stripOUT.Color(0,0,0));  
    stripOUT.setPixelColor(OUTPixels, stripOUT.Color(5,0,5));  
    stripOUT.setPixelColor(OUTPixels-1, stripOUT.Color(10,0,10));  
    stripOUT.setPixelColor(OUTPixels-2, stripOUT.Color(20,0,20));  
    stripOUT.setPixelColor(OUTPixels-3, stripOUT.Color(170,0,170));  // 
    }else if(b==1){stripOUT.setPixelColor(b, stripOUT.Color(0,0,0));  
    stripOUT.setPixelColor(b-1, stripOUT.Color(5,0,5));  
    stripOUT.setPixelColor(OUTPixels, stripOUT.Color(10,0,10));  
    stripOUT.setPixelColor(OUTPixels-1, stripOUT.Color(20,0,20));  
    stripOUT.setPixelColor(OUTPixels-2, stripOUT.Color(170,0,170));  // 
    }else if(b==2){stripOUT.setPixelColor(b, stripOUT.Color(0,0,0));  
    stripOUT.setPixelColor(b-1, stripOUT.Color(5,0,5));  
    stripOUT.setPixelColor(b-2, stripOUT.Color(10,0,10));  
    stripOUT.setPixelColor(OUTPixels, stripOUT.Color(20,0,20));  
    stripOUT.setPixelColor(OUTPixels-1, stripOUT.Color(170,0,170));  // 
    }else if(b==3){stripOUT.setPixelColor(b, stripOUT.Color(0,0,0));  
    stripOUT.setPixelColor(b-1, stripOUT.Color(5,0,5));  
    stripOUT.setPixelColor(b-2, stripOUT.Color(10,0,10));  
    stripOUT.setPixelColor(b-3, stripOUT.Color(20,0,20));  
    stripOUT.setPixelColor(OUTPixels, stripOUT.Color(170,0,170));  // 
    }else{ 
      stripOUT.setPixelColor(b, stripOUT.Color(0,0,0));   
      stripOUT.setPixelColor(b-1, stripOUT.Color(5,0,5)); 
      stripOUT.setPixelColor(b-2, stripOUT.Color(10,0,10)); 
      stripOUT.setPixelColor(b-3, stripOUT.Color(20,0,20)); 
      stripOUT.setPixelColor(b-4, stripOUT.Color(170,0,170));  } // 
                    
  loopcount=0; 
  } 
  if(b==OUTPixels){b=0;}        
/////////////////////////////////////////////////////   
// begin Balázs Suhajda code https://gist.github.com/suhajdab/9716028
   if (random(20) == 1)  
   { 
      uint16_t i = random(Pixels); 
      uint16_t H = random(Pixels); 
      if (redStatesL[i] < 1 && greenStatesL[i] < 1 && blueStatesL[i] < 1)  
      { 
        redStatesL[i] = random(256); 
        greenStatesL[i] = random(256); 
        blueStatesL[i] = random(256); 
      } 
      if (redStatesR[H] < 1 && greenStatesR[H] < 1 && blueStatesR[H] < 1)  
      { 
        redStatesR[H] = random(256); 
        greenStatesR[H] = random(256); 
        blueStatesR[H] = random(256); 
      } 
  } 
/////////////////////     
    for(uint16_t l = 0; l < Pixels; l++)  
    { 
      if (redStatesL[l] > 1 || greenStatesL[l] > 1 || blueStatesL[l] > 1) { 
        stripL.setPixelColor(l, redStatesL[l], greenStatesL[l], blueStatesL[l]);    
        if (redStatesL[l] > 1) { 
          redStatesL[l] = redStatesL[l] * fadeRate; 
        } else { 
          redStatesL[l] = 0; 
        }         
        if (greenStatesL[l] > 1) { 
          greenStatesL[l] = greenStatesL[l] * fadeRate; 
        } else { 
          greenStatesL[l] = 0; 
        }         
        if (blueStatesL[l] > 1) { 
          blueStatesL[l] = blueStatesL[l] * fadeRate; 
        } else { 
          blueStatesL[l] = 0; 
        }         
      } else { 
        stripL.setPixelColor(l, 0, 0, 0); 
      } 
    } 
/////////////////////     
    for(uint16_t g = 0; g < Pixels; g++)  
    { 
      if (redStatesR[g] > 1 || greenStatesR[g] > 1 || blueStatesR[g] > 1) { 
        stripR.setPixelColor(g, redStatesR[g], greenStatesR[g], blueStatesR[g]);    
        if (redStatesR[g] > 1) { 
          redStatesR[g] = redStatesR[g] * fadeRate; 
        } else { 
          redStatesR[g] = 0; 
        }         
        if (greenStatesR[g] > 1) { 
          greenStatesR[g] = greenStatesR[g] * fadeRate; 
        } else { 
          greenStatesR[g] = 0; 
        }         
        if (blueStatesR[g] > 1) { 
          blueStatesR[g] = blueStatesR[g] * fadeRate; 
        } else { 
          blueStatesR[g] = 0; 
        }         
      } else { 
        stripR.setPixelColor(g, 0, 0, 0); 
      } 
    } 
//////////////////////////////////    
    stripL.show();  
    stripR.show();  
    stripOUT.show(); 
    delay(10); 
// end Balázs Suhajda code https://gist.github.com/suhajdab/9716028
} //end cycle =1   
//////////////////////////////////////////////////////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////////////////////////////////////////////////////// 
if(cycle == 2) 
stripL.setBrightness(bright); 
stripR.setBrightness(bright); 
      float jump = 0.25; 
      if(a>100){state = 0;} 
      if(a<3){state = 1;} 
      if(state==0)   /////////////////////////////////// 
      {    
        for(float f=OUTPixels; f>-1; f--){ 
          stripOUT.setPixelColor(f, stripOUT.Color(a,0,a));    
          stripL.setPixelColor(f, stripOUT.Color(a,0,a));    
          stripR.setPixelColor(f, stripOUT.Color(a,0,a));   }  
     a-=jump;            
      } 
      if(state==1)  /////////////////////////////////// 
      { 
        count = 0; 
        for(float f=0; f<OUTPixels; f++){ 
          stripOUT.setPixelColor(f, stripOUT.Color(a,0,a));   
          stripL.setPixelColor(f, stripOUT.Color(a,0,a));   
          stripR.setPixelColor(f, stripOUT.Color(a,0,a));  } 
     a+=jump;      
      } 
    stripL.show();  
    stripR.show();  
    stripOUT.show(); 
} // end cycle == 2 
//////////////////////////////////////////////////////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////////////////////////////////////////////////////// 
if(cycle==3){ 

count3++; 
stripR.setBrightness(50); 
stripL.setBrightness(50); 
stripOUT.setBrightness(50); 
g = random(255); 
h = random(255); 
i = random(255); 
x = random(255); 
y = random(255); 
z = random(255); 
if(count3==1500){ 
    for(byte f=0;f<OUTPixels;f++){ 
    stripR.setPixelColor(f, stripR.Color(g,h,i)); 
    stripL.setPixelColor(f, stripL.Color(g,h,i)); 
    stripOUT.setPixelColor(f, stripOUT.Color(x,y,z) );       
    stripOUT.setPixelColor(f-1, stripOUT.Color(x,y,z)); }  
    stripOUT.show();stripL.show();stripR.show();delay(wait);delay(pause);count3=0; 
    } 
}    // end cycle3 
} // end void loop
Once the code is uploaded and all is working, take some time to waterproof any exposed contact points.  You don't have to do this, but Disney parks tend to have water here and there, so it's not a bad idea to waterproof.  If any water comes in contact with any metal on the board while powered on, the whole thing will be ruined forever.  Additionally, this will also provide additional strength to the wires to keep them from ripping out and also prevent them from touching each other and this shorting out the board.   To cover the wires running atop the alice band, you could use some electrical tape and glue to keep it in place.

If you're doing the Minnie version, you can now add the red bow to the alice band. I've not found a good glue that works on the outside of the diffusion material to hold the bow in place.  I used the gorilla glue but it eventually came loose.  The sides won't matter as much.  Just focus on gluing it to the top of the alice band.  Hot glue works quit well here.  

Also be sure to stress test the ears before taking them out for a production run.  Test the alice band's movement and ensure the wires aren't too tight and ripping out of the solder points.  Also ensure the wires aren't causing the ears to move.   Make sure the ears are tightly connected to the alice band.  If they wiggle at all, they are too loose.  Watch for any signs of electrical problems.  If the LED animation freezes on a full battery, then chances are some wires are touching but they shouldn't be.



Adafruit featured my project on their wearable wednesdays episode.  My project begins at 4:36. 

Above all the ears were a huge success.  We heard lots of comments from people such as "look at those" and "where did they get those ears."  But the employees loved them the most.  We had a a few employees come right up to us and ask us all about them.   And Mickey himself was impressed as well.  



Alternative & Cost Saving Options:
  • Instead of using the 60 pixels per meter strips of neopixels, you could settle for the cheaper strips of 30 per meter.  In my opinion, it really doesn't look as good and you would have to adjust the code to make it look decent. 
  • On that note, you could save some  money by buying one 60 pixels/meter strip and one 30 pixels/meter strip, and use the 30/m strip for the inner ear lights.  The ears look best with the 60/m strip on the outside and with the diffusion material covering the inner strip, the fewer pixels won't be as noticeable.
  • Instead of using a Flora board for $20, you could use a Trinket Pro for $10.  Technically this is a more size efficient board, but harder to work with for the inexperienced.  The Flora is bigger and kinda looks odd when placed on the alice band, but it's way easier to solder on wires.   If you are experienced with arduino and soldering, go with Trinket Pro 3v.  Whatever you do, make sure it's 3v and not 5v boards. 
  • Instead of two strips per ear, you could just do one outer strip per ear and ignore the inner strips to save $$ on neopixels. 
  • If you want to spend the extra $$ and go ultra bling, you can get the neopixel strips that are 120 per meter.  The animation of the LEDs will be much smoother, but beware more pixels will eat more battery life.  
  • This project references Adafruit parts which may not be the cheapest but Adafruit is my favorite.  You could find something similar for a better price and use those parts instead.  But you had best know what you are doing because I am not going to help you figure it out.  
  • Some people don't like the looks of the AAA battery pack.  I can't say I blame them but this guide is for somewhat novice users.  So anyone with a deep desire to make it look a tad prettier could switch to a LiPo battery instead. But keep in mind you will also need to buy some kind of a charger and you will want to get at least two batteries so you have a full battery on standby. 
  • UPDATE:  I have recently found what appears to be a cheap knock off version of the neopixels on Amazon.  They appear to be the same thing at 1/4 the price.  So if you need to make multiple sets of ears, this could be a good way to save money.  But I have not tried it so I cannot guarantee anything. 
  • UPDATE 9/2017 - I decided to take another dland trip so I went back to upgrade my ears.  Per the video below, I first changed the code to add a 2nd trail on the outer edge of each ear.  I used a 144 pixels per meter strip so there are 2x the amount of pixels, which does make for a smoother trail animation, but costs more $$.   After that, I removed the AAA battery case and added a 2200mAH lithium ion battery, and connected that to a USB lipo battery charger so I have a way to recharge it (like a phone).  I also added a small on/off toggle switch between the battery and board since the battery pack was the original on/off switch.    With this battery, it lasts well over 12 hours on a single charge.


Saturday, August 15, 2015

Easiest way to do a momentary push button for arduino

The best way to do a momentary push button involves placing a resistor between the button and ground.  But if your code is simple enough and can afford a slight delay, then you can use this method instead.

  • Simply use a 2 pin momentary push button between one GPIO pin and ground.  
  • Use the code below as an example. 
  • Define the GPIO pin and set that pin to HIGH as default.  
  • Then in the main loop, read the pin and if it detects a LOW signal, perform the action needed when the button is pushed.  
If the button is pushed, it connects connects the ground to the GPIO pin and thus that pin is grounded and furthermore the pin will read as LOW.  when released it will go back to HIGH.   

If you don't do an immediate delay after, the loop will perform that action as many times as it can while the button is pushed...and that can be a lot.  


#define button 9   // # input button (detects the button press)
void setup() {
 digitalWrite(button , HIGH);
}
void loop () 
{
  if(digitalRead(button) == LOW){ delay(500); action++;} 
}

Thursday, January 1, 2015

Square Enix - A failure of customer service

I've been a die hard Final Fantasy fan for a long time.  I started with FF2 and fell in love.  Moved on to FF3 and was amazed.  Then PS1 came out with FF7 and the earth stopped as many people have agreed.  I still play FF7 every now and again.  FF8, 9, 10 were all decent as well but I didnt really like FF Tactics.

Once I finally got a decent computer to handle an MMORPG, I bought Final Fantasy 11 (FFXI) without question.  I did love the game at first but even then I knew it had some drawbacks.   But I still enjoyed the story line and got into the game so much I went to the FFXI Festival of 2007 held in Anaheim, CA.   I actually met quite a few people in person of whom I knew well in the game, one of which is still a good friend to this day.

Over time I noticed quite a few problems with the way Square Enix handled it's public relations and customer service issues.   I listened closely for comments of praise hoping that the constant barrage of negative comments were just the exception and not the rule.  Turns out...Square Enix has quite a reputation.


Horrible Response



Before the days of computer security, compromised accounts were a rare occurrence seen less than Bigfoot or UFOs.  Eventually, hackers realized there is money to be made in stealing FFXI accounts.

When the accounts first started to get compromised, Square Enix literally told people there was nothing they could do.  Many people lost all of their gil (the game's currency), and all of their precious and valuable items that took them years to acquire.

Some game items are marked as "Ex" which means un-EXchangeable and thus the item cannot be sold or even given to other players. Because of the hacked accounts, all non-Ex (or normal items) were stolen from players.  Because of this issue, I asked square enix to add an in-game option for players to mark their items as Ex on demand even if such an option was a irreversible.  It made sense to me to let players decide which items they want to protect from fraudulent activity.

Why was this so important?  Because Square Enix (SE) refused to return any of the stolen items or in-game money to the players.   No matter the reason, SE told players "there's nothing we can do."   They said this a lot because, let's face it, that is the easy and cheap response.

But SE eventually did start to "do something" about the hacked accounts.   They really didn't want to, but suddenly they had no choice.   Soon, the hacked accounts became far less of a myth and quickly became a common occurrence like cars on a highway.

The high majority of FFXI accounts were played on Windows systems and we all know how secure windows was and still is to this day.   On top of that, almost ALL of those users had no idea how to protect themselves against online threats.

It was only when they stood to lose money did they bother to make an effort.  

The previous "tough crap" attitude wasn't going to work now because  most people in this position chose NOT to continue their accounts and thus they cancelled their monthly service payment.  A few accounts here and there is no big deal.  But the thousands of accounts that were quickly getting compromised was now going to eat a very large hole into SE's profit margin.    So as you can imagine, SE took action and suddenly changed it's policy on responding to hacked accounts. It was only when they stood to lose money did they bother to make an effort.

Square Enix then formed the Special Task Force Unit to investigate breached accounts and also ban accounts that were being used for illegal purposes.   Basically, hackers were getting into players' accounts and transferring all the items and gil to their own account(s).  Then they would sell all the items and make as much game money (gil) as possible.  Then that online currency was sold for real-life money via the internet.   So a million gil would go for $20 (I have no idea what the prices are nowadays).

Once the gil was purchased via their website(s), the hacker or group would meet the player in the game and then give them the gil for which they paid.   So the accounts the hackers were using to distribute the gil were hunted after by the Special Task Force Unit.   Every 3 months, they would ban a large number of accounts they found performing illegal activity.  Other MMORPG providers do the same thing.

The compromised accounts were those in which paying customers wanted un-banned and restored in full.   SE first wanted proof you are not committing fraud so they told their customers they had to file an official police report.   Once the police report number is provided to SE, the Special Task Force Unit would investigate the issue.   Given the massive rush of cases, an investigation typically took a while.  From what I hear lately, this has not changed.

SE did NOT tell people to suspend their accounts while the investigation took place.  People were patiently waiting for a bus that wasn't coming but still continued to pay their monthly service fee.   When SE finally restored the account, they informed the user that they will not refund or even credit the unused play time spent while waiting for the investigation to complete.

If the Special Task Force Unit found evidence the account was deliberately used for illegal activity, the account was not recovered.  Otherwise, the account was recovered by restoring a backup of the account on the server side.  While this did not happen to me, I heard from other people that some game items were restored, but gil (in-game money) was not restored.   SE informed players that if their account was compromised, the recovery and investigation would not incur any additional fees.   But, if it happened again, then SE would then charge a fee.

Over time, the Special Task Force Unit became more known for ending accounts than they were for assisting in the recovery of stolen accounts.   Another big reason SE banned accounts was for using 3rd party software.     Third party software is just another program made to interact with FFXI while the main FFXI application is running.  This software is designed to assist the player in some way while playing the game.

The most commonly used 3rd party software was the Windower.  Back in those days, software game vendors  often forced the game clients to run the game in full screen mode.  Placing the game in a separate window was not even an option as this was exactly the case for FFXI.   SE forbade windower applications because they assumed running FFXI in a window will allow cheating applications to run much easier.

While this is technically true, most people did NOT use a windower to cheat.   Most people, including myself, would use a windower just to break the monotony the game creates.  While many of us enjoyed the game, it had some major drawbacks.  One prominent issue was the pace at which the average person progressed in the game.   Gaining levels in FFXI was very, very difficult.  Once you reached level 10, you simply could not gain enough experience points in a short enough period of time to make your time worthwhile.

This forced us all to seek out a "party."  A party is just a group of other players all fighting monsters together.  If the monster is higher level than your character, then you get more experience for that fight.  So a party allows players to take on harder mobs for more experience.   Experience gained by solo fighting was about one fifteenth or less the experience received while fighting in a party.   So parties were the only way to get ahead in the game all the way through level 75 (they have since increased the level cap to 99).

Don't believe me?  Ask someone who played FFXI as Beastmaster.

Even WITH a party, it still took a very long time to gain a level.   Also, in seeking out a party, most people would just wait in nearby party zones to be added to a party.  In some cases, especially Qufim, people would simply not get added to a party after waiting hours on end.   So playing the game gets rather tedious.  And most people in those days had only one monitor as dual monitors were not popular yet and video card manufacturers were not yet making cards with dual output...well, the affordable cards at least.

So the average player was forced to play in full screen mode on only one monitor for hours, days, weeks, and months.   anyone who played the game knows how annoying the in-game music became over time.  Just imagine how annoying Christmas music is at the end of December.  But then you still have to listen to it well into the next holiday season.   Players could only turn off the music, but then they have annoying silence which also gets old.   Because the game is in full screen mode only, players cannot (easily) run a music application in the background such as VLC player (or in those days, Winamp).  To be fair, you could run a player in the background, but you could not touch it once you started FFXI.  As soon as you ALT-TAB to the application, the connection to FFXI was terminated.

This is the main reason players used a Windower application.  With the game in windowed mode, we could run an mp3 player or even watch a movie while we drained hours of our time on a game that technically never ended.   But the windower developers also allowed other developers to create plugins.  These plugins did certain things to make game play easier.   Some of these plugins were very simple and helpful features like organization of items or the latest version now records video (an option that previously required yet another application to run in the background).    Other plugins did a little too much where some people would argue the plugin is a form of cheating. 

The problem was, Square Enix felt anything not approved and provided by Square Enix was cheating.   So the Special Task Force Unit went after accounts they found were using the windower.   Because of this extremist view of account bans, the Special Task Force Unit quickly became known as S.T.F.U.  If you know what that anagram typically stands for and combine it with the views enforced by SE, you will realize that the anagram was incredibly accurate. 


Avoiding Responsibility


Everyone knows how most companies handle bad Pubic Relations.   They typically just glide over the incident and do whatever they can to shove it under the rug and pretend it never happened.  They never admit fault because doing so would create obligation to make reparations.  Square Enix was no different.

As described above, playing the game was slow and tedious in general, but it had other time consuming issues.   The game also has monsters called "Notorious Monsters" which are rare or incredibly rare monsters that are seldom seen.   The more rare and difficult to fight, the better the reward received when defeating the monster.

Some monsters are known as "Historical Notorious Monsters" (the H was loosely defined as some people said it meant High Notorious Monster).   These HNMs are not only as rare as they come, but they also require an alliance of three parties to defeat.    Some HNMs are called to fight by presenting a particular item called a spawn item.

One example of this procedure was the fight for a monster named Absolute Virtue (AV).   This mob could be manually spawned at a particular location by trading a specific item at a specific location.   The item was basically pieced together over time by fighting a lot of previous monsters and gathering other items to eventually obtain the spawn item.  In most cases, it takes weeks if not months of teamwork and fighting to obtain this item.

The problem in this case, was (originally) AV was not a guaranteed spawn.  The item traded would actually spawn the Jailer of Love (JoL) monster which at that time took at least an hour to kill.  After killing JoL, there was a percentage chance that AV would spawn.  So in some cases, all that work just to get the item to needed spawn AV was for absolutely nothing because AV didn't spawn after killing JoL.

But in those other cases, AV did spawn and let me assure you....he was a very difficult foe to defeat.    There were a lot of questions about how to defeat this guy.  No one really knew anything concrete so a lot of people begged SE for clues.   Eventually SE responded with a video of a group that did defeat AV.  During the video, it zoomed in on certain parts to emphasize important details intended to be clues.  But still nothing was certain about how to defeat AV. 

So people who tried and kept trying discussed via the FFXI community forums.   Eventually, new information made it's way into those forums.   SE hosted events every so often and the game developers would show up and answer questions.  The topic of AV came up and a very important response was taken from one of the game developers....a response which since it was made has been refuted as rumor and the post deleted from the online discussion board.  

The developer specifically stated that AV was meant to last around 18 earth hours of fighting so any group attempting to fight him needs to be well prepared.   This little piece of information blew people away.

Confirmed with this post:
http://games-beta.slashdot.org/story/08/12/11/0331255/on-luck-and-randomness-in-games

...a SE (developer) said that while it's theoretically possible to kill it in 2-4 hours, the average is somewhere around 18 hours, so 18 hours doesn't stick out as unusual for those sadistic bastards.

The fact that SE would an enemy that requires so much real-life time was rather confusing.   Before a player connects to the server, SE forces all of its players to read the following "warning" message:


An 18 hour fight is a very long time to reserve just for playing a game let alone most anything else.   Keep in mind, the 18 hours is non-stop fighting so there is no pause button, and no food or bathroom breaks.   People continued to try and fail at killing AV and life went on.  In this interview with SE, they clearly had no idea just how powerful AV was to the average player.  Granted if you designed the monster and know every little thing about this foe, it would sure make things a lot easier.  But the players didn't have the advantage the developers had and testing the multiple theories was incredibly difficult because obtaining the spawn item took weeks of work. 

Cracked.com named this the #4 biggest "dick" move in online gaming history.

Later in 2008, a new super boss named Pandamonium Warden (PW) emerged with the Aht Urghan expansion pack.     Similar to AV, word got around that this boss was going to be a very long fight.   Eventually, a group decided to go for the glory and they took on PW.  When it was over, some of them documented the experience of such a long fight.   The news was not good.  

There were reports of people passing out and/or vomiting and apparently after 18 hours of fighting, the group leader called the whole thing off.   News of this reached the rest of the community and people were outraged.  A lot of people were angry with SE for making such a difficult boss to fight.    SE eventually responded to the public outcry with a statement saying that they never intended for players to go to such measures to defeat a single enemy.

Soon after the public response, another group tried to defeat AV and reported amazing success....too amazing.  This first group apparently was able to defeat AV in less than one hour.   A week later, another group posted video of AV being killed in less than one minute.  



Not only did SE refuse to take any responsibility for their own actions, they also weakened AV and PW so much, it took the all the fun and challenge completely out of the fight.   Many discussion boards covered this topic well and the consensus pointed some at the group being too stupid to keep fighting for that long without realizing their strategy is flawed.

But others agree that SE was also to blame for making an enemy so difficult and never testing those limits.   Yes SE never expected anyone to fight that long, but it doesn't mean no one will ever try.  And if you have developers and other SE employees confirming the fight was intended to last that long, you should know what comes next.  That's generally the main flaw in computer security these days.  Anyone that thinks "why would anyone ever do that" is just waiting to get exploited.


Failed Customer Service


The last straw for my Tour of Duty was the Wings of the Goddess expansion pack.   This was the 4th expansion pack for the FFXI platform.  Many people were anxious to see the new features the expansion would bring.

For the most part, the expansion did bring some new and entertaining features most people found enjoyable.  The time-travel element allow players to journey into the past which answered a lot of questions about what happened in previous areas.  It completed the story of Garliage Citadel, Batillia Downs, and Rolenberry Fields.

But there was one major problem....the expansion pack was not complete.

Each expansion brings overall game changes, but it also offers each player to complete the "missions" which were basically a series of quests completed in a specific order.  Given that this expansion pack had a total of 54 missions in the end, one would think the expansion pack would start with more than just 2 missions...but that's all we got.   SE sold the expansion pack long before if was ever completed simply to make sales promising their customers that more missions are on the way.

But this was not the first time SE had pulled this nonsense.  The same exact thing happened with the previous expansion packs "The Treasures of Aht Urghan" and the one before that "The Chains of Promathia."   It took over a full year before the final missions for those expansions were released.   It became clear that SE feels it's ok to sell an incomplete product to it's customers.   I disagree.

Promising more missions are coming is, to me, like selling a car without the tires....but promising the tires are in the mail.   Selling an incomplete expansion is a very deceitful act for one major reason...reliability.   With most everything in this world, a lot of us consumers will look for reviews about a product to see what good and bad others have experienced with the product.  If the previous expansions have succeeded in delivering all the desired qualities to this point, it would be a good idea to verify those same qualities are included in the next expansion pack before investing money on a purchase.

But if the story line is not yet complete, then you have no way to compare it to the previous releases.   So you could end up paying for a game you hate just because there was no one to warn you how bad the game was from the start.  And previous experience has taught me to be cautious.

in 2007, the Aht Urghan expansion pack had just been released and I was attending the Final Fantasy XI Fan Festival that year.    During the Q&A sessions, the developers made a specific promise to the players that more Summoner Avatars were coming soon.   Years went by and nothing happened.  The new avatars eventually did come around, but not until after the next expansion "Wings of the Goddess"...and then even longer.  Because the expansion was not yet complete, the avatars weren't available until the required missions were released.  

SE seems to enjoy it's lack of accountability in game development.  Keeping its paying customers on the line with empty promises and no guarantees or deadlines seems to be a standard practice.   And they really don't like my preference to save my money for something worth buying.   The latest example was my very recent trial period of Final Fantasy 14 (FFXIV). 

My friends had been telling me how much the game had improved since FFXI.  I brushed off those comments for years because I still didn't feel SE was a trustworthy company given all the previous contemptible incidents of the past.   But finally, I decided to see what my friends had been saying.

I downloaded the trial game and signed up for the 14-day trial account.  Compared to FFXI, I was definitely impressed with the game overall.  It was much easier to level up and much easier to acquire money to buy needed items.    The graphics were also superior to FFXI as the rendered shapes were much more modern catering to the high quality graphics cards.  

However I wasn't able to create my account on the server where my friends had their accounts.  I wanted to be able to play with my friends on occasion as they were my friends from FFXI.   So after the first 7 days, I emailed Square Enix with a request to move my account to the desired server.   I told them that I was pleased with the game and if they were willing to move my character to my desired server, I would then invest in buying the game and starting a monthly subscription.

Sent: Fri, 19 Dec 2014 10:17 AM

Dear Customer,

Regarding your request for account support. Please find your answer below.

Unfortunately that service is not available at this time.  Suggestions from our customers are always valued.  While we cannot guarantee implementation we will surely pass this on to the developers. 

Any Worlds that have reached their maximum population cap cannot be selected.

It?s also not possible to transfer more characters than can be created on a single World.  Since players with an entry level subscription may only create 1 character on 1 World, it?s not possible to transfer to a World where they already have a character.  Finally, standard level subscribers cannot transfer to a World if they already have 8 characters on that World.

For further details about our World Transfer service, please click here.

Thank you for contacting the SQUARE ENIX Support Center.

Like all previous inquiries sent to SE support, all I got back was a Level I, no-brainer, scripted response.   The underpaid support staff just follows the rules and responds accordingly, not taking into account any unique circumstances.

I replied one last time telling them I have not yet purchased the game and I am not going to give them my money if I cannot play on the same server as my friends.   I told SE that I am willing to buy the game and start my account now as long as I get a written guarantee to place my account on the desired server within a reasonable amount of time.

An mentioned above, SE bans accounts all the time, typically every 3 months.  So it's very possible that SE will have room for my account to be transferred in a few months.  But SE has not responded.  Probably because they don't like seeing a customer being prudent and insistent.   SE generally acts like a casino where the money just keeps flowing in without a please or thank you.   They don't do anything for their customers unless they know it's going to severely eat into their profits or cause a public relations nightmare.

So that's where it stops for me.  SE has not replied and I doubt they ever will.  I've never seen a company that doesn't do whatever it takes to make the sale...but SE has it's issues.  I hope someday this article is read by some of the shareholders so they see that SE support is not performing in the best interest of the company.  

Because I received no response, I gave my money to Blizzard once more and played some more World of Warcraft.   I don't love that game as much as most players, but it's a nice time killer for vacation or holiday periods.   But that's capitalism for ya.  If company A doesn't make the customer happy, then company B will step up. 

Read the reviews from Amazon.com to see how people are finding another company.


In January, I decided to give Square Enix one more chance before I went ahead and invested in another MMO.  I wrote this letter to customer service...

I have been thinking about buying the latest expansion pack for World of Warcraft and continuing service with Blizzard.  But before I make the investment, I would first like to give Square Enix one last opportunity to do the right thing. 

Let me first be clear that my initial intent for this email thread was not to avoid paying for a service.  I am willing to pay for a service (such as world transfer) if the service is, in fact, worth the investment.  A simple transfer without having begun the game would not be a worthwhile purchase.  But Square Enix support somehow finding a way to make room for my account on a full server would be a service worth the money. 

Please note that I am willing to be quite flexible in this matter.  I am willing to wait a reasonable amount of time (perhaps ~6 months) for you to find a space for my account on the desired server. The only reason I am requesting these efforts is because I wish to be on the same server where my friends are also playing.   Frankly, I am quite surprised you don't have any standard process to deal with these requests given FFXIV and FFXI are both massive multiplayer games and I suspect these social requests are quite common.   If a process has not yet been developed, this could be a good opportunity for Square Enix to begin development of a new process.  I would even be willing to help with this in any way I could, so feel free to contact me later if desired.   

But if Square Enix can find a way to make room for my account on the desired server, I would be willing to pay for that service because I will know that Square Enix has put forth the extra effort.   If Square Enix support can guarantee my account will be eligible for transfer to my desired server in a reasonable but specific time frame, then I will be happy to purchase the game now and begin a monthly service account while patiently waiting for an update on this request.  I will also be willing to pay the wold transfer fee in advance (if possible) to show my willingness to cooperate. 

So please take this into consideration and let me know your thoughts.   I am truly hoping Square Enix can step up and find a way to make things happen.   You can reply directly to this gmail address or to the registered address.   thank you. 

...Square Enix did not respond with any real human effort.  They just took the first two paragraphs (or sentences) from the original response included above and pasted that into their response.  That's all you get from SE...cut and paste scripted answers.


A week later I was talking to my friend who told me her other friend managed to transfer to her server, which is exactly what I was trying to do but SE told me no.   She eventually probed the other friend who said he just went to the SE account store and did it all himself.  Apparently, the whole process is automated and does all the checks required to ensure transfer is possible.  So i went ahead and did that same thing, paying the transfer fee at the end of the process.  Five minutes later, I was transferred to that server.   Just goes to show you that SE customer support is completely worthless.  After all this effort and begging SE to grow a brain, all they had to do was direct me to the transfer page.

Additional customer service complaints found on amazon...

1.            Horrible customer service. Couldn't run this game on computer with minimum requirements. Purchased a new machine and they have no option to extend game time for people with issues. How are you going to have an online only game where you cant credit game time or game money to customers....

2.            I entered in incorrect security information and was never able to play the game in the free one month timetable. I tried contacting customer service but they have not responded. Basically I am not getting what I paid for and its unfortunate. I used a weird password that I don't normally use and its very difficult to retrieve it if you also used wrong birth date! I mean cmon, why does it have to be so hard...this is ridiculous.

3.            Save your money and go get world of Warcraft. The game is buggy, laggy and has almost no support

4.            The company does not care if your phone gets stolen and you can't access your account any longer. I played for a few months and fell in love with the game. Then my phone was stolen. The company blamed me and they were RUDE when I tried to remove my phone from the account and denied me access to my account and locked it permanently. I was banished for getting robbed. I will never buy another Square-Enix game

5.            I purchased this before reading the reviews and it wouldn't even download the updates during the initial installation there is no fix for it and little to no customer service from Square Enix

6.            Today I contacted customer service and asked for my 30 days back, stating that if they looked at my account they would be able to see that I never logged into my account. They acknowledged that they could see I never logged into my account but would not give me my 30 days back.

Quite unfortunate that they lack clear account messaging regarding the 30 days and their customer service lacks the power/will to problem solve situations rather than parroting customer service guidelines...

7.        Banned for nothing and Squares useless support never helped. Nice game otherwise, but this extra copy i bought my brother was banned day one, so i cancelled my subscription and went on with my life. I hope ESO enjoys my business.

8.            Within 1 day it said my account had been hacked. It was an impossible customer service mountain to climb to get it reinstated

9.            Good game with the worst support of all time
...I received an email that my account was suspended permanently - with no real details beyond this. My account LOOKED fine, it was not hacked, the password was correct, etc. but I was never really able to get any more details out of the company. I tried email support, and they did not handle suspended accounts, so they referred me to phone or chat. I tried phone three times - staying on hold for 2+ hours each time and gave up. I tried the chat option several times, I had to open a whole NEW ticket just to find out WHERE I could chat with someone. Eventually I DID get to talk to someone, and explained the whole situation - not to mention that I purchased $50 worth of Crysta (in-game store currency) right from the beginning with the intention playing the game on through. They took everything down, said they would open a support case and they would get back to me. That was almost 1 MONTH ago. Seriously, stay away from this game at all costs....

10.         Square-Enix is the worst company I've ever had to deal with. Customer support is non-existent. The security for this game is abysmal. My account was compromised in less than a week after signing up. Trying to recover the account has been a nightmare and is still unresolved.

I may be in the minority, but this is the first time that any of my gaming accounts have been compromised and unfortunately, it is with the company that has the worst customer service.

- No phone support
- Email support responds once every 24 hours.

I've since given up and decided to cut my losses. I'm sure square will not miss me as an individual. I hope for their sake that what happened to me is an isolated incident or they'll be losing a lot more customers.

11.          If you like giving money away then go for it. This company clearly doesn't give a poo about any of their customers. Horrible customer service, paid subscription, few servers that work. Maybe one day it will be worth it but for now I would rather spend my money elsewhere. I returned this game.

 -------
and my favorite.....
 -------

12.          I will never buy another Square Enix game. Ever. The level of contempt they have shown their customers goes beyond anything I've ever seen before. There was no, "oh gosh, we totally screwed that up and we want to make it right" response. At all. Their response has been consistently inappropriate for a completely unacceptable situation caused by their own failure to properly resource their data centers. Choosing to lock their customers out of the systems instead of building in the ability to expand capacity on-the-fly (like every other MMO I've played has been able to do) shows that Square Enix as a company does not value their customers.