\chapter{Projeto e Implementação da Solução}
\label{chapter:solução}

\section{Introdução}

Este capítulo apresenta o processo de desenvolvimento da solução proposta, desde a construção física da mão robótica até à implementação do sistema sensorial.  Inicia-se com a apresentação das etapas associadas ao fabrico e montagem da estrutura da mão robótica, seguindo-se a configuração dos motores e o desenvolvimento da lógica de controlo, desde o acionamento de motores individuais até ao controlo coordenado da mão completa.

É igualmente descrita a arquitetura de software desenvolvida, com especial destaque para as funcionalidades avançadas implementadas, como o ajuste dinâmico de corrente durante o contacto com objetos, a definição de velocidades relativas entre dedos e falanges, e a introdução de atrasos temporais entre movimentos.

Adicionalmente, aborda-se a implementação do sistema sensorial de deteção de contacto, incluindo a seleção do microcontrolador, o desenvolvimento físico da unidade de aquisição e os testes realizados com diferentes sensores. 

\section{Desenvolvimento da Mão Robótica}



\subsection{Fabrico e Montagem da Estrutura}

A construção da estrutura da mão robótica seguiu integralmente as indicações fornecidas na documentação da LEAP Hand~\cite{shaw2023leaphand}, a qual disponibiliza de forma aberta e acessível todos os ficheiros CAD necessários, bem como instruções detalhadas de montagem. Esta abordagem permitiu realizar uma primeira montagem da estrutura de forma fiel ao projeto original, facilitando a replicação inicial da arquitetura mecânica.

As peças foram produzidas por impressão 3D com recurso a uma Creality K1, uma impressora de alto desempenho que assegura uma boa qualidade dimensional e tempos de fabrico reduzidos. Para a estrutura principal foi utilizado o filamento Hyper PLA da Creality, selecionado pela sua rigidez e facilidade de impressão. Já para as pontas dos dedos, onde se pretende maior flexibilidade e capacidade de aderência ao contacto com objetos, foi utilizado o Python Flex TPU da FormFutura.

A construção dos dedos revelou-se a fase mais demorada do processo de montagem devido ao elevado número de componentes envolvidos e à complexidade dos passos necessários. Todos os dedos seguem a mesma configuração estrutural, com exceção do polegar que apresenta um desenho distinto adaptado à sua função anatómica e posição na mão.

Na Figura~\ref{fig:polegar} é apresentado o polegar já montado, enquanto na Figura~\ref{fig:dedo} observa-se um dos restantes dedos, com estrutura idêntica entre si. A montagem de cada dedo envolveu operações detalhadas e sequenciais que exigiram precisão e atenção redobrada, especialmente na organização dos cabos e no alinhamento das juntas móveis.

\begin{figure}[h]
    \centering
    \begin{minipage}[b]{0.45\textwidth}
        \centering
        \includegraphics[height=6cm]{figs/chapter4/polegar.jpg}
        \caption{Polegar construído de acordo com a Documentação da Leap Hand}
        \label{fig:polegar}
    \end{minipage}
    \hfill
    \begin{minipage}[b]{0.45\textwidth}
        \centering
        \includegraphics[height=6cm]{figs/chapter4/dedo.jpg}
        \caption{Dedo construído de acordo com a documentação da Leap Hand correspondente à estrutura do dedo indicador, médio e anelar}
        \label{fig:dedo}
    \end{minipage}
\end{figure}

No final do processo obteve-se a mão totalmente montada de acordo com a estrutura proposta na LEAP Hand, conforme ilustrado na Figura~\ref{fig:mao_montada}.

\begin{figure}[h]
    \centering
    \includegraphics[height=8cm]{figs/chapter4/leap.jpg}
    \caption{Mão robótica completamente montada, seguindo a estrutura proposta na documentação da LEAP Hand.}
    \label{fig:mao_montada}
    
\end{figure}

Para complementar a descrição deste processo, no Apêndice~\ref{appendix:montagem_polegar} e ~\ref{appendix:montagem_dedo} e  são apresentadas imagens sequenciais representativas da construção de cada dedo, bem como hiperligações (~\ref{appendix:videos}) para vídeos que documentam o procedimento completo de montagem, constituindo assim um apoio visual adicional à documentação escrita.



Embora a montagem inicial tenha seguido rigorosamente as orientações da documentação da LEAP Hand, durante o desenvolvimento do projeto surgiram necessidades específicas que motivaram adaptações à estrutura original. Estas modificações serão detalhadas nas secções seguintes deste capítulo.



\subsection{Configuração dos Motores}

Antes de iniciar o desenvolvimento do código responsável pelo controlo dos movimentos da mão robótica, foi necessário proceder à configuração inicial dos motores Dynamixel. Esta fase incluiu a atribuição de identificadores únicos (IDs) a cada motor, uma vez que todos os motores, por defeito, vêm configurados com o mesmo ID. Para isso, recorreu-se à ferramenta gráfica Dynamixel Wizard 2.0 que permite, de forma intuitiva, alterar os parâmetros fundamentais de cada atuador.

Nesta configuração inicial os IDs atribuídos seguiram a mesma lógica utilizada na documentação da LEAP Hand, garantindo assim compatibilidade com a estrutura de referência proposta pelos autores.

\subsubsection{Modos de Operação do Motores Dynamixel}

Após a atribuição dos IDs a cada motor, foi necessário configurar o modo de operação correspondente. Os motores Dynamixel XC330-M288-T suportam diversos modos de funcionamento, permitindo adaptá-los a diferentes tipos de movimentos e estratégias de controlo.

Na presente subsecção são descritos os principais modos de operação disponibilizados por estes atuadores, destacando as suas características e o comportamento em situações com ou sem contacto com obstáculos.


\begin{enumerate}
    \item \textbf{Position Control Mode} \\
    Este modo permite definir uma posição angular específica que o motor deve atingir, dentro dos limites físicos configurados. Caso surja um obstáculo durante o movimento, o motor continuará a aplicar torque máximo na tentativa de alcançar a posição desejada, o que pode levar ao sobreaquecimento dos motores.


    \item \textbf{Extended Position Control Mode} \\
    Uma extensão do modo anterior permite rotações superiores a 360°, tornando-se útil para aplicações que requerem movimento contínuo em rotação. No entanto, não é relevante no contexto deste projeto, dado que as juntas dos dedos não realizam rotações completas.


    \item \textbf{Velocity Control Mode} \\  
    Este modo permite definir uma velocidade angular constante, sem especificar uma posição final. O motor acelera até atingir a velocidade pretendida e mantém-se em rotação. Na presença de um obstáculo, o motor continua a tentar girar, aplicando o torque máximo, o que pode resultar em sobreaquecimento.


    \item \textbf{PWM Control Mode} \\
    Permite controlar diretamente a potência fornecida ao motor através de modulação por largura de pulso (PWM). Este modo oferece um controlo mais direto e flexível, mas não garante precisão de movimento, nem proteção contra obstáculos, podendo causar sobreaquecimento em situações de bloqueio mecânico.


    \item \textbf{Current Control Mode} \\
    Neste modo controla-se diretamente o torque aplicado ao definir a corrente desejada. Se não houver resistência, o motor continua a girar. Na presença de um obstáculo, o motor não tenta forçar o movimento, e mantém um torque constante correspondente ao valor de corrente definido, oferecendo uma resposta segura e previsível.


    \item \textbf{Current-Based Position Control Mode} \\   
    Combina as vantagens do controlo de posição com limitação de corrente. O motor tenta alcançar uma determinada posição, mas limita o torque máximo aplicado, de acordo com o valor de corrente permitido. Se o obstáculo exigir mais torque do que o configurado, o motor interrompe o movimento, mantendo a força aplicada constante.

\end{enumerate}

A Tabela~\ref{tab:modos_operacao} resume os diferentes modos de operação, destacando os parâmetros controlados, as aplicações ideais e o comportamento em situações de contacto com obstáculos:

\begin{table}[h]
\centering
\renewcommand{\arraystretch}{1.5}
{ 
\normalsize
\begin{tabular}{l l p{6cm}}
\toprule
\textbf{Modo} & \textbf{Controla}  & \textbf{Reação a Obstáculos} \\
\midrule
Position Control & Posição & Aplica torque máximo até atingir posição \\
Extended Position & Posição ($>$360º) & Idêntico ao Position Control \\
Velocity Control & Velocidade  & Aplica torque máximo para manter velocidade \\
Current Control & Corrente (torque) & Mantém torque constante, sem tentar forçar \\
Current-Based Position & Posição + Corrente & Tenta atingir posição, mas respeita limite de torque \\
PWM Control & Potência (PWM) & Não protege contra sobrecarga ou obstáculos \\
\bottomrule
\end{tabular}
} 
\caption{Resumo dos modos de operação dos motores Dynamixel}
\label{tab:modos_operacao}
\end{table}


A escolha do modo de operação adequado é essencial para garantir o desempenho e a segurança do sistema. No contexto deste projeto, onde o contacto com objetos e a necessidade de limitar a força aplicada pelos dedos são aspetos fundamentais, foi escolhido o \textit{Current-Based Position Control Mode}, uma vez que este modo permite controlar a posição de cada articulação, ao mesmo tempo que impõe um limite ao torque aplicado, o que evita danos em situações de bloqueio ou contacto inesperado.


\section{Programação e Controlo}

A implementação do controlo dos motores Dynamixel exige, numa fase inicial, a correta definição dos parâmetros de comunicação, de forma a garantir a fiabilidade da ligação entre o sistema computacional e os atuadores.

Entre os elementos essenciais a configurar, destaca-se a especificação da porta série utilizada, tipicamente \texttt{/dev/ttyUSB0} em sistemas operativos baseados em Linux, a taxa de transmissão de dados (\textit{baud rate}), o protocolo de comunicação (sendo utilizada a versão 2.0), a série dos motores (neste caso, a série X, correspondente aos modelos Dynamixel XC330-M288-T) e o identificador único (\textit{ID}) atribuído previamente a cada motor.

A correta parametrização destes elementos é fundamental para que seja possível estabelecer comunicação com os motores, enviar comandos de controlo e ler os parâmetros relevantes de operação. Nos pontos seguintes, descreve-se de forma progressiva a programação de um motor individual, o controlo coordenado de um dedo completo e, por fim, a implementação da lógica de controlo da mão robótica na sua totalidade.

Nesta secção, apresenta-se de forma estruturada a abordagem seguida para o desenvolvimento do sistema de controlo da mão robótica, descrevendo-se de forma progressiva a programação de um motor individual, o controlo coordenado de um dedo completo e, por fim, a implementação da lógica de controlo da mão robótica na sua totalidade. Seguidamente, é descrita a arquitetura de \textit{software} desenvolvida que suporta a coordenação entre os diferentes componentes do sistema. Por fim, são detalhadas as funcionalidades avançadas implementadas, nomeadamente o ajuste dinâmico de corrente no contacto com objetos, a implementação de velocidades relativas entre dedos e falanges, e os atrasos temporais programáveis entre movimentos de diferentes dedos, permitindo um controlo mais seguro e adaptável.

Importa ainda referir que foi adotada uma estratégia base de fecho da mão, em que todos os dedos se movimentam para posições pré-definidas com a mesma velocidade. Esta abordagem simples e eficaz explora a capacidade adaptativa da mão robótica, permitindo-lhe conformar-se à geometria de diferentes objetos durante o processo de preensão.



\subsection{Programação de um Motor Individual}


