Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
movimentacao.cpp
- Committer:
- terhorst
- Date:
- 2020-06-23
- Revision:
- 3:a9c1946f0518
- Parent:
- 2:281470e6654a
- Child:
- 4:7594859b6e60
File content as of revision 3:a9c1946f0518:
# include "mbed.h"
AnalogIn XAxis(A0);
AnalogIn YAxis(A1);
InterruptIn butao(PC_13);
DigitalIn ZAxis_UP(D13);
DigitalIn ZAxis_DOWN(D12);
DigitalOut Fase_M1_A(PB_12);
DigitalOut Fase_M1_B(PB_15);
DigitalOut Fase_M1_C(PB_14);
DigitalOut Fase_M1_D(PB_13);
DigitalOut Fase_M2_A(PC_12);
DigitalOut Fase_M2_B(PA_13);
DigitalOut Fase_M2_C(PA_14);
DigitalOut Fase_M2_D(PA_15);
DigitalOut Fase_M3_A(PA_12);
DigitalOut Fase_M3_B(PC_5);
DigitalOut Fase_M3_C(PC_6);
DigitalOut Fase_M3_D(PC_8);
DigitalOut Emergencia(D14);
DigitalIn SensorParadaX_1(PA_8);
DigitalIn SensorParadaY_1(PA_9);
DigitalIn SensorParadaZ_1(PA_10);
DigitalIn Fim(PA_11);
DigitalOut Pipeta(D15);
Serial pc(USBTX, USBRX);
Timer debounce;
int PosicaoRecipiente[3]; //Cria um vetor de 3 digítos para representar a posição do recipiente pré-existente na máquina (x, y, z)
PosicaoRecipiente[0] = 40;
PosicaoRecipiente[1] = 35;
PosicaoRecipiente[2] = 10;
void Botao_Emergencia(void);
void Joystick(){
int PosicaoUsuario[3];
int X,Y,estado;
estado = 1;
Emergencia = 0;
Pipeta = 1;
Fase_M1_A = 0;
Fase_M1_B = 0;
Fase_M1_C = 0;
Fase_M1_D = 0;
Fase_M2_A = 0;
Fase_M2_B = 0;
Fase_M2_C = 0;
Fase_M2_D = 0;
Fase_M3_A = 0;
Fase_M3_B = 0;
Fase_M3_C = 0;
Fase_M3_D = 0;
debounce.start();
butao.rise(&Botao_Emergencia);
while(estado == 1) {
X = XAxis.read() * 1000;
Y = YAxis.read() * 1000;
float tempo = 0.01;
if (ZAxis_UP == 1) { // Enquanto o Botão não estiver pressionado o motor permanece desligado
Fase_M3_A = 0;
Fase_M3_B = 0;
Fase_M3_C = 0;
Fase_M3_D = 0;
}
if (ZAxis_DOWN == 1) { // Enquanto o Botão não estiver pressionado o motor permanece desligado
Fase_M3_A = 0;
Fase_M3_B = 0;
Fase_M3_C = 0;
Fase_M3_D = 0;
}
if (ZAxis_UP == 0 && ZAxis_DOWN == 1) { // Quando o botão UP estiver pressionado e o botão DOWN não - Suba a pipeta - inverte o sentido de rotação do motor
Fase_M3_D = 1;
wait(tempo);
Fase_M3_D = 0;
Fase_M3_C = 1;
wait(tempo);
Fase_M3_C = 0;
Fase_M3_B = 1;
wait(tempo);
Fase_M3_B = 0;
Fase_M3_A = 1;
wait(tempo);
Fase_M3_A = 0;
PosicaoUsuario[2] = PosicaoUsuario[2] - 5;
}
if (ZAxis_DOWN == 0 && ZAxis_UP == 1) { // Quando o botão DOWN estiver pressionado e o botão UP não - Desce a pipeta - sentido normal de rotação do motor
Fase_M3_A = 1;
wait(tempo);
Fase_M3_A = 0;
Fase_M3_B = 1;
wait(tempo);
Fase_M3_B = 0;
Fase_M3_C = 1;
wait(tempo);
Fase_M3_C = 0;
Fase_M3_D = 1;
wait(tempo);
Fase_M3_D = 0;
PosicaoUsuario[2] = PosicaoUsuario[2] + 5;
}
if (100<X<900) { //delimitando range de atuação do joystick
Fase_M1_A = 0;
Fase_M1_B = 0;
Fase_M1_C = 0;
Fase_M1_D = 0;
Fase_M2_A = 0;
Fase_M2_B = 0;
Fase_M2_C = 0;
Fase_M2_D = 0;
Fase_M3_A = 0;
Fase_M3_B = 0;
Fase_M3_C = 0;
Fase_M3_D = 0;
}
if (100<Y<900) { //delimitando range de atuação do joystick
Fase_M1_A = 0;
Fase_M1_B = 0;
Fase_M1_C = 0;
Fase_M1_D = 0;
Fase_M2_A = 0;
Fase_M2_B = 0;
Fase_M2_C = 0;
Fase_M2_D = 0;
Fase_M3_A = 0;
Fase_M3_B = 0;
Fase_M3_C = 0;
Fase_M3_D = 0;
}
if (X<100) { //seta esquerda - Inverte o sentido de rotação
Fase_M1_D = 1;
wait(tempo);
Fase_M1_D = 0;
Fase_M1_C = 1;
wait(tempo);
Fase_M1_C = 0;
Fase_M1_B = 1;
wait(tempo);
Fase_M1_B = 0;
Fase_M1_A = 1;
wait(tempo);
Fase_M1_A = 0;
PosicaoUsuario[0] = PosicaoUsuario[0] - 5;
}
if (X>900) { // seta direita - sentido normal de rotação
Fase_M1_A = 1;
wait(tempo);
Fase_M1_A = 0;
Fase_M1_B = 1;
wait(tempo);
Fase_M1_B = 0;
Fase_M1_C = 1;
wait(tempo);
Fase_M1_C = 0;
Fase_M1_D = 1;
wait(tempo);
Fase_M1_D = 0;
PosicaoUsuario[0] = PosicaoUsuario[0] + 5;
}
if (Y<100) { //seta pra baixo - Inverte o sentido de rotação
Fase_M2_D = 1;
wait(tempo);
Fase_M2_D = 0;
Fase_M2_C = 1;
wait(tempo);
Fase_M2_C = 0;
Fase_M2_B = 1;
wait(tempo);
Fase_M2_B = 0;
Fase_M2_A = 1;
wait(tempo);
Fase_M2_A = 0;
PosicaoUsuario[1] = PosicaoUsuario[1] - 5;
}
if (Y>900) { //seta pra cima - Sentido normal de rotação
Fase_M2_A = 1;
wait(tempo);
Fase_M2_A = 0;
Fase_M2_B = 1;
wait(tempo);
Fase_M2_B = 0;
Fase_M2_C = 1;
wait(tempo);
Fase_M2_C = 0;
Fase_M2_D = 1;
wait(tempo);
Fase_M2_D = 0;
PosicaoUsuario[1] = PosicaoUsuario[1] + 5;
}
if (Fim == 1) {
estado = 0;
}
}
}
void Botao_Emergencia() {
if (debounce.read_ms()>200) {
Emergencia = 1;
debounce.reset();
}
}
void movimentacao_inicial_X_esquerda() {
Fase_M1_D = 1;
wait(tempo);
Fase_M1_D = 0;
Fase_M1_C = 1;
wait(tempo);
Fase_M1_C = 0;
Fase_M1_B = 1;
wait(tempo);
Fase_M1_B = 0;
Fase_M1_A = 1;
wait(tempo);
Fase_M1_A = 0;
}
void movimentacao_inicial_Y_esquerda() {
Fase_M1_D = 1;
wait(tempo);
Fase_M1_D = 0;
Fase_M1_C = 1;
wait(tempo);
Fase_M1_C = 0;
Fase_M1_B = 1;
wait(tempo);
Fase_M1_B = 0;
Fase_M1_A = 1;
wait(tempo);
Fase_M1_A = 0;
}
void movimentacao_inicial_Z_esquerda() {
Fase_M1_D = 1;
wait(tempo);
Fase_M1_D = 0;
Fase_M1_C = 1;
wait(tempo);
Fase_M1_C = 0;
Fase_M1_B = 1;
wait(tempo);
Fase_M1_B = 0;
Fase_M1_A = 1;
wait(tempo);
Fase_M1_A = 0;
}
void zeramento() {
int Posicao_inicial[3];
int parada_total_X = 0;
int parada_total_Y = 0;
int parada_total_Z = 0;
int paradaX_esquerda = 0;
int paradaY_esquerda = 0;
int paradaZ_esquerda = 0;
int SensorX_1 = SensorParadaX_1;
int SensorY_1 = SensorParadaY_1;
int SensorZ_1 = SensorParadaZ_1;
while (parada_total_X == 0) { //Eixo X começa a se mover, quando o sensor de parada for ativado ele para e começa a rodar no sentido contrário.
if (paradaX_esquerda == 1) {
movimentacao_inicial_X_esquerda(); //roda a função de movimentação do eixo X
if (SensorX_1 == 1) {
Posicao_inicial[0] = 0;
paradaX_esquerda = 0;
parada_total_X = 1;
}
}
}
while (parada_total_Y == 0) { //Eixo X começa a se mover, quando o sensor de parada for ativado ele para e começa a rodar no sentido contrário.
if (paradaY_esquerda == 1) {
movimentacao_inicial_Y_esquerda(); //roda a função de movimentação do eixo X
if (SensorY_1 == 1) {
Posicao_inicial[1] = 0;
paradaY_esquerda = 0;
parada_total_Y = 1;
}
}
}
while (parada_total_Z == 0) { //Eixo X começa a se mover, quando o sensor de parada for ativado ele para e começa a rodar no sentido contrário.
if (paradaZ_esquerda == 1) {
movimentacao_inicial_Z_esquerda(); //roda a função de movimentação do eixo X
if (SensorZ_1 == 1) {
Posicao_inicial[2] = 0;
paradaZ_esquerda = 0;
parada_total_Z = 1;
}
}
}
}
void ativa_pipeta() { // Função para fazer a pipeta sugar/soltar o líquido - 1ml
Pipeta = 0;
wait(0.2);
Pipeta = 1;
}
void avaliar_distancia(){ //Função para detectar e movimentar a pipeta até o local da pega
int x = 0;
int y = 0;
int z = 0;
int x_2 = 0;
int y_2 = 0;
int z_2 = 0;
while (x == 0){ // Checa se a pipeta está na posição de pega, se n estiver ela se movimenta até lá
if (Posicao_inicial[0] < PosicaoFrasco[0]) { // Se a pipeta estiver antes da posição correta ela passa a girar no sentido horário
Fase_M1_A = 1;
wait(tempo);
Fase_M1_A = 0;
Fase_M1_B = 1;
wait(tempo);
Fase_M1_B = 0;
Fase_M1_C = 1;
wait(tempo);
Fase_M1_C = 0;
Fase_M1_D = 1;
wait(tempo);
Fase_M1_D = 0;
Posicao_inicial[0] = Posicao_inicial[0] + 5;
}
if (Posicao_inicial[0] > PosicaoFrasco[0]) { // Se a pipeta estiver depois da posição correta ela passa a girar no sentido anti-horário
Fase_M1_D = 1;
wait(tempo);
Fase_M1_D = 0;
Fase_M1_C = 1;
wait(tempo);
Fase_M1_C = 0;
Fase_M1_B = 1;
wait(tempo);
Fase_M1_B = 0;
Fase_M1_A = 1;
wait(tempo);
Fase_M1_A = 0;
Posicao_inicial[0] = Posicao_inicial[0] - 5;
}
if (Posicao_inicial[0] == PosicaoFrasco[0]) { // Se a pipeta estiver na posição correta ela fica parada
Fase_M1_A = 0;
Fase_M1_B = 0;
Fase_M1_C = 0;
Fase_M1_D = 0;
x = 1;
}
}
while (y == 0){ // Checa se a pipeta está na posição de pega, se n estiver ela se movimenta até lá
if (Posicao_inicial[1] < PosicaoFrasco[1]) { // Se a pipeta estiver antes da posição correta ela passa a girar no sentido horário
Fase_M2_A = 1;
wait(tempo);
Fase_M2_A = 0;
Fase_M2_B = 1;
wait(tempo);
Fase_M2_B = 0;
Fase_M2_C = 1;
wait(tempo);
Fase_M2_C = 0;
Fase_M2_D = 1;
wait(tempo);
Fase_M2_D = 0;
Posicao_inicial[1] = Posicao_inicial[1] + 5;
}
if (Posicao_inicial[1] > PosicaoFrasco[1]) { // Se a pipeta estiver depois da posição correta ela passa a girar no sentido anti-horário
Fase_M2_D = 1;
wait(tempo);
Fase_M2_D = 0;
Fase_M2_C = 1;
wait(tempo);
Fase_M2_C = 0;
Fase_M2_B = 1;
wait(tempo);
Fase_M2_B = 0;
Fase_M2_A = 1;
wait(tempo);
Fase_M2_A = 0;
Posicao_inicial[1] = Posicao_inicial[1] - 5;
}
if (Posicao_inicial[1] == PosicaoFrasco[1]) { // Se a pipeta estiver na posição correta ela fica parada
Fase_M2_A = 0;
Fase_M2_B = 0;
Fase_M2_C = 0;
Fase_M2_D = 0;
y = 1;
}
}
while (z == 0){ // Checa se a pipeta está na posição de pega, se n estiver ela se movimenta até lá
if (Posicao_inicial[2] < PosicaoFrasco[2]) { // Se a pipeta estiver antes da posição correta ela passa a girar no sentido horário
Fase_M3_A = 1;
wait(tempo);
Fase_M3_A = 0;
Fase_M3_B = 1;
wait(tempo);
Fase_M3_B = 0;
Fase_M3_C = 1;
wait(tempo);
Fase_M3_C = 0;
Fase_M3_D = 1;
wait(tempo);
Fase_M3_D = 0;
Posicao_inicial[2] = Posicao_inicial[2] + 5;
}
if (Posicao_inicial[2] > PosicaoFrasco[2]) { // Se a pipeta estiver depois da posição correta ela passa a girar no sentido anti-horário
Fase_M3_D = 1;
wait(tempo);
Fase_M3_D = 0;
Fase_M3_C = 1;
wait(tempo);
Fase_M3_C = 0;
Fase_M3_B = 1;
wait(tempo);
Fase_M3_B = 0;
Fase_M3_A = 1;
wait(tempo);
Fase_M3_A = 0;
Posicao_inicial[2] = Posicao_inicial[2] - 5;
}
if (Posicao_inicial[2] == PosicaoFrasco[2]) { // Se a pipeta estiver na posição correta ela fica parada
z = 1;
}
}
ativa_pipeta();
while (Posicao_inicial[2] != 0) { //Depois de sugar o líquido a pipeta é levada para cima para evitar possíveis colisões
Fase_M3_D = 1;
wait(tempo);
Fase_M3_D = 0;
Fase_M3_C = 1;
wait(tempo);
Fase_M3_C = 0;
Fase_M3_B = 1;
wait(tempo);
Fase_M3_B = 0;
Fase_M3_A = 1;
wait(tempo);
Fase_M3_A = 0;
Posicao_inicial[2] = Posicao_inicial[2] - 5;
}
while (x_2 == 0){ // Checa se a pipeta está na posição de solta, se n estiver ela se movimenta até lá
if (Posicao_inicial[0] < PosicaoRecipiente[0]) {
Fase_M1_A = 1;
wait(tempo);
Fase_M1_A = 0;
Fase_M1_B = 1;
wait(tempo);
Fase_M1_B = 0;
Fase_M1_C = 1;
wait(tempo);
Fase_M1_C = 0;
Fase_M1_D = 1;
wait(tempo);
Fase_M1_D = 0;
Posicao_inicial[0] = Posicao_inicial[0] + 5;
}
if (Posicao_inicial[0] > PosicaoRecipiente[0]) {
Fase_M1_D = 1;
wait(tempo);
Fase_M1_D = 0;
Fase_M1_C = 1;
wait(tempo);
Fase_M1_C = 0;
Fase_M1_B = 1;
wait(tempo);
Fase_M1_B = 0;
Fase_M1_A = 1;
wait(tempo);
Fase_M1_A = 0;
Posicao_inicial[0] = Posicao_inicial[0] - 5;
}
if (Posicao_inicial[0] == PosicaoRecipiente[0]) {
Fase_M1_A = 0;
Fase_M1_B = 0;
Fase_M1_C = 0;
Fase_M1_D = 0;
x_2 = 1;
}
}
while (y_2 == 0){ // Checa se a pipeta está na posição de solta, se n estiver ela se movimenta até lá
if (Posicao_inicial[1] < PosicaoRecipiente[1]) {
Fase_M2_A = 1;
wait(tempo);
Fase_M2_A = 0;
Fase_M2_B = 1;
wait(tempo);
Fase_M2_B = 0;
Fase_M2_C = 1;
wait(tempo);
Fase_M2_C = 0;
Fase_M2_D = 1;
wait(tempo);
Fase_M2_D = 0;
Posicao_inicial[1] = Posicao_inicial[1] + 5;
}
if (Posicao_inicial[1] > PosicaoRecipiente[1]) {
Fase_M2_D = 1;
wait(tempo);
Fase_M2_D = 0;
Fase_M2_C = 1;
wait(tempo);
Fase_M2_C = 0;
Fase_M2_B = 1;
wait(tempo);
Fase_M2_B = 0;
Fase_M2_A = 1;
wait(tempo);
Fase_M2_A = 0;
Posicao_inicial[1] = Posicao_inicial[1] - 5;
}
if (Posicao_inicial[1] == PosicaoRecipiente[1]) {
Fase_M2_A = 0;
Fase_M2_B = 0;
Fase_M2_C = 0;
Fase_M2_D = 0;
y_2 = 1;
}
}
while (z_2 == 0){ // Checa se a pipeta está na posição de solta, se n estiver ela se movimenta até lá
if (Posicao_inicial[2] < PosicaoRecipiente[2]) {
Fase_M3_A = 1;
wait(tempo);
Fase_M3_A = 0;
Fase_M3_B = 1;
wait(tempo);
Fase_M3_B = 0;
Fase_M3_C = 1;
wait(tempo);
Fase_M3_C = 0;
Fase_M3_D = 1;
wait(tempo);
Fase_M3_D = 0;
Posicao_inicial[2] = Posicao_inicial[2] + 5;
}
if (Posicao_inicial[2] > PosicaoRecipiente[2]) {
Fase_M3_D = 1;
wait(tempo);
Fase_M3_D = 0;
Fase_M3_C = 1;
wait(tempo);
Fase_M3_C = 0;
Fase_M3_B = 1;
wait(tempo);
Fase_M3_B = 0;
Fase_M3_A = 1;
wait(tempo);
Fase_M3_A = 0;
Posicao_inicial[2] = Posicao_inicial[2] - 5;
}
if (Posicao_inicial[2] == PosicaoRecipiente[2]) {
Fase_M3_A = 0;
Fase_M3_B = 0;
Fase_M3_C = 0;
Fase_M3_D = 0;
z_2 = 1;
}
}
ativa_pipeta();
}
void repetir(){
for (i=0 , i<3 , i++) {
avaliar_distancia()
}
}
int main() {
debounce.start();
butao.rise(&Botao_Emergencia);
zeramento();
Joystick();
repetir();
}