De nuevo gracias por los consejos. He echado un vistazo a lo que me sugieres y no sabía por donde agarrarlo. Al final he decidido tirar por la idea de hacer un programa en Arduino con la filosofía de LOGO. Intentaba dibujar una cruz de Malta y algo parecido ha salido. A pesar de los cálculos para los motores PAP se pierden muchos decimales en los bucles y queda algo aproximado.

<iframe width="800" height="400" src="//www.youtube.com/embed/KABQFkrpmV8" frameborder="0" allowfullscreen=""></iframe>
#include <MeOrion.h>
#include <Arduino.h>
#include <SoftwareSerial.h>
#include <Wire.h>
MeStepper stepper1(PORT_1);
MeStepper stepper2(PORT_2);
MePort port_1(PORT_7);
Servo pluma;
MeLEDMatrix Matrix_1(PORT_6);
int pinpluma = port_1.pin2();
int dirPin1 = mePort[PORT_1].s1;
int stpPin1 = mePort[PORT_1].s2;
int dirPin2 = mePort[PORT_2].s1;
int stpPin2 = mePort[PORT_2].s2;
uint8_t ojos[16]={24,36,66,90,90,66,36,24,24,36,66,90,90,66,36,24};
uint8_t ojo[16]={24,36,66,90,90,66,36,24,24,24,36,60,60,36,24,24};
void setup(){
Serial.begin(9600);
pinMode(dirPin1, OUTPUT);
pinMode(stpPin1, OUTPUT);
pinMode(dirPin2, OUTPUT);
pinMode(stpPin2, OUTPUT);
pluma.attach(pinpluma);
pluma.write(150);
Matrix_1.setBrightness(Brightness_8);
Matrix_1.setColorIndex(1);
delay(1000);
}
void loop(){
Matrix_1.drawBitmap(0, 0, sizeof(ojos), ojos);
gira_iz(60);
baja_pluma();
diabolo();
gira_de(90);
diabolo();
sube_pluma();
retrocede(20);
gira_de(20);
parpadeo();
parpadeo();
while (1==1){}
}
void parpadeo(){
Matrix_1.drawBitmap(0, 0, sizeof(ojo), ojo);
delay (300);
Matrix_1.drawBitmap(0, 0, sizeof(ojos), ojos);
delay (300);
Matrix_1.drawBitmap(0, 0, sizeof(ojo), ojo);
delay (300);
Matrix_1.drawBitmap(0, 0, sizeof(ojos), ojos);
}
void diabolo(){
avanza(10);
gira_iz(120);
avanza(10);
gira_iz(120);
avanza(20);
gira_de(120);
avanza(10);
gira_de(120);
avanza(10);
}
void gira_de(int grados){
digitalWrite(dirPin1,1);
digitalWrite(dirPin2,1);
delay(50);
for(int i=0;i<grados*20;i++){
digitalWrite(stpPin1, HIGH);
digitalWrite(stpPin2, HIGH);
delayMicroseconds(800);
digitalWrite(stpPin1, LOW);
digitalWrite(stpPin2, LOW);
delayMicroseconds(800);
}
}
void gira_iz(int grados){
digitalWrite(dirPin1,0);
digitalWrite(dirPin2,0);
delay(50);
for(int i=0;i<grados*20;i++){
digitalWrite(stpPin1, HIGH);
digitalWrite(stpPin2, HIGH);
delayMicroseconds(800);
digitalWrite(stpPin1, LOW);
digitalWrite(stpPin2, LOW);
delayMicroseconds(800);
}
}
void avanza(int cm){
digitalWrite(dirPin1,1);
digitalWrite(dirPin2,0);
delay(50);
for(int i=0;i<cm*158;i++){
digitalWrite(stpPin1, HIGH);
digitalWrite(stpPin2, HIGH);
delayMicroseconds(800);
digitalWrite(stpPin1, LOW);
digitalWrite(stpPin2, LOW);
delayMicroseconds(800);
}
}
void retrocede(int cm){
digitalWrite(dirPin1,0);
digitalWrite(dirPin2,1);
delay(50);
for(int i=0;i<cm * 158;i++){
digitalWrite(stpPin1, HIGH);
digitalWrite(stpPin2, HIGH);
delayMicroseconds(800);
digitalWrite(stpPin1, LOW);
digitalWrite(stpPin2, LOW);
delayMicroseconds(800);
}
}
void sube_pluma(){
pluma.write(150);
}
void baja_pluma(){
pluma.write(90);
}
De nuevo gracias por los consejos. He echado un vistazo a lo que me sugieres y no sabía por donde agarrarlo. Al final he decidido tirar por la idea de hacer un programa en Arduino con la filosofía de LOGO. Intentaba dibujar una cruz de Malta y algo parecido ha salido. A pesar de los cálculos para los motores PAP se pierden muchos decimales en los bucles y queda algo aproximado.

