Внешний вид Drawing Robot

В принципе робот может рисовать по сгенерированному коду. Не меняя код, благодаря векторному способу рисования, рисуемое можно масштабировать и отзеркаливать.


Что то надо придумывать для отрисовки изображений из нескольких линий (робот накапливает ошибки в углах поворота и неминуемо искажает источник).
93d5e3087a0c06a8440dbd2a3b71f060
Но главный вопрос - как эти контурные изображения получают?, из фоток или картинок :slight_smile: Мысль, что это рука художника мне чужда. Встречал кто приложения для перевода картинок-фоток в рисунки линией-контуром?

ту явно Пикассо поработал )))

Ну, значит, это не для тебя.


Не, тут другая механика-оптика, сквозь хрустальную посуду вид :slight_smile:

Как хорошо когда есть женщины! Бац и делов то :slight_smile:

Видеть очевидное это талант !


Наигрался, для обучения робот очень полезный. Как пример рисовалок скетч выкладываю.

Спойлер
// робот рисовальщик - управление ИК пультом от триколор
#include <Servo.h>
#include <IRremote.h>
//
#define plus A2 //
#define minus A1 //

int RECV_PIN = A0;               // Pin, an den der Empf�nger angeschlossen ist
IRrecv irrecv(RECV_PIN);         // Instanz der Receiver-Klasse
decode_results results;          // Zur Aufnahme des ermittelsten Codes
/////////
long Y=0;//переменная хранения моментов времени
byte FLAG=0;//
int k=0;//переменная хранения и записи числовых данных по углу и дистанции
int kk=0;//переменная хранения и записи числовых данных по углу при рисовании дуги
//
float M=1.0;// множитель для регулировки размера рисуемого изображения
bool Z=false;// переменная-флаг для возможности зеркального отражения при рисовании
// setup servo
int servoPin = 8;
int PEN_DOWN = 80; // angle of servo when pen is down
int PEN_UP = 20;   // angle of servo when pen is up
Servo penServo;

//float wheel_dia=66.0; //    # mm (increase = spiral out)
//float wheel_base=110.0; //    # mm (increase = spiral in, ccw) 
//int steps_rev=512; //        # 512 for 64x gearbox, 128 for 16x gearbox
int delay_time=4; //         # time between steps in ms

// Stepper sequence org->pink->blue->yel (оранжевый,розовый,синий,жёлтый)
int L_stepper_pins[] = {12, 10, 9, 11};
int R_stepper_pins[] = {4, 6, 7, 5};

int fwd_mask[][4] =  {{1, 0, 1, 0},
                      {0, 1, 1, 0},
                      {0, 1, 0, 1},
                      {1, 0, 0, 1}};

int rev_mask[][4] =  {{1, 0, 0, 1},
                      {0, 1, 0, 1},
                      {0, 1, 1, 0},
                      {1, 0, 1, 0}};


void setup() {
   irrecv.enableIRIn(); // Startet den Receiver
 // randomSeed(analogRead(1)); 
 // Serial.begin(9600);
  for(int pin=0; pin<4; pin++){
    pinMode(L_stepper_pins[pin], OUTPUT);
    digitalWrite(L_stepper_pins[pin], LOW);
    pinMode(R_stepper_pins[pin], OUTPUT);
    digitalWrite(R_stepper_pins[pin], LOW);
  }
pinMode(plus,OUTPUT);//
digitalWrite(plus,HIGH);// плюс питания ик приёмника
pinMode(minus,OUTPUT);//
digitalWrite(minus,LOW);// минус питания ик приёмника

  penServo.attach(servoPin);
   penServo.write(PEN_UP);
  //Serial.println("setup");
 // penup();//вверх маркер
 // delay(2000);
}