A programação de um motor individual constitui o primeiro passo no desenvolvimento da lógica de controlo da mão robótica.
O processo tem início com a importação da biblioteca e a configuração da interface de comunicação série. Tal configuração é efetuada através da criação dos objetos \texttt{portHandler} e \texttt{packetHandler}, com as instruções \texttt{portHandler = PortHandler(DEVICENAME)} e \texttt{packetHandler = PacketHandler(PROTOCOL\_VERSION)}. O primeiro estabelece a ligação física à porta série especificada (por exemplo, \texttt{/dev/ttyUSB0}), enquanto o segundo gere a codificação e descodificação dos pacotes de dados, de acordo com o protocolo de comunicação adotado (neste projeto, a versão 2.0).


Após a abertura da porta e a verificação do sucesso da ligação, é necessário ativar o torque do motor para que este possa responder aos comandos enviados. A partir deste momento, torna-se possível controlar diversos parâmetros do motor, como a posição, a velocidade e a corrente máxima, dependendo do modo de operação previamente selecionado.

A leitura e escrita desses parâmetros nos registos internos do motor são realizadas através das funções disponibilizadas pelo SDK. A leitura pode abranger dados como a posição atual, velocidade de rotação, corrente consumida ou valor de PWM. A escolha da função adequada depende da dimensão dos dados a transferir, sendo comum a utilização de \texttt{read2ByteTxRx()} e \texttt{read4ByteTxRx()} para valores de 2 e 4 bytes, respetivamente.

É importante salientar que os motores Dynamixel não fornecem diretamente a posição angular em graus ou radianos. Em vez disso, utilizam um sistema interno de representação baseado em \textit{ticks}, no qual a posição é expressa por um valor inteiro. No caso do modelo \texttt{XC330-M288-T}, a resolução do encoder é de 12 bits, o que resulta em $2^{12} = 4096$ valores distintos ao longo de uma rotação completa de $360^\circ$. Deste modo, cada unidade (\textit{tick}) corresponde a um incremento angular de aproximadamente $0{.}088^\circ$.

A conversão do valor lido, em \textit{ticks}, para a correspondente posição angular em graus é efetuada através da equação~\eqref{eq:conversao_graus}:

\begin{equation}
\theta = \frac{360 \times \text{ticks}}{4095}
\label{eq:conversao_graus}
\end{equation}

onde $\theta$ representa a posição angular em graus, e \texttt{ticks} é o valor devolvido diretamente pelo motor.

De forma análoga, a velocidade de rotação também é representada em \textit{ticks}. Neste caso, a relação com as unidades físicas é definida por um fator de conversão fornecido pelo fabricante. Para o motor em questão, cada unidade corresponde a aproximadamente 0{.}229 rotações por minuto (RPM). Assim, a velocidade real pode ser obtida através da equação~\eqref{eq:conversao_rpm}:

\begin{equation}
\text{Velocidade (RPM)} = \text{ticks} \times 0.229
\label{eq:conversao_rpm}
\end{equation}

Adicionalmente, o sinal do valor atribuído à velocidade determina o sentido de rotação: valores positivos indicam rotação no sentido horário, enquanto valores negativos correspondem a uma rotação no sentido anti-horário.

No que diz respeito à corrente elétrica consumida pelo motor, esta é diretamente disponibilizada pelo SDK em miliamperes (mA), não sendo necessária qualquer conversão adicional. Este parâmetro está diretamente relacionado com o torque aplicado pelo motor sendo, por isso, relevante para o diagnóstico do esforço mecânico exigido durante o funcionamento.


\subsection{Programação e Controlo de um Dedo}

Após a compreensão do funcionamento individual dos motores Dynamixel e da configuração dos seus parâmetros, procedeu-se ao desenvolvimento do controlo coordenado de um dedo completo da mão robótica. Cada dedo integra quatro motores, tornando necessário garantir a leitura sincronizada dos seus estados e o envio simultâneo de comandos de controlo, de forma eficiente e escalável. Para tal, recorreu-se às funcionalidades de comunicação em bloco disponibilizadas pelo Dynamixel SDK, nomeadamente as operações \texttt{sync\_read}, \texttt{sync\_write}, \texttt{bulk\_read} e \texttt{bulk\_write}. 

No que respeita à leitura dos parâmetros dos motores — posição, velocidade e corrente — a função \texttt{sync\_read} foi a selecionada, por permitir aceder a um mesmo conjunto de registos em múltiplos motores de forma síncrona. Esta abordagem revelou-se eficiente tanto em termos de desempenho como de utilização de memória, além de respeitar as limitações de tamanho de mensagem impostas pelo protocolo de comunicação, evitando os riscos associados à utilização do \texttt{bulk\_read}.

Na Tabela~\ref{tab:comparacao_leitura_dynamixel}, apresenta-se uma comparação entre as duas funções de leitura disponibilizadas pelo Dynamixel SDK, evidenciando os critérios que suportaram a decisão de utilizar a função \texttt{sync\_read}.


\begin{table}[h]
\centering
\renewcommand{\arraystretch}{1.5}
{ 
\normalsize
\begin{tabular}{p{6cm} p{4cm} p{4cm} }
\toprule
\textbf{Critério} & \textbf{\texttt{Sync Read}} & \textbf{\texttt{Bulk Read}} \\ 
\midrule
Registos lidos por motor & Iguais (obrigatório) & Diferentes (flexível) \\
Tempo médio de leitura (12 motores, 3 registos) & \SI{3.5}{\milli\second} & \SI{4.7}{\milli\second} \\
Utilização de buffer de comunicação & \textasciitilde60 bytes & \textasciitilde85–100 bytes \\ 
Tamanho máximo de mensagem (versão 2.0) & 143 bytes & 143 bytes \\ 
\bottomrule
\end{tabular}
}
\caption{Comparação entre as funções \texttt{sync\_read} e \texttt{bulk\_read} do Dynamixel SDK}
\label{tab:comparacao_leitura_dynamixel}
\end{table}


Relativamente à escrita de comandos, optou-se pela função \texttt{bulk\_write}, que permite enviar dados distintos para registos diferentes de múltiplos motores numa única operação. Apesar de o registo alvo ser frequentemente o mesmo (como a posição ou o limite de corrente), esta escolha confere maior versatilidade ao sistema, permitindo a sua adaptação a cenários futuros em que diferentes parâmetros possam ser configurados seletivamente em cada motor.

Na Tabela~\ref{tab:comparacao_escrita_dynamixel}, apresenta-se uma comparação entre as duas funções de escrita disponibilizadas pelo Dynamixel SDK, evidenciando os critérios que suportaram a decisão de utilizar a função \texttt{bulk\_write}.

\begin{table}[h]
\centering
\renewcommand{\arraystretch}{1.5}
{ 
\normalsize
\begin{tabular}{p{6cm} p{4cm} p{4cm}}
\toprule
\textbf{Critério} & \textbf{Sync Write} & \textbf{Bulk\_Write} \\
\midrule
Registos enviados por motor & 1  & Vários \\
Tempo médio de envio (8 motores) & \SI{1.85}{\milli\second} & \SI{2.10}{\milli\second} \\
Utilização do buffer de comunicação & 96 bytes & 104 bytes \\
Tamanho máximo de mensagem (protocolo 2.0) & 1472 bytes & 1472 bytes \\
\bottomrule
\end{tabular}
}
\caption{Comparação entre as funções \texttt{sync\_write} e \texttt{bulk\_write} do Dynamixel SDK}
\label{tab:comparacao_escrita_dynamixel}
\end{table}


Assim, a combinação de \texttt{sync\_read} para a leitura periódica do estado dos motores e \texttt{bulk\_write} para o envio de comandos de controlo assegura simultaneidade, escalabilidade e robustez no controlo coordenado de um dedo da mão robótica, servindo como base sólida para a extensão posterior ao controlo integrado de múltiplos dedos. Com esta abordagem foi possível atingir uma taxa de leitura estável de aproximadamente \SI{50}{\hertz}, garantindo uma monitorização suficientemente rápida para aplicações em tempo quase real.

Após implementar com sucesso o envio de comandos e a leitura simultânea dos parâmetros dos motores, procedeu-se à aplicação do modo de operação selecionado: o Current-Based Position Control Mode. A adaptação do código previamente desenvolvido foi direta, bastando configurar o registo correspondente ao modo de operação e definir um limite máximo de corrente na zona de inicialização do sistema. Esta configuração é realizada através da escrita nos endereços apropriados de cada motor Dynamixel.

Nos primeiros testes foi definido um limite de corrente de \SI{100}{\milli\ampere}. Embora este modo de operação não permita o controlo direto da velocidade, é possível estabelecer uma velocidade máxima por meio da configuração do parâmetro \texttt{Profile Velocity}. Assim, foram enviadas posições de destino previamente definidas para provocar o movimento de fecho e posterior abertura do dedo, com o objetivo de avaliar o comportamento dos motores em condições ideais. Os gráficos resultantes desta experiência encontram-se nas Figuras~\ref{fig:pos},~\ref{fig:vels} e ~\ref{fig:currs}.

\begin{figure}[h]
    \centering
    \includegraphics[height=6cm]{figs/chapter4/finger_positions.png}
    \caption{Posições dos motores ao longo do tempo durante o fecho e abertura do dedo sem nenhuma obstrução}
    \label{fig:pos}
    
\end{figure}
\begin{figure}[h]
    \centering
    \includegraphics[height=6cm]{figs/chapter4/finger_velocities.png}
    \caption{Velocidades dos motores ao longo do tempo durante o fecho e abertura do dedo sem nenhuma obstrução}
    \label{fig:vels}
    
\end{figure}
\begin{figure}[h]
    \centering
    \includegraphics[height=6cm]{figs/chapter4/finger_currents.png}
    \caption{Correntes consumidas pelos motores ao longo do tempo durante o fecho e abertura do dedo sem nenhuma obstrução}
    \label{fig:currs}
    
\end{figure}

Como se pode observar, durante todo o movimento, os valores de corrente e velocidade mantiveram-se dentro dos limites especificados. A única exceção ocorreu no motor 1 onde se registou uma ligeira oscilação de velocidade, ultrapassando o valor definido em apenas \SI{0.07}{\radian\per\second}. Esta variação é considerada normal e esperada no funcionamento real dos motores, não comprometendo a estabilidade nem a segurança do sistema.

Na experiência seguinte foram mantidas as mesmas posições de destino, mas introduziu-se um obstáculo físico que impedia a concretização do movimento pretendido. Tal como ilustrado nas Figuras~\ref{fig:pos1}, ~\ref{fig:vels1} e ~\ref{fig:currs1}, a análise dos dados revela diferenças claras entre os dois cenários. 

\begin{figure}[h]
    \centering
    \includegraphics[height=6cm]{figs/chapter4/finger_positions_1.png}
    \caption{Posições dos motores ao longo do tempo durante o fecho e abertura do dedo com obstáculo}
    \label{fig:pos1}
    
\end{figure}
\begin{figure}[h]
    \centering
    \includegraphics[height=6cm]{figs/chapter4/finger_velocities_1.png}
    \caption{Velocidades dos motores ao longo do tempo durante o fecho e abertura do dedo com obstáculo}
    \label{fig:vels1}
    
\end{figure}
\begin{figure}[h]
    \centering
    \includegraphics[height=6cm]{figs/chapter4/finger_currents_1.png}
    \caption{Correntes consumidas pelos motores ao longo do tempo durante o fecho e abertura do dedo com obstáculo}
    \label{fig:currs1}
    
\end{figure}

Na presença do obstáculo o dedo não consegue atingir a posição alvo, resultando numa estabilização precoce da posição e no corte da velocidade. Simultaneamente, verifica-se um aumento significativo na corrente consumida, evidenciando o esforço do motor perante a resistência sem nunca ultrapassar o limite de corrente definido. Após a remoção do obstáculo, o sistema retoma o movimento normal, alcançando a posição desejada com maior estabilidade e menor consumo energético.

Estes resultados comprovam a utilidade e a eficácia do \textit{Current-Based Position Control Mode}, permitindo limitar a força exercida pelos motores durante a interação com o ambiente. Esta funcionalidade é fundamental para aplicações em que a segurança e a adaptabilidade ao contacto com objetos são essenciais, como é o caso da manipulação robótica.

Para além das duas experiências iniciais foram conduzidos testes adicionais com o objetivo de aprofundar a análise do comportamento dos motores em diferentes condições operacionais. Numa dessas experiências o dedo foi submetido a movimentos de abertura e fecho com diferentes velocidades máximas configuradas. Os resultados, apresentados no Apêndice~\ref{appendix:teste_velocidades}, demonstram que velocidades mais reduzidas conduzem a um menor consumo energético e a uma variação mais suave da posição ao longo do tempo. A inclinação menos acentuada da curva de posição indica um movimento mais progressivo e controlado, confirmando a influência direta da velocidade sobre a dinâmica do sistema.

Outra experiência relevante consistiu em introduzir obstáculos que interrompessem o movimento do dedo em diferentes posições, com o intuito de estudar o efeito da localização do obstáculo no comportamento individual dos motores. Verificou-se que, quando o obstáculo atua sobre a base do dedo (afetando os motores inferiores), apenas o motor bloqueado entra em esforço, enquanto os restantes continuam a tentar atingir as suas posições alvo. Em contraste, quando o obstáculo é colocado na extremidade do dedo, todos os motores são simultaneamente afetados, ficando em esforço e impedidos de completar o movimento. Esta experiência, cujos gráficos se encontram no Apêndice~\ref{appendix:teste_posições_obstaculos}, reforça ainda a eficácia do controlo baseado em corrente, uma vez que a corrente consumida em nenhuma circunstância ultrapassou o limite máximo previamente definido.

Os dados experimentais obtidos encontram-se acompanhados de gráficos e ligações para vídeos demonstrativos no Apêndice~\ref{appendix:teste_velocidades} e ~\ref{appendix:teste_posições_obstaculos}, permitindo uma análise visual clara dos diferentes comportamentos observados. Estas experiências complementares contribuem significativamente para a validação do sistema de controlo implementado, demonstrando não só a sua eficácia em cenários ideais, mas também a sua robustez perante interações físicas imprevistas.

Na Tabela~\ref{tab:resumo_experiencias} apresenta-se um resumo das duas experiências realizadas, incluindo uma breve descrição dos seus objetivos e a indicação da localização dos gráficos correspondentes que ilustram os resultados obtidos para uma melhor compreensão dos diferentes comportamentos da mão robótica sob as condições testadas.

\begin{table}[h]

\renewcommand{\arraystretch}{1.5}
{\normalsize
\begin{tabular}{p{4cm} p{7.5cm} p{2cm}}
\toprule
\textbf{Experiência} & \textbf{Conclusões} & \textbf{Gráficos} \\\\
\midrule
Movimentos de abertura e fecho com velocidades máximas variadas & Velocidades menores mostraram menor consumo e movimentos mais controlados, evidenciados por curvas de posição com inclinação reduzida. & Apêndice~\ref{appendix:teste_velocidades} \\

Interrupção do movimento por obstáculos em posições distintas & Obstáculos na base afetam apenas motores específicos, enquanto na extremidade todos os motores entram em esforço. A corrente nunca ultrapassou o limite definido, validando o controlo baseado em corrente. & Apêndice~\ref{appendix:teste_posições_obstaculos} \\
\bottomrule
\end{tabular}
}
\caption{Resumo das experiências complementares realizadas para análise do comportamento dos motores, com indicação da localização dos respetivos gráficos}
\label{tab:resumo_experiencias}
\end{table}





\subsection{Programação da Mão Completa}

Para permitir o controlo simultâneo da mão robótica completa, bem como a leitura contínua dos valores de posição, velocidade e corrente consumida de todos os motores, foram necessárias apenas pequenas adaptações ao código previamente desenvolvido. Este já tinha sido concebido de forma modular e escalável, incluindo a deteção automática dos motores conectados, o que facilitou a sua extensão para múltiplos dedos.

A implementação consistiu essencialmente na inclusão das posições adicionais dos motores dos dedos restantes no nó responsável pelo envio das posições alvo. Paralelamente, foi necessário instanciar os nós correspondentes aos novos dedos, assegurando que cada conjunto de motores pudesse ser controlado de forma independente mas coordenada.

Estas alterações permitiram que o sistema mantivesse a mesma lógica de funcionamento utilizada no controlo de um único dedo, agora aplicada a toda a mão, garantindo a consistência e sincronização entre todos os atuadores. A lógica de comunicação e o tratamento dos dados lidos dos motores mantiveram-se inalterados, validando a robustez da abordagem inicialmente adotada.

Importa referir que a organização dos nós e a sua interligação são parte integrante da arquitetura de software desenvolvida, que será detalhada na secção seguinte.



\subsection{Arquitetura de Software Desenvolvida}


A arquitetura de software desempenha um papel fundamental no desenvolvimento de sistemas robóticos complexos, como é o caso da operação de uma mão robótica antropomórfica. Uma arquitetura bem definida não só influencia diretamente o desempenho e a escalabilidade do sistema, como também facilita a sua compreensão, manutenção e reutilização por outros utilizadores ou desenvolvedores. Uma estrutura modular clara e coerente é, por isso, essencial para garantir um desenvolvimento eficiente e uma experiência de utilização positiva.

Neste projeto optou-se por uma arquitetura modular baseada em múltiplos nós ROS de forma a garantir modularidade, clareza e separação de responsabilidades.

A interação com o sistema inicia-se no nó \texttt{set\_positions}, responsável por receber as posições alvo que o utilizador pretende que a mão atinja. Este nó funciona como a interface de alto nível do sistema e comunica essas posições ao \texttt{manager\_node}, o nó central responsável por toda a interação com o hardware.

O \texttt{manager\_node} desempenha um papel crítico, funcionando como elo de ligação entre o software e os motores Dynamixel. Por um lado, recebe as posições alvo (ou limites de corrente) enviadas pelos restantes nós e envia-as para os motores. Por outro lado, lê periodicamente o estado atual de todos os motores, incluindo posição, velocidade e corrente consumida.

Os dados lidos pelo \texttt{manager\_node} são então distribuídos para quatro nós específicos, um para cada dedo da mão robótica: \texttt{thumb\_node}, \texttt{index\_node}, \texttt{middle\_node} e \texttt{ring\_node}. Cada um destes nós processa exclusivamente os dados do respetivo conjunto de motores, permitindo não só uma análise mais localizada e específica de cada dedo, como também a possibilidade de controlo independente por dedo. A Figura~\ref{fig:esquema} ilustra a mão robótica com os dedos devidamente identificados, de forma a facilitar a compreensão da estrutura modular dos nós responsáveis pelo controlo de cada dedo.

\begin{figure}[h]
    \centering
    \includegraphics[height=8cm]{figs/chapter4/mao_esquema.jpg}
    \caption{Fotografia da mão robótica desenvolvida, com a identificação dos dedos correspondentes a cada nó de controlo.}
    \label{fig:esquema}
    
\end{figure}

Adicionalmente, estes nós de dedo podem publicar mensagens para o nó \texttt{set\_currents}, responsável por definir os limites de corrente para os motores. O \texttt{set\_currents} envia os valores definidos de volta ao \texttt{manager\_node}, que por sua vez os comunica aos motores.

Esta arquitetura modular e hierarquizada assegura uma operação fiável, facilita a expansão para novas funcionalidades e permite isolar falhas ou testar componentes individuais de forma independente. O diagrama da Figura~\ref{fig:fluxograma} ilustra a interação entre os diferentes nós e a comunicação com o hardware, proporcionando uma visão clara do funcionamento global do sistema.

\begin{figure}[h]
    \centering
    \includegraphics[width=\textwidth]{figs/chapter4/fluxograma.png}
    \caption{Diagrama da arquitetura de software desenvolvida}
    \label{fig:fluxograma}
    
\end{figure}


Com o objetivo de simplificar a utilização do sistema e facilitar o processo de inicialização, foi desenvolvido um \textit{launch file} (apresentado no Bloco de Código~\ref{lst:launch}) que automatiza a execução dos principais componentes da arquitetura. Este ficheiro lança automaticamente três terminais distintos:

\begin{itemize}
    \item Um terminal dedicado à execução dos nós de controlo da mão, incluindo o \texttt{manager\_node} e os nós de cada dedo;
    \item Um terminal responsável pela execução do nó de leitura dos sensores, permitindo a monitorização em tempo real dos valores adquiridos pelos sensores FSR;
    \item Um terceiro terminal que corre o nó de controlo da mão, no qual o utilizador pode inserir comandos diretamente no terminal, como por exemplo abrir ou fechar a mão completa, ou controlar dedos de forma individual.
\end{itemize}

\begin{lstlisting}[language=Python, caption=Launch File desenvolvido para automatizar a execução do sistema, label=lst:launch, captionpos=b]

def generate_launch_description():
    return LaunchDescription([
        # Terminal 1 - Managers
        ExecuteProcess(
            cmd=['gnome-terminal', '--', 'bash', '-c',
                 'ros2 run leap_hand_control hand_manager & '
                 'ros2 run leap_hand_control thumb_manager & '
                 'ros2 run leap_hand_control index_manager & '
                 'ros2 run leap_hand_control ring_manager & '
                 'ros2 run leap_hand_control middle_manager; exec bash'],
            shell=False
        ),

        # Terminal 2 - set_fingers_position
        ExecuteProcess(
            cmd=['gnome-terminal', '--', 'bash', '-c',
                 'ros2 run leap_hand_control set_fingers_position; exec bash'],
            shell=False
        ),

        # Terminal 3 - read_sensors
        ExecuteProcess(
            cmd=['gnome-terminal', '--', 'bash', '-c',
                 'ros2 run leap_hand_control read_sensors ; exec bash'],
            shell=False
        ),
    ])

\end{lstlisting}

Esta abordagem facilita significativamente a operação do sistema, reduz o tempo necessário para iniciar todos os componentes e proporciona uma experiência de utilização mais fluida, mesmo para utilizadores com menor familiaridade com a infraestrutura ROS.




\subsection{Funcionalidades Avançadas}

A arquitetura modular desenvolvida para o controlo da mão robótica não só garante uma operação robusta e eficiente, como também facilita significativamente a integração de novas funcionalidades. Esta capacidade de expansão é fundamental para adaptar o sistema a cenários de maior complexidade, melhorar a segurança da interação com o ambiente e oferecer maior expressividade nos movimentos da mão.

Tirando partido dessa flexibilidade, foram implementadas três funcionalidades avançadas que ampliam o potencial de controlo e aumentam a segurança operacional do sistema:

