terça-feira, 16 de agosto de 2016

Envio de Dados XBee com PIC C18

Bem pessoal, estou num projeto de iniciação científica e tive muita dificuldade para desenvolver um método de transmissão de dados utilizando o transceiver XBee S2 no modo API juntamente com o microcontrolador PIC18F2620 com o compilador C18 na IDE MPLAB, por isto apresentarei como proseguir.


HARDWARE:
- Observando que a tensão de alimentação do XBee é 3.3V, a tensão de saída do pino TX deve se manter no intervalo entre 0V e 3.3V. Por isto se seu controlador estiver sendo alimentado com 5V se faz necessária a implementação de um regulador simples de tensão para que o pino TX do PIC opere nesta faixa.

SOFTWARE:
- Quando trabalhamos com o XBee em modo API devemos levar em consideração o formato do pacote de dados:

1. Delimitador do início do pacote
2. Comprimento da mensagem
3. Tipo do pacote
4. ID do pacote
5. Endereço 64bits do destino
6. Endereço 16bits do destino
7. Byte de broadcast
8. Byte de opções
9. Mensagem que será enviada
10. Checksum

Como é possível observar, teremos que trabalhar com BYTES, e construir o pacote de acordo com a ordem descrita acima, sempre observando se a USART está ocupada. O cálculo do Checksum é feito com a soma de todos os bytes a partir da terceira parte e após esta soma pegamos o byte menos significativo

1. Delimitador do início do pacote






2. Comprimento da mensagem








3. Tipo do pacote







4. ID do pacote









5. Endereço 64bits do destino









6. Endereço 16bits do destino









7. Byte de broadcast







8. Byte de opções









9. Mensagem que será enviada









10. Checksum






O download do código pode ser feito pelo link: sendData download

sexta-feira, 15 de maio de 2015

Inteligência Artificial - Mundo Wumpus


O mundo de Wumpus é um problema didático onde o objetivo é encontrar um monte de ouro em uma de 16 salas possíveis. Para isso o agente deve evitar as salas que contém poços sem fundo e a sala onde está o Wumpus. O ambiente do mundo de Wumpus contém:

  • Wumpus, que é monstro que devora qualquer guerreiro que entrar em sua caverna.
  • Malha 4x4 de cavernas conectadas por passagens.
  • Ouro em alguma caverna.
  • Buracos sem fundo nos quais cairá qualquer um que vagar por esta caverna, exceto o Wumpus.
  • O agente pode matar o Wumpus, porém possui apenas uma flecha para fazer isso.
  • O agente sempre começa no quadrado identificado como [1,1] voltado para a direita.
  • As posições do Wumpus, ouro e poços são escolhidas ao acaso.
O agente que vasculhará o mundo de Wumpus em busca do ouros possui as seguintes características:

  • Sensores fedor (cavernas adjacentes ao Wumpus, exceto diagonal), brisa (cavernas adjacentes a um poço, exceto diagonal), brilho (cavernas onde existe ouro), choque (ao caminhar para uma parede).
  • Agente não conhece a configuração do ambiente.
Minha "solução" para o problema é para uma malha de 6x6, o agente comeca de uma posicao escolhida pelo testador e este pode escolher também a quantidade de Wumpus e Buracos. O caçador no meu caso verifica sempre as cavernas adjacentes e verifica os seguintes casos:
  • Se a caverna que ele se encontra é vazia, toas as adjacentes são seguras.
  • Se a caverna que ele se encontra tem fedor ou brisa ele só se move caso a caverna adjacente for fedor ou brisa.
  • Caso estas não forem satisfeitas ele fará uma escolha aleatória (sorteio).
Não é uma solução que verificará sempre a melhor ação para todos os casos mas já é um "quebra galho"

LINK PARA DOWNLOAD DO CÓDIGO: MundoWumpus

Inteligência Artificial - Perceptron

O perceptron é um tipo de rede neural artificial inventada em 1957 no Cornell Aeronautical Laboratory por Frank Rosenblatt. Ele pode ser visto como o tipo mais simples de um classificador linear.




O código que estarei disponibilizando, é uma rede perceptron simples que treina portas AND, OR, IMPLICAÇÃO, da lógica simples. com as alterações corretas é possível utilizar o código para casos mais interessantes.
LINK PARA DOWNLOAD DO CÓDIGO: AlgoritmoPerceptron

sábado, 15 de junho de 2013

Dropbox




    Olá, após muito tempo sem postar, trago a vocês o dropbox, um sistema de armazenamento online semelhante ao skydrive (Microsoft), e GoogleDrive (Google).
    O Dropbox é o lugar certo para todos os seus arquivos, fotos e vídeos. Qualquer coisa que você adicionar ao seu Dropbox aparecerá automaticamente em todos os seus computadores, celulares e até mesmo no site do Dropbox , para que você possa acessar tudo de qualquer lugar.
    Com o Dropbox, compartilhar arquivos com outras pessoas é superfácil, não importa se você é estudante ou profissional, um pai ou um avô. Mesmo se você derramar café sem querer no laptop, não fique com medo! Relaxe com a certeza de que todos os seus arquivos estão seguros no Dropbox e nunca se perderão.

Por isso não perca a oportunidade de ganhar 2GB de armazenamento, basta acessar:

domingo, 3 de fevereiro de 2013

Filme - Forrest Gump


Sinopse: Forrest Gump é um homem muito especial. Considerado estúpido por todos que o conheçem, ele é na verdade apenas uma pessoa ingênua que vê o mundo por uma perspectiva diferente. Gump acidentalmente participa de alguns dos momentos mais importantes da história recente dos Estados Unidos - Guerra do Vietnã, Caso Wategate, entre outros - enquanto tenta ir atrás do grande amor de sua vida. Sua história é contada com drama e bom humor em iguais proporções, surpreendendo o espectador a cada cena.