void loop(){ 
  ///////////////////////////////////
  if (irrecv.decode(&results))   //Если произошло событие/кнопка была нажата
  {
    switch ( results.value )
    {
   //////////////////////////
    case 0x8A857://исполнить команду вперёд
  if(k==0){
   FLAG=1;
      Y=millis();}
      else{backward(k);k=0;done();}  
        break;
     case 0x88877://исполнить команду назад
   if(k==0){
    FLAG=2; 
      Y=millis();}
      else{ forward(k);k=0;done();}   
        break;  
      case  0x848B7://исполнить команду вправоright(k);
   if(k==0){
     FLAG=3;
      Y=millis();}
      else{left(k);k=0;done();}   
        break; 
   case  0x828D7://исполнить команду влево
   if(k==0){
     FLAG=4;
      Y=millis();}
      else{right(k);k=0;done();}   
        break;             
     case 0xFFFFFFFF:// если кнопку удерживают, то не отключать команду ещё 200 мс
      Y=millis();
        break;
    ///////другая вариация пульта 
     case  0x8B04F://рисовать дугу вправо вперёд
   if(k!=0&&kk!=0){
    duga(k,kk,1,1);k=0;kk=0;} 
    break;
     case  0x818E7://рисовать дугу влево вперёд
   if(k!=0&&kk!=0){
    duga(k,kk,1,0);k=0;kk=0;} 
    break;
     case  0x86897://рисовать дугу вправо назад
   if(k!=0&&kk!=0){
    duga(k,kk,0,0);k=0;kk=0;} 
    break;
     case 0x8827D://рисовать дугу влево назад
   if(k!=0&&kk!=0){
    duga(k,kk,0,1);k=0;kk=0;} 
    break;                     
     ////////////////////////////
     case 0x8C837://кнопка OK - управление маркером
      if( penServo.read()==PEN_DOWN){ penup();}//вверх маркер
      else{
      if(penServo.read()==PEN_UP){ pendown();}//вниз маркер
      }
        break; 
     ////////////////////////////
      case 0x8C03F://кнопка 1
      k=10*k+1;if(k>999){k=0;}delay(250);
        break;
    case 0x820DF://кнопка 2
     k=10*k+2;if(k>999){k=0;}delay(250);
        break;
    case 0x8A05F://кнопка 3
     k=10*k+3;if(k>999){k=0;}delay(250);
        break;
    case 0x8609F://кнопка 4
    k=10*k+4;if(k>999){k=0;}delay(250);
        break;
    case 0x8E01F://кнопка 5
   k=10*k+5;if(k>999){k=0;}delay(250);
        break;
    case 0x810EF://кнопка 6
     k=10*k+6;if(k>999){k=0;}delay(250);
        break;
      case 0x8906F://кнопка 7
     k=10*k+7;if(k>999){k=0;}delay(250);
        break;
   case 0x850AF://кнопка 8
     k=10*k+8;if(k>999){k=0;}delay(250);  
        break;
   case 0x8D02F://кнопка 9
     k=10*k+9;if(k>999){k=0;}delay(250);
        break;
     case 0x830CF://кнопка 0
     k=10*k+0;if(k>999){k=0;}delay(250);  
        break;        
    /////////////////////////// 
     case 0x838C7://кнопка красная - рисование выбранного изображения
    if(k==1){ komanda_1();k=0;}//рис.из приложения сова
    if(k==2){ komanda_2();k=0;}//рис.из приложения волк
    if(k==3){ komanda_3();k=0;}//рис.из приложения кролик
        break;    
     case 0x8B847://кнопка зелёная - внесение данных по углу поворота при командном рисовании дуги
    kk=k;k=0;delay(250);
        break;        
     case 0x858A7://кнопка жёлтая 
     delay(400);
     if(M==1.0){M=1.3;}else{M=1.0;}//трансформация изображения которое будут рисовать (увеличиваем размер)
        break;        
      case 0x87887://кнопка синяя
      delay(400); 
     if(Z==false){Z=true;}else{Z=false;}//трансформация изображения которое будут рисовать (зеркальное отражение)
        break;                    
    ///////////////////////////          
    }
    irrecv.resume();//Считываем следующую значение/кнопку
   }
   if(millis()-Y>200){ FLAG=0;}//если кнопка не удерживается, то через 200 мс отключить команду  
  ///////////////////////////////////
  for(int mask=0; mask<4; mask++){
      for(int pin=0; pin<4; pin++){
        if(FLAG==2){
        digitalWrite(L_stepper_pins[pin], fwd_mask[mask][pin]);
        digitalWrite(R_stepper_pins[pin], rev_mask[mask][pin]);
           } 
         if(FLAG==1){
        digitalWrite(L_stepper_pins[pin], rev_mask[mask][pin]);
        digitalWrite(R_stepper_pins[pin], fwd_mask[mask][pin]);
           } 
         if(FLAG==4){
        digitalWrite(R_stepper_pins[pin], fwd_mask[mask][pin]);
        digitalWrite(L_stepper_pins[pin], fwd_mask[mask][pin]);
           } 
         if(FLAG==3){
        digitalWrite(R_stepper_pins[pin], rev_mask[mask][pin]);
        digitalWrite(L_stepper_pins[pin], rev_mask[mask][pin]);
           }       
         if(FLAG==0){
        digitalWrite(R_stepper_pins[pin], LOW);
        digitalWrite(L_stepper_pins[pin], LOW);
           }                 
      }
      delay(delay_time);
    } 
  ///////////////////////////////////
}



