Hi,
i'm trying to build a modified version of this plotter http://www.instructables.com/id/Cheap-Arduino-Controlled-3-Axis-Pen-Plotter/
The idea is to replace the X and Y axis with the hand and to move line by line. It's a kind of game, like a hard to use printer you have to learn to use (like you learn to play the piano you could learn to handprint). You move the motor with your hand, in a line after the first line is printed a LED blinks and you go to the next line.
Here is the prototype :

Before I show you the code a quick explanation, the motor doesn't seems to read the datas (it always repeat the same sequence)
I think the problem comes from bitRead and word image[].
So here is the code :
#include <Servo.h>
Servo myservo;
int led = 13;
int deg;
word image[12] = {
0b001001011110,
0b001001010010,
0b001111011110,
0b001001010010
};
void setup()
{
myservo.attach(9);
pinMode(led, OUTPUT);
// here i do a big motion to know that everything is ok
myservo.write(0);
delay(1000);
myservo.write(179);
delay(1000);
// This far everything is working nicely
digitalWrite(led, HIGH);
delay(5000);
// One LED goes bright to tell me I have 5 sec before the drawing begins
}
void loop()
{
deg = map(deg, 0, 1023, 0, 179);
for(int column = 0; column < 4; column++) {
digitalWrite(led, LOW);
for(int row = 0; row < 12; row++){
boolean pixel = bitRead(image[row],column);
if(pixel == 1){
penDown();
delay(15);
}
else{
penUp();
delay(15);
}
delay(15);
}
}
// the led goes bright again to tell me that I need to jump to another line
// like the enter key on a writting machine except that I do it manually
digitalWrite(led, HIGH);
delay(1500);
}
void penUp()
{
deg=169;
myservo.write(deg);
delay(30);
}
void penDown()
{
deg=159;
myservo.write(deg);
delay(30);
}
For the moment I resolved the problem using a massive amount of penUp() penDown() (the function that make the motor goes up or down) and digitalWrite(led, LOW); digitalWrite(led, HIGH); delay() to make the led goes bright after each lines (and delay to give me enough time to go to the newt line). This works (its quite hard to write but the code do the job) but its really long to make any change and quite a boring (not smart) piece of code :
#include <Servo.h>
Servo myservo;
int led = 13;
int deg;
void setup()
{
myservo.attach(9);
pinMode(led, OUTPUT);
myservo.write(0);
delay(1000);
myservo.write(179);
delay(1000);
digitalWrite(led, HIGH);
delay(5000);
}
void loop()
{
deg = map(deg, 0, 1023, 0, 179);
digitalWrite(led, LOW);
delay(3000);
digitalWrite(led, HIGH);
delay(3000);
penDown();
penDown();
delay(15);
penUp() ;
penUp() ;
penDown();
penUp() ;
penDown();
penDown();
penDown();
penDown();
penUp() ;
penDown();
penUp() ;
penUp() ;
penDown();
penUp() ;
penDown();
penDown();
penDown();
penUp() ;
digitalWrite(led, LOW);
delay(3000);
digitalWrite(led, HIGH);
delay(3000);
penDown();
penDown();
delay(15);
penUp() ;
penUp() ;
penDown();
penUp() ;
penDown();
penUp() ;
penUp() ;
penDown();
penUp() ;
penDown();
penUp() ;
penUp() ;
penDown();
penUp() ;
penDown();
penUp() ;
penDown();
penDown();
penUp() ;
digitalWrite(led, LOW);
delay(3000);
digitalWrite(led, HIGH);
delay(3000);
penDown();
penDown();
delay(15);
penDown();
penDown();
penDown();
penUp() ;
penDown();
penDown();
penDown();
penDown();
penUp() ;
penDown();
penDown();
penUp() ;
penDown();
penUp() ;
penDown();
penUp() ;
penDown();
penDown();
penUp() ;
digitalWrite(led, LOW);
delay(3000);
digitalWrite(led, HIGH);
delay(3000);
penDown();
penDown();
delay(15);
penUp() ;
penUp() ;
penDown();
penUp() ;
penDown();
penUp() ;
penUp() ;
penDown();
penUp() ;
penDown();
penUp() ;
penDown();
penDown();
penUp() ;
penDown();
penDown();
penDown();
penUp() ;
delay(50);
digitalWrite(led, LOW);
delay(50);
digitalWrite(led, HIGH);
delay(50);
digitalWrite(led, LOW);
delay(50);
digitalWrite(led, HIGH);
delay(50);
digitalWrite(led, LOW);
delay(50);
digitalWrite(led, HIGH);
delay(5000);
digitalWrite(led, HIGH);
delay(50);
digitalWrite(led, LOW);
delay(50);
digitalWrite(led, HIGH);
delay(50);
digitalWrite(led, LOW);
delay(50);
digitalWrite(led, HIGH);
delay(50);
digitalWrite(led, LOW);
delay(50);
}
void penUp()
{
deg=169;
myservo.write(deg);
delay(14);
}
void penDown()
{
deg=159;
myservo.write(deg);
delay(14);
}
So the idea is to use the word word image[12] technique instead of that. If you have any idea why the first code don't work you're welcome.
Thanks
ps : I use the arduino Uno but I don't think that's relevant for the problem