Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

Pingubot

131 Respuestas
19 Usuarios
0 Reactions
66 K Visitas
furri
Respuestas: 2708
Topic starter
(@furri)
Ardero
Registrado: hace 20 años

Por fin he acabado la versión Pingubot 3.0.

No tengo suficientes palabras para agradecer a Bastian su ayuda pasando el diseño a Eagle en la pingubot 2.0, con lo que integramos una placa con todo incluido, micro y mosfet en una sola PCB.

Despues de aprender a manejar el Eagle de forma acelerada he ido haciendo mis pinitos y como he hecho cambios que rompen con el esquema anterior he cambiado la versión para evitar confusiones asi que vamos por la 3. Los cambios principales son:
- Cambio de disposición de mosfet, switchs, etc.
- El conector de sensores pasa de 8 pines digitales a 4 analogicos y 4 digitales.
- Añadidas las resistencias pull-down de los mosfet MCP14E5
- Ajustarlo todo a una placa de tamaño estandar de 80x60.

Esta semana espero fabricar una placa y poner otro robot en pista, si todo va bien subo los ficheros de Eagle a la wiki.

Responder
130 respuestas
fj_sanchez
Respuestas: 1083
(@fj_sanchez)
Ardero
Registrado: hace 19 años

Buenas, me estoy volviendo loco con el dichoso pinguino... estoy tratando de medir el tiempo que tarda el pingubot en leer los 6 sensores y me están pasando cosas rarísimas con el código:
#include <string.h>
#include <stdlib.h>

#define LED3 8
#define LED4 9
#define LEDV LED4
#define LEDR LED3
#define PSB1 3
#define PSB2 3
#define SW1 1
#define SW2 0
#define M1A 12
#define M1B 17
#define M2A 11
#define M2B 10
#define D1 4
#define D2 5
#define D3 16
#define D4 15
#define I1 14
#define I2 13
#define I3 6
#define I4 7

// Function prototipes
void pingubotInit(void);
void readSensors(void);
void uitoa(unsigned int value, char* string, int radix);

// Global variables
u16 sensors[8] = {0,0,0,0,0,0,0,0};
char buf[10] = "";
u16 time = 0;

void setup() {
pingubotInit();
millis(); // This is here to include the _millis variable
}

void loop() {

// Fix for analog pin 17 as digital
pinMode(M1B, OUTPUT);
digitalWrite(M1B, LOW);

/* Timer config for time measuring*/
T0CONbits.T08BIT = 0; // 16 bits timer
T0CONbits.T0CS = 0; // internal clock
T0CONbits.T0SE = 0; // change on high-to-low
T0CONbits.PSA = 1; // don't use prescaler
T0CONbits.T0PS2 = 0;
T0CONbits.T0PS1 = 0;
T0CONbits.T0PS1 = 0;
T0CONbits.TMR0ON = 1; // run timer

// Wait for connection
while(!CONTROL_LINE) {
CONTROL_LINE = 1;
}
CDC.print("PRUEBArn",8);

while(!digitalRead(PSB1));

while (TRUE) {
buf[0] = '';
time = 0;
TMR0H = 0;
TMR0L = 0;
readSensors();
time = TMR0L;
time |= (TMR0H<<8);
uitoa(time, buf, 10);
CDC.print(buf, strlen(buf));
//Delayms(5);
CDC.print("rn",2);
Delayms(1000);
}
}

void pingubotInit(void) {
// Pushbuttons, DIP switch and leds setup
pinMode(PSB1, INPUT);
pinMode(PSB2, INPUT);
pinMode(SW1, INPUT);
pinMode(SW2, INPUT);
pinMode(LEDV, OUTPUT);
digitalWrite(LEDV, LOW);
pinMode(LEDR, OUTPUT);
digitalWrite(LEDV, LOW);

// H-Bridge setup
pinMode(M1A, OUTPUT);
digitalWrite(M1A, LOW);
// Doesn't work here because of ADC lib
//pinMode(M1B, OUTPUT);
//digitalWrite(M1B, LOW);
pinMode(M2A, OUTPUT);
digitalWrite(M2A, LOW);
pinMode(M2B, OUTPUT);
digitalWrite(M2B, LOW);

// Sensors setup
pinMode(D3, OUTPUT);
pinMode(D4, OUTPUT);
pinMode(I3, OUTPUT);
pinMode(I4, OUTPUT);
}