///////////////////////////////////////
void forward(float distance){
 distance=distance*M;  
 // int steps = step(distance);
    int steps =distance/0.40;
  for(int step=0; step<steps; step++){
    for(int mask=0; mask<4; mask++){
      for(int pin=0; pin<4; pin++){
        digitalWrite(L_stepper_pins[pin], fwd_mask[mask][pin]);
        digitalWrite(R_stepper_pins[pin], rev_mask[mask][pin]);
      }
      delay(delay_time);
    } 
  }
}
/////////////////////////////////////////
void  backward(float distance){
 distance=distance*M; 
 // int steps = step(distance);
    int steps =distance/0.40;
 // Serial.println(steps);
  for(int step=0; step<steps; step++){
    for(int mask=0; mask<4; mask++){
      for(int pin=0; pin<4; pin++){
        digitalWrite(L_stepper_pins[pin], rev_mask[mask][pin]);
        digitalWrite(R_stepper_pins[pin], fwd_mask[mask][pin]);
      }
      delay(delay_time);
    } 
  }
}
//////////////////////////////////////////
void left(float degrees){
 if(Z==true){Z=false;right(degrees);Z=true;}else{
 // float rotation = degrees / 360.0;
 // float distance = wheel_base * 3.1412 * rotation;
 // int steps = step(distance);
    int steps =degrees/0.42;
  for(int step=0; step<steps; step++){
    for(int mask=0; mask<4; mask++){
      for(int pin=0; pin<4; pin++){
        digitalWrite(R_stepper_pins[pin], rev_mask[mask][pin]);
        digitalWrite(L_stepper_pins[pin], rev_mask[mask][pin]);
      }
      delay(delay_time);
    } 
  }
  }   
}

/////////////////////////////////////////
void right(float degrees){
  if(Z==true){Z=false;left(degrees);Z=true;}else{
 // float rotation = degrees / 360.0;
 // float distance = wheel_base * 3.1412 * rotation;
 // int steps = step(distance);
  int steps =degrees/0.42;
  for(int step=0; step<steps; step++){
    for(int mask=0; mask<4; mask++){
      for(int pin=0; pin<4; pin++){
        digitalWrite(R_stepper_pins[pin], fwd_mask[mask][pin]);
        digitalWrite(L_stepper_pins[pin], fwd_mask[mask][pin]);
      }
      delay(delay_time);
    } 
  }
 }   
}


void done(){ // unlock stepper to save battery
  for(int mask=0; mask<4; mask++){
    for(int pin=0; pin<4; pin++){
      digitalWrite(R_stepper_pins[pin], LOW);
      digitalWrite(L_stepper_pins[pin], LOW);
    }
    delay(delay_time);
  }
}
////////////////////
void penup(){//вверх маркер
  penServo.attach(servoPin);
  for(int i=PEN_DOWN;i>=PEN_UP;i--){
  penServo.write(i);
  delay(2*delay_time/1);
  }
 penServo.detach(); 
}
///////////////////
void pendown(){//вниз маркер
  penServo.attach(servoPin);
for(int i=PEN_UP;i<=PEN_DOWN;i++){
  penServo.write(i);
  delay(2*delay_time/1);
  } 
 penServo.detach(); 
}