[https://youtu.be/KABQFkrpmV8](http://Video dibujando "Cruz de Malta")
````
/********************************************
* Programa para controlar el mCar del mBotDraw mediante software externo
* Dibuja la cruz de Malta
* *incluye animacion de led-matrix
* JHG julio 2016
****************************************/
#include <MeOrion.h>
#include <Arduino.h>
#include <SoftwareSerial.h>
#include <Wire.h>
MeStepper stepper1(PORT_1);
MeStepper stepper2(PORT_2);
MePort port_1(PORT_7); // para el servo
Servo pluma; // crea el objeto pluma para el control del servo
MeLEDMatrix Matrix_1(PORT_6);
// ---------movimiento lineal-----------
// diametro rueda: 64,5 mm
// pasos/vuelta: 200 x 16 = 3200 (driver en HHH)
// avance/vuelta: 64,5 x 3,14 = 202,5 mm
// pasos/cm: 3200/20,25 = 158
// ------------ giros --------------
// distancia entre ruedas: 140 mm
// arco 90º: 2 x 3,14 X 140/ 4 = 219,8 mm
// arco de 1º: 219,8/90 = 2,44mm
// pasos por grado: 2,44 x 15,8 = 38,58 (39)
// girando las 2 ruedas: 38,58/2 = 19,29 (19)
int pinpluma = port_1.pin2(); // para el control del pin del servo por el puerto
int dirPin1 = mePort[PORT_1].s1;// PORT1 SLOT1
int stpPin1 = mePort[PORT_1].s2;// PORT1 SLOT2
int dirPin2 = mePort[PORT_2].s1; // idem PORT_2
int stpPin2 = mePort[PORT_2].s2;// idem PORT_2
uint8_t ojos[16]={24,36,66,90,90,66,36,24,24,36,66,90,90,66,36,24};
uint8_t ojo[16]={24,36,66,90,90,66,36,24,24,24,36,60,60,36,24,24};
//=================================
void setup(){
Serial.begin(9600);
pinMode(dirPin1, OUTPUT);
pinMode(stpPin1, OUTPUT);
pinMode(dirPin2, OUTPUT);
pinMode(stpPin2, OUTPUT);
pluma.attach(pinpluma); // pin que controlara el servo
pluma.write(150); // posicion inicial, pluma arriba
Matrix_1.setBrightness(Brightness_8);
Matrix_1.setColorIndex(1);
delay(1000); //tiempo para arranque de motor
}
//=================================
void loop(){
Matrix_1.drawBitmap(0, 0, sizeof(ojos), ojos);
gira_iz(60);
baja_pluma();
diabolo();
gira_de(90);
diabolo();
sube_pluma();
retrocede(20);
gira_de(20);
parpadeo();
parpadeo();
while (1==1){}
}
//=================================
void parpadeo(){
Matrix_1.drawBitmap(0, 0, sizeof(ojo), ojo);
delay (300);
Matrix_1.drawBitmap(0, 0, sizeof(ojos), ojos);
delay (300);
Matrix_1.drawBitmap(0, 0, sizeof(ojo), ojo);
delay (300);
Matrix_1.drawBitmap(0, 0, sizeof(ojos), ojos);
}
void diabolo(){
avanza(10);
gira_iz(120);
avanza(10);
gira_iz(120);
avanza(20);
gira_de(120);
avanza(10);
gira_de(120);
avanza(10);
}
void gira_de(int grados){
digitalWrite(dirPin1,1);
digitalWrite(dirPin2,1);
delay(50);
for(int i=0;i<grados*20;i++){
digitalWrite(stpPin1, HIGH);
digitalWrite(stpPin2, HIGH);
delayMicroseconds(800);
digitalWrite(stpPin1, LOW);
digitalWrite(stpPin2, LOW);
delayMicroseconds(800);
}
}
void gira_iz(int grados){
digitalWrite(dirPin1,0);
digitalWrite(dirPin2,0);
delay(50);
for(int i=0;i<grados*20;i++){
digitalWrite(stpPin1, HIGH);
digitalWrite(stpPin2, HIGH);
delayMicroseconds(800);
digitalWrite(stpPin1, LOW);
digitalWrite(stpPin2, LOW);
delayMicroseconds(800);
}
}
void avanza(int cm){
digitalWrite(dirPin1,1);
digitalWrite(dirPin2,0);
delay(50);
for(int i=0;i<cm*158;i++){
digitalWrite(stpPin1, HIGH);
digitalWrite(stpPin2, HIGH);
delayMicroseconds(800);
digitalWrite(stpPin1, LOW);
digitalWrite(stpPin2, LOW);
delayMicroseconds(800);
}
}
void retrocede(int cm){
digitalWrite(dirPin1,0);
digitalWrite(dirPin2,1);
delay(50);
for(int i=0;i<cm * 158;i++){
digitalWrite(stpPin1, HIGH);
digitalWrite(stpPin2, HIGH);
delayMicroseconds(800);
digitalWrite(stpPin1, LOW);
digitalWrite(stpPin2, LOW);
delayMicroseconds(800);
}
}
void sube_pluma(){
pluma.write(150);
}
void baja_pluma(){
pluma.write(90);
}
````
editado 8 Jul '16 a las 9:44 am