Pages: 1 [2]   Go Down
Author Topic: Dúvida ligação máquina fotográfica DSLR ao Arduino  (Read 2845 times)
0 Members and 1 Guest are viewing this topic.
'round the world...
Online Online
Faraday Member
**
Karma: 41
Posts: 3108
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Não fiques assim... o teu código também funciona, mas não é muito flexível por causa dos delays.

Este é um pouco mais complexo, mas após compreenderes o objectivo torna-se simples.

Reparei que a parte da sequência estava desalinhada, se meteres alinhado talvez consigas ver melhor.
Os bits são vistos da direita para a esquerda, ou seja, o bit mais à direita é o zero, o seguinte à o um, etc... Esses bits indicam o estado das luzes ou válvula em cada momento. Como podes ver, no primeiro estado a lampada externa (que ainda não tens no teu sistema) está ligada para tu preparares tudo. Depois o estado 1 diz-te que a lâmpada está apagada e a válvula e obturador estão abertos. Depois apenas o obturador, depois o obturador e a válvula.

No setup tens a definicão da sequencia. Onde eu escrevi a explicacão da sequencia, o numero do estado é o indice do vector sequencia_pinos e o valor que eu coloquei é visto por de cima para baixo. Ou seja:

estado zero - 0b00000001
estado um  - 0b00000110
estado dois - 0b00000100

... estás a ver a mecânica?

O vector estado_tempos indica o tempo que demora a passar de estado para estado.
Hoje talvez tenha algum tempo para ver isto por casa com uns leds e se a sequencia funciona (ontem usei um bocado de código semelhante para simular um encoder, por isso deve dar). 
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Não fiques assim... o teu código também funciona, mas não é muito flexível por causa dos delays.

Este é um pouco mais complexo, mas após compreenderes o objectivo torna-se simples.

Reparei que a parte da sequência estava desalinhada, se meteres alinhado talvez consigas ver melhor.
Os bits são vistos da direita para a esquerda, ou seja, o bit mais à direita é o zero, o seguinte à o um, etc... Esses bits indicam o estado das luzes ou válvula em cada momento. Como podes ver, no primeiro estado a lampada externa (que ainda não tens no teu sistema) está ligada para tu preparares tudo. Depois o estado 1 diz-te que a lâmpada está apagada e a válvula e obturador estão abertos. Depois apenas o obturador, depois o obturador e a válvula.

No setup tens a definicão da sequencia. Onde eu escrevi a explicacão da sequencia, o numero do estado é o indice do vector sequencia_pinos e o valor que eu coloquei é visto por de cima para baixo. Ou seja:

estado zero - 0b00000001
estado um  - 0b00000110
estado dois - 0b00000100

... estás a ver a mecânica?

O vector estado_tempos indica o tempo que demora a passar de estado para estado.
Hoje talvez tenha algum tempo para ver isto por casa com uns leds e se a sequencia funciona (ontem usei um bocado de código semelhante para simular um encoder, por isso deve dar). 

AHH,da direita para a esquerda  smiley  era isso que me estava a fazer confusão pois estava a tentar ler ao contrário,assim já estou a ver melhor,mas aquele primeiro "0" da esquerda e o "b",o que significam?

Vou estar uns dias sem internet e em principio só posso continuar isto no fim de semana,mas volto aqui logo que possa  smiley-wink
Logged

'round the world...
Online Online
Faraday Member
**
Karma: 41
Posts: 3108
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

o 0b é para indicar ao arduino que o numero que está à frente é para ser pensado como um numero binário e não um inteiro. Se nõa indicares isso, o arduino pensa que aquilo é um numero inteiro na ordem dos milhões. smiley-wink
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

... depois é uma questão de adicionar o LCD. Isso será o mais complicado. :\ LOL

Olá  smiley

Estive a ver onde conseguia chegar na configuração e nos menus do lcd,mas não me safo  smiley-eek é mesmo complicado para mim,podes abrir um pouco o caminho?Sozinho está visto que não vou lá!
Logged

'round the world...
Online Online
Faraday Member
**
Karma: 41
Posts: 3108
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Para começar tens de ter teclas... tendo isso, podes definir o que é que elas fazem.

Por exemplo, ter um cursor para andar para cima e outra para baixo, ou só uma para andar em frente e dar a volta. Uma tecla para cancelar e uma tecla para confirmar será o minimo.

Depois tens de definir a árvore dos menus. Depois torna-se mais fácil de codificar pois dá para ver as interacções que são necessárias para mexer nos menus. smiley

Começa por aí e depois eu coloco aqui um exemplo (genérico) para implementar um sistema de menus.

Nota também que os menus podem ocupar imenso espaço de memória se pretenderes colocar imensas strings com descrições do menu. Por isso acho melhor fazer algo bem simples no menu, ou então usar indices em vez de strings de texto.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

'round the world...
Online Online
Faraday Member
**
Karma: 41
Posts: 3108
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pensa conceptualmente.

Faz um esquema do que pretendes e de como as teclas que tens disponíveis te vão levar lá. Depois disso estar pronto, o resto é relativamente fácil. Pensa nisso primeiro... pensa também que parâmetros queres ajustar... nota que a sequência que tens tem imensos parâmetros para ajustar. Talvez queiras simplificar isso com o LCD e só tenhas a possibilidade de ajustar uns poucos. Tudo isso é importante definir antes de andar para a frente.

Infelizmente com 3 litros de cerveja no bucho não consigo ser muita ajuda de momento. Amanhã tiro um tempinho para deixar aqui um exemplo ou um esqueleto para veres a mecânica.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Eu bem tenho estudado,mas isto é muito complicado para alguém como eu que não tem bases nenhumas nisto...

Estive a tentar perceber quantos menus preciso e parece.me que bastam 3:

MENU ENTRADA
linha 1 -------------Gota_1
linha 2--------------Gota_2

MENU_1_Gota_1
linha 1--------------Tamanho(1º tempo da minha sequência_tempos)
linha 2--------------Tempo_Atraso(2º tempo da minha sequência_tempos)

MENU_2_Gota_2
linha 1--------------Tamanho(3º tempo da minha sequência_tempos)
linha 2--------------Tempo_Atraso(4º tempo da minha sequência_tempos)

Os outros tempos serão fixos depois dos ajustes iniciais...
Mas estou com extrema dificuldade em criar os menus e a navegação através das teclas,por mais que me esforce,parece-me uma tarefa impossível para mim.

Penso que a questão da definição das teclas consigo fazer,mas isso é só ir à biblioteca da minha Shield e copiar,a biblioteca está aqui: http://linksprite.com/wiki/index.php5?title=16_X_2_LCD_Keypad_Shield_for_Arduino

Eu não estou a conseguir passar disto:

Code:
/*--------------------------------------------------------------------------------------
  Includes
--------------------------------------------------------------------------------------*/
#include <LiquidCrystal.h>   // include LCD library
/*--------------------------------------------------------------------------------------
  Defines
--------------------------------------------------------------------------------------*/

// Pins in use
#define BUTTON_ADC_PIN           A0  // A0 is the button ADC input
#define LCD_BACKLIGHT_PIN         10  // D10 controls LCD backlight
// ADC readings expected for the 5 buttons on the ADC input
#define RIGHT_10BIT_ADC           0  // right
#define UP_10BIT_ADC            145  // up
#define DOWN_10BIT_ADC          329  // down
#define LEFT_10BIT_ADC          505  // left
#define SELECT_10BIT_ADC        741  // right
#define BUTTONHYSTERESIS         10  // hysteresis for valid button sensing window
//return values for ReadButtons()

#define BUTTON_NONE               0  //
#define BUTTON_RIGHT              1  //
#define BUTTON_UP                 2  //
#define BUTTON_DOWN               3  //
#define BUTTON_LEFT               4  //
#define BUTTON_SELECT             5  //
//some example macros with friendly labels for LCD backlight/pin control, tested and can be swapped into the example code as you like
#define LCD_BACKLIGHT_OFF()     digitalWrite( LCD_BACKLIGHT_PIN, LOW )
#define LCD_BACKLIGHT_ON()      digitalWrite( LCD_BACKLIGHT_PIN, HIGH )
#define LCD_BACKLIGHT(state)    { if( state ){digitalWrite( LCD_BACKLIGHT_PIN, HIGH );}else{digitalWrite( LCD_BACKLIGHT_PIN, LOW );} }
//Numero de Menus
#define Numero_de_Menus    3
/*--------------------------------------------------------------------------------------
  Variables
--------------------------------------------------------------------------------------*/
byte buttonJustPressed  = false;         //this will be true after a ReadButtons() call if triggered
byte buttonJustReleased = false;         //this will be true after a ReadButtons() call if triggered
byte buttonWas          = BUTTON_NONE;   //used by ReadButtons() for detection of button events
/*--------------------------------------------------------------------------------------
  Init the LCD library with the LCD pins to be used
--------------------------------------------------------------------------------------*/
LiquidCrystal lcd( 8, 9, 4, 5, 6, 7 );   //Pins for the freetronics 16x2 LCD shield. LCD: ( RS, E, LCD-D4, LCD-D5, LCD-D6, LCD-D7 )