////////////////////
void  duga(float L,float a,bool KL,bool Ka){//функция отрисовки дуги длиной L мм и углом поворота a градусов,KL=1,0-вперёд назад,Ka=1,0-вправо,влево
  
 int NL= L/0.40; int Na=a/0.42;//общее число шагов при прямолинейном движении и повороте маркера на дуге 
 //(Lш=0.40 мм; aш=0.42 градуса - прямолинейное перемещение и угол поворота маркера при одном шаге моторов )
 //Lш=3.14*d/N;aш=360*d/(N*D) где d- диаметр колеса (66мм); N-число шагов мотора на полный оборот (512);D- расстояние между колёсами (110мм)
 
 int nL=10; int na=Na*nL/NL;//число шагов моторов при прямолинейном движении и повороте для одного минишага при рисовании 
 for(int schag=0;schag<NL+Na;schag++){
 for(int mask=0; mask<4; mask++){
      for(int pin=0; pin<4; pin++){
        if(KL==1&&schag%(nL+na)<nL){//вперёд
        digitalWrite(L_stepper_pins[pin], fwd_mask[mask][pin]);
        digitalWrite(R_stepper_pins[pin], rev_mask[mask][pin]);
           }
       if(KL==0&&schag%(nL+na)<nL){//назад
        digitalWrite(L_stepper_pins[pin], rev_mask[mask][pin]);
        digitalWrite(R_stepper_pins[pin], fwd_mask[mask][pin]);
           }     
         if(Ka==1&&schag%(nL+na)>=nL){//вправо
        digitalWrite(R_stepper_pins[pin], fwd_mask[mask][pin]);
        digitalWrite(L_stepper_pins[pin], fwd_mask[mask][pin]);
           }
       if(Ka==0&&schag%(nL+na)>=nL){//влево
        digitalWrite(R_stepper_pins[pin], rev_mask[mask][pin]);
        digitalWrite(L_stepper_pins[pin], rev_mask[mask][pin]);
           }         
      }
    delay(delay_time);   
 }
  } 
               
}
////////////////////
//функции рисования готовых картинок
////////////////////
void komanda_1(){//сова
  M=1.0;//
left(136);forward(107);
pendown();
right(165);forward(71);
right(7);forward(20);
right(15);forward(27);
right(13);forward(16);
right(13);forward(15);
right(24);forward(8);
right(86);forward(4);
right(61);forward(6);
right(26);forward(9);
right(17);forward(10);
right(33);forward(10);
right(30);forward(13);
right(21);forward(11);
right(33);forward(6);
right(149);forward(8);
left(23);forward(9);
left(23);forward(8);
left(44);forward(5);
left(68);forward(7);
left(39);forward(7);
left(16);forward(5);
left(37);forward(5);
left(67);forward(4);
left(75);forward(5);//
left(59);forward(3);
left(80);forward(6);
left(31);forward(5);
left(9);forward(6);
left(20);forward(6);
left(23);forward(6);
left(40);forward(4);
left(76);forward(4);
left(60);forward(7);
left(37);forward(11);
right(2);forward(22);
left(17);forward(10);
right(2);forward(6);
left(92);forward(6);
left(68);forward(4);
left(29);forward(6);//
left(30);forward(10);//
left(20);forward(8);//
left(24);forward(5);
left(55);forward(3);
left(56);forward(3);
left(54);forward(7);//
left(70);forward(3);
left(87);forward(10);
right(57);forward(5);
//метка
left(70);forward(5);
left(36);forward(4);
left(3);forward(7);
left(148);forward(8);
right(40);forward(4);
right(40);forward(11);
left(37);forward(6);
left(46);forward(7);
left(36);forward(10);
right(158);forward(11);
right(20);forward(8);
//метка
right(28);forward(16);//
right(28);forward(7);//
right(7);forward(15);
right(14);forward(32);
left(12);forward(34);
left(20);forward(26);
left(28);forward(18);
left(56);forward(7);
left(57);forward(12);
left(30);forward(15);
left(13);forward(19);
left(15);forward(11);
left(13);forward(7);
left(100);forward(3);//
left(52);forward(8);
left(23);forward(9);
left(13);forward(11);
left(19);forward(8);
left(44);forward(7);
left(60);forward(10);//
left(24);forward(12);
left(9);forward(18);
left(16);forward(15);
left(28);forward(6);
left(99);forward(3);//
left(28);forward(5);
left(21);forward(7);
left(31);forward(9);
left(31);forward(7);
left(68);forward(10);//
left(43);forward(10);
left(15);forward(13);
left(14);forward(7);
left(14);forward(5);
left(120);forward(3);//
left(34);forward(5);
left(44);forward(5);
left(51);forward(4);
left(53);forward(7);
left(23);forward(13);
left(13);forward(13);
penup();
right(67);forward(125);
M=1.0;//
done(); // отключить ток в обмотках моторов (отпустить роторы)
}
///////////////////
void komanda_2(){//волк
 right(55);forward(56);
pendown();
right(24);forward(13);
right(14);forward(11);
right(26);forward(8);
right(44);forward(6);
right(53);forward(5);
right(58);forward(8);
right(45);forward(6);
right(60);forward(13);
right(19);forward(14);
right(136);forward(8);
left(35);forward(6);
left(12);forward(7);
right(8);forward(5);
right(41);forward(6);
left(55);forward(5);
right(9);forward(7);
left(20);forward(7);
right(96);forward(4);
right(11);forward(5);
right(38);forward(8);
right(30);forward(8);
left(9);forward(10);
left(19);forward(9);
left(13);forward(8);
//метка
left(10);forward(24);
left(4);forward(14);
left(9);forward(12);
right(1);forward(8);
right(1);forward(13);
right(160);forward(12);
right(1);forward(19);
left(9);forward(22);
left(13);forward(12);
left(30);forward(8);
left(65);forward(10);
left(55);forward(8);
left(19);forward(10);
left(27);forward(11);
left(23);forward(10);
left(27);forward(10);
left(3);forward(10);
right(20);forward(8);
right(19);forward(7);
right(18);forward(5);
right(19);forward(6);
left(163);forward(11);
left(33);forward(11);
left(19);forward(10);
left(42);forward(8);
right(111);forward(15);
left(9);forward(9);
left(28);forward(8);
left(36);forward(13);
left(24);forward(10);
left(26);forward(14);
//метка
left(17);forward(14);
right(6);forward(11);
right(8);forward(16);
right(6);forward(15);
right(15);forward(18);
right(16);forward(14);
right(20);forward(10);
right(17);forward(12);
left(162);forward(12);
left(30);forward(7);
left(3);forward(12);
left(21);forward(13);
right(1);forward(14);
right(17);forward(9);
right(36);forward(10);
right(26);forward(8);
right(33);forward(12);
right(2);forward(19);
left(6);forward(19);
left(13);forward(24);
right(158);forward(27);
right(29);forward(12);
left(17);forward(15);
left(2);forward(14);
right(21);forward(15);
//метка
right(19);forward(15);
right(18);forward(17);
right(20);forward(11);
right(50);forward(10);
right(35);forward(9);
right(23);forward(13);
right(22);forward(25);
left(106);forward(36);
right(157);forward(22);
penup();
right(17);forward(89);
done(); // отключить ток в обмотках моторов (отпустить роторы)  
}
///////////////////
void komanda_3(){//кролик
 M=0.7;
right(110);forward(59);
pendown();
right(172);forward(17);
left(18);forward(10);
left(14);forward(12);
left(25);forward(12);
left(33);forward(11);
left(41);forward(10);
left(10);forward(11);
left(17);forward(16);
right(143);forward(12);
left(12);forward(7);
left(37);forward(8);
left(55);forward(6);
left(54);forward(9);
left(24);forward(23);
right(1);forward(22);
left(17);forward(11);
left(33);forward(9);
left(15);forward(9);
right(7);forward(8);
right(51);forward(5);
right(65);forward(9);
right(36);forward(7);
right(39);forward(7);
right(38);forward(7);
right(89);forward(17);
right(18);forward(13);
//метка
left(20);forward(18);//
left(11);forward(20);//
left(11);forward(20);
left(15);forward(22);
left(5);forward(16);
left(20);forward(16);
left(7);forward(13);//
left(3);forward(11);
right(43);forward(7);
right(57);forward(12);
right(22);forward(9);
left(7);forward(18);
left(11);forward(19);
left(13);forward(10);
left(73);forward(6);
left(49);forward(9);
left(20);forward(14);
left(9);forward(17);
right(157);forward(18);
left(4);forward(10);
left(63);forward(4);
left(69);forward(6);
left(25);forward(9);
left(17);forward(16);
right(4);forward(17);
right(45);forward(12);
left(2);forward(14);
left(14);forward(11);
left(18);forward(9);
left(23);forward(10);
left(28);forward(5);
left(39);forward(15);
left(9);forward(14);//
left(23);forward(16);
left(44);forward(12);
left(24);forward(9);
left(52);forward(12);
left(49);forward(11);
//метка
left(40);forward(18);//
left(38);forward(19);//
left(27);forward(14);//
left(18);forward(17);//
left(31);forward(15);
left(12);forward(13);
right(27);forward(5);
right(63);forward(5);
right(33);forward(11);
left(30);forward(7);
left(29);forward(6);
left(94);forward(9);
left(5);forward(12);
left(15);forward(10);
left(29);forward(12);
left(5);forward(7);
right(65);forward(24);
left(5);forward(7);
M=1;  
penup();
done(); // отключить ток в обмотках моторов (отпустить роторы)   
}
//////////////////////////
1 лайк