Start

Förstasidan
Statistik

Social robot

Robotens syn
Modell/simulator
Levande modell


Arduino

Starta upp Arduino
DCcduino UNO
Pro Mini

Raspberry pi

Om Raspberry

Pic32

Om Pic32
Konstruktionen
Praktisk kom-igång
Starta upp UBW32
Installera MPLAB
Rinnande ljus
Stegmotor
Display
RS232 Pic32 - terminal
Luffarschack

Servo

Överblick
Isärmonterat servo
Styrning av servo
Mini Maestro
Bygga ett servo

Elektronik

Open Collector
Kontaktstuds
Drivsteg på utgångarna
Halleffektsensor/switch
MLX90316 (halleffekt)
Pulsbreddsmodulering

Open CV

Om OpenCV

Matematik

Linjär algebra
Olinjär länkmekanism

Luffarschack - 5 i rad - på Pic32 via RS232
Göra något sköj
Jag ägnade några timmar åt att knacka ner koden för det klassiska luffarschacket! Den som får fem kryss eller ringar i rad först har vunnit.

Inställningarna i putty är 19200 baud. Övriga instruktioner och förklaringar finns på sidan RS232 med Pic32.

Koden för luffarschack
/*************************************************
Luffarschack på Pic32 via RS232 www.robotsteel.com
**************************************************/

#include "plib.h"
#include "HardwareProfile.h"

#define SYS_FREQ   (80000000L)
#define BRATE  1041

char str[80]; // temp in och ut string
int poang[15][15],ux,uy,pmax=0,uv=0;
int sp[24][24];
char f[3]={'+','X','O'};
int p[81]={0,10,20,5,100,0,10,0,200,3,15,0,15,500,
  0,0,0,0,0,0,100,0,0,0,100,0,2500,0,0,0,0,0,0,0,0,0,
  0,0,0,0,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,0,0,
  0,70,0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,500,0,65000};


void initU2(void)
{
  int x;
  U2BRG=BRATE;
  U2STA=0;
  U2MODE=0x8008;   // init UART 
  U2STASET=0x1400; // enable transmitter
  putU2(0);
  for(x=0;x<10000;x++) ; // vänta lite
  putU2S("Serieport 2 konfigurerad 19200 baud");
}

int putU2(int c)
{
  while(U2STAbits.UTXBF) ;
  U2TXREG=c;
  return c;
}

char getU2(void)
{
  while(!U2STAbits.URXDA) ;
  return U2RXREG;
}

int putU2S(char *s)
{
  while(*s)
  {
    putU2(*s++);
  }
}

char *getData(char *s, int len)
{
  char *p = s;
  do
  {
    *s = getU2();
    if(*s==13)
    {
      putU2(10);
    }
    putU2(*s);
    if(*s=='\r') break;
    s++;
    len--;
  }
  while(len>1);
  *s='\0';
  return p;
}

void drawboard()
{
  int a,b;
  putU2S("\n\n\r Luffarschack pa Pic32 via RS232\n\n\r");
  putU2S("   1 2 3 4 5 6 7 8 9101112131415\n\r");
  for(a=0;a<15;a++)
  {
    sprintf(str,"%2d",a+1);
    putU2S(str);
    for(b=0;b<15;b++)
    {
      sprintf(str," %c",f[sp[a+4][b+4]]);
      putU2S(str);
    }
    putU2S("\n\r");
  }
}

int humanwon(int mx,int my)
{
  int a,b,i,j,dx,dy;

  uv=0;
  for(dx=-1;dx<2;dx++)
  for(dy=-1;dy<2;dy++)
  {
    if((dy!=0)||(dx!=0))
    {
      i=sp[mx+dx*4][my+dy*4]*27+
      sp[mx+dx*3][my+dy*3]*9+
      sp[mx+dx*2][my+dy*2]*3+sp[mx+dx][my+dy];
      j=sp[mx-dx*2][my-dy*2]+sp[mx-dx][my-dy]*3;
      if ((i==40)||((i==13)&&((j==3)||
        (j==5)))||((i==4)&&(j==4)))
          {uv=1;};
    }
  }
  return uv;
}

void compmove()
{
  int dx,dy,a,b,cmx=0,cmy=0,pnt,i,j;
  pmax=-1;
  for(a=4;a<19;a++)
  for(b=4;b<19;b++)
  {
    if(sp[a][b]==0)
    {
      pnt=0;
      for(dx=-1;dx<2;dx++)
      for(dy=-1;dy<2;dy++)
      {
        if((dy!=0)||(dx!=0))
        {
          i=sp[a+dx*4][b+dy*4]*27+
          sp[a+dx*3][b+dy*3]*9+
          sp[a+dx*2][b+dy*2]*3+
          sp[a+dx][b+dy];
          j=sp[a-dx*2][b-dy*2]+sp[a-dx][b-dy]*3;
          pnt=pnt+p[i];
          if((j==6)&&((i==53)||(i==26)))
            {pnt=pnt+90000;};
          if((j==8)&&((i==8)||(i==17)||
          (i==35)||(i==44)||(i==62)||(i==71)))
            {pnt=pnt+90000;};
          if(((j==3)||(j==4))&&
          ((i==13)||(i==67)))
            {pnt=pnt+5000;};
          if((j==4)&&((i==4)||
          (i==22)||(i==49)))
            {pnt=pnt+5000;};
          if((i==53)&&(j==0)){pnt=pnt+500;};
          if((i==67)&&(j==0)){pnt=pnt+200;};
          poang[a-4][b-4]=pnt;
          if(pnt>pmax)
          {
            pmax=pnt;
            cmx=a;
            cmy=b;
          }
        }
      }
    }
  }
  sprintf(str,"Mitt drag (O) ar %d, %d\n",cmy-3,cmx-3);
  putU2S(str);
  sp[cmx][cmy]=2;
}

int main()
{
  int a,b,n=0;
  SYSTEMConfigPerformance(80000000L);
  mJTAGPortEnable(0);
  initU2();
  while(1)
  {
    drawboard();
    n=0;
    if((pmax>60000)&&(uv==0))
    {
      putU2S("\n\n*** PIC32 VANN!! ***\n\n\r");
      n=1;
    }  
    if(uv==1)
    {
      putU2S("\n\n*** DU VANN!! ***\n\n\r");
      n=1;
    }
    if(n==1)
    {
      for(a=0;a<19;a++)
      for(b=0;b<19;b++)
      {
        sp[a][b]=0;
      }
      drawboard();
    }
    do
    {
      putU2S("\nDitt drag? Du ar X\n\r");
      putU2S("Mata in X  och sedan Y \n\r");
      uy=atoi(getData(str,sizeof(str)));
      ux=atoi(getData(str,sizeof(str)));
      if(sp[ux+3][uy+3]!=0)
      {
        putU2S("\nDen platsen ar upptagen...\n\r");
      }
    } while(sp[ux+3][uy+3]!=0);    
    sp[ux+3][uy+3]=1;
    putU2S("\n\n\rOk...");
    if(!humanwon(ux+3,uy+3))
    {
      compmove();
    }
  }
}


Spela luffarschack
Datorn är ring och du är kryss. Man startar spelet genom att klicka på reset-knappen på UBW32.

luffarschack

Man spelar genom att ange koordinaterna där man vill stätta sitt kryss. Datorn svarar med ett drag och visar bräden i konsolfönstret.

luffarschack

Illa. Pic32 vann!





Robot och elektronik -sidan byter namn till electro.st

Senast läst 14:25:10 27/5 2017 Texten uppdaterad 17/9 2014
footer sign