Hola,

Tengo un programa que yo creo que esta bien codificado pero hace algo erroneo.

Mi objetivo con el programa es que el mbotRanger cuando esta a oscuras toque la cancion de StarWars que viene en el libro de mbot. Ademas indepentientemente de que este a oscuras o en luz que siga recto hasta evitar los obstaculos.

El problema que me ocurre es que cuando esta en modo de que hay luz el mbotRanger va recto y evita obstaculos bien. Pero cuando entra en modo oscuras hecha para atras y despues de eso se queda tocando la cancion y a la vez girando constantemente.

Y si enciendes la luz vuelve funcionar como se le espera. Adjunto foto con el codigo del programa. Por si alguien sabe decirme que esta mal en el codigo o a que se debe que haga lo que dije.

programaStarWars.bmp

Hola, Tengo un programa que yo creo que esta bien codificado pero hace algo erroneo. Mi objetivo con el programa es que el mbotRanger cuando esta a oscuras toque la cancion de StarWars que viene en el libro de mbot. Ademas indepentientemente de que este a oscuras o en luz que siga recto hasta evitar los obstaculos. El problema que me ocurre es que cuando esta en modo de que hay luz el mbotRanger va recto y evita obstaculos bien. Pero cuando entra en modo oscuras hecha para atras y despues de eso se queda tocando la cancion y a la vez girando constantemente. Y si enciendes la luz vuelve funcionar como se le espera. Adjunto foto con el codigo del programa. Por si alguien sabe decirme que esta mal en el codigo o a que se debe que haga lo que dije. [programaStarWars.bmp](serve/attachment&path=58c5ac41a05d9.bmp)

El código aparentemente está bien, el tema de la luz no debería variar tu control de movimiento, lo has independizado perfectamente.

No se me ocurre de donde puede venir el problema.

¿Podrías colgar el código de Arduino que se genera antes de subir a la placa?

Saludos,

Dani S.

El código aparentemente está bien, el tema de la luz no debería variar tu control de movimiento, lo has independizado perfectamente. No se me ocurre de donde puede venir el problema. ¿Podrías colgar el código de Arduino que se genera antes de subir a la placa? Saludos, Dani S.

include <Arduino.h>

include <Wire.h>

include <SoftwareSerial.h>

include <MeAuriga.h>

//Encoder Motor
MeEncoderOnBoard Encoder_1(SLOT1);
MeEncoderOnBoard Encoder_2(SLOT2);

void isr_process_encoder1(void)
{
if(digitalRead(Encoder_1.getPortB()) == 0){
Encoder_1.pulsePosMinus();
}else{
Encoder_1.pulsePosPlus();
}
}

void isr_process_encoder2(void)
{
if(digitalRead(Encoder_2.getPortB()) == 0){
Encoder_2.pulsePosMinus();
}else{
Encoder_2.pulsePosPlus();
}
}

void move(int direction, int speed)
{
int leftSpeed = 0;
int rightSpeed = 0;
if(direction == 1){
leftSpeed = -speed;
rightSpeed = speed;
}else if(direction == 2){
leftSpeed = speed;
rightSpeed = -speed;
}else if(direction == 3){
leftSpeed = -speed;
rightSpeed = -speed;
}else if(direction == 4){
leftSpeed = speed;
rightSpeed = speed;
}
Encoder_1.setTarPWM(leftSpeed);
Encoder_2.setTarPWM(rightSpeed);
}
void moveDegrees(int direction,long degrees, int speed_temp)
{
speed_temp = abs(speed_temp);
if(direction == 1)
{
Encoder_1.move(-degrees,(float)speed_temp);
Encoder_2.move(degrees,(float)speed_temp);
}
else if(direction == 2)
{
Encoder_1.move(degrees,(float)speed_temp);
Encoder_2.move(-degrees,(float)speed_temp);
}
else if(direction == 3)
{
Encoder_1.move(-degrees,(float)speed_temp);
Encoder_2.move(-degrees,(float)speed_temp);
}
else if(direction == 4)
{
Encoder_1.move(degrees,(float)speed_temp);
Encoder_2.move(degrees,(float)speed_temp);
}
}

double angle_rad = PI/180.0;
double angle_deg = 180.0/PI;
void controlMov(double segundosEspera);
MeUltrasonicSensor ultrasonic_10(10);
MeLightSensor lightsensor_12(12);
MeBuzzer buzzer;

void controlMov(double segundosEspera)
{
if((10) > (ultrasonic_10.distanceCm())){
move(2,100);
_delay(segundosEspera);
move(4,50);
_delay(segundosEspera);
}else{
move(1,100);
}
}

