joi, 30 ianuarie 2014

DESENE CU ARDUINO SI PROCESSING...


     Chiar daca titlul suna putin cam pompos, in definitiv, cu aplicatia pe care o voi prezenta in cele ce urmeaza se poate face un desen. Ideea care sta la baza este o jucarie denumita "etch a sketch" cu care se pot face desene numai cu linii orizontale si verticale. Probabil ca veti zice ca nu e mare lucru. Cautati de curiozitate pe Google si veti gasi adevarate opere de arta facute cu aceasta jucarie. Dar mai bine sa revenim la oile noastre.
    In primul rand dovada :)


      Ca de obcei vom utiliza un Arduino Mega 2560 la care vom lega 4 butoane si 4 leduri. Fiecare buton comanda  miscarea intr-o anumita directie (sus, jos, stanga, dreapta), butoanele avand roulul de a semnaliza apasarea unui buton. Dupa fiecare apasare se va trimite un cod pe care programul realizat in Processing il va interpreta rezultatul fiind desenarea pe ecran a unei linii: fie orizontala fie verticala.



     Cele doua butoane fac exact ceea ce scrie sub ele : unul sterge tot ce se afla pe ecran iar celalalt sterge ultima linie desenata. Probabil ar fi fost mult mai interesant daca desenul s-ar fi realizat cu doua potentiometre. Am incercat si aceasta varianta insa exista o problema cu calibrarea si cu cat de repede se invarte potentiometrul. O alta idee ar fi utilizarea encoderelor unui mouse cu bila dar timpul si mouse-ul pe care nu-l am nu mi-au permis un test. Nu voi comenta codul deoarce pentru Arduino este simplu si pana la urma scopul acestui blog este experienta cu microcontrollere sau cu electronica in general si nu programele scrise in Java (cu scrisul carora incerc cu greu sa ma descurc).

Cod Arduino:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int led_array[4]={24,26,28,30};
int b_array[4]={2,3,4,5};
String com[4]={"a","b","c","d"};
int i;

void setup(){

 Serial.begin(9600);
 for(i=0;i<2;i++){
  pinMode(led_array[i],OUTPUT);
  pinMode(b_array[i],INPUT);
 }
}

void loop(){
 for(int i=0;i<4;i++){
  if(digitalRead(b_array[i])){
   digitalWrite(led_array[i]);
   while(digitalRead(b_array[i])){
    Serial.write(com[i]);
    delay(250);//SE MODIFICA DELAY PT VITEZA 
                                           //MAI MARE DE DESEN
   }
  }
 }
}

Cod Processing program principal:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
/////SIMPLE DRAWING WITH ARDUINO//////
/////PETRESCU CRISTIAN///////////////
/////hobbyelectro.blogspot.com//////
/////JAN. 2014/////////////////////


import processing.serial.*;
color normal= color(0,255,0);
color pushed =color(255,0,0);
boolean ready;
boolean append;
boolean sort=true;
int xwindow=600;
int ywindow=600;
button reset = new button(50,560,60,20,"RESET");
button undo = new button(490,560,60,20,"UNDO");
pot ho =new pot(xwindow/2,ywindow/2);
color black = color(0);
color back =color(200);
IntList h_line;
String inString;
Serial arduino;

////////////DRAW MARKER///////////////////
void draw_marker(int x1,int y1){
  stroke(black);
  line(x1,y1,x1+3,y1+3);
  line(x1,y1,x1-3,y1+3);
}
////////////ADD VALUES TO LIST////////////
void append(int x,int y){
  h_line.append(x);
  h_line.append(y);
}
/////////////SETUP//////////////////////
void setup(){
  arduino = new Serial(this, Serial.list()[0], 9600);
  arduino.buffer(1);
  size(xwindow,ywindow);
  background(back);
  draw_marker(ho.newX,ho.newY);
  h_line=new IntList();
  h_line.append(xwindow/2);
  h_line.append(ywindow/2);
}
//////////////////DRAW///////////////////////////
void draw(){
  background(back);
  fill(normal);
  rect(reset.xpos,reset.ypos,reset.len,reset.wid);
  rect(undo.xpos,undo.ypos,undo.len,undo.wid);
  fill(0, 102, 153);
  text(reset.caption,reset.cX,reset.cY);
  text(undo.caption,undo.cX,undo.cY); 
  int k =h_line.size();
  draw_marker(h_line.get(k-2),h_line.get(k-1));
  if(ready){
    for(int i=0;i<k-2;i=i+2){
      line(h_line.get(i),h_line.get(i+1),h_line.get(i+2),h_line.get(i+3));
    }
  }
  sort=true;
}
/////SERIAL EVENT/////////////////////
void serialEvent(Serial arduino) { 
  inString = arduino.readString();
  if(sort){
    sort=false;
    if(inString.equals("l")&&ho.newX>0){
      ho.refresh(ho.newX-5,ho.newY);
      append(ho.newX,ho.newY);
    }
    if(inString.equals("r")&&ho.newX<600){
      ho.refresh(ho.newX+5,ho.newY);
      append(ho.newX,ho.newY);
    }
    if(inString.equals("u")&&ho.newY>0){
      ho.refresh(ho.newX,ho.newY-5);
      append(ho.newX,ho.newY);
    }
    if(inString.equals("d")&&ho.newY<550){
      ho.refresh(ho.newX,ho.newY+5);
      append(ho.newX,ho.newY);
    }
    ready=true;    
    }
 }
/////////////CLICK MOUSE///////////////////////////////
void mouseClicked(){
  if((mouseX<(reset.xpos+reset.len)&&mouseX>reset.xpos)&&
    (mouseY<(reset.ypos+reset.wid)&&mouseY>reset.ypos)){
      h_line.clear();
      h_line.append(xwindow/2);
      h_line.append(ywindow/2);
      ho.newX=xwindow/2;
      ho.newY=ywindow/2;
   }
   if((mouseX<(undo.xpos+undo.len)&&mouseX>undo.xpos)&&
    (mouseY<(undo.ypos+reset.wid)&&mouseY>undo.ypos)){
      int k=h_line.size();
      if(k>=4){
        h_line.remove(k-1);
        h_line.remove(k-2);
        ho.newX=h_line.get(k-4);
        ho.newY=h_line.get(k-3);
      }  
   }
}

    Cod Processing clasa "pot":


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class pot{
  public int newX;
  public int newY;
  public pot(int ox, int oy){
    this.newX=ox;
    this.newY=oy;
  }
  void refresh(int rx, int ry){
    this.newX=rx;
    this.newY=ry;
  }
}

    Cod Processing clasa "button":

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class button{
  int xpos,ypos,len,wid, cX,cY;
  String caption;
  //color normal= color(0,255,0);
  //color pushed color(255,0,0);
  button(int x, int y, int l, int w, String text){
    this.xpos=x;
    this.ypos=y;
    this.len=l;
    this.wid=w;
    this.caption=text;
    this.cX=x;
    this.cY=captionY();
  }
  int centerX(){
    int x=this.xpos+(this.len/2);
    return x;
  }
  int centerY(){
    int y=this.ypos+(this.wid/2);
    return y;
  }
  int captionX(){
    int cX=this.xpos;
    return cX;
  }
  int captionY(){
    int cY=this.ypos+this.wid+15;
    return cY;
  }

   Cei care doresc pot descarca codul de aici.
   Succes! Si pentru cei napastuiti (ca mine) BAFTA LA EXAMENE !!!

2 comentarii: