Marcelo Costanzo Miranda
/
Retrovisor_CAN
Retrovisor CAN BUS funcionando
main.cpp
- Committer:
- Marcelocostanzo
- Date:
- 2019-04-12
- Revision:
- 0:20364736a14b
File content as of revision 0:20364736a14b:
#include "mbed.h" //-----------Pinos de saida (output)--------------- DigitalOut IN1A(D5); DigitalOut IN2A(D4); DigitalOut EN_A(D2); DigitalOut IN1B(A0); DigitalOut IN2B(A1); DigitalOut EN_B(A4); DigitalOut LED(PA_5); //-----------Pinos de saida (input)--------------- DigitalIn SW(PC_13); //----------Pinos de entrada analogica (ADC)------ AnalogIn AXIS_X(A3); AnalogIn AXIS_Y(A5); //---------Declaração de comunicação serial------- Serial pc(USBTX, USBRX); //---------Declaração de comunicação CAN------- CAN can1(PB_8, PB_9); //---------Declaração de interrupção para debug------- Ticker flip; //---------Dados em hexadecimal de cada mensagem------- static char info = 0x55; static char left = 0x01; static char right = 0x02; static char up = 0x03; static char down = 0x04; static char stop = 0x05; //--------Rotina do debug-------------------------- void debug() { LED =! LED; } //-------Rotina para setar os pinos na direção -X ------- void move_down() { EN_A = 1; EN_B = 1; IN1A = 1; IN2A = 0; IN1B = 0; IN2B = 0; } //-------Rotina para setar os pinos na direção +X ------- void move_up() { EN_A = 1; EN_B = 1; IN1A = 0; IN2A = 1; IN1B = 1; IN2B = 0; } //-------Rotina para setar os pinos na direção -Y ------- void move_left() { EN_A = 1; EN_B = 1; IN1A = 1; IN2A = 1; IN1B = 0; IN2B = 0; } //-------Rotina para setar os pinos na direção +Y ------- void move_right() { EN_A = 1; EN_B = 1; IN1A = 0; IN2A = 0; IN1B = 1; IN2B = 0; } //-------Rotina para desligar os motores de X e Y ------- void move_stop() { EN_A = 0; EN_B = 0; } int main() { //---------Garante que não haverá curto na ponte H ao ligar---- IN1A = 0; IN2A = 0; EN_A = 1; IN1B = 0; IN2B = 0; EN_B = 1; //-----atribuição dos dados as mensagens---------- CANMessage msg(5, &info, 8, CANData, CANStandard); CANMessage msg_up(5, &up, 8, CANData, CANStandard); CANMessage msg_down(5, &down, 8, CANData, CANStandard); CANMessage msg_left(5, &left, 8, CANData, CANStandard); CANMessage msg_right(5, &right, 8, CANData, CANStandard); CANMessage msg_stop(5, &stop, 8, CANData, CANStandard); //----Pisca o led e envia via serial uma string------- LED = 1; wait(0.5); LED = 0; wait(0.5); pc.printf("Start\n"); //-----Habilita a interrupção para debug-------------- flip.attach(&debug, 0.5f); //---------Declaração de variaveis locais---------------- float VAL_X = 0.0f, VAL_Y = 0.0f; while(1) { //------Leitura do joystick nos eixos X e Y -------------- VAL_X = AXIS_X.read(); VAL_Y = AXIS_Y.read(); //----Envia mensagem para +Y ----- if(VAL_X > 0.7f) { //printf("\n\rRIGHT"); if(can1.write(msg_right)) { pc.printf("Direita enviada\n"); } else { pc.printf("Direita NAO enviada\n"); } } //----Envia mensagem para -Y ----- if(VAL_X < 0.3f) { //printf("\n\rLEFT"); if(can1.write(msg_left)) { pc.printf("Esquerda enviada\n"); } else { pc.printf("Esquerda NAO enviada\n"); } } //----Envia mensagem para +X ----- if(VAL_Y > 0.7f) { //printf("\n\rUP"); if(can1.write(msg_up)) { pc.printf("Cima enviada\n"); } else { pc.printf("Cima NAO enviada\n"); } } //----Envia mensagem para -X ----- if(VAL_Y < 0.3f) { //printf("\n\rDown"); if(can1.write(msg_down)) { pc.printf("Baixo enviada\n"); } else { pc.printf("Baixo NAO enviada\n"); } } //----Se o joystick estiver em repouso, envia mensagem para parar os motores dos eixos-------- if(((VAL_Y < 0.65f) && (VAL_Y > 0.45f)) && ((VAL_X < 0.65f) && (VAL_X > 0.45f))) { //printf("\n\rStop"); if(can1.write(msg_stop)) { pc.printf("Parada enviada\n"); } else { pc.printf("Parada NAO enviada\n"); } } //-----Verifica se recebeu uma mensagem na CAN------------- if(can1.read(msg)) { pc.printf("Mensagem recebida: %x\n", msg.data[0]); } //------Se a mensagem for do tipo UP, então move para cima---- if(msg.data[0] == up) { move_up(); pc.printf("Cima recebida: %x\n", msg_up.data[0]); } //------Se a mensagem for do tipo DOWN, então move para baixo---- if(msg.data[0] == down) { move_down(); pc.printf("Baixo recebida: %x\n", msg_down.data[0]); } //------Se a mensagem for do tipo RIGHT, então move para direita---- if(msg.data[0] == right) { move_right(); pc.printf("Direita recebida: %x\n", msg_right.data[0]); } //------Se a mensagem for do tipo LEFT, então move para esquerda---- if(msg.data[0] == left) { move_left(); pc.printf("Esquerda recebida: %x\n", msg_left.data[0]); } //------Se a mensagem for do tipo STOP, então para os motores------ if(msg.data[0] == stop) { move_stop(); pc.printf("Parada recebida: %x\n", msg_stop.data[0]); } msg.data[0] = 0x00;//limpa a variavel wait_ms(10);//controla o envio/recebimento de mensagens } }