\begin{itemize}

    \item \textbf{Ajuste dinâmico da corrente limite}: Permite adaptar automaticamente o limite de corrente dos motores em resposta ao contacto com objetos, evitando a aplicação de força excessiva e protegendo tanto o sistema robótico como os objetos manipulados.

    \item \textbf{Velocidades relativas entre dedos e falanges}: Introduz a possibilidade de definir velocidades relativas entre dedos e entre diferentes falanges de um mesmo dedo, possibilitando movimentos mais naturais, coordenados e eficientes. 

    \item \textbf{Atrasos temporais programáveis entre movimentos}: Permite sequenciar ações de forma controlada e adaptada a diferentes tarefas ou contextos.
\end{itemize}

Estas funcionalidades são exploradas nas subsecções seguintes, onde se descreve o seu funcionamento, integração no sistema e os testes realizados para validar a sua eficácia.

\subsubsection{Ajuste Dinâmico de Corrente no Contacto com Objetos}
\label{sec:ajuste_corrente}

Um dos principais desafios na área da manipulação com mãos robóticas antropomórficas consiste em conseguir agarrar objetos sensíveis ou deformáveis sem os danificar, mantendo uma preensão estável. A aplicação de forças excessivas pode levar ao esmagamento ou deformação irreversível do objeto sendo, por isso, essencial implementar mecanismos de controlo adaptativo que regulem a força aplicada em tempo real. Com esse objetivo, foi desenvolvida uma funcionalidade de ajuste dinâmico da corrente limite nos motores, de forma a restringir o esforço exercido sempre que é detetado contacto com um objeto. Para tal, adaptou-se o código dos nós individuais de cada dedo, permitindo que estes ajustem automaticamente a corrente limite com base em dois critérios principais: o aumento da corrente consumida e a diminuição significativa da aceleração do motor. A Figura~\ref{fig:ajuste_corrente} ilustra uma situação em que, após a deteção de contacto com o objeto, foi aplicada uma corrente limitada de forma a prevenir a aplicação excessiva de força e, consequentemente, o risco de esmagamento.

\begin{figure}[h]
    \centering
    \includegraphics[height=8cm]{figs/chapter4/agarrar_bola.jpg}
    \caption{Exemplo de controlo de corrente onde, após o contacto entre o dedo robótico e o objeto, é imposta uma corrente limite para evitar forças excessivas que possam danificar o objeto.}
    \label{fig:ajuste_corrente} 
\end{figure}

A deteção de um aumento de corrente baseia-se na comparação das correntes lidas para cada motor do dedo com um valor máximo pré-definido no nó, denominado \texttt{GOAL\_CURRENT\_VALUE}. Se alguma das correntes medidas exceder este valor, considera-se que o motor está em carga excessiva. Inicialmente a redução de velocidade era avaliada diretamente através da diferença entre a velocidade atual e a registada no instante anterior. Contudo, devido à variação do intervalo temporal entre amostras consecutivas, essa abordagem revelou-se inconsistente. Assim, optou-se por considerar a aceleração como métrica mais fiável, tendo-se adicionado à mensagem enviada para os dedos um parâmetro correspondente ao intervalo de tempo entre amostras. Com essa informação, torna-se possível calcular a aceleração de forma precisa.

Desta forma define-se que a deteção de um contacto com obstáculo ocorre quando se verifica simultaneamente um aumento significativo da corrente e uma redução expressiva da aceleração, indicando que o motor está a aplicar força sem conseguir avançar, ou seja, em contacto com um objeto. De forma a visualizar mais facilmente o processo descrito, na Figura~\ref{fig:fluxograma_ajuste_corrente} apresenta-se o diagrama referente à lógica de implementação da funcionalidade de ajuste dinâmico da corrente no contacto com objetos.

\begin{figure}[h]
    \centering
    \includegraphics[width=\textwidth]{figs/chapter4/ajuste_corrente.png}
    \caption{Diagrama da lógica de ajuste dinâmico da corrente dos motores da mão robótica no contacto com objetos}
    \label{fig:fluxograma_ajuste_corrente}
    
\end{figure}

Para validar esta funcionalidade, foi realizada uma experiência em que se introduziu um obstáculo a impedir o movimento de um dos dedos da mão robótica. Nas Figuras~\ref{fig:teste_corrente} apresentam-se os gráficos relativos às posições e correntes consumidas pelos motores de um dedo em duas situações: com e sem obstáculo. Nesta experiência a corrente limite inicial foi definida como \SI{200}{\milli\ampere}, enquanto o valor para o qual a corrente era ajustada dinamicamente, aquando da deteção de contacto, foi fixado em \SI{100}{\milli\ampere}.

\begin{figure}[h]
\centering
\begin{tabular}{ccc}
  \includegraphics[height=5cm]{figs/chapter4/finger_pos_vel50_no_obs.png} \\
  \includegraphics[height=5cm]{figs/chapter4/finger_pos_vel50_obs.png} \\
  \includegraphics[height=5cm]{figs/chapter4/finger_currs_vel50_no_obs.png} \\
  \includegraphics[height=5cm]{figs/chapter4/finger_currs_vel50_obs.png} \\
\end{tabular}
\caption{Gráficos da posição e da corrente consumida pelos motores de um dedo em dois cenários distintos: sem obstáculo (primeiro e terceiro gráfico) e com obstáculo a impedir o movimento (segundo e quarto gráfico).}
\label{fig:teste_corrente}
\end{figure}

A análise dos gráficos mostra que durante o movimento livre do dedo (sem obstáculo), ocorrem picos de corrente superiores a \SI{100}{\milli\ampere}, o que é normal dado o esforço requerido pelos motores para vencer a resistência mecânica do sistema. No entanto, no momento em que o dedo encontra o obstáculo, observa-se uma estabilização da corrente nos \SI{100}{\milli\ampere}, refletindo a deteção de contacto e a consequente adaptação do valor limite de corrente. Após a remoção do obstáculo voltam a registar-se picos superiores a \SI{100}{\milli\ampere}, permitindo ao dedo retomar o seu movimento normal com a corrente limite restabelecida.

Esta funcionalidade representa um avanço significativo na segurança e adaptabilidade da mão robótica, permitindo interações mais delicadas e controladas com objetos de diferentes propriedades físicas.




\subsubsection{Implementação de Velocidades Relativas entre Dedos e Falanges}

O ser humano possui uma notável capacidade de controlar a sua mão de forma precisa e adaptativa, aplicando diferentes velocidades tanto entre os dedos como entre as falanges de um mesmo dedo. Esta habilidade permite executar gestos variados, aparentemente semelhantes, mas com propósitos distintos e ajustados ao contexto, como agarrar, ajustar ou largar objetos de diferentes formas.

Com o objetivo de aproximar o comportamento da mão robótica antropomórfica do seu equivalente biológico, foi implementado neste projeto um mecanismo que permite a definição de fatores de velocidade relativa, tanto entre os diferentes dedos como entre as várias falanges de cada dedo. Esta funcionalidade possibilita, por exemplo, que o polegar alcance a sua posição de destino antes dos restantes dedos, ou que a ponta de um dedo se mova mais rapidamente do que a sua base, permitindo movimentos mais articulados e naturais.

A implementação desta funcionalidade realizou-se com uma modificação ao nó \texttt{hand\_manager}, onde se definiu a classe \texttt{Finger}. Esta classe inclui como atributos o nome do dedo, o fator de velocidade relativa do dedo face aos restantes, e um dicionário com os fatores de velocidade relativa entre as diferentes juntas (motores) do mesmo dedo. Por exemplo, a construção \texttt{Finger("index", 1, {"0": 1, "1": 1, "2": 1, "3": 1})} representa o dedo indicador com fator de velocidade relativa global 1 e com velocidades iguais entre todas as suas juntas. Este sistema permite configurar rapidamente diferentes padrões de movimento através da alteração dos fatores no dicionário de dedos.

Para validar esta funcionalidade realizaram-se duas experiências distintas, cujos resultados são apresentados de seguida.

Na primeira experiência atribuiu.se ao dedo médio o dobro da velocidade do polegar. A Figura~\ref{fig:vel_rel_dedos} apresenta os gráficos das velocidades dos motores de ambos os dedos durante o movimento de fecho e abertura da mão. Para além dos gráficos também é possível visualizar os vídeos referente a esta experiência no Apêndice~\ref{appendix:teste_vels_dedos}

\begin{figure}[h]
\centering
\begin{tabular}{ccc}
  \includegraphics[width=0.75\textwidth]{figs/chapter4/finger_vel2_finger_1.png} \\
  \includegraphics[width=0.75\textwidth]{figs/chapter4/finger_vel2_finger_3.png} \\
\end{tabular}
\caption{Gráficos das velocidades para o dedo médio e para o polegar quando se aplicou o dobro da velocidade do polegar ao dedo médio}
\label{fig:vel_rel_dedos}
\end{figure}

A análise dos gráficos e a visualização do vídeo revela que, conforme esperado, o dedo médio alcança a posição de destino mais rapidamente do que o polegar, devido ao seu fator de velocidade mais elevado. Esta diferença de sincronização resulta num posicionamento em que o polegar termina o seu movimento por cima do dedo médio.

Além disso, é possível observar um pico de corrente no polegar durante o movimento de abertura da mão. Este pico ocorre porque, ao estar o polegar posicionado por cima do dedo médio, e sendo o dedo médio mais rápido (devido ao seu fator de velocidade superior), este tenta abrir antes do polegar. Como resultado, o dedo médio empurra mecanicamente o polegar que se encontra por cima, provocando resistência à sua própria abertura.

Na segunda experiência, testou-se o impacto da variação de velocidade entre falanges de um único dedo. Apenas um dedo foi movimentado, sendo atribuído à sua primeira falange (motor mais próximo da base) o dobro da velocidade das restantes. A Figura~\ref{fig:vel_rel_falanges} apresenta os gráficos das velocidades dos motores ao longo do tempo para duas situações distintas: na primeira, todos os motores do dedo operam com a mesma velocidade; na segunda, o motor da primeira falange executa o movimento com o dobro da velocidade dos demais. Tal como na primeira experiência, os vídeos referentes a esta experiência podem ser consultados no Apêndice~\ref{appendix:teste_vels_falanges} para observação complementar dos resultados.

\begin{figure}[h]
\centering
\begin{tabular}{ccc}
  \includegraphics[width=0.75\textwidth]{figs/chapter4/finger_vel3_finger_1.png} \\
  \includegraphics[width=0.75\textwidth]{figs/chapter4/finger_vel4_finger_1.png} \\
\end{tabular}
\caption{Gráficos das velocidades dos motores de um dedo em duas configurações distintas: em cima, todos os motores operam com a mesma velocidade; em baixo, o motor da primeira falange (mais próximo da base) opera com o dobro da velocidade das restantes.}
\label{fig:vel_rel_falanges}
\end{figure}

A análise dos gráficos e a visualização dos vídeos indica que a primeira falange inicia e termina o seu movimento antes das restantes, conduzindo o movimento do dedo como um todo. Este comportamento faz com que o dedo feche de forma mais rápida na base, completando o gesto de agarrar apenas na fase final do movimento, quando as falanges mais distais se aproximam da posição final.




\subsubsection{Implementação de Atrasos Temporais Programáveis entre Movimentos de Dedos}