Opnião: Filme muito interessante, apesar de ser de 1994 apresenta um enredo e uma história envolvente, é o tipo de filme que eu nunca havia assistido, o que mais impressiona é a capacidade do mesmo de amar uma mulher depois de tudo que ela o fez passar. O filme combina situações tanto de drama quanto de comédia, se você é uma pessoa que facilmente chora ao assistir um filme, neste as duas situações serão misturadas. Muito recomentado!

"Corra Forrest, Corra!"


Fonte da Sinopse: www.webcine.com.br

Resolução - Revisão de Contrato - 2010

Questão da maratona de programação de 2010, basicamente um contador que não cuidou muito bem de seu computador pede sua ajuda para determinar o real valor de seus contratos. Neste problema eu trabalhei na base de string, o número da tecla problemática recebo como inteiro e somo com 48 para obter o seu respectivo número na tabela ASCII, e o número seguinte recebo como uma string.
No tratamento do valor eu substituo todos os valores iguais ao valor problemático por 'A', após isso se a string for composta somente por zeros imprimo "0", senão eu imprimo a partir do primeiro valor diferente de zero.

LINK PARA DOWNLOAD DO CÓDIGO: Código Revisão de Contrato

SITE: http://www.urionlinejudge.com.br/judge/problems/view/1120

Resolução - Robô colecionador - 2010

Questão da maratona de programação de 2010, consiste em elaborar um algoritmo para calcular quantas figurinhas serão coletas pelo robô. O modo mais simples que veio a minha cabeça foi criar uma matriz de char para armazenar todos os elementos da arena e uma struct para armazenar a posição inicial e a próxima posição que ele irá ocupar:

struct pos {
    int x;
    int y;
    int prox_x;
    int prox_y;
}pos;

Com isto basta apenas receber a string de comandos, prestar atenção nas bordas, nas colunas, apagar as figurinhas coletadas e criar um contador para armazenar o número de figuras coletadas!
Vamos lá:


#include<stdio.h>
struct pos {
    int x;
    int y;
    int prox_x;
    int prox_y;
}pos;



int main (void) {
    int L, C, S;
    while (scanf("%d %d %d", &L, &C, &S)&&L!=0) {
        int i, j, fig=0;
        char tab[L][C], cmd[S+1];
        getchar();
        for(i=0; i<L; i++) {
            for(j=0; j<C; j++) {
                tab[i][j]=getchar();
                if(tab[i][j]!='.'&&tab[i][j]!='*'&&tab[i][j]!='#') {
                    pos.x=i;
                    pos.y=j;
                    switch (tab[i][j]) {
                        case 'N':
                            pos.prox_x=i-1;
                            pos.prox_y=j;
                            break;
                        case 'S':
                            pos.prox_x=i+1;
                            pos.prox_y=j;
                            break;
                        case 'L':
                            pos.prox_x=i;
                            pos.prox_y=j+1;
                            break;
                        case 'O':
                            pos.prox_x=i;
                            pos.prox_y=j-1;
                            break;
                    }
                }
            }
            getchar();
        }
        scanf("%s", cmd);
        for (i=0; i<S; i++) {
            switch (cmd[i]) {
                case 'D':
                    if (pos.prox_y==pos.y) {
                        if (pos.prox_x>pos.x) {
                            pos.prox_x=pos.x;
                            pos.prox_y=pos.y-1;
                        }
                        else {
                            pos.prox_x=pos.x;
                            pos.prox_y=pos.y+1;
                        }
                    }
                    else {
                        if (pos.prox_y>pos.y) {
                            pos.prox_y=pos.y;
                            pos.prox_x=pos.x+1;
                        }
                        else {
                            pos.prox_y=pos.y;
                            pos.prox_x=pos.x-1;
                        }
                    }
                    break;
                case 'E':
                    if (pos.prox_x==pos.x) {
                        if (pos.prox_y>pos.y) {
                            pos.prox_y=pos.y;
                            pos.prox_x=pos.x-1;
                        }
                        else {
                            pos.prox_y=pos.y;
                            pos.prox_x=pos.x+1;
                        }
                    }
                    else {
                        if (pos.prox_x>pos.x) {
                            pos.prox_x=pos.x;
                            pos.prox_y=pos.y+1;
                        }
                        else {
                            pos.prox_x=pos.x;
                            pos.prox_y=pos.y-1;
                        }
                    }
                    break;
                case 'F':
                    if (tab[pos.prox_x][pos.prox_y]!='#'&&(pos.prox_x<L&&pos.prox_x>-1)&&(pos.prox_y<C&&pos.prox_y>-1)) {
                        if (tab[pos.prox_x][pos.prox_y]=='*') {
                            tab[pos.prox_x][pos.prox_y]='.';
                            fig++;
                        }
                        if (pos.prox_y==pos.y) {
                            if (pos.prox_x>pos.x) {
                                pos.x=pos.prox_x;
                                pos.prox_x++;

                            }
                            else {
                                pos.x=pos.prox_x;
                                pos.prox_x--;
                            }
                        }
                        else {
                            if (pos.prox_y>pos.y) {
                                pos.y=pos.prox_y;
                                pos.prox_y++;

                            }
                            else {
                                pos.y=pos.prox_y;
                                pos.prox_y--;
                            }
                        }
                    }
                    break;
            }

        }
        printf("%d\n", fig);
    }
    return 0;
}

Admito que o código é bem deselegante mas é uma forma simples e fácil de implementar
SITE: http://www.urionlinejudge.com.br/judge/problems/view/1121



[sourcecode language="c"] Escreva aqui seu código-fonte. [/sourcecode]