Específicos
Observando o exemplo básico do PID, acho que você só precisa instanciar duas cópias do controlador PID, uma para cada roda, codificador e pwm:
PID leftPID(&InputLeft, &OutputLeft, &SetpointLeft,2,5,1, DIRECT);
PID rightPID(&InputRight, &OutputRight, &SetpointRight,2,5,1, DIRECT);
Então, no seu loop()
equivalente, você acabou de ler os dois codificadores, passar cada valor do codificador para o relevante PID
e, finalmente, gravar os dois valores PWM.
Por enquanto SetpointLeft
e SetpointRight
pode realmente apontar para o mesmo valor, mas defini-los separadamente dessa maneira permite adicionar o recurso de virar mais tarde.
Conceitos
Embora isso possa funcionar para o caso básico, se é suficiente depende realmente da precisão que você precisa que sua linha reta seja.
Dado que você tem codificadores em cada roda, se você executar dois circuitos PID e comparar o erro seguinte de cada roda , poderá potencialmente calcular seu erro máximo de abbe ao longo da distância, supondo que suas rodas não escorregem. Se esse erro for menor do que os seus requisitos, basta calcular o número de mortos .
No entanto, se suas rodas estão propensas a escorregar, você pode ter ocultado o seguinte erro que seu sistema de controle não consegue detectar e você precisará de uma maneira de detectar um escorregamento ou calcular a posição independentemente dos seus codificadores de roda e, em seguida, usar um software de nível superior para corrigir exigiu posições / velocidades das rodas para manter uma linha reta.
Determinação da posição relativa
Como John sugere , você pode usar um acelerômetro para determinar a posição, mas, dada a precisão e o efeito dos erros acumulados ao longo do tempo, pode ser melhor usar os dados do acelerômetro para detectar e corrigir a derrapagem das rodas.
Na robótica móvel, as técnicas de filtragem Kalman são comumente usadas para fundir os dados de várias fontes, como um acelerômetro e os codificadores de roda para determinar melhor a posição atual.
Faça o que fizer com determinação posição relativa no entanto, ao longo do tempo a posição que você acredita ser em vão afastar-se da sua posição física real.
Determinação de posição absoluta
A única maneira de contornar isso é ter um ponto de referência fora do quadro de referência do seu veículo.
Um roomba, por exemplo, geralmente usa o acerto de contas morto para se movimentar pela sala, mas sempre que precisa atracar, ele procura um feixe de luz infravermelha enviado pela estação de carregamento. Quando o roomba se move aleatoriamente através desse feixe, ele o detecta, trava no feixe e o segue de volta à sua fonte. Em combinação com seus sensores de resposta, ele pode se posicionar com precisão nos contatos de carregamento.
Para o seu robô, ele pode ter uma posição inicial, onde pode voltar e detectar que está naquele local conhecido. Nesse ponto, ele sabe exatamente onde está e pode relatar a distância entre a posição calculada e a posição real.
Outra opção, se você precisar que seu robô viaje em linha reta por centenas de metros, seria mudar para uma técnica diferente, como adicionar um escudo GPS do Arduino .
Uma combinação de técnicas
Por fim, dependendo dos requisitos de precisão, pode ser necessário usar uma combinação dessas técnicas.
Se um feixe guia for possível, você poderá fazer o que deseja com muita simplicidade com uma linha invisível seguindo a técnica . Se você precisar se mover em qualquer linha reta arbitrária em uma área restrita, como o roomba, poderá usar um par de vigas guia (perpendiculares entre si) para permitir que você corrija sua posição sintetizada em um eixo cartesiano toda vez que o robô passa por um dos feixes.
Existem muitas opções aqui, e o que você escolheu depende do que você precisa.