void setup(){
attachInterrupt(Encoder_1.getIntNum(), isr_process_encoder1, RISING);
attachInterrupt(Encoder_2.getIntNum(), isr_process_encoder2, RISING);
//Set Pwm 8KHz
TCCR1A = _BV(WGM10);
TCCR1B = _BV(CS11) | _BV(WGM12);
TCCR2A = _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(CS21);
buzzer.setpin(45);
}

void loop(){
if((lightsensor12.read()) < (10)){
for(int i=0;i<3;++i)
{
buzzer.tone(392, 500);
delay(20);
controlMov(1);
}
buzzer.tone(330, 250);
delay(20);
controlMov(1);
buzzer.tone(494, 125);
delay(20);
controlMov(1);
buzzer.tone(392, 500);
delay(20);
controlMov(1);
buzzer.tone(330, 250);
delay(20);
controlMov(1);
buzzer.tone(494, 125);
delay(20);
controlMov(1);
buzzer.tone(392, 1000);
delay(20);
controlMov(1);
for(int i=0;i<3;++_i
)
{
buzzer.tone(587, 500);
delay(20);
controlMov(1);
}
buzzer.tone(659, 250);
delay(20);
controlMov(1);
buzzer.tone(494, 125);
delay(20);
controlMov(1);
buzzer.tone(392, 500);
delay(20);
controlMov(1);
buzzer.tone(330, 250);
delay(20);
controlMov(1);
buzzer.tone(494, 125);
delay(20);
controlMov(1);
buzzer.tone(392, 1000);
delay(20);
controlMov(1);
}else{
controlMov(1);
}
_loop();
}

void _delay(float seconds){
long endTime = millis() + seconds * 1000;
while(millis() < endTime)_loop();
}

void _loop(){
Encoder_1.loop();
Encoder_2.loop();
}
0x00 0x00
lock 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00

     Programmer Type : Wiring
     Description     : Wiring
     Programmer Model: AVRISP
     Hardware Version: 15
     Firmware Version Master : 2.10
     Vtarget         : 0.0 V
     SCK period      : 0.1 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e9801
avrdude: reading input file "C:\DOCUME~1\Pedro\CONFIG~1\Temp\build3521077687409193779.tmp/project_ESQUIVAOBSTACULOSCONSTARWARS2_0.cpp.hex"
avrdude: writing flash (14586 bytes):

Writing | ################################################## | 100% 2.27s

avrdude: 14586 bytes of flash written
avrdude: verifying flash memory against C:\DOCUME~1\Pedro\CONFIG~1\Temp\build3521077687409193779.tmp/project_ESQUIVAOBSTACULOSCONSTARWARS2_0.cpp.hex:
avrdude: load data flash data from input file C:\DOCUME~1\Pedro\CONFIG~1\Temp\build3521077687409193779.tmp/project_ESQUIVAOBSTACULOSCONSTARWARS2_0.cpp.hex:
avrdu

#include <Arduino.h> #include <Wire.h> #include <SoftwareSerial.h> #include <MeAuriga.h> //Encoder Motor MeEncoderOnBoard Encoder_1(SLOT1); MeEncoderOnBoard Encoder_2(SLOT2); void isr_process_encoder1(void) { if(digitalRead(Encoder_1.getPortB()) == 0){ Encoder_1.pulsePosMinus(); }else{ Encoder_1.pulsePosPlus(); } } void isr_process_encoder2(void) { if(digitalRead(Encoder_2.getPortB()) == 0){ Encoder_2.pulsePosMinus(); }else{ Encoder_2.pulsePosPlus(); } } void move(int direction, int speed) { int leftSpeed = 0; int rightSpeed = 0; if(direction == 1){ leftSpeed = -speed; rightSpeed = speed; }else if(direction == 2){ leftSpeed = speed; rightSpeed = -speed; }else if(direction == 3){ leftSpeed = -speed; rightSpeed = -speed; }else if(direction == 4){ leftSpeed = speed; rightSpeed = speed; } Encoder_1.setTarPWM(leftSpeed); Encoder_2.setTarPWM(rightSpeed); } void moveDegrees(int direction,long degrees, int speed_temp) { speed_temp = abs(speed_temp); if(direction == 1) { Encoder_1.move(-degrees,(float)speed_temp); Encoder_2.move(degrees,(float)speed_temp); } else if(direction == 2) { Encoder_1.move(degrees,(float)speed_temp); Encoder_2.move(-degrees,(float)speed_temp); } else if(direction == 3) { Encoder_1.move(-degrees,(float)speed_temp); Encoder_2.move(-degrees,(float)speed_temp); } else if(direction == 4) { Encoder_1.move(degrees,(float)speed_temp); Encoder_2.move(degrees,(float)speed_temp); } } double angle_rad = PI/180.0; double angle_deg = 180.0/PI; void controlMov(double segundosEspera); MeUltrasonicSensor ultrasonic_10(10); MeLightSensor lightsensor_12(12); MeBuzzer buzzer; void controlMov(double segundosEspera) { if((10) > (ultrasonic_10.distanceCm())){ move(2,100); _delay(segundosEspera); move(4,50); _delay(segundosEspera); }else{ move(1,100); } } void setup(){ attachInterrupt(Encoder_1.getIntNum(), isr_process_encoder1, RISING); attachInterrupt(Encoder_2.getIntNum(), isr_process_encoder2, RISING); //Set Pwm 8KHz TCCR1A = _BV(WGM10); TCCR1B = _BV(CS11) | _BV(WGM12); TCCR2A = _BV(WGM21) | _BV(WGM20); TCCR2B = _BV(CS21); buzzer.setpin(45); } void loop(){ if((lightsensor_12.read()) < (10)){ for(int __i__=0;__i__<3;++__i__) { buzzer.tone(392, 500); delay(20); controlMov(1); } buzzer.tone(330, 250); delay(20); controlMov(1); buzzer.tone(494, 125); delay(20); controlMov(1); buzzer.tone(392, 500); delay(20); controlMov(1); buzzer.tone(330, 250); delay(20); controlMov(1); buzzer.tone(494, 125); delay(20); controlMov(1); buzzer.tone(392, 1000); delay(20); controlMov(1); for(int __i__=0;__i__<3;++__i__) { buzzer.tone(587, 500); delay(20); controlMov(1); } buzzer.tone(659, 250); delay(20); controlMov(1); buzzer.tone(494, 125); delay(20); controlMov(1); buzzer.tone(392, 500); delay(20); controlMov(1); buzzer.tone(330, 250); delay(20); controlMov(1); buzzer.tone(494, 125); delay(20); controlMov(1); buzzer.tone(392, 1000); delay(20); controlMov(1); }else{ controlMov(1); } _loop(); } void _delay(float seconds){ long endTime = millis() + seconds * 1000; while(millis() < endTime)_loop(); } void _loop(){ Encoder_1.loop(); Encoder_2.loop(); } 0x00 0x00 lock 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00 calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00 signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00 Programmer Type : Wiring Description : Wiring Programmer Model: AVRISP Hardware Version: 15 Firmware Version Master : 2.10 Vtarget : 0.0 V SCK period : 0.1 us avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature = 0x1e9801 avrdude: reading input file "C:\DOCUME~1\Pedro\CONFIG~1\Temp\build3521077687409193779.tmp/project_ESQUIVAOBSTACULOSCONSTARWARS2_0.cpp.hex" avrdude: writing flash (14586 bytes): Writing | ################################################## | 100% 2.27s avrdude: 14586 bytes of flash written avrdude: verifying flash memory against C:\DOCUME~1\Pedro\CONFIG~1\Temp\build3521077687409193779.tmp/project_ESQUIVAOBSTACULOSCONSTARWARS2_0.cpp.hex: avrdude: load data flash data from input file C:\DOCUME~1\Pedro\CONFIG~1\Temp\build3521077687409193779.tmp/project_ESQUIVAOBSTACULOSCONSTARWARS2_0.cpp.hex: avrdu

Por probar algo he quitado todas las notas musicales del código y entonces va perfectamente. Aunque en teoria no deberia afectar.

Tambien he probado a poner solo una nota musical. La que esta dentro del primer bucle de 3 repeticiones. Entonces se reproduce el fallo que dije al principio.

Si en vez de ponerla en el bucle pongo una sola instruccion de sonido y el resto de movimiento hace un extraño. Y es que en el estado noche gira un poco despues de tocar pared. Pero luego ya sigue recto.

De alguna manera interactuan las notas musicales y las ordenes de girar y/o avanzar. Es como si despues de una nota musical la orden de girar y/o avanzar retroceder no se ejecutaran. Y mantiene la orden ultima.

