About

quinta-feira, 30 de maio de 2013

quinta-feira, 23 de maio de 2013

3D Printer - Primeiras peças

Começaram a chegar as primeiras peças da minha impressora 3d, logo logo vou começar a postar sobre a montagem dela e imprimir peças para meus projetos! :D

quinta-feira, 2 de maio de 2013

Temporizadores (por Threads) no Arduino


Eu de novo em mais um post surpreendente, espetacular!! Uma coisa que não sabia que existia no arduino: Threads. Claro! O arduino processa código C, então dá pra fazer isso e muito mais. Em baixo vai o código de um temporizador que precisei fazer pro projeto Kerberos:



void requireStatus(){
   Serial1.println("Status");
}

void requireModo(){
   Serial1.println("Modo");
}

// Envio de mensagens para o controle
#define NUMBER_OF_ACTIONS 2

// Classe da Thread
typedef struct{
   unsigned long previousTrigger;
   unsigned int interval;
   void (*function)();
}ProtoThread;

// Instancia da Thread
ProtoThread protoThreads[NUMBER_OF_ACTIONS] = {
   {5000,10000,requireModo},
   {2000,10000,requireStatus} //predelay 2000 milliseconds, then from then on always trigger every 1000        millisecond - REPETE CADA 1s
};

void loop(){
  delay(100);
  // Verifica Threads
  for (byte i=0; i<NUMBER_OF_ACTIONS; i++) {
    if ((millis() - protoThreads[i].previousTrigger) > protoThreads[i].interval) {
      protoThreads[i].previousTrigger = millis();
      protoThreads[i].function();
    }
    delay(100);
  }
}



Dando uma explicada sobre o que tá acontecendo: o comando 'typedef struct' vai criar uma estrutura, uma classe chamada ProtoThread. Logo abaixo estamos instanciando ela passando o tempo para iniciar a partir do power on do arduino, o tempo de espera para ser executada novamente e a função que irá chamar. Veja que o Loop é o encarregado de fazer a verificação.

Por enquanto é só pessoal! Qualquer dúvida comenta ai.

ja ta ja ne

quarta-feira, 1 de maio de 2013

Tela TFT 3.2" / 2.4" Touch Screen


  Saudações! Neste post vou falar um pouco sobre a telinha TFT TouchScreen, muito legal de usar e pouco prático de programar, então criei uns métodos mais dinâmicos para criação de botões e comandos de toque. Estou usando a biblioteca do Henning Karlsen e uma dificuldade que tive foi 'adivinhar' qual constante usar não inicialização da classe, então coloquei aqui a lista de constantes encontrada em UTFT.h, já pra saber qual o CI da sua tela, você deve consultar o datasheet com o fabricante, as vezes também pode-se encontrar no site da loja. 

Meu projeto de controle do Kerberos (Ainda falarei sobre ele)

Em baixo vai um código que preparei para mostrar como criar telas, botões e chamar funções pelo touch.

#include <UTFT.h>
#include <ITDB02_Touch.h>

extern uint8_t BigFont[];
extern uint8_t SmallFont[];

// constantes do menu
const int MENU_PRINCIPAL = 1000;
const int ACT_BOTAO1 = 1001;
const int ACT_BOTAO2 = 1002;
const int ACT_BOTAO3 = 1003;
const int ACT_BOTAO4 = 1004;


// Aqui deve-se saber qual o CI de controle da sua tela, no meu caso o SSD1289
UTFT myGLCD(ITDB32S,38,39,40,41);
ITDB02_Touch myTouch(42,43,44,45,46);

// Constantes de Menu \ Ações
int x, y;
int coordTouchButton[6][5];
int qtdButtons = 0;

void printButton(String titulo, int id, int x1, int y1, int x2, int y2){
    myGLCD.setColor(0, 0, 255);
    myGLCD.fillRoundRect (x1, y1, x2, y2);
    myGLCD.setColor(255, 255, 255);
    myGLCD.drawRoundRect (x1, y1, x2, y2);
    myGLCD.setBackColor(0, 0, 255);
    myGLCD.print(titulo, x1+10, centered(y1,y2));
    coordTouchButton[qtdButtons][0] = x1;
    coordTouchButton[qtdButtons][1] = y1;
    coordTouchButton[qtdButtons][2] = x2;
    coordTouchButton[qtdButtons][3] = y2;
    coordTouchButton[qtdButtons][4] = id;
    qtdButtons++;
}


void printMenuPrincipal(){
  myTouch.InitTouch(orientation);
  myGLCD.clrScr();
  printButton("BOTAO 1", ACT_BOTAO1, 10, 30, 150, 80);
  printButton("BOTAO 2", ACT_BOTAO2, 160, 30, 300, 80);
  printButton("BOTAO 3", ACT_BOTAO3, 10, 90, 150, 140);
  printButton("BOTAO 4", ACT_BOTAO4, 160, 90, 300, 140);
//  Se precisar de mais botões
//  printButton("", 10, 150, 150, 200);
//  printButton("", 160, 150, 300, 200);
  printTitle("Titulo Controle X");
  printStatus("Status ok!");
}