A mão humana é capaz de executar movimentos coordenados entre os dedos que, embora relacionados, não ocorrem necessariamente de forma simultânea. De forma a replicar essa capacidade na mão robótica desenvolvida, implementou-se um mecanismo de controlo que permite definir atrasos temporais programáveis entre os movimentos dos diferentes dedos. Para tal, foi desenvolvida a função \texttt{publish\_ordered\_positions} no nó \texttt{set\_positions.py}, que permite o envio escalonado de comandos de posição para diferentes dedos, com base em offsets temporais definidos previamente. Esta funcionalidade acrescenta flexibilidade ao sistema, possibilitando a criação de movimentos mais expressivos, adaptados ao contexto da tarefa executada.

O funcionamento da função \texttt{publish\_ordered\_positions} pode ser descrito da seguinte forma:

\begin{enumerate}

    \item As entradas (pares de dedo e posição) são ordenadas por ordem crescente de offset;

    \item Num primeiro momento, são enviadas todas as posições correspondentes aos dedos cujo offset é igual a zero;

    \item Em seguida, o sistema aguarda um intervalo de tempo calculado como a diferença entre o offset do último grupo de dedos enviado e o offset do próximo grupo;

    \item Após esse intervalo, são publicadas as posições dos dedos seguintes;

    \item Este processo é repetido até que todas as posições tenham sido enviadas, respeitando os offsets temporais definidos para cada dedo.

\end{enumerate}

Para exemplificar a utilização desta funcionalidade, foi criado o movimento designado por \textit{wave}, no qual a mão fecha de forma sequencial, iniciando pelo polegar, seguido sucessivamente pelos restantes dedos. Neste caso, o offset temporal entre o polegar e o dedo seguinte foi fixado em \SI{0.5}{\second}, enquanto os offsets entre os restantes dedos foram definidos como \SI{0.2}{\second}.

Na fase de reabertura da mão optou-se por inverter a ordem dos offsets, garantindo assim uma simetria no movimento — ou seja, os dedos que fecharam por último passam a ser os primeiros a abrir. Para isso, os offsets de abertura foram calculados com base na expressão presente em~\ref{eq:offsets}.

\begin{equation}
\text{offset}_{\text{abertura}} = \text{offset}_{\text{máximo}} - \text{offset}_{\text{fecho}}
\label{eq:offsets}
\end{equation}


Apesar de não terem sido adquiridos gráficos nesta experiência, o movimento pode ser visualizado no vídeo correspondente, cuja ligação se encontra no Apêndice~\ref{appendix:offsets_temporais}. O vídeo demonstra claramente o efeito dos atrasos programados na execução do gesto, reforçando o potencial desta funcionalidade para gerar interações mais naturais e contextualmente adaptadas.

Na Figura~\ref{fig:polegar_por_baixo}, é possível observar uma situação em que o polegar ficou por baixo dos restantes dedos, enquanto na Figura~\ref{fig:polegar_por_cima} se verifica uma configuração em que o polegar ficou por cima. Estas variações ilustram a flexibilidade do sistema em adaptar a ordem dos movimentos, resultando em diferentes gestos e formas de interação com objetos.

\begin{figure}[h]
\centering
\begin{subfigure}[b]{0.4\textwidth}
    \centering
    \includegraphics[width=0.8\textwidth]{figs/chapter4/polegar_baixo.jpg}
    \caption{Exemplo de execução do gesto com o polegar a posicionar-se por baixo dos restantes dedos.}
    \label{fig:polegar_por_baixo}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.4\textwidth}
    \centering
    \includegraphics[width=0.8\textwidth]{figs/chapter4/polegar_cima.jpg}
    \caption{Exemplo de execução do gesto com o polegar a posicionar-se por cima dos restantes dedos.}
    \label{fig:polegar_por_cima}
\end{subfigure}
\caption{Variações de gesto obtidas através da definição de diferentes offsets temporais entre os dedos.}

\end{figure}





\section{Implementação dos Sensores de Contacto}

A capacidade de detetar contacto físico com objetos é um elemento crucial para o desenvolvimento de sistemas robóticos mais seguros, precisos e adaptáveis ao ambiente. No contexto deste projeto a integração de sensores de contacto visa não apenas a perceção de toque, mas também a monitorização da distribuição de forças ao longo dos dedos, permitindo implementar estratégias de controlo baseadas em \textit{feedback} sensorial. Este tipo de funcionalidade é particularmente relevante para tarefas que envolvem manipulação delicada ou interação com objetos de diferentes formatos e texturas, sendo um importante contributo para a robustez e versatilidade da mão robótica.

Esta secção descreve detalhadamente o processo de implementação dos sensores de contacto, desde a seleção do microcontrolador até à montagem física dos componentes e ao desenvolvimento de um \ac{PCB}. Para além dos aspetos de hardware, foram também realizados diversos testes com sensores do tipo \ac{FSR}, com o objetivo de validar a sua resposta e sensibilidade ao contacto. 


\subsection{Seleção do Microcontrolador}
\label{sec:microcontrolador}


A seleção do microcontrolador responsável pela aquisição dos sinais provenientes dos sensores de contacto é um passo fundamental para garantir a fiabilidade e eficiência do sistema sensorial da mão robótica desenvolvida. Para além da capacidade de leitura adequada dos sensores, esta escolha deve também considerar as restrições físicas impostas pela estrutura da mão robótica, bem como a compatibilidade com o ecossistema de desenvolvimento adotado ao longo do projeto, o \ac{ROS}.

O modelo sensorial inicialmente previsto contempla a utilização de quatro sensores \ac{FSR} 400, instalados nas pontas dos dedos, e um sensor \ac{FSR} 406 localizado na região da palma da mão. Esta configuração requer, no mínimo, cinco entradas analógicas disponíveis no microcontrolador. Contudo, esta configuração poderá sofrer alterações em trabalhos futuros, pelo que é importante considerar alguma margem de expansão na escolha do microcontrolador, bem como a eventual integração de um \ac{PCB}.

Recorrendo ao software FreeCAD foi possível determinar as dimensões máximas permitidas para a instalação do microcontrolador na palma da mão, tal como ilustrado na Figura~\ref{fig:espaco_microcontrolador}, onde a zona de alojamento se encontra destacada a vermelho.

\begin{figure}[h]
    \centering
    \includegraphics[width=0.75\textwidth]{figs/chapter4/palma.png}
    \caption{Peça da palma da mão com o espaço reservado para o microcontrolador destacado a vermelho. Figura obtida com o software FreeCad.}
    \label{fig:espaco_microcontrolador}
    
\end{figure}


As medições, visíveis na Figura~\ref{fig:dimensoes_microcontrolador} indicam que a unidade de controlo não deverá exceder \SI{23.40}{\milli\meter} × \SI{52.63}{\milli\meter}.


\begin{figure}[h]
    \centering
    \includegraphics[width=0.75\textwidth]{figs/chapter4/espaço_controlador.png}
    \caption{Medições efetuadas com a ferramenta FreeCad}
    \label{fig:dimensoes_microcontrolador}
    
\end{figure}


Com base nestas dimensões e nos requisitos técnicos do sistema, foi realizada uma análise comparativa de diferentes microcontroladores compatíveis, resumida na Tabela~\ref{tab:comparacao_microcontroladores}. Esta análise teve em consideração o número de entradas analógicas, a frequência de operação e o tamanho físico do dispositivo.

\begin{table}[h]
\centering
{\normalsize
\begin{tabular}{lccc}
\toprule
\textbf{Modelo} & \textbf{Entradas Analógicas} & \textbf{Frequência} & \textbf{Dimensões (mm)} \\
\midrule
Teensy 4.0 & 14 & 600 MHz & 19 × 36 \\
Arduino Nano & 8 & 16 MHz & 19 × 43 \\
Seeeduino XIAO & 11 & 48 MHz & 18 × 20 \\
\bottomrule
\end{tabular}
}
\caption{Comparação entre microcontroladores compatíveis com as dimensões disponíveis.}
\label{tab:comparacao_microcontroladores}
\end{table}

O Teensy 4.0 (Figura~\ref{fig:teensy}) destaca-se como a opção mais robusta, combinando uma elevada frequência de operação com um número generoso de entradas analógicas (14), o que assegura não só a leitura precisa dos sensores \ac{FSR}, como também permite futuras expansões. Adicionalmente, a sua compatibilidade com o ambiente de desenvolvimento Arduino IDE, PlatformIO e bibliotecas como \textit{rosserial} torna-o particularmente adequado à integração com o sistema baseado em \ac{ROS}. A resolução analógica de 12 bits e o processador ARM Cortex-M7 conferem-lhe ainda vantagens em termos de desempenho e resposta temporal.


O Arduino Nano (Figura~\ref{fig:arduino_nano}), embora amplamente documentado e suportado pela comunidade, apresenta limitações ao nível do desempenho e número de entradas analógicas. Já o Seeeduino XIAO (Figura~\ref{fig:xiao}), apesar de ser a solução mais compacta, oferece menos suporte na integração com \ac{ROS} e menor desempenho comparativamente ao Teensy.

\begin{figure}[h]
\centering
\begin{subfigure}[b]{0.3\textwidth}
    \centering
    \includegraphics[width=\textwidth]{figs/chapter4/teensy4.0.jpg}
    \caption{Teensy 4.0}
    \label{fig:teensy}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.3\textwidth}
    \centering
    \includegraphics[width=\textwidth]{figs/chapter4/arduino_nano.jpg}
    \caption{Arduino Nano}
    \label{fig:arduino_nano}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.3\textwidth}
    \centering
    \includegraphics[width=\textwidth]{figs/chapter4/seeeduino.jpg}
    \caption{Seeeduino XIAO}
    \label{fig:xiao}
\end{subfigure}
\caption{Microcontroladores considerados para análise.}
\label{fig:microcontroladores}
\end{figure}

Assim, a escolha recaiu sobre o Teensy 4.0 por reunir um conjunto equilibrado de características técnicas, dimensão física adequada e excelente compatibilidade com o ecossistema de desenvolvimento utilizado neste projeto.



\subsection{Implementação Física do Sistema sensorial}

A implementação física do sistema sensorial é uma etapa essencial para garantir a integração eficiente dos sensores de contacto com a arquitetura eletrónica e mecânica da mão robótica. Esta implementação envolveu não só a preparação do circuito de aquisição dos sinais provenientes dos sensores, mas também a conceção de soluções mecânicas para a fixação segura e funcional dos componentes eletrónicos no interior da palma da mão desenvolvida.

Nesta subsecção são detalhadas três vertentes fundamentais do processo: a \textbf{Unidade de Aquisição dos Sensores}, onde se descreve a necessidade da utilização de divisores de tensão para permitir a leitura correta dos sinais analógicos pelo microcontrolador Teensy 4.0; o \textbf{Desenho da Peça para Fixação}, que corresponde à modelação 3D da estrutura de suporte do microcontrolador e do circuito impresso, de modo a garantir a sua instalação estável dentro da mão; e por fim, o \textbf{Desenvolvimento do PCB}, onde se apresenta o \ac{PCB} concebido para acomodar as ligações entre todos os sensores \ac{FSR} utilizados e os pinos analógicos disponíveis, assegurando uma montagem compacta e funcional.

Esta abordagem integrada permitiu construir um sistema sensorial modular e escalável, capaz de suportar as necessidades do projeto e de se adaptar a futuras modificações na disposição ou quantidade de sensores.

\subsubsection{Unidade de Aquisição dos sensores}
\label{sec:unidade_aquisicao}
Os sensores de força resistivos (\ac{FSR}) são dispositivos cuja resistência elétrica varia inversamente com a força aplicada sobre a sua superfície sensível. Ou seja, quanto maior a força exercida, menor a sua resistência. Esta característica permite a medição de pressões ou contactos físicos de forma relativamente simples, sendo ideal para aplicações em robótica onde se pretende detetar interações entre a mão robótica e objetos do ambiente.