//
unsigned long time;

#define PASSOS     8


const char pushButtonPin = 29;  //botão de inicio ligado ao pinp 13
const char cameraPin = 25;   //shutter da máquina ligado ao pino 10
const char valvulaPin = 27;  //válvula ligada ao pino 11
const char flashPin = 23;    //flash ligado ao pino 12

//sequências...
/*
As sequências são definidas por bits. cada unsigned char tem 8 bits.
Estados                     0    1    2    3    4    5    6    7

bit 0 - valvulaPin          1 -- 0 -- 1 -- 0 -- 0 -- 0 -- 0 -- 0
bit 1 - cameraPin           0 -- 0 -- 0 -- 0 -- 1 -- 1 -- 1 -- 0
bit 2 - flashPin            0 -- 0 -- 0 -- 0 -- 0 -- 1 -- 0 -- 0

*/
unsigned char sequencia_pinos[7]; //imagine que a sequência tem 8 estados
unsigned long sequencia_tempos[7]; //tempos entre sequências...

void executa_sequencia(unsigned long start) {
   unsigned char seq_counter = 0;
   
   for (int i = 0; i < PASSOS; i++) { //percorre as sequencias
      do {
          digitalWrite(valvulaPin, (sequencia_pinos[i] & 0x1));
          digitalWrite(cameraPin, (sequencia_pinos[i] >> 1) & 0x1);
          digitalWrite(flashPin, (sequencia_pinos[i] >> 2) & 0x1);
         
      }while (millis() - start <= sequencia_tempos[i]); 
      start = millis(); //reinicializa temporizacção
   }//end for   
       
}

void setup()
{


   //button adc input
   pinMode( BUTTON_ADC_PIN, INPUT );         //ensure A0 is an input
   digitalWrite( BUTTON_ADC_PIN, LOW );      //ensure pullup is off on A0
   //lcd backlight control
   digitalWrite( LCD_BACKLIGHT_PIN, HIGH );  //backlight control pin D3 is high (on)
   pinMode( LCD_BACKLIGHT_PIN, OUTPUT );     //D3 is an output
   //set up the LCD number of columns and rows:
   lcd.begin( 16, 2 );
   //Print some initial text to the LCD.
   lcd.setCursor( 0, 0 );   //top left
   //          1234567890123456
   lcd.print( "Ola" );
   //
   lcd.setCursor( 0, 1 );   //bottom left
   //          1234567890123456
   lcd.print( "Pedro" );

 
//inicializa sequencia de pinos.
   sequencia_pinos[0] = 0b0000001;
   sequencia_pinos[1] = 0b0000000;
   sequencia_pinos[2] = 0b0000001;
   sequencia_pinos[3] = 0b0000000;
   sequencia_pinos[4] = 0b0000010;
   sequencia_pinos[5] = 0b0000110;
   sequencia_pinos[6] = 0b0000010;
   sequencia_pinos[7] = 0b0000000;

//inicializa sequencia de tempo. 
   sequencia_tempos[0] = 200; //tamanho gota 1
   sequencia_tempos[1] = 1000; //tempo que demora gota 1 cair
   sequencia_tempos[2] = 400; //tamanho gota 2
   sequencia_tempos[3] = 700; //tempo que demora gota 2 colidir com gota 1
   sequencia_tempos[4] = 200; //atraso entre abertura obturador e disparo do flash
   sequencia_tempos[5] = 10; //tempo de disparo do flash
   sequencia_tempos[6] = 100; //atraso fecho obturador depois do flash disparar

   pinMode(pushButtonPin,INPUT);    //inicia o botão como input
   pinMode(cameraPin,OUTPUT);    //inicia o shutter como output
   pinMode(valvulaPin,OUTPUT);   //inicia a válvula como output
   pinMode(flashPin,OUTPUT);     //inicia o flash como output

     
 }

 
 void loop() {
    if (digitalRead(pushButtonPin) == 1) { //carregaste no botão
        executa_sequencia(millis());
    }


 }


Preciso mesmo de um grande empurrão,se puderes ajudar,agradeço!
Logged