void printStatus(String texto){
    myGLCD.setBackColor(0, 0, 200);
    myGLCD.print("                                        ", LEFT, 224);
    myGLCD.setColor(0, 255, 0);
    myGLCD.print(texto, LEFT, 224);
}

void printTitle(String texto){
    myGLCD.setBackColor(0, 0, 102);
    myGLCD.print("                                                            ", LEFT, LEFT);
    myGLCD.setColor(0, 255, 0);
    myGLCD.print(texto, LEFT, LEFT);
}

void executeTouchCmd(int id){

  switch (id)
  {
    case MENU_PRINCIPAL:
      printMenuPrincipal();
      menu_action = id;
      break;

    case BOTAO_1:
      //executaAcao1();
      menu_action = id;
      break;


    default:
      Serial1.println(id);
      break;
  }
 }

// Draw a red frame while a button is touched
void waitForIt(int x1, int y1, int x2, int y2)
{
  myGLCD.setColor(255, 0, 0);
  myGLCD.drawRoundRect (x1, y1, x2, y2);
  while (myTouch.dataAvailable())
    myTouch.read();
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRoundRect (x1, y1, x2, y2);
}


int getButton(int x, int y){
        for(int i=0;i<qtdButtons;i++){
            if ((y>=coordTouchButton[i][1]) && (y<=coordTouchButton[i][3])){
                if ((x>=coordTouchButton[i][0]) && (x<=coordTouchButton[i][2])){
                    tone(PIN_BUZZ, NOTE_C4, 8);
                    waitForIt(coordTouchButton[i][0], coordTouchButton[i][1], coordTouchButton[i][2],          coordTouchButton[i][3]);
                    return coordTouchButton[i][4];
                }
            }
        }
}

void getTouch(){
        if (myTouch.dataAvailable()){
            myTouch.read();
            x=myTouch.getX();
            y=map(myTouch.getY(), 0, 240, 240, 0);
//            y=myTouch.getY();
            Serial.print("x:");
            Serial.println(x);
            Serial.print("y:");
            Serial.println(y);
            executeTouchCmd(getButton(x,y));
        }
}

void setup()
{
  // Initial setup
  myGLCD.InitLCD(orientation);
  myGLCD.clrScr();

  myTouch.InitTouch(orientation);
  myTouch.setPrecision(PREC_HI);

  myGLCD.setFont(SmallFont);
  myGLCD.setBackColor(0, 0, 255);

  printMenuPrincipal();
}

void loop(){
  getTouch();
}


Enfim pessoal, qualquer dúvida ou sugestão manda comentário, inclusive se acharem algum bug no código ;)

ja ta ja ne!

terça-feira, 9 de abril de 2013

Módulo Wireless APC220



Este post é sobre o módulo APC220, ao longo da implementação desse carinha eu tive algumas dificuldades que queria compartilhar.
Os códigos que encontrei na web eram, no geral, criados para envio de char ou int. Eu queria algo mais dinâmico, usando String! Eis o código:

 String serialRead() {
String msg;
while (!Serial1.available()) {
char c = (char) Serial1.read();
if (c == '\n') {
break;
}
msg += c;
delay(1);
}
msg.trim();
return msg;
}
// Esse método é disparado sempre
// que a porta serial recebe alguma coisa
// nesse caso a Serial1 do Arduino Mega
void serialEvent1() {
String msg;
while (1 == 1) {
char c = (char) Serial1.read();
if (c == '\n') {
break;
}
msg += c;
delay(1);
}
msg.trim();
Serial.println("mensagem recebida: " + msg);
}
void setup() {
// Initial setup
Serial.begin(9600);
Serial1.begin(9600);
}
void loop() {
}

O módulo APC vem com um adaptador USB, então você pode conectá-lo e enviar mensagens usando o monitor serial para testar. Esse código vai receber a mensagem do APC pela porta serial 1 e enviar para serial padrão.

quinta-feira, 4 de abril de 2013

Começando!


Eaê Galera!?

Este é o primeiro post do meu blog sobre Arduino. Meu objetivo, inicialmente é facilitar a vida de quem tá começando a se aventurar nesse mundo, pois tive algumas dificuldades para entender algumas coisas.
Então, pra começar, o que é o Arduino? Bem, costumo dizer que o Arduino é um  "computadorzinho" em que, com simples comandos de programação você consegue controlar diversos dispositivos eletrônicos, desde LEDs a uma tela TFT (thin-film transistor). Muitos desses dispositivos são as "shields", módulos mais complexos feitos essencialmente para o Arduino.
Particulamente, eu sou mais prático que isso, vamos a um exemplo: o famoso Blink!



/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.

  This example code is in the public domain.
 */


// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Affiliate Network Reviews