Por probar algo he quitado todas las notas musicales del código y entonces va perfectamente. Aunque en teoria no deberia afectar. Tambien he probado a poner solo una nota musical. La que esta dentro del primer bucle de 3 repeticiones. Entonces se reproduce el fallo que dije al principio. Si en vez de ponerla en el bucle pongo una sola instruccion de sonido y el resto de movimiento hace un extraño. Y es que en el estado noche gira un poco despues de tocar pared. Pero luego ya sigue recto. De alguna manera interactuan las notas musicales y las ordenes de girar y/o avanzar. Es como si despues de una nota musical la orden de girar y/o avanzar retroceder no se ejecutaran. Y mantiene la orden ultima.

Yo te había entendido que sin parar de girar reproducía todas las notas. ¿Es así?

Viendo el código no se ve nada raro la verdad.

De alguna manera interactuan las notas musicales y las ordenes de girar y/o avanzar. Es como si despues de una nota musical la orden de girar y/o avanzar retroceder no se ejecutaran. Y mantiene la orden ultima.

Haz una prueba por probar... después del delay que hay después de la instrucción de motores girando prueba a parar los motores (te producirá parones) o mejor aún a ponerlos avanzando a 100. De esa manera la última instrucción de movimiento siempre será avanzar.

58c7ce4322440.jpg

Yo he reproducido tu programa en mBot y no he tenido problema, a ver si alguien con Auriga pudiera reproducirlo y localizar el problema.

Siento no poder ser de más ayuda smile

Dani S.

Yo te había entendido que sin parar de girar reproducía todas las notas. ¿Es así? Viendo el código no se ve nada raro la verdad. >De alguna manera interactuan las notas musicales y las ordenes de girar y/o avanzar. Es como si despues de una nota musical la orden de girar y/o avanzar retroceder no se ejecutaran. Y mantiene la orden ultima. Haz una prueba por probar... después del delay que hay después de la instrucción de motores girando prueba a parar los motores (te producirá parones) o mejor aún a ponerlos avanzando a 100. De esa manera la última instrucción de movimiento siempre será avanzar. ![58c7ce4322440.jpg](serve/attachment&path=58c7ce4322440.jpg) Yo he reproducido tu programa en mBot y no he tenido problema, a ver si alguien con Auriga pudiera reproducirlo y localizar el problema. Siento no poder ser de más ayuda :( Dani S.

Muchas gracias por tus consejos e interés. Intentaré esta noche si puedo probar ese consejo.

Lo bueno sería que los de makeblock harían esa prueba con mbotRanger. O si hay alguien que lo tiene y quiere sería genial.

Muchas gracias por tus consejos e interés. Intentaré esta noche si puedo probar ese consejo. Lo bueno sería que los de makeblock harían esa prueba con mbotRanger. O si hay alguien que lo tiene y quiere sería genial.

Hola Dani,

Hice tu consejo y tampoco mejoro. Extrañamente se quedo girando. Ni siquiera se quedo con la orden de seguir recto.

Lo extraño es que cuando se queda girando si detecta un obstaculo si que realiza los movimientos.

Ya no se bien que pensar.smile

Hola Dani, Hice tu consejo y tampoco mejoro. Extrañamente se quedo girando. Ni siquiera se quedo con la orden de seguir recto. Lo extraño es que cuando se queda girando si detecta un obstaculo si que realiza los movimientos. Ya no se bien que pensar.|(

Hola.

Hemos probado el código que propones en una Auriga, decirte que se comporta exactamente igual a como describes, cuando está "en modo nocturno" las ordenes de los motores parece que no responden, lo hemos solucionado dándole un poco de tiempo trás la orden de lectura del sensor de ultrasonidos, de la siguiente manera:

58cb2961bde0d.jpg

las notas suenan mas espaciadas, pero los motores responden bien.

Saludos.

Hola. Hemos probado el código que propones en una Auriga, decirte que se comporta exactamente igual a como describes, cuando está "en modo nocturno" las ordenes de los motores parece que no responden, lo hemos solucionado dándole un poco de tiempo trás la orden de lectura del sensor de ultrasonidos, de la siguiente manera: ![58cb2961bde0d.jpg](serve/attachment&path=58cb2961bde0d.jpg) las notas suenan mas espaciadas, pero los motores responden bien. Saludos.
1.04k
vistas
8
respuestas
3
seguidores
vista previa (en vivo)
introduzca al menos un 10 caracteres
Advertencia: Mencionaste a %MENTIONS%, pero ellos no pueden ver el mensaje y no serán notificados
Guardando...
Guardado
Todos los posteos de este tema serán borrados ?
Borrador pendiente ... Click para continuar editando
Descartar borrador