Publishing for Biomimetics.
Dependencies: CRC MODDMA MODSERIAL MPU6050IMU PID QEI mbed-rtos mbed-src
main.cpp
- Committer:
- abuchan
- Date:
- 2016-05-31
- Revision:
- 0:8cfa73bb68e4
File content as of revision 0:8cfa73bb68e4:
#include "mbed.h" #include "protocol.h" #include "packet_parser.h" #include "sensors.h" #include "control.h" #define PID_KP 1.0f #define PID_KI 0.1f #define PID_KD 0.0f #define PID_PERIOD 0.01f #define PID_IN_MIN (-50.0f) #define PID_IN_MAX 50.0f #define PID_OUT_MIN (-1.0f) #define PID_OUT_MAX 1.0f #define TICK_PER_REV 1200 #define PID_DEAD_BAND 0.03f #define SERIAL_BAUDRATE 230400 #define VOLTAGE_PIN p15 #define L_ENC_A_PIN p29 #define L_ENC_B_PIN p30 #define R_ENC_A_PIN p11 #define R_ENC_B_PIN p12 #define IMU_SDA_PIN p9 #define IMU_SCL_PIN p10 #define L_MOT_0_PIN p21 #define L_MOT_1_PIN p22 #define R_MOT_0_PIN p23 #define R_MOT_1_PIN p24 void fill_time_packet(packet_t* pkt, uint32_t time) { pkt->header.type = PKT_TYPE_TIME; pkt->header.length = sizeof(header_t) + sizeof(time_data_t) + 1; time_data_t* time_data = (time_data_t*)pkt->data_crc; time_data->time = time; } extern "C" void mbed_reset(); int main() { DigitalOut led1(LED1); DigitalOut led4(LED4); led1 = 1; Timer system_timer; system_timer.start(); uint32_t last_time = system_timer.read_ms(); uint32_t current_time = last_time; PacketParser parser(SERIAL_BAUDRATE, USBTX, USBRX, LED2, LED3); packet_union_t* recv_pkt = NULL; packet_union_t* send_pkt = NULL; command_data_t* command; send_pkt = parser.get_send_packet(); if (send_pkt != NULL) { fill_time_packet(&(send_pkt->packet), system_timer.read_us()); parser.send_packet(send_pkt); } Sensors sensors( &system_timer, VOLTAGE_PIN, L_ENC_A_PIN, L_ENC_B_PIN, R_ENC_A_PIN, R_ENC_B_PIN, TICK_PER_REV, IMU_SDA_PIN, IMU_SCL_PIN ); Control control( L_MOT_0_PIN, L_MOT_1_PIN, R_MOT_0_PIN, R_MOT_1_PIN, &sensors, TICK_PER_REV, PID_KP, PID_KI, PID_KD, PID_PERIOD, PID_IN_MAX, PID_DEAD_BAND ); led4 = 1; packet_union_t* sensor_pkt = parser.get_send_packet(); while(1) { recv_pkt = parser.get_received_packet(); if (recv_pkt != NULL) { switch (recv_pkt->packet.header.type) { case PKT_TYPE_RESET: mbed_reset(); break; case PKT_TYPE_COMMAND: command = (command_data_t*)recv_pkt->packet.data_crc; control.set_setpoints(command->left, command->right); break; case PKT_TYPE_TIME: send_pkt = parser.get_send_packet(); if (send_pkt != NULL) { fill_time_packet(&(send_pkt->packet), system_timer.read_us()); parser.send_packet(send_pkt); } break; case PKT_TYPE_READ: if (sensor_pkt != NULL) { if(sensors.fill_sensor_packet(&(sensor_pkt->packet))) { control.fill_sensor_packet(&(sensor_pkt->packet)); parser.send_packet(sensor_pkt); sensor_pkt = parser.get_send_packet(); } } else { sensor_pkt = parser.get_send_packet(); } break; } parser.free_received_packet(recv_pkt); } current_time = system_timer.read_ms(); if (current_time - last_time > 500) { last_time = current_time; led1 = !led1; led4 = !led4; } Thread::yield(); } }