27 de mar. de 2014

Servos

Hoje fiz o primeiro teste com o servo.
Não foi tão simples quanto eu imaginava, porém para minha surpresa, diferente do arduino, no Netduino não precisamos de uma biblioteca <servo.h>

 
 PWM servo = new PWM(PWMChannels.PWM_PIN_D5, 20000, 1500, PWM.ScaleFactor.Microseconds, false);
            uint firstPosition = 1000;
            uint lastPosition = 2500; 
            for (uint currentPosition = firstPosition;
                currentPosition <= lastPosition;
                currentPosition += 10)               
                servo.Duration = currentPosition;
                servo.Period = 20000;
                servo.Start();
                Thread.Sleep(20);
            }  
            servo.Duration = firstPosition; // duração do pulso
            servo.Period = 20000;  //periodo do pulso
            servo.Start();    
no caso acima ele faz um movimento de 1000 pulsos até 2500 pulsos da uns 110º

Fiz uma classe, para que eu possa no programa falar assim (Servo mova-se 20 graus, mova 40 graus, etc).
http://netduinonetmf.blogspot.com.br/p/servocs.html

Ainda na versão 1.0, preciso pegar um servo 360º para finalizar testes.

Netduino 2 plus

Ontem fui buscar meu Netduino 2 plus em Jundiaí.

E como todo brinquedo de criança, sempre quando vamos brincar falta a pilha!

No meu caso o aplicativo de teste que eu tinha feito de cara não funcionou, tinha desenvolvido para v4.3.1 do .NET Micro Framework e o firmware dele estava em 4.2.2.

Achei que seria fácil atualizar o firmware, na verdade é, demorou 2min, porém até eu descobrir como fazia, perdi umas 2horas!

Enfim, agora com a base nas mãos irei portar o aplicativo base que tinha feito em console para ele, depois desenvolver os servos, tudo em cima da protoboard e por final começar a montar o tripé.
Acho que posso dizer que 20% de todo o projeto já esta pronto!

26 de mar. de 2014

Atualizado funcoes.cs

Hoje fiz alguns testes no método StartPanorama
O Sistema de fotos estava dando erro, funcoes.cs, ele estava tirando 2 fotos quando mudava de linha, agora a função tira foto, fica somente no for que move linha horizontalmente.

para o exemplo o int _QtdMovimentosX = 6 , int _QtdMovimentosY = 3
(XY (6,3))

Essa é a correta sequência correta!, agora esta assim

Ordem:
Tira foto, move coluna a direita.

Chegando no final, move para começo da linha
move para linha de baixo.

volta para o if, que move e tira foto horizontalmente.
no final ele volta para a cordenada X original e sai dos 2 loop.







Quer ver como ficou o código?
http://netduinonetmf.blogspot.com.br/p/funcoescs.html

Lembrando que o Text.StringBuilder é apenas agora no método debug.

24 de mar. de 2014

Display, teclado

Comprei 2 display, conforme já falado no post Apresentação

Chegaram hoje. Vieram da China e chegaram em 3 dias, mais rápido que SEDEX São Paulo - Curitiba
Não é que o FEDEX seja rápido os correios brasileiros que são lerdos..
O Servo 360 graus, vacilei e não comprei lá...vou ver se aqui não é tão caro.
Também o controle IF para dar os inputs no programa.

Interface IFotografia & Classe fotografia.CS & funcoes.cs

Primeiro a Interface IFotografia, atualizada hoje:
Editado esse post, agora essas classes são páginas fixas no canto direito superior.

Escrever as classes diretamente aqui ocupa muito espaço,fica difícil a leitura.

Árvore do Programa: (Solution Explorer)

  • fotografia.cs
    • Classe,  base para tudo que for referente a fotografia como ângulo de visão, fator de corte, objetiva, etc. Não será referente aos modelos de câmeras, etc.
  • funcoes.cs
    • Classe, é referente ao funcionamento base do programa é ele que chamará classes como fotografia.cs, ou servo.cs, etc
  • IFotografia.cs
    • Interface
  • Program.cs

22 de mar. de 2014

Classe fotografia

Ainda apenas testando, tantas coisas na cabeça... nem sei por onde começar...
Começei calculando o ângulo de visão, discutido no post anterior..agora já na classe C#


using System;

namespace fotografia
{
    internal class fotografia : IFotografia
    {
        public double FatordeCorte { get; set; }

        public int ObjetivaMM { get; set; }

        public int CameraFabricante(_CamerasFabricante _value)
        {
            return (int)_value;
        }

        private double _MMFinalObjetiva()
        {
            return (Convert.ToDouble(ObjetivaMM) * FatordeCorte);
        }

        public double SensorHmm
        {
            get;
            set;
        }

        private double myVar;

        public double SensorVmm
        {
            get { return myVar; }
            set { myVar = value; }
        }

        public double CalculoAnguloVisaoH()
        {
            double fov = SensorHmm / (2 * _MMFinalObjetiva());

            double arctan = 2 * Math.Atan(fov)  * 180.0 / Math.PI;
            return arctan;
        }

        private double CalculoAnguloVisaoV()
        {
            double fov = SensorVmm / (2 * _MMFinalObjetiva());

            double arctan = 2 * Math.Atan(fov) * 180.0 / Math.PI;
            return arctan;
        }
    }
}

vamos testar, para ver se funciona.

  fotografia ft = new fotografia();
            ft.CameraFabricante(_CamerasFabricante.Canon);
            ft.ObjetivaMM = 50;
            ft.SensorHmm = 22.3;
            ft.FatordeCorte = 1.6;
            var t = ft.CalculoAnguloVisaoH();
voilá...funcionando perfeitamente. :)

Ângulo de visão -

De acordo com http://en.wikipedia.org/wiki/Angle_of_view o ângulo de visão é:

\alpha = 2 \arctan \frac {d} {2 f}
então,
Horizontal = 2 arctan (h / 2 x mm da objetiva)
Vertical = 2 arctan (v / 2 x mm da objetiva)
h,v são horizontal e vertical do sensor da câmera

Canon 7d
h = 22.3 mm
V = 14.9 mm

também podemos aproximar
 \alpha\approx \frac{d}{f} radians or \frac{180d}{\pi f} degrees.


Ainda a pensar em qual fórmula