Наигрался, для обучения робот очень полезный. Как пример рисовалок скетч выкладываю.
Спойлер
// робот рисовальщик - управление ИК пультом от триколор
#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(); // отключить ток в обмотках моторов (отпустить роторы)
}
//////////////////////////