Os microcontroladores não conseguem medir diretamente a resistência elétrica. Para converter esta variável resistiva num sinal analógico de tensão mensurável, é necessário implementar um circuito divisor de tensão. Este circuito consiste em ligar o sensor FSR em série com uma resistência fixa, aplicando uma tensão constante nas extremidades da série. A tensão de saída é então medida no ponto comum entre a resistência fixa e o sensor \ac{FSR}. Quando o sensor é pressionado, a sua resistência diminui, fazendo com que a tensão no ponto de leitura aumente. Esta variação de tensão pode então ser lida por uma entrada analógica do microcontrolador.


A Figura~\ref{fig:divisor_tensao_fsr} ilustra o esquema de um circuito divisor de tensão desenhado com a ferramenta Fritzing, utilizando um sensor FSR, uma resistência e o microcontrolador Teensy 4.0. Este tipo de montagem foi replicado para cada sensor de contacto utilizado no projeto.

\begin{figure}[h]
    \centering
    \includegraphics[height= 8cm]{figs/chapter4/circuito.png}
    \caption{Esquema de circuito com divisor de tensão utilizando um sensor FSR (representado por J1), uma resistência e um Teensy 4.0, criado com o Fritzing.}
    \label{fig:divisor_tensao_fsr}
\end{figure}

O valor da resistência no divisor de tensão é um parâmetro crítico no circuito de leitura dos sensores \ac{FSR}, uma vez que influencia diretamente a sensibilidade do sistema. Em geral, para circuitos com sensores de força resistivos, os valores de resistência utilizados situam-se  entre \SI{1}{\kilo\ohm} e \SI{100}{\kilo\ohm}, dependendo da aplicação e do intervalo de forças a ser medido.

Para um divisor de tensão, o cálculo da tensão de saída é dado pela expressão presente em ~\ref{eq:divisor_tensao}, onde \( V \) é a tensão de alimentação (neste caso, \SI{3.3}{\volt}), \( R \) é a resistência fixa, \( R_{\text{FSR}} \) é a resistência variável do sensor, e \( V_{\text{out}} \) é a tensão de saída lida pelo microcontrolador.


\begin{equation}
V_{\text{out}} = V \cdot \frac{R}{R + R_{\text{FSR}}}
\label{eq:divisor_tensao}
\end{equation}

Na Figura~\ref{fig:curva_fsr400} é possível observar a curva característica do sensor FSR 400, disponibilizada pela Interlink Electronics\cite{Interlink}. Esta curva representa a resistência do sensor em função da força aplicada (em gramas), e permite estimar a gama de valores que o sensor irá apresentar no contexto da aplicação.

\begin{figure}[h]
\centering
\includegraphics[width=0.65\textwidth]{figs/chapter4/curva_sensor.png}
\caption[Curva característica do sensor FSR 400, indicando a resistência em função da força aplicada. Retirada da ficha técnica do fabricante (Interlink Electronics)]{Curva característica do sensor FSR 400, indicando a resistência em função da força aplicada. Retirada da ficha técnica do fabricante (Interlink Electronics\cite{Interlink}).}
\label{fig:curva_fsr400}
\end{figure}

Tendo em consideração que neste projeto não se esperam forças superiores a \SI{2000}{\gram}, é possível, a partir da curva, estimar que para essa força a resistência do sensor se situa entre aproximadamente \SI{0.8}{\kilo\ohm} e \SI{0.6}{\kilo\ohm}. Com base na Equação~\ref{eq:divisor_tensao}, e assumindo uma tensão de alimentação de \SI{3.3}{\volt} e um valor de saída desejado próximo de \SI{3.2}{\volt} (sem atingir a saturação), é possível calcular os valores de resistência fixa ideais para o divisor.

Substituindo os valores na equação para os dois extremos de resistência do sensor, obtêm-se os seguintes resultados:
\begin{itemize}
    \item Para \( R_{\text{FSR}} = \SI{0.8}{\kilo\ohm} \): \\
    \[
        R_{\text{M}} =  \SI{25.6}{\kilo\ohm}
    \]
    
    \item Para \( R_{\text{FSR}} = \SI{0.6}{\kilo\ohm} \): \\
    \[
        R_{\text{M}} = \SI{19.2}{\kilo\ohm}
    \]
\end{itemize}


Deste modo selecionou-se um valor intermédio de \SI{22}{\kilo\ohm} para a resistência fixa, de forma a obter uma resposta adequada do sistema para o intervalo de forças esperado, sem comprometer a resolução da leitura analógica nem atingir valores de saturação.


\subsubsection{Desenho da peça para fixação}

A estrutura da LEAP Hand \cite{shaw2023leaphand} não foi originalmente concebida com sensores de contacto integrados. No entanto, conforme descrito na Subsecção~\ref{sec:microcontrolador}, existe algum espaço disponível no interior da palma da mão, o que possibilitou a implementação de um sistema sensorial adicional.

De forma a aproveitar o espaço disponível e garantir a correta fixação dos componentes eletrónicos, nomeadamente o microcontrolador Teensy 4.0 e o circuito impresso (\ac{PCB}), foi necessário desenhar uma peça em 3D utilizando a ferramenta Tinkercad. Após uma análise cuidada do espaço interno disponível, optou-se por posicionar tanto o microcontrolador como o PCB na vertical, uma vez que esta orientação maximiza a utilização do espaço e facilita a sua remoção para futuras modificações ou manutenções.

Para o Teensy 4.0, foi desenvolvida uma ranhura com \SI{1.58}{\milli\meter} de largura, tendo em conta a sua espessura de \SI{1.57}{\milli\meter}, de forma a garantir um encaixe justo. O comprimento da ranhura foi definido em 36mm, ligeiramente superior ao comprimento do microcontrolador (\SI{35.56}{\milli\meter}), e a altura de \SI{5}{\milli\meter} foi escolhida para proporcionar estabilidade suficiente. A peça de fixação dedicada ao Teensy pode ser observada na Figura~\ref{fig:fixacao_teensy}.

\begin{figure}[h]
    \centering
    \includegraphics[width=0.7\textwidth]{figs/chapter4/ranhura_teensy.png}
    \caption{Peça desenvolvida com a ferramenta TinkerCad para fixar o Teensy 4.0 na palma da mão}
    \label{fig:fixacao_teensy}
\end{figure}

Para o \ac{PCB}, aplicou-se a mesma lógica de construção. Foi desenhada uma ranhura com 1.48 mm de largura (para acomodar um \ac{PCB} de \SI{1.47}{\milli\meter} de espessura) e 44 mm de comprimento. Contrariamente ao suporte do Teensy, não foi necessário incluir elementos adicionais para impedir o deslizamento vertical, uma vez que a própria estrutura da palma da mão já possui duas paredes laterais que garantem a contenção do \ac{PCB}. A peça de fixação do \ac{PCB} encontra-se representada na Figura~\ref{fig:fixacao_pcb}.

\begin{figure}[h]
    \centering
    \includegraphics[width=0.7\textwidth]{figs/chapter4/ranhura_pcb.png}
    \caption{Peça desenvolvida com a ferramenta TinkerCad para fixar o \ac{PCB} na palma da mão}
    \label{fig:fixacao_pcb}
\end{figure}

Por fim, para assegurar uma montagem precisa e integrada, foi desenvolvida uma peça única com a geometria correspondente ao espaço disponível na palma da mão. Nessa base comum foram integradas as duas estruturas anteriormente desenvolvidas para a fixação do microcontrolador e do \ac{PCB} nas posições definidas. O resultado final da peça completa pode ser visualizado na Figura~\ref{fig:fixacao_final}.

\begin{figure}[h]
    \centering
    \includegraphics[width=0.7\textwidth]{figs/chapter4/peca_fixacao.png}
    \caption{Peça final desenvolvida com a ferramenta TinkerCad para fixar o o Teensy 4.0 e o \ac{PCB} na palma da mão}
    \label{fig:fixacao_final}
\end{figure}


A peça final foi fixada na estrutura da palma da mão com recurso a cola epóxi, garantindo uma ligação firme e duradoura entre os componentes e a estrutura da mão robótica. Adicionalmente, foi realizado um furo lateral na própria peça da palma da mão, de modo a permitir a passagem do cabo USB responsável pela alimentação e programação do microcontrolador, assegurando o acesso contínuo à porta de comunicação do Teensy sem comprometer a integridade estrutural do sistema.



\subsubsection{Desenvolvimento do PCB}

Tendo em conta a utilização de 5 sensores de contacto, surgiu a necessidade de desenvolver uma solução de interligação eficiente entre os sensores e o microcontrolador. Para tal, foi construído um circuito em \textit{protoboard} com vista à criação de um \ac{PCB} funcional que garantisse a correta distribuição de sinais e alimentação elétrica.

A organização do circuito baseou-se na utilização de dois \ac{DIP} \textit{sockets} de 9 pinos e uma barra de pinos fêmea de 9 pinos. No canto inferior direito da placa, foi colocada a barra de pinos na vertical. Esta barra foi totalmente soldada na parte traseira, permitindo a ligação de um dos pinos ao terminal de \SI{3.3}{\volt} do microcontrolador através de um cabo jumper. Os restantes pinos da barra foram conectados às extremidades de alimentação dos sensores, fornecendo assim a tensão necessária para o seu funcionamento.

Imediatamente ao lado da barra de pinos, foram posicionados os dois \ac{DIP} \textit{sockets}, também na vertical, mas sem ligação direta à barra de pinos fêmea. Os pinos mais à esquerda do primeiro \ac{DIP} \textit{socket} foram todos interligados por soldadura na parte traseira da placa, permitindo ligar o terminal GND do microcontrolador a um dos pinos e garantir que todos os restantes fiquem igualmente conectados ao terra do sistema. Neste ponto, foram também inseridas as resistências necessárias à implementação dos divisores de tensão, conectando uma das extremidades de cada resistência a estes pinos comuns de GND e a outra extremidade aos pinos correspondentes do lado direito do mesmo \ac{DIP} \textit{socket}.

Os pinos mais à direita do primeiro \ac{DIP} \textit{socket} foram individualmente ligados aos pinos mais à esquerda do segundo \ac{DIP} \textit{socket}. Estes últimos, por sua vez, foram interligados com os pinos mais à direita do segundo \ac{DIP} \textit{socket}. Esta configuração permitiu criar os circuitos necessários à implementação de divisores de tensão, tal como descrito na Secção~\ref{sec:unidade_aquisicao}. Assim, os pinos mais à esquerda do primeiro \ac{DIP} \textit{socket} correspondem às saídas de sinal dos divisores e foram conectados às entradas analógicas do microcontrolador. Já os pinos mais à direita do segundo \ac{DIP} \textit{socket} foram utilizados para ligar as extremidades livres dos sensores de contacto.

Na Figura~\ref{fig:pcb_frente} encontra-se representada a vista frontal do PCB, enquanto que a Figura~\ref{fig:pcb_tras} mostra a vista traseira da placa com indicações adicionais que facilitam a compreensão das ligações realizadas.

\begin{figure}[h]
\centering
\begin{subfigure}[b]{0.4\textwidth}
    \centering
    \includegraphics[width=\textwidth]{figs/chapter4/pcb_frente.jpg}
    \caption{Vista frontal do PCB desenvolvido, com a disposição dos DIP sockets e da barra de pinos fêmea}
    \label{fig:pcb_frente}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.4\textwidth}
    \centering
    \includegraphics[width=\textwidth]{figs/chapter4/tras_pcb.png}
    \caption{Vista traseira do PCB com destaque para as soldaduras e interligações entre os componentes}
    \label{fig:pcb_tras}
\end{subfigure}
\label{fig_pcb}
\caption{Vista frontal e traseira do PCB desenvolvido para melhor compreensão das ligações realizadas.}
\end{figure}







\subsection{Programação do Microcontrolador}


A leitura dos sensores \ac{FSR} foi realizada através de um código desenvolvido na plataforma Arduino IDE, recorrendo à linguagem C/C++. O objetivo principal deste código é efetuar a leitura contínua das entradas analógicas a que os sensores se encontram ligados e calcular a correspondente tensão para posterior transmissão via porta série.

Para tal, os cinco sensores FSR foram conectados a diferentes entradas analógicas do microcontrolador, sendo estas definidas no início do código com as constantes \texttt{fsrPin1} a \texttt{fsrPin5}, associadas respetivamente aos pinos \texttt{A9}, \texttt{A8}, \texttt{A7}, \texttt{A6} e \texttt{A5}.

O código implementado encontra-se organizado em duas partes principais: a função \texttt{setup()}, onde é inicializada a comunicação série a uma taxa de 115200 bauds, e a função \texttt{loop()}, que corre continuamente durante a execução do programa. Dentro da função \texttt{loop()}, são efetuadas as leituras dos sensores através da função \texttt{analogRead()}, que retorna um valor inteiro proporcional à tensão medida em cada entrada analógica.

Os valores obtidos são depois convertidos em tensão (em volts), utilizando a fórmula presente em ~\ref{eq:teensy}:

\begin{equation}
V = \frac{\text{valor\_lido} \times 3.3}{1023}
\label{eq:teensy}
\end{equation}
 
 
Neste contexto, \texttt{valor\_lido} representa o valor devolvido pela função \texttt{analogRead()}, que no caso do Teensy 4.0, cuja resolução do conversor analógico-digital (ADC) é de 10 bits, pode variar entre 0 e 1023. Esta gama de valores decorre da capacidade do ADC representar \(2^{10} = 1024\) níveis discretos de tensão. Assim, o valor 0 corresponde a uma tensão de \SI{0}{\volt}, e o valor 1023 corresponde a 3.3V, que é a tensão de referência do microcontrolador.

A seguir à conversão, os cinco valores de tensão são enviados através da porta série, sendo apresentados numa única linha e separados por tabulações, facilitando a sua leitura e processamento posterior. A utilização da função \texttt{Serial.println()} no último valor garante a quebra de linha entre conjuntos sucessivos de amostras. Foi ainda introduzido um pequeno \texttt{delay} de 1ms entre ciclos para evitar sobrecarga na transmissão dos dados.






\subsection{Testes com sensores}

Até ao momento, tinha sido realizado apenas um teste preliminar com um único sensor. Nesta subseção, apresentam-se testes adicionais realizados para avaliar de forma mais abrangente o desempenho dos sensores incorporados no sistema.

O primeiro teste consistiu em ligar quatro sensores FSR ao microcontrolador em simultâneo. Foram aplicadas forças individualmente em cada um dos sensores, de forma a analisar a resposta de cada sensor de maneira isolada. De seguida, aplicaram-se forças em mais do que um sensor ao mesmo tempo, permitindo avaliar o comportamento do sistema quando várias entradas são acionadas simultaneamente, como acontece durante o funcionamento típico da mão robótica. Esta etapa foi essencial para compreender a capacidade do sistema em distinguir forças aplicadas em diferentes pontos ou limitações na leitura dos sinais.

Adicionalmente, foi realizada uma experiência específica utilizando o sensor FSR 406, com o objetivo de aprofundar a análise do seu comportamento. Este sensor, devido à sua maior área de detecção, apresenta características distintas em relação aos sensores FSR 400, sendo, portanto, fundamental compreender o seu desempenho em condições práticas.

Para integrar os dados dos sensores no sistema robótico baseado em ROS~2, foi desenvolvido um nó denominado \texttt{fsr\_sensor\_node}. Este nó estabelece uma ligação com o microcontrolador via comunicação série, lê continuamente os dados provenientes dos cinco sensores e publica-os no tópico \texttt{fsr\_values} . Para além disso, os valores adquiridos são gravados num ficheiro CSV, com o respetivo carimbo temporal, permitindo a posterior análise offline. 

Por fim, é descrito o desenvolvimento de uma peça de interface que foi projetada com o objetivo de propagar a força exercida na ponta do dedo para o sensor. Esta peça, posicionada entre a superfície externa da falange e o sensor FSR, permite uma distribuição mais homogénea da força e contribui para melhorar a fiabilidade das medições.



\subsubsection{Testes iniciais com sensores FSR}

Para a realização dos testes iniciais com os sensores de contacto, foi preparada uma montagem experimental composta por quatro sensores a operar em simultâneo: três sensores FSR 400 e um sensor FSR 406. O principal objetivo destes testes foi avaliar o comportamento individual de cada sensor, assim como o desempenho do sistema quando várias forças são aplicadas de forma simultânea.

Na primeira experiência foi aplicada força apenas sobre um dos sensores, de forma a analisar a sua resposta individual e a verificar se a ativação desse sensor poderia influenciar as leituras dos restantes. Os gráficos obtidos para esta experiência encontram-se apresentados nas Figuras ~\ref{fig:teste1}.


\begin{figure}[h]
\centering

\begin{tabular}{cc}

% Gráfico FSR1
\begin{tikzpicture}
  \begin{axis}[
    width=0.49\textwidth,
    height=0.35\textwidth,
    xlabel={Tempo (s)},
    ylabel={Leitura do FSR (V)},
    legend pos=north west,
    legend style={font=\scriptsize},
    grid=both,
    grid style={dashed,gray!30},
  ]
  % FSR1
  \addplot [color=red] table [x=timestamp, y=FSR1, col sep=comma] {figs/graficos/sensor1.csv};
  \addlegendentry{FSR1}

  % FSR2
  \addplot [color=blue] table [x=timestamp, y=FSR2, col sep=comma] {figs/graficos/sensor1.csv};
  \addlegendentry{FSR2}

  % FSR3
  \addplot [color=green] table [x=timestamp, y=FSR3, col sep=comma] {figs/graficos/sensor1.csv};
  \addlegendentry{FSR3}

  % FSR4
  \addplot [color=orange] table [x=timestamp, y=FSR4, col sep=comma] {figs/graficos/sensor1.csv};
  \addlegendentry{FSR4}
  \end{axis}
\end{tikzpicture}
&

% Gráfico FSR2
\begin{tikzpicture}
  \begin{axis}[
    width=0.49\textwidth,
    height=0.35\textwidth,
    xlabel={Tempo (s)},
    ylabel={Leitura do FSR (V)},
    legend pos=north west,
    legend style={font=\scriptsize},
    grid=both,
    grid style={dashed,gray!30},
  ]
  % FSR1
  \addplot [color=red] table [x=timestamp, y=FSR1, col sep=comma] {figs/graficos/sensor2.csv};
  \addlegendentry{FSR1}

  % FSR2
  \addplot [color=blue] table [x=timestamp, y=FSR2, col sep=comma] {figs/graficos/sensor2.csv};
  \addlegendentry{FSR2}

  % FSR3
  \addplot [color=green] table [x=timestamp, y=FSR3, col sep=comma] {figs/graficos/sensor2.csv};
  \addlegendentry{FSR3}

  % FSR4
  \addplot [color=orange] table [x=timestamp, y=FSR4, col sep=comma] {figs/graficos/sensor2.csv};
  \addlegendentry{FSR4}
  \end{axis}
\end{tikzpicture}
\\

% Gráfico FSR3
\begin{tikzpicture}
  \begin{axis}[
    width=0.49\textwidth,
    height=0.35\textwidth,
    xlabel={Tempo (s)},
    ylabel={Leitura do FSR (V)},
    legend pos=north west,
    legend style={font=\scriptsize},
    grid=both,
    grid style={dashed,gray!30},
  ]
  % FSR1
  \addplot [color=red] table [x=timestamp, y=FSR1, col sep=comma] {figs/graficos/sensor3.csv};
  \addlegendentry{FSR1}

  % FSR2
  \addplot [color=blue] table [x=timestamp, y=FSR2, col sep=comma] {figs/graficos/sensor3.csv};
  \addlegendentry{FSR2}

  % FSR3
  \addplot [color=green] table [x=timestamp, y=FSR3, col sep=comma] {figs/graficos/sensor3.csv};
  \addlegendentry{FSR3}

  % FSR4
  \addplot [color=orange] table [x=timestamp, y=FSR4, col sep=comma] {figs/graficos/sensor3.csv};
  \addlegendentry{FSR4}
  \end{axis}
\end{tikzpicture}
&

% Gráfico FSR4
\begin{tikzpicture}
  \begin{axis}[
    width=0.49\textwidth,
    height=0.35\textwidth,
    xlabel={Tempo (s)},
    ylabel={Leitura do FSR (V)},
    legend pos=north west,
    legend style={font=\scriptsize},
    grid=both,
    grid style={dashed,gray!30},
  ]
  % FSR1
  \addplot [color=red] table [x=timestamp, y=FSR1, col sep=comma] {figs/graficos/sensor4.csv};
  \addlegendentry{FSR1}

  % FSR2
  \addplot [color=blue] table [x=timestamp, y=FSR2, col sep=comma] {figs/graficos/sensor4.csv};
  \addlegendentry{FSR2}

  % FSR3
  \addplot [color=green] table [x=timestamp, y=FSR3, col sep=comma] {figs/graficos/sensor4.csv};
  \addlegendentry{FSR3}

  % FSR4
  \addplot [color=orange] table [x=timestamp, y=FSR4, col sep=comma] {figs/graficos/sensor4.csv};
  \addlegendentry{FSR4}
  \end{axis}
\end{tikzpicture}

\\

\end{tabular}
\caption{Gráfico da tensão de saída dos sensores durante a aplicação de força apenas sobre um dos sensores.}
\label{fig:teste1}
\end{figure}

A análise dos resultados permitiu concluir que os sensores respondem de forma adequada à aplicação de carga, apresentando um aumento claro da tensão de saída quando submetidos a força. Simultaneamente, verificou-se que os sensores não acionados mantiveram os seus sinais estáveis ao longo de toda a experiência, confirmando que a aplicação de carga num sensor não interfere com o comportamento dos restantes. Foi ainda registada uma ligeira oscilação de aproximadamente 0,01 V na ausência de carga, o que indica uma variação residual no sinal. No entanto, tendo em conta a sua amplitude reduzida, considerou-se que esta flutuação não compromete o desempenho do sistema, pelo que não foi aplicada qualquer filtragem adicional.

Na segunda experiência, aplicaram-se forças em vários sensores em simultâneo, com o objetivo de estudar o comportamento do sistema em situações de utilização mais representativas das condições de operação da mão robótica. Os gráficos resultantes desta experiência encontram-se apresentados nas Figuras ~\ref{fig:teste2}.


\begin{figure}[h]
\centering

\begin{tabular}{cc}

% Gráfico FSR1
\begin{tikzpicture}
  \begin{axis}[
    width=0.49\textwidth,
    height=0.35\textwidth,
    xlabel={Tempo (s)},
    ylabel={Leitura do FSR (V)},
    legend pos=north west,
    legend style={font=\scriptsize},
    grid=both,
    grid style={dashed,gray!30},
  ]
  % FSR1
  \addplot [color=red] table [x=timestamp, y=FSR1, col sep=comma] {figs/graficos/2sensors.csv};
  \addlegendentry{FSR1}

  % FSR2
  \addplot [color=blue] table [x=timestamp, y=FSR2, col sep=comma] {figs/graficos/2sensors.csv};
  \addlegendentry{FSR2}

  % FSR3
  \addplot [color=green] table [x=timestamp, y=FSR3, col sep=comma] {figs/graficos/2sensors.csv};
  \addlegendentry{FSR3}

  % FSR4
  \addplot [color=orange] table [x=timestamp, y=FSR4, col sep=comma] {figs/graficos/2sensors.csv};
  \addlegendentry{FSR4}
  \end{axis}
\end{tikzpicture}
&

% Gráfico FSR2
\begin{tikzpicture}
  \begin{axis}[
    width=0.49\textwidth,
    height=0.35\textwidth,
    xlabel={Tempo (s)},
    ylabel={Leitura do FSR (V)},
    legend pos=north west,
    legend style={font=\scriptsize},
    grid=both,
    grid style={dashed,gray!30},
  ]
  % FSR1
  \addplot [color=red] table [x=timestamp, y=FSR1, col sep=comma] {figs/graficos/3sensors.csv};
  \addlegendentry{FSR1}

  % FSR2
  \addplot [color=blue] table [x=timestamp, y=FSR2, col sep=comma] {figs/graficos/3sensors.csv};
  \addlegendentry{FSR2}

  % FSR3
  \addplot [color=green] table [x=timestamp, y=FSR3, col sep=comma] {figs/graficos/3sensors.csv};
  \addlegendentry{FSR3}

  % FSR4
  \addplot [color=orange] table [x=timestamp, y=FSR4, col sep=comma] {figs/graficos/3sensors.csv};
  \addlegendentry{FSR4}
  \end{axis}
\end{tikzpicture}
\\

% Gráfico FSR3
\begin{tikzpicture}
  \begin{axis}[
    width=0.49\textwidth,
    height=0.35\textwidth,
    xlabel={Tempo (s)},
    ylabel={Leitura do FSR (V)},
    legend pos=north west,
    legend style={font=\scriptsize},
    grid=both,
    grid style={dashed,gray!30},
  ]
  % FSR1
  \addplot [color=red] table [x=timestamp, y=FSR1, col sep=comma] {figs/graficos/4sensors.csv};
  \addlegendentry{FSR1}

  % FSR2
  \addplot [color=blue] table [x=timestamp, y=FSR2, col sep=comma] {figs/graficos/4sensors.csv};
  \addlegendentry{FSR2}

  % FSR3
  \addplot [color=green] table [x=timestamp, y=FSR3, col sep=comma] {figs/graficos/4sensors.csv};
  \addlegendentry{FSR3}

  % FSR4
  \addplot [color=orange] table [x=timestamp, y=FSR4, col sep=comma] {figs/graficos/4sensors.csv};
  \addlegendentry{FSR4}
  \end{axis}
\end{tikzpicture}


\end{tabular}
\caption{Gráfico da tensão de saída dos sensores durante a aplicação de força sobre 2, 3 e 4 sensores em simultâneo.}
\label{fig:teste2}
\end{figure}

A análise dos resultados confirma as conclusões retiradas da primeira experiência de que os sensores apresentam um comportamento independente, sem sinais de interferência mútua. Além disso, foi possível observar que o sistema responde de forma satisfatória à aplicação de força, validando o desempenho adequado dos sensores nas condições de funcionamento previstas.

Estes testes permitiram, assim, validar o correto funcionamento do sistema de sensores, tanto em situações de carga individual como de carga múltipla, constituindo uma etapa fundamental para a integração dos sensores na estrutura da mão robótica. Adicionalmente, verificou-se que a frequência de leitura dos valores provenientes dos sensores FSR é de aproximadamente 1000~Hz, valor que garante uma amostragem suficientemente elevada para aplicações em tempo real e deteção de contactos rápidos.




\subsubsection{Teste com sensor FSR 406}


O sensor \ac{FSR} 406 possui uma geometria quadrada e uma área de deteção consideravelmente maior do que os sensores \ac{FSR} 400, o que o torna particularmente interessante para aplicações onde se pretende medir forças aplicadas de forma mais distribuída. 

De forma a avaliar o comportamento específico deste sensor, nomeadamente a sua capacidade de resposta à aplicação de cargas em diferentes zonas da superfície sensível, realizou-se outra experiência onde foi inicialmente aplicada uma carga sobre o sensor, colocando-se um objeto de massa conhecida numa região específica da sua área ativa. Após esta primeira aplicação, procedeu-se à aplicação de uma força, posicionada noutro ponto distinto do sensor, de forma a analisar a resposta do sistema à distribuição de forças em múltiplas zonas.

O gráfico obtido para esta experiência encontra-se apresentado na Figura ~\ref{fig:fsr_406} e a sua análise permite observar que aquando da aplicação da primeira carga, o sinal de saída apresenta alguma oscilação, possivelmente associada à instabilidade do objeto colocado, dado o seu peso reduzido, ou à falta de fixação adequada do sensor à superfície de teste. Este comportamento evidencia a sensibilidade do sensor a fatores externos, como a estabilidade da carga e as condições de montagem.

Após a aplicação da segunda carga, observou-se um aumento adicional na tensão de saída, indicando que o sinal final reflete a soma das forças aplicadas em diferentes pontos da superfície sensível do sensor. Estes resultados demonstram a capacidade do sensor FSR 406 para detetar forças em múltiplas zonas da sua área ativa.



\begin{figure}[h]
\centering
\begin{tikzpicture}
  \begin{axis}[
    width=12cm,
    height=8cm,
    xlabel={Tempo (s)},
    ylabel={Leitura do FSR (V)},
    legend pos=north east,
    grid=both,
    grid style={dashed,gray!30},
    cycle list name=color list,
  ]

  % FSR1
  \addplot [color=red] table [x=timestamp, y=FSR1, col sep=comma] {figs/graficos/sensor_406.csv};
  \addlegendentry{FSR1}


  \end{axis}
\end{tikzpicture}
\caption{Gráfico da tensão de saída do sensor FSR 406 durante a aplicação de duas cargas em pontos distintos da sua superfície sensível.}
\label{fig:fsr_406}
\end{figure}






\subsubsection{Aumento da Zona Sensível do Sensor}


Os testes preliminares realizados em bancada permitiram avaliar o comportamento dos \ac{FSR} em condições ideais. No entanto, quando se integraram na estrutura da mão robótica, verificou-se que os sensores raramente registavam valores significativos durante os testes de contacto. Este fenómeno deve-se principalmente à discrepância entre o tamanho reduzido e a geometria plana dos sensores FSR e a forma volumosa e irregular das pontas dos dedos da \textit{LEAP Hand} \cite{shaw2023leaphand}. Assim, a força exercida pelos objetos nem sempre é aplicada diretamente sobre o sensor, comprometendo a transferência eficaz da força.


Para ultrapassar o problema identificado, foi desenhada, com recurso à ferramenta Tinkercad, uma pequena peça em 3D composta por uma base com espessura de \SI{0.5}{\milli\metre} que replica aproximadamente a forma da superfície da ponta do dedo. No centro desta base foi adicionada uma saliência com geometria semiesférica, com cerca de \SI{1.5}{\milli\metre} de altura e \SI{8}{\milli\metre} de diâmetro, valor próximo do diâmetro útil do sensor FSR. Esta semiesfera é orientada de forma a ficar em contacto direto com o sensor, permitindo concentrar e propagar a força proveniente de diferentes pontos da superfície do dedo para a zona ativa do sensor. Na Figura~\ref{fig:esquema_chapa} é possível observar o esquema de aplicação da peça desenvolvida para melhor compreensão da utilidade da mesma.

\begin{figure}[h]
\centering
\includegraphics[width=0.6\textwidth]{figs/chapter4/chapa.png}
\caption{Esquema de utilização da peça desenvolvida para aumento da zona sensível do sensor.}
\label{fig:esquema_chapa}
\end{figure}


A utilização desta peça garante uma melhor transferência de força, mesmo quando o objeto interage com áreas da ponta do dedo que não se encontram diretamente sobre o sensor. Na Figura~\ref{fig:peca_propagacao_forca} é possível visualizar a peça desenhada. A eficácia desta solução será discutida no capítulo seguinte, com base nos resultados obtidos durante os testes experimentais.

\begin{figure}[h]
\centering
\includegraphics[width=0.5\textwidth]{figs/chapter4/peca_propagaçao.png}
\caption{Peça desenhada em Tinkercad para propagação da força até ao sensor FSR.}
\label{fig:peca_propagacao_forca}
\end{figure}





\section{Conclusão}


Este capítulo apresentou de forma sistemática o processo de desenvolvimento, montagem e programação da mão robótica, bem como a sua integração com um sistema sensorial de contacto.

Na primeira parte abordou-se a construção da estrutura física da mão robótica, incluindo o fabrico, montagem e integração dos diferentes componentes. Foram configurados os motores \textit{Dynamixel XC330-M288-T}, com destaque para a seleção dos modos de operação e parâmetros que asseguram um controlo eficiente e compatível com a cinemática da mão.

Seguidamente, desenvolveu-se a programação necessária para o controlo dos movimentos, iniciando-se pela ativação de um único motor, passando pelo controlo completo de um dedo, até à coordenação dos quatro dedos da mão. Este processo resultou na conceção de uma arquitetura de software modular e escalável, que suporta o controlo coordenado da mão e funcionalidades avançadas, como a definição de velocidades relativas entre dedos e falanges, bem como a introdução de atrasos temporais entre movimentos, possibilitando gestos mais fluidos e semelhantes aos de uma mão humana.

Na fase final do capítulo, detalhou-se a implementação do sistema sensorial baseado em sensores FSR, começando pela escolha do microcontrolador e das resistências adequadas até ao desenvolvimento físico do sistema, com a criação de um PCB para facilitar as ligações e a alimentação. Foram também desenhadas peças em 3D para fixar os componentes eletrónicos na palma da mão, bem como uma peça adicional que permite propagar a força exercida sobre os dedos até ao sensor, tendo em conta a geometria da estrutura.

A nível de software, foi implementada a leitura dos sinais analógicos dos sensores e sua transmissão via comunicação série, utilizando o microcontrolador Teensy 4.0, cuja frequência de operação até 600~MHz permitiu atingir uma elevada taxa de amostragem. Os testes realizados demonstraram que o sistema é capaz de adquirir dados dos sensores FSR a uma frequência aproximada de 1000~Hz, o que assegura uma perceção tátil responsiva e adequada a aplicações em tempo real. Paralelamente, avaliou-se também que os dados dos motores podem ser lidos a uma frequência de 50~Hz de forma estável, permitindo a monitorização contínua do estado da mão durante o seu funcionamento.

Em suma, este capítulo consolidou os principais elementos físicos e funcionais da mão robótica desenvolvida, dotando-a não só de capacidade de movimento articulado, mas também de perceção tátil básica. O sistema encontra-se, assim, preparado para fases posteriores de integração com estratégias de controlo sensório-motor e testes experimentais mais avançados.


