I really liked working with electromagnets so I decided to change my final project. Instead of giving haptic feedback through a glove (which turned out to be very hard), I will use a pad with an array of electromagnets. I call this project the haptic-pad.
I found a very nice reference called the Actuated Workbench. It is mainly the same system, an array of 8 by 8 controlled electromagnets. The haptic-pad is not about moving objects or interfacing with the computer though, but rather is about giving feedback to hand movement, as in the original final project the haptic-glove.
The idea here is to display 3D 'images' that could be 'touched" by the hand or through a pen with a magnetic head. I imagine this system used as a sort of paper-based drafting tool with invisible snaps and rulers (like autocad using regular pen and paper).
I wanted to use Charlieplexing to control the array of electromagnets. I didn't work though, because I need to use mosfets (to provide enough current) and therefore I canont use the 3 state capabilities of the pins (Attinny cannot sourse-sink enough current).
I decided to start simple and control 3 electromagnets through 3 pins (PWM) and a simple interface (in Processing). I found some hardware problems though: I burned the voltage regulator. I think I need a diode between the regulator's ground and the ground of the mosfets' loop.
Eagle files (Schematic and Board Layout).
Code files (Arduino and Processing).
The Arduino-Processing interface and communication worked out pretty well. I just modified David Mellis' Physical Pixel project. I included 3 squares, one for each electromagnet: if the cursor is over a square, a specific byte (ASCII character) is transmited to the board through software serial communication.
A byte corresponds to eight bits, character 'A' = 1000001. I used characters from A to F. For example, if the cursor is over the second square a 'C' (1000011) is trasmitted to the Attinny, which turns pin 7 (PA7) HIGH (5V) activating the corresponding n-mosfet and therefore turning on the electromagnet.
ARDUINO (key code lines)
SoftwareSerial mySerial(0, 1); // (rx,tx) of the microcontroller
int incomingByte; // a variable to read incoming serial data into
void setup() {
mySerial.begin(9600); // set the data rate (same as Processing)
pinMode(6, OUTPUT); // initialize pin as an output
}
void loop() {
if (mySerial.available() > 0) {
incomingByte = mySerial.read(); // read the oldest byte in the serial buffer
// Test FIRST square
if (incomingByte == 'A')
{
digitalWrite(6, HIGH); // if byte is 'A' turn pin 6 HIGH
}
if (incomingByte == 'B')
{
digitalWrite(6, LOW); // if byte is 'B' turn pin 6 LOW
}
}
}
import processing.serial.*;
Serial port;
void setup() {
println(Serial.list()); // prints ports
port = new Serial(this, Serial.list()[0], 9600); // set the data rate
}
void draw() {
// Test FIRST square
if (mouseX > boxX1-boxSize && mouseX < boxX1+boxSize &&
mouseY > boxY1-boxSize && mouseY < boxY1+boxSize)
{
port.write('A'); // send 'A' to port (mouse is over square)
}
else
{
port.write('B'); // send 'B' to port (mouse is not over square)
}
}