'round the world...
Online Online
Faraday Member
**
Karma: 41
Posts: 3108
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok... vamos dividir para conquistar.

Primeiro esquece a parte das gotas. Sabemos que temos 4 variáveis para ajustar. Não percebi o que queres dizer por menu de entrada. Se vires um LCD de 16 caracteres, não consegues meter lá muita informação.

Aqui fica um excerto da mecânica.
Infelizmente não é muito complexo e certamente que tem bugs, mas mostra como se faz, basicamente vais andando para cima e para baixo consoante as teclas que usaste.
Vais usar um LCD shield? Uma coisa boa do LCD shield é que usa o analogRead() para detectar o botão usado e isso faz com que não tenhas problemas de bounce.

Quote
#define NUMERO_MENUS 3

#define MENU_HOME   0
#define MENU_GOTA1  1
#define MENU_GOTA2  2

unsigned char menu_move = 0;
unsigned char menu_enter = 0;
unsigned char menu_exit = 0;

unsigned char estado_menu = 0;
unsigned char sub_menu = 0;
unsigned int temp = 0;
unsigned int parametro1 = 0;
unsigned int parametro2 = 0;

unsigned int parametros[3]; //estes ser~o os parametros que usas no teu programa das gotas

switch(estado_menu) {
  case MENU_HOME: {
    lcd.print("Gota 1");
    lcd.print("Gota 2");
    if (menu_move == TRUE) {
      temp = (temp+1)%3;
      }
      lcd.print("menu");
      lcd.print(temp);
      if (menu_enter == TRUE) {
        estado_menu = temp;
      }
      break;
  case MENU_GOTA1: { //agora ficamos aqui dentro...
    switch(sub_menu) {
      case 0: {
        lcd.print("move cursor para escolher parametro");
        if (menu_move == TRUE) {
          temp = (temp+1)%3;
        }
        lcd.print("menu");
        lcd.print(temp);
        if (menu_enter == TRUE) {
          sub_menu = temp;
        }
        break;
        }
      case 1: {
        lcd.clear();
        lcd.print("ajuste parametro 1");
        if (menu_move == TRUE)
          parametro1++;
        lcd.setCursor(0,1);
        lcd.print(parametro1);
        if (menu_enter == TRUE) {
          parametros[0] = parametro1; 
        }
        if (menu_exit == TRUE) {
          sub_menu = 0; 
        }
        break;
      }
      case 2: {
        lcd.clear();
        lcd.print("ajuste parametro 1");
        if (menu_move == TRUE)
          parametro2++;
        lcd.setCursor(0,1);
        lcd.print(parametro2);
        if (menu_enter == TRUE) {
          parametros[1] = parametro2; 
        }
        if (menu_exit == TRUE) {
          sub_menu = 0; 
        }
        break;
      }//end case 2
      
    }//end switch sub_menu
    }//end switch


Como podes ver é um pouco complicado, mesmo para um menu simples como este.

Com um interface série seria um pouco mais simples de programar, mas terias de ter o computador ao teu lado para configurar o bicho.

Infelizmente não tenho um lcd para fazer um programa completamente funcional e testado para veres. smiley-sad
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Isto é uma autêntica montanha para mim  smiley-eek uma coisa que parece tão simples,afinal é tão complexa  smiley-eek

No enxerto que meteste ainda falta configurar o menu da gota 2,certo?

Meti o código,mas diz-me que "TRUE" não está declarado...
Logged

'round the world...
Online Online
Faraday Member
**
Karma: 41
Posts: 3108
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

TRUE Pode ser qualquer coisa.. normalmente é 1. Podes também trocar por HIGH.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

'round the world...
Online Online
Faraday Member
**
Karma: 41
Posts: 3108
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Viva,

Acho que o problema está em não usares o lcd.clear() sempre que queres colocar dados novos no LCD ou fazer mudança de menú e também não fazeres uso da função setCursor() para posicionar o cursor.

Code:
void trata_lcd(){
 
 
  switch(estado_menu) {
  case MENU_HOME: {
    lcd.print("Gota 1");
    lcd.setCursor(0,1);   <----------------ADICIONADO
    lcd.print("Gota 2");
    if (BUTTON_UP == HIGH) {
      temp = (temp+1)%3;
      }
      lcd.clear(); <-----------------------ADICIONADO
      lcd.print("menu");
      lcd.print(temp);
      if (BUTTON_RIGHT == HIGH) {
        estado_menu = temp;
      }
      break;
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Pages: 1 [2]   Go Up
Jump to: