<\/a> Hoy os mostrare como controlar un coche a radio control pero via bluetooth y ayudando me con PINGUINO. <\/p>\n <\/p>\n El control es basico pero he puesto un detalle muy interesante, ya que la direcci\u00f3n de este veh\u00edculo es exponencial ya que puedes indicarle que gire X grados (a diferencia de los coches de radio control tradicionales que son TOPE IZQUIERDA o TOPE DERECHA), para poder controlarlo finamente he puesto un servo para dirigirlo como si de un conductor se tratase, este puede girar la direcci\u00f3n tantos grados como le indiquemos, ahora en el ejemplo lo he puesto en m\u00e1ximos de ambos extremos, pero f\u00e1cilmente puede indicarse que gire a la izquierda X grados.<\/p>\n El motor principal es controlado por un PUENTE H basico con BC548, y el pinguino es el tradicional 8bits 18f4550, el modulo bluetooth es el mismo que vengo utilizando en anteriores circuitos y facilmente comprable a traves de EBAY.<\/p>\n La comunicaci\u00f3n bluetooth la realizo con un ordenador MAC, pero puede realizarse con cualquier equipo o distribuci\u00f3n ya que utiliza los protocolos RS232 sobre Bluetooth, generando una interfaz serie virtual en el equipo cliente.<\/p>\n Tambien el c\u00f3digo de PROCESSING es muy f\u00e1cil y conciso, exportable a java para ser reproducido en cualquier ordenador. Este es el c\u00f3digo de PINGUINO<\/p>\n <\/p>\n [sourcecode language=\u00bbpy\u00bb] } void stop() void loop() [\/sourcecode]<\/p>\n <\/p>\n y Este es el c\u00f3digo de processing<\/p>\n [sourcecode language=\u00bbpy\u00bb] final static int NORTH = 1; void setup() { void draw() { void keyPressed(){ void keyReleased(){ <\/p>\n <\/p>\n <\/span><\/p>\n
\nLa idea viene a rais de un MINI controlado por Android que venden en algunas tiendas y pens\u00e9, que ser\u00eda facil de reproducir.<\/p>\n
\nDejo el c\u00f3digo fuente para que cada uno lo reproduzca en su PC de casa sea cual sea la distribuci\u00f3n.<\/p>\n
\n\/\/ PCBC v1
\n\/\/ Pinguino Car Bluetooth Control v1
\n\/\/ Walii.es 2011
\n\/\/ pinguino.walii.es
\n#define RUNLED PORTAbits.RA4
\n#define PIC18F4550 \/\/ control pin of servo
\nint counter; \/\/ counter used for interrupt
\nint position0=50; \/\/pin0 servo vertical
\nint previous;
\nint i;
\nint key;
\nint pulseWidth = 20;
\nvoid setup()
\n{
\nT1CON=0x01; \/\/ configure timer 1
\nPIE1bits.TMR1IE=1; \/\/ set interrupt for timer 1
\nINTCON|=0xA0; \/\/ enable GIE and PEIE
\nfor (i=1;i<8;i++) { \/\/servos conections
\npinMode(i,OUTPUT);
\ndigitalWrite(i,LOW);\t\t\t\/\/ fixe un niveau 0 sur les sorties<\/p>\n
\npinMode(0,OUTPUT);
\nSerial.begin(9600);
\n}
\nvoid UserInterrupt()
\n{
\nif (PIR1bits.TMR1IF)
\n{
\nTMR1H=0xFF; \/\/ reload value timer 1
\nTMR1L=0x9C;
\nPIR1bits.TMR1IF=0; \/\/ clear interrupt flag
\nif (counter>position0+51) PORTBbits.RB0=0; \/\/ position
\nelse PORTBbits.RB0=1;
\nif (counter==1500) counter=0; \/\/ value for ~20 mS
\ncounter++;
\n}
\n}<\/p>\n
\n{
\n\tdigitalWrite(2,LOW);
\n\tdigitalWrite(1,LOW);
\n\tdelay(10);
\n}
\nvoid stoptotal()
\n{
\n\tdigitalWrite(2,LOW);
\n\tdigitalWrite(1,LOW);
\n\tposition0=50;
\n\tdelay(10);
\n}
\nvoid w()
\n{
\n\tdigitalWrite(2,HIGH);
\n\tdigitalWrite(1,LOW);
\n}
\nvoid s()
\n{
\n\tdigitalWrite(2,LOW);
\n\tdigitalWrite(1,HIGH);
\n}
\nvoid a()
\n{
\nposition0=10;
\n}
\nvoid d()
\n{
\nposition0=80;
\n}
\nvoid q()
\n{
\nposition0=10;
\ndigitalWrite(2,HIGH);
\ndigitalWrite(1,LOW);
\n}
\nvoid e()
\n{
\nposition0=80;
\ndigitalWrite(2,HIGH);
\ndigitalWrite(1,LOW);
\n}
\nvoid z()
\n{
\nposition0=80;
\ndigitalWrite(2,LOW);
\ndigitalWrite(1,HIGH);
\n}
\nvoid c()
\n{
\nposition0=10;
\ndigitalWrite(2,LOW);
\ndigitalWrite(1,HIGH);
\n}<\/p>\n
\n{
\nif (Serial.available())
\n {
\nkey=Serial.read();
\nif (key==’w’ && previous!=’w’) stop(),w();
\nif (key==’s’ && previous!=’s’) stop(),s();
\nif (key==’a’ && previous!=’a’) stop(),a();
\nif (key==’d’ && previous!=’d’) stop(),d();
\nif (key==’q’ && previous!=’q’) stop(),q();
\nif (key==’e’ && previous!=’e’) stop(),e();
\nif (key==’z’ && previous!=’z’) stop(),z();
\nif (key==’c’ && previous!=’c’) stop(),c();
\nprevious=key;
\n} else; stoptotal();
\nSerial.printf(" %d", position0);
\n}<\/p>\n
\n\/**
\nPINGUINO CAR CONTROL via BLUETOOTH
\nWalii & walterleonardo
\nPinguino.walii.es
\n*\/
\nimport processing.serial.*;
\nSerial myPort;
\nString port[];
\nint i;<\/p>\n
\nfinal static int EAST = 2;
\nfinal static int SOUTH = 4;
\nfinal static int WEST = 8;
\nfinal static int STOP = 16;
\nint result;
\nfloat x,y;<\/p>\n
\n size(512,400);
\n frameRate(30);
\n result = 0;
\n x = width\/2;
\n y = height\/2;
\n port=Serial.list();
\nprintln(port);
\nmyPort=new Serial(this,port[10],9600);
\n}<\/p>\n
\n background(0);
\n switch(result) {
\n case NORTH: myPort.write("w"); break;
\n case EAST: myPort.write("d"); break;
\n case SOUTH: myPort.write("s"); break;
\n case WEST: myPort.write("a"); break;
\n case NORTH|EAST: myPort.write("e"); break;
\n case NORTH|WEST: myPort.write("q"); break;
\n case SOUTH|EAST: myPort.write("c"); break;
\n case SOUTH|WEST: myPort.write("z"); break;
\n case STOP: myPort.write("x"); break;
\n }
\n fill(255);
\n rect(x,y,10,10);
\n}<\/p>\n
\n switch(key) {
\n case(‘w’):case(‘W’):result |=NORTH;break;
\n case(‘d’):case(‘D’):result |=EAST;break;
\n case(‘s’):case(‘S’):result |=SOUTH;break;
\n case(‘a’):case(‘A’):result |=WEST;break;
\n case(‘x’):case(‘X’):result |=STOP;break;
\n }
\n}<\/p>\n
\n switch(key) {
\n case(‘w’):case(‘W’):result ^=NORTH;break;
\n case(‘d’):case(‘D’):result ^=EAST;break;
\n case(‘s’):case(‘S’):result ^=SOUTH;break;
\n case(‘a’):case(‘A’):result ^=WEST;break;
\n case(‘x’):case(‘X’):result ^=STOP;break;
\n\/\/ case(‘w’):case(‘W’):result |=STOP;break;
\n\/\/ case(‘d’):case(‘D’):result |=STOP;break;
\n\/\/ case(‘s’):case(‘S’):result |=STOP;break;
\n\/\/ case(‘a’):case(‘A’):result |=STOP;break;
\n }
\n}
\n[\/sourcecode]<\/p>\n