void readSensors(void) {
sensors[0] = digitalRead(D4);
sensors[1] = digitalRead(D3);
sensors[2] = analogRead(D2);
sensors[3] = analogRead(D1);
sensors[4] = analogRead(I1);
sensors[5] = analogRead(I2);
sensors[6] = digitalRead(I3);
sensors[7] = digitalRead(I4);
}

/*-------------------------------------------------------------------------
integer to string conversion

Written by: Bela Torok, 1999
bela.torok@kssg.ch
usage:

uitoa(unsigned int value, char* string, int radix)
itoa(int value, char* string, int radix)

value -> Number to be converted
string -> Result
radix -> Base of value (e.g.: 2 for binary, 10 for decimal, 16 for hex)
---------------------------------------------------------------------------*/

#define NUMBER_OF_DIGITS 16 /* space for NUMBER_OF_DIGITS + '' */

void uitoa(unsigned int value, char* string, int radix)
{
unsigned char index, i;

index = NUMBER_OF_DIGITS;
i = 0;

do {
string[--index] = '0' + (value % radix);
if ( string[index] > '9') string[index] += 'A' - ':'; /* continue with A, B,.. */
value /= radix;
} while (value != 0);

do {
string[i++] = string[index++];
} while ( index < NUMBER_OF_DIGITS );

string = 0; /* string terminator */
}

Básicamente tal y como está algo hace, pero el tema es que si le quito el Delayms(5) (es lo mismo que delay()) ya el código no es capaz de arrancar el USB... y si no lo pongo parece que no le da tiempo a imprimirlo todo... ¿alguien me puede ayudar?

Responder
fj_sanchez
Respuestas: 1083
(@fj_sanchez)
Ardero
Registrado: hace 19 años

Bueno, ya lo he solucionado más o menos... he pasado a usar el timer3 en lugar del timer1, ya que la función delay usa dicho timer y creo que algo estaba en conflicto... no obstante me sigue haciendo cosas raras, a veces no me incluye la libería de delay, otras no manda por USB, otras cambiando algo deja de funcionar el USB... le queda mucho por recorrer a pinguino...

Responder
furri
Respuestas: 2708
Topic starter
(@furri)
Ardero
Registrado: hace 20 años

Hola FJ.

En los Delays no he notado problemas aunque si los he tenido midiendo tiempos con Millis() y tambien con los timers.

Igual que a ti me da la impresion de que a Pinguino le queda aún trecho por recorrer y personalmente preferiria que se solucionaran problemas de lo que ya está en el mercado a que se centren como parece que está ocurriendo en sacar las nuevas versiones 32bits.

furri.

Responder
sphinx
Respuestas: 651
(@sphinx)
Ardero
Registrado: hace 17 años

Totalmente de acuerdo...
Llevo una temporada desconectado y me he perdido los últimos cambios, pero efectivamente se está invirtiendo más esfuerzo en las placas de 32 que en lo que ya existía... que tiene mucho que mejorar.

/Sphinx

Responder
fj_sanchez
Respuestas: 1083
(@fj_sanchez)
Ardero
Registrado: hace 19 años

Buenas,

no se si se trata de un pequeño fallo o una característica, pero bueno yo lo comento. Es en referencia a los leds que van a las líneas RX y TX. Ahora mismo se usa la UART, los leds estarían siempre encendidos (la UART en reposo pone los pines TX a nivel alto), salvo cuando haya actividad, que se apagarían. Creo que si se invierte el sentido de ánodo y cátodo y se cambiase GND por VCC funcionarían como indicadores de actividad en la linea, aunque para usarlos como I/O habría que usar lógica negada. También convendría cambiar el valor de la resistencia a uno más alto, como 1K para no cargar la linea tanto y que pueda usarse el puerto serie con un baudrate alto.

Espero no haberme equivocado.
Un saludo.

Responder
Página 26 / 27
Compartir: