Mostrando postagens com marcador eletrônica. Mostrar todas as postagens
Mostrando postagens com marcador eletrônica. Mostrar todas as postagens

sexta-feira, julho 02, 2010

Simulação de um semáforo de trânsito com Arduino



Vídeo demostrando a simulação de um semáforo de trânsito com Arduino.

Hoje dia de jogo da seleção brasileira na copa do mundo da África, dia de folga, dia de arrancar os cabelos com a desclassificação e de aprender mais e mais sobre o meu novo brinquedinho, meu Arduino.
 
Como eu já tinha demonstrado antes aqui no blog, eu já tinha feito algumas brincadeiras com PICs, escrevendo código em Assembly. Mas tem muita coisa que realmente é chato nisso, como ficar trabalhando com os malditos registradores da linguagem, estouro de timer, estouro de variáveis, bit clear, etc. Então fui fazer meu semáforo no Arduino que eu ganho mais ;)
 
A idéia era simular o que vemos nas ruas. Para isso consideremos duas hipotéticas avenidas chamadas A e B.
 
O programa inicia liberando o tráfego de veículos (LED verde) na avenida A e bloqueando-o na avenida B (LED vermelho). O que se segue é o que conhecemos bem: sinal amarelo na avenida A, sinal vermelho na avenida A e verde na B e depois o contrário, amarelo na avenida B, vermelho na avenida B e verde na A novamente.
 
O vídeo está no YouTube para quem quiser ver. Eis a URL: http://www.youtube.com/watch?v=-bUbkyEs3CM
 
E aqui o código fonte:
 

/******************************************************************************;
; Processor: ATMEGA328 ;
; Function : This circuit simulates a typically operation of a traffic light. ;
; There is two sets of LEDs, one representing an hypothetical ;
; avenue "A" and the other set representing an hypothetical avenue ;
; "B". When the program starts the traffic on avenue "A" will be ;
; released and the traffic will be stopped on avenue "B". ;
; After 3s the traffic will be stopped on avenue "A" and will be ;
; released on avenue "B". Before this change, the alert light ;
; (yellow LED) will appear turned on for 1,5s on avenue's "A" ;
; traffic light. After this operation the circle will be reversed. ;
; Hardware : Arduino Duemilanove and an protoboard ;
; Filename : main.pde ;
; Author : Jean J. Míchel ;
; Website : http://www.jeanjmichel.blogspot.com ;
; Credit : ;
;******************************************************************************/

//Traffic light of avenue A
int avenueARed = 12;
int avenueAYellow = 11;
int avenueAGreen = 10;

//Traffic light of avenue B
int avenueBRed = 2;
int avenueBYellow = 3;
int avenueBGreen = 4;

void setup() { //This section will be performed just
pinMode(avenueARed ,OUTPUT); //once after the Arduino be energized
pinMode(avenueAYellow ,OUTPUT); //and sets the orientation of ATmega
pinMode(avenueAGreen ,OUTPUT); //ports

pinMode(avenueBRed ,OUTPUT);
pinMode(avenueBYellow ,OUTPUT);
pinMode(avenueBGreen ,OUTPUT);
}

void openAvenueA() { //Method for release the traffic on
digitalWrite(avenueARed ,LOW); //avenue A
digitalWrite(avenueAYellow ,LOW);
digitalWrite(avenueAGreen ,HIGH);
}

void closeAvenueA() { //Method for stop the traffic on
digitalWrite(avenueARed ,HIGH); //avenue A
digitalWrite(avenueAYellow ,LOW);
digitalWrite(avenueAGreen ,LOW);
}

void prepareToCloseAvenueA() { //Method to display the warning light
digitalWrite(avenueAYellow ,HIGH); //on avenue A
}

void openAvenueB() { //Method for release the traffic on
digitalWrite(avenueBRed ,LOW); //avenue B
digitalWrite(avenueBYellow ,LOW);
digitalWrite(avenueBGreen ,HIGH);
}

void prepareToCloseAvenueB() { //Method to display the warning light
digitalWrite(avenueBYellow ,HIGH); //on avenue B
}

void closeAvenueB() { //Method for stop the traffic on
digitalWrite(avenueBRed ,HIGH); //avenue B
digitalWrite(avenueBYellow ,LOW);
digitalWrite(avenueBGreen ,LOW);
}

void loop() { //This method will be performed over
openAvenueA(); //and over again as long as the
closeAvenueB(); //Arduino has energized

delay(3000);
prepareToCloseAvenueA();
delay(1500);
closeAvenueA();
openAvenueB();

delay(3000);
prepareToCloseAvenueB();
delay(1500);
closeAvenueB();
}

quinta-feira, julho 01, 2010

Arduino Duemilanove


See at jeanjmichel.blogspot.com
Arduino Duemilanove.

 
Depois de 22 dias de espera chegou meu Arduino Duemilanove que comprei no eBay (veio da China), mas por apenas US$ 12.00 valeu a pena a espera.
Comei cogitando a idéia de montar o meu Arduino em casa, para isso comecei a procurar os esquemas e o desenho da placa para uma versão não SMD. Só achei uma versão serial, e eu queria mesmo a USB.
Então fui procurar onde comprar um Arduino aqui no Brasil, e cogitei a versão "extendida" dele, da Globalcode, chamado Program-ME, mas por hora o meu orçamento não me permite desembolsar R$ 190.00 em um brinquedinho que eu posso nem mesmo gostar tanto assim, abandoná-lo e voltar para os PICs da Microchip que venho brincando e tenho o suporte de um colega de trabalho que conhece muito a respeito.
Então o negócio foi apelar para o Mercado Livre e lojas do ramo de eletrônica, mesmo assim um Arduino não sairia por menos de R$ 80.00. Deu aquele estalo e fui olhar o eBay, e lá encontrei um leilão começando em US$ 1.00 de um Arduino Duemilanove, bem o que eu queria ;), e arrematei por US$ 12.00. Coloca aí mais US$ 9.00 de frete internacional e temos um Arduino Duemilanove por R$ 37.00 ;)
 
Demorou mas chegou. Veio o Arduino mais o cabo USB. Eu já tinha baixado a IDE (acesse aqui para baixar) e lido alguns tutoriais bem simples, além de ter visto o pessoal da Globalcode aloprando com o Program-ME criando robôs, usando displays, etc.
 
Apenas ontem que tive tempo de testar o bichinho. Muito simples de usar, fio espertar o Arduino na USB e o Windows 7 já o detectou numa boa, depois foi colocar o código na IDE, compilar, fazer o up load para o Arduino, colocar o LED nas portas certas e ver o resultado ;) Foi este meu primeiro exemplo.
 

See at jeanjmichel.blogspot.com
Primeira montagem.

 
Recomendo a todos que tem o espírito "Professor Pardal" e gostam de ver as coisas acontecendo, etc.
 
Em breve posto mais coisas que irei fazendo até chegar no Daileon =P

quarta-feira, junho 30, 2010

Fotos do meu último experimento

Aí estão as fotos da montagem do meu último experimento (nada científico) com o PIC 16F628A da Microchip.
 
Mas não se anime, pois não está funcionando :(
 
Vou dar uma debugada depois, com calma, pois no Proteus está funcionando. Devo ter feito alguma barberagem na hora de montar, sei lá.
 
O que acontece é que quando o botão é pressionado os dois LEDs vermelhos apagam e o verde não liga.
 
Eis as fotos:
 
See at http://www.flickr.com/photos/jeanjmichel
 
See at http://www.flickr.com/photos/jeanjmichel
 
See at http://www.flickr.com/photos/jeanjmichel
 
See at http://www.flickr.com/photos/jeanjmichel

quarta-feira, junho 09, 2010

Mais um experimento com PIC 16F628A e Assembly

Seguindo a minha saga pelo mundo dos microcontroladores, hoje fiz mais um exemplo em Assembly usando o PIC 16F628A da Microchip.
 
A brincadeira é permutar entre o acendimento de um ou outro LED via chave táctil.
 
O fluxo do programa é este:
 
Fluxo
 
Aqui estão as imagens da simulação do circuito feita no Proteus:
 
Circuito desligado
Circuito desligado.
 
Circuito ligado
Circuito ligado.
 
Chave pressionada
Chave pressionada.
 
E aqui está o código Assembly:
 
;******************************************************************************;
; Processor: PIC16F628 at 4 MHz using internal RC oscillator                   ;
; Function : When the circuit is energized two LEDs will turn on, the power    ;
;            indicator and LED_D1. Every time the button is pressed the LED_D1 ;
;            will turn off and the LED_D2 will turn on, the opposite occurs    ;
;            when the button is released, turning off the LED_D2 and turning   ;
;            on the LED_D1 again.                                              ;
; Hardware : Protoboard                                                        ;
; Filename : main.asm                                                          ;
; Author   : Jean J. Míchel <jeanjmichel-at-gmail.com>                         ;
; Website  : http://www.jeanjmichel.blogspot.com                               ;
; Credit   :                                                                   ;
;******************************************************************************;
; Wiring diagram                               +-/\/\/--|>|--o GND             ;
;                                  +---v---+   |  R2    LED_PWR                ;
;                                -<|º  1   |>--+                               ;
;                                -<|   6   |>----/\/\/--|>|--o GND             ;
;                                -<|   F   |>--+  R3    D1                     ;
;                                -<|   6   |>- |                               ;
;                                -<|   2   |>- +-/\/\/--|>|--o GND             ;
;                                -<|   8   |>-    R4    D2                     ;
;                                -<|   A   |>-                                 ;
;                                -<|       |>--+----o¯o----o VDD 5v            ;
;                                  +-------+   |    R1                         ;
;                                              +---/\/\/---o GND               ;
;******************************************************************************;
#include  <p16f628a.inc>
list p=16f628a
ERRORLEVEL 0, -302;, -224, -302, -305, -207
__config (_INTOSC_OSC_NOCLKOUT & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_OFF)
 
#define   select_bank0  bcf STATUS,RP0
#define   select_bank1  bsf STATUS,RP0
#define   LED_PWR  PORTA,1
#define   LED_D1   PORTA,0
#define   LED_D2   PORTA,7
#define   BUTTON   PORTB,4
 
                org       0x00
                goto      setup              ;Perform the initial settings     ;
                
main            btfsc     BUTTON             ;Monitors the action of the button;
                goto      turn_on_d2         ;Turns on LED_D2                  ;
                goto      turn_on_d1         ;Turns on LED_D1                  ;
                
turn_on_d1      bcf       LED_D2             ;Turns off LED_D2                 ;
                bsf       LED_D1             ;Turns on LED_D1                  ;
                goto      main
                
turn_on_d2      bcf       LED_D1             ;Turns off LED_D1                 ;
                bsf       LED_D2             ;Turns on LED_D2                  ;
                goto      main
                
setup           select_bank1
                movlw     B'00000000'        ;Defines all pins of the PORTA    ;
                movwf     TRISA              ;registrator as output            ;
                
                movlw     B'00010000'        ;Defines all pins of the PORTB    ;
                movwf     TRISB              ;registrator as output except the ;
                                             ;the pin 4 - push button          ;
                
                bsf       PCON, OSCF         ;Sets 16F628 to operate at 4MHz   ;
                
                select_bank0
                movlw     0x07
                movwf     CMCON              ;Turns off the comparator         ;
                
                clrf      PORTA              ;Clears all pins of the PORTA     ;
                                             ;registrator                      ;
                
                clrf      PORTB              ;Clears all pins of the PORTB     ;
                                             ;registrator                      ;
                
                bsf       LED_PWR            ;Turns on LED_PWR - power LED     ;
 
 
                goto      main               ;Loop forever ;)                  ;
 
end
 
Enjoy!

sábado, junho 05, 2010

Eletrônica - micro controlador Microchip 16F628A + Assembly [fotos]

Tinha ficado devendo as fotos do meu experimento com o PIC 16F628A da Microchip, bem aqui estão elas:
 
Montagem na protoboard
 
Montagem na protoboard
 
Montagem na protoboard
 
Ficou bem legal, funcionou conforme o simulado, mas dei algumas mancadas na hora de construir o circuito, falta de prática :-D.

terça-feira, junho 01, 2010

Eletrônica - micro controlador Microchip 16F628A + Assembly

Quem, assim como eu, trabalha com TI está acostumado a ver sistemas transformando informações em informações =P, ou seja, dados vem daqui e vão para lá. Isso me deixa um pouco frustrado, pois não construo nada, não vejo nada acontecer, etc. (não me diga que ver um gráfico em um relatório é "ver" as coisas acontecerem em um sistema ;) ) então voltei para os meus primórdios sonhos infantis de construir alguma coisa (na verdade um robô) e para isso invoquei meus conhecimentos de quando tinha 15 anos e estudei na Escola Estadual Técnica Parobé (hoje Centro Tecnológico Estadual Parobé), onde cursei eletrônica.
 
Junte a vontade de fazer algo "se mexer" a ter um colega com skills do Professor Pardal a muitas conversas sobre automação na hora do almoço e um passeio pela Rua República do Líbano (onde estão as lojas de componentes eletrônicos aqui no Rio de Janeiro) e então terás nas mãos uma protoboard, um punhado de componentes e muita diversão ;)
 
Comecei leve: um micro controlador da Microchip (16F628A), dois LEDs, um botão e um programa escrito em Assembly. Assembly ao invés de C porque é o mais próximo que podemos chegar de ver os elétrons passando pela placa ;).
 
A brincadeira é muito simples, mas com ela tive contato com Assembly para micro controladores, o que não conhecia.
 
Vamos lá, o negócio é ter dois LEDs ligados no PIC, um ficará permanentemente aceso (indicando que o circuito está ligado) e o outro LED ficará desligado até que se pressione o botão, que o ligará.
 
Eis a simulação do circuito (as imagens podem ser vistas direto no Flickr: http://www.flickr.com/photos/jeanjmichel/sets/72157624156071640/):
 
Circuito desligado:
desligado
 
Circuito ligado:
ligado
 
Circuito em uso (botão pressionado):
ligado
 
Eis o código Assembly:
 
;******************************************************************************;
; Processor: PIC16F628 at 4 MHz using internal RC oscillator                   ;
; Function : Switch on two LEDs. The first LED (D1), conenected to RB0, turns  ;
;            on when the circuit is energized (power LED), while the second    ;
;            LED (D2), connected to RA1, just turns on when the push button    ;
;            (PB1) is pressed.                                                 ;
; Hardware : Protoboard                                                        ;
; Filename : main.asm                                                          ;
; Author   : Jean J. Míchel <jeanjmichel-at-gmail.com>                         ;
; Website  : http://www.jeanjmichel.blogspot.com                               ;
; Credit   : Eduardo Bekman                                                    ;
;******************************************************************************;
; Wiring diagram                                                               ;
;                                  +---v---+    R1    D1                       ;
;                                -<|º  1   |>--/\/\/--|>|--o GND               ;
;                                -<|   6   |>--+                               ;
;                                -<|   F   |>- +----o¯o----o VDD 5v            ;
;                                -<|   6   |>- |    PB1                        ;
;                     D2    R3   -<|   2   |>- |                               ;
;              GND o--|<|--/\/\/--<|   8   |>- +---/\/\/---o GND               ;
;                                -<|   A   |>-      R2                         ;
;                                -<|       |>-                                 ;
;                                  +-------+                                   ;
;                                                                              ;
;******************************************************************************;
#include  <p16f628a.inc>
list p=16f628a
ERRORLEVEL 0, -302;, -224, -302, -305, -207
__config (_INTOSC_OSC_NOCLKOUT & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _BODEN_OFF & _MCLRE_OFF)
 
#define   select_bank0  bcf STATUS,RP0
#define   select_bank1  bsf STATUS,RP0
#define   BUTTON  PORTA,0
#define   LED_D1  PORTA,1
#define   LED_D2  PORTB,0
 
                org       0x00
                goto      setup              ;Perform the initial settings     ;
 
main            btfsc     BUTTON             ;Monitors the action of the button;
                goto      turn_on_led        ;Turns on LED_D1                  ;
                goto      turn_off_led       ;Turns off LED_D1                 ;
 
turn_on_led     bsf       LED_D1             ;Turns on LED_D1                  ;
                goto      main
 
turn_off_led    bcf       LED_D1             ;Turns off LED_D1                 ;
                goto      main
 
setup           select_bank1
                movlw     B'00000001'        ;Defines all pins of the PORTA    ;
                movwf     TRISA              ;registrator as output except     ;
                                             ;pin 0 - push button              ;
 
                movlw     B'00000000'        ;Defines all pins of the PORTB    ;
                movwf     TRISB              ;registrator as output            ;
 
                bsf       PCON, OSCF         ;Sets 16F628 to operate at 4MHz   ;
 
                select_bank0
                movlw     0x07
                movwf     CMCON              ;Turns off the comparator         ;
 
                clrf      PORTA              ;Clears all pins of the PORTA     ;
                                             ;registrator                      ;
 
                clrf      PORTB              ;Clears all pins of the PORTB     ;
                                             ;registrator                      ;
 
                bsf       LED_D2             ;Turns on LED_D2 - power LED      ;
                goto      main               ;Loop forever ;)                  ;
 
end
 
Ainda não consegui monta-lo na protoboard para postar fotos e vídeos do projeto funcionando, mas assim que o fizer eu posto.