Here is a schematic. There are three of these, one for each phase and another without the high side part of the circuit for the stator. Most of the components are recycles from other devices or items I had an abundance of. Hence the values but, it works...
A 12V, 14Ah gel cell battery is used to power the motor. The 9V battery is there because I never got around to building a charge pump to drive the high side fets. The gate voltage must be higher than the source to turn on N channel fets. It's on my "to do" list.
On the same list is rotor position sensing with hall switches.
I used optos because the duino was the most expensive component in the whole mess. I didn't want to fry the brain however, several fets did meet an untimely demise. "No honey, I don't smell anything burning! Is the dog near you?"

The sketch was only intended to run short durations. I used the on_time to control speed though I'm sure there are other solutions and cleaner more efficient code to be had.
int i = 0;
int stator = 11;
int ledPin1 = 10;
int ledPin2 = 9;
int ledPin3 = 8;
int ledPin4 = 7;
int ledPin5 = 6;
int ledPin6 = 5;
int between = 60;
int on_time = 1500;
void setup()
{
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
pinMode(ledPin5, OUTPUT);
pinMode(ledPin6, OUTPUT);
pinMode(stator, OUTPUT);
analogWrite(stator, 0);
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, LOW);
analogWrite(stator, 64);
delay(50);
for(i = 0 ; i < 2000; i++)
{
digitalWrite(ledPin4, HIGH);
delayMicroseconds(on_time);
digitalWrite(ledPin6, LOW);
delayMicroseconds(between); // 2
digitalWrite(ledPin5, HIGH);
delayMicroseconds(on_time);
digitalWrite(ledPin1, LOW);
delayMicroseconds(between); // 3
digitalWrite(ledPin2, HIGH);
delayMicroseconds(on_time);
digitalWrite(ledPin4, LOW);
delayMicroseconds(between); // 4
digitalWrite(ledPin3, HIGH);
delayMicroseconds(on_time);
digitalWrite(ledPin5, LOW);
delayMicroseconds(between); // 5
digitalWrite(ledPin6, HIGH);
delayMicroseconds(on_time);
digitalWrite(ledPin2, LOW);
delayMicroseconds(between); // 6
digitalWrite(ledPin1, HIGH);
delayMicroseconds(on_time);
digitalWrite(ledPin3, LOW);
delayMicroseconds(between);
if (i > 1500)
{
on_time = 875;
}
else if (i > 750)
{
on_time = 1000;
}
else
{
on_time = 1500;
}
}
analogWrite(stator, 0);
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, LOW);
}
void loop()
{
}