aaaaa
Dependencies: EthernetInterface HC-SR04 PID Servo mbed-rtos mbed
Fork of TCPEchoServer by
main.cpp@11:88cba231c882, 2017-12-14 (annotated)
- Committer:
- diego1332
- Date:
- Thu Dec 14 00:10:14 2017 +0000
- Revision:
- 11:88cba231c882
- Parent:
- 10:2eaab13dec3c
vers?o final;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mbed_official | 0:38cbb854d85f | 1 | #include "mbed.h" |
emilmont | 1:5cebe0e38cd2 | 2 | #include "EthernetInterface.h" |
diego1332 | 10:2eaab13dec3c | 3 | #include "HCSR04.h" |
diego1332 | 10:2eaab13dec3c | 4 | #include "Servo.h" |
diego1332 | 11:88cba231c882 | 5 | #include <string.h> |
pauloludewig | 9:eb22e90a3c03 | 6 | |
diego1332 | 10:2eaab13dec3c | 7 | #define POS_CENTRO 1750 |
diego1332 | 10:2eaab13dec3c | 8 | #define POS_MAX (POS_CENTRO + 110) |
diego1332 | 10:2eaab13dec3c | 9 | #define POS_MIN (POS_CENTRO - 110) |
diego1332 | 10:2eaab13dec3c | 10 | #define DIST_MIN 10 |
diego1332 | 10:2eaab13dec3c | 11 | #define DIST_MAX 56 |
diego1332 | 10:2eaab13dec3c | 12 | #define RESOL 1 |
diego1332 | 10:2eaab13dec3c | 13 | #define PERIODO 10 |
diego1332 | 10:2eaab13dec3c | 14 | |
pauloludewig | 9:eb22e90a3c03 | 15 | const int ECHO_SERVER_PORT = 7; |
pauloludewig | 9:eb22e90a3c03 | 16 | const char* ECHO_SERVER_ADDRESS = "10.3.2.164"; |
diego1332 | 10:2eaab13dec3c | 17 | const int BROADCAST_PORT = 58083; |
diego1332 | 10:2eaab13dec3c | 18 | |
diego1332 | 10:2eaab13dec3c | 19 | bool conectado = false; |
diego1332 | 10:2eaab13dec3c | 20 | |
diego1332 | 11:88cba231c882 | 21 | int setpoint; |
diego1332 | 11:88cba231c882 | 22 | |
pauloludewig | 9:eb22e90a3c03 | 23 | Thread tcp_server; |
diego1332 | 10:2eaab13dec3c | 24 | Thread broadcast; |
pauloludewig | 9:eb22e90a3c03 | 25 | Thread leitura; |
pauloludewig | 9:eb22e90a3c03 | 26 | Thread controle; |
pauloludewig | 9:eb22e90a3c03 | 27 | |
diego1332 | 10:2eaab13dec3c | 28 | Mutex m_dist; |
pauloludewig | 9:eb22e90a3c03 | 29 | Mutex m_ref; |
diego1332 | 11:88cba231c882 | 30 | |
pauloludewig | 9:eb22e90a3c03 | 31 | EthernetInterface eth; |
diego1332 | 10:2eaab13dec3c | 32 | |
diego1332 | 10:2eaab13dec3c | 33 | HCSR04 usensor(D8,D9); |
diego1332 | 10:2eaab13dec3c | 34 | Servo Servo1(D7); |
diego1332 | 10:2eaab13dec3c | 35 | |
diego1332 | 10:2eaab13dec3c | 36 | unsigned int dist; |
diego1332 | 11:88cba231c882 | 37 | |
pauloludewig | 9:eb22e90a3c03 | 38 | void tcp_server_thread (); |
diego1332 | 10:2eaab13dec3c | 39 | void udp_broadcast (); |
pauloludewig | 9:eb22e90a3c03 | 40 | void leitura_thread(); |
pauloludewig | 9:eb22e90a3c03 | 41 | void controle_thread(); |
diego1332 | 11:88cba231c882 | 42 | |
diego1332 | 11:88cba231c882 | 43 | int main (void) |
diego1332 | 11:88cba231c882 | 44 | { |
pauloludewig | 9:eb22e90a3c03 | 45 | //inicializa o módulo ethernet |
pauloludewig | 9:eb22e90a3c03 | 46 | eth.init(); |
emilmont | 1:5cebe0e38cd2 | 47 | eth.connect(); |
diego1332 | 11:88cba231c882 | 48 | |
diego1332 | 10:2eaab13dec3c | 49 | //inicializa servo |
diego1332 | 10:2eaab13dec3c | 50 | Servo1.Enable(POS_CENTRO,20000); |
diego1332 | 11:88cba231c882 | 51 | |
diego1332 | 10:2eaab13dec3c | 52 | // inicializa threads |
pauloludewig | 9:eb22e90a3c03 | 53 | tcp_server.start(tcp_server_thread); |
diego1332 | 10:2eaab13dec3c | 54 | broadcast.start(udp_broadcast); |
diego1332 | 11:88cba231c882 | 55 | |
diego1332 | 10:2eaab13dec3c | 56 | broadcast.join(); |
diego1332 | 11:88cba231c882 | 57 | |
pauloludewig | 9:eb22e90a3c03 | 58 | leitura.start(leitura_thread); |
pauloludewig | 9:eb22e90a3c03 | 59 | controle.start(controle_thread); |
diego1332 | 11:88cba231c882 | 60 | printf("Todas as thread iniciadas\n"); |
diego1332 | 11:88cba231c882 | 61 | |
pauloludewig | 9:eb22e90a3c03 | 62 | while (true) { |
diego1332 | 11:88cba231c882 | 63 | |
pauloludewig | 9:eb22e90a3c03 | 64 | } |
pauloludewig | 9:eb22e90a3c03 | 65 | } |
diego1332 | 11:88cba231c882 | 66 | |
diego1332 | 11:88cba231c882 | 67 | void tcp_server_thread () |
diego1332 | 11:88cba231c882 | 68 | { |
mbedAustin | 7:a5ead1402704 | 69 | printf("\nServer IP Address is %s\n", eth.getIPAddress()); |
diego1332 | 11:88cba231c882 | 70 | |
emilmont | 1:5cebe0e38cd2 | 71 | TCPSocketServer server; |
emilmont | 3:36fd3cfad85a | 72 | server.bind(ECHO_SERVER_PORT); |
emilmont | 3:36fd3cfad85a | 73 | server.listen(); |
diego1332 | 11:88cba231c882 | 74 | |
emilmont | 1:5cebe0e38cd2 | 75 | while (true) { |
emilmont | 1:5cebe0e38cd2 | 76 | printf("\nWait for new connection...\n"); |
emilmont | 1:5cebe0e38cd2 | 77 | TCPSocketConnection client; |
emilmont | 1:5cebe0e38cd2 | 78 | server.accept(client); |
emilmont | 3:36fd3cfad85a | 79 | client.set_blocking(false, 1500); // Timeout after (1.5)s |
diego1332 | 11:88cba231c882 | 80 | |
diego1332 | 11:88cba231c882 | 81 | conectado = true; |
pauloludewig | 9:eb22e90a3c03 | 82 | printf("\nConnection from: %s\n", client.get_address()); |
emilmont | 1:5cebe0e38cd2 | 83 | char buffer[256]; |
emilmont | 1:5cebe0e38cd2 | 84 | while (true) { |
emilmont | 3:36fd3cfad85a | 85 | int n = client.receive(buffer, sizeof(buffer)); |
emilmont | 1:5cebe0e38cd2 | 86 | if (n <= 0) break; |
diego1332 | 11:88cba231c882 | 87 | |
mbedAustin | 7:a5ead1402704 | 88 | // print received message to terminal |
mbedAustin | 7:a5ead1402704 | 89 | buffer[n] = '\0'; |
mbedAustin | 7:a5ead1402704 | 90 | printf("Received message from Client :'%s'\n",buffer); |
diego1332 | 11:88cba231c882 | 91 | |
diego1332 | 11:88cba231c882 | 92 | int pos = buffer[8] - '0'; |
diego1332 | 11:88cba231c882 | 93 | |
diego1332 | 11:88cba231c882 | 94 | if(pos == 1)setpoint = 20; |
diego1332 | 11:88cba231c882 | 95 | else if(pos == 2)setpoint = 35; |
diego1332 | 11:88cba231c882 | 96 | else if(pos == 3)setpoint = 50; |
diego1332 | 11:88cba231c882 | 97 | printf("Setpoint: %d\n", setpoint); |
diego1332 | 11:88cba231c882 | 98 | |
diego1332 | 11:88cba231c882 | 99 | m_ref.lock(); |
diego1332 | 11:88cba231c882 | 100 | // ref = atof(buffer); |
diego1332 | 11:88cba231c882 | 101 | sprintf (buffer, "%s", client.get_address()); |
diego1332 | 11:88cba231c882 | 102 | m_ref.unlock(); |
diego1332 | 11:88cba231c882 | 103 | |
pauloludewig | 9:eb22e90a3c03 | 104 | m_ref.lock(); |
diego1332 | 10:2eaab13dec3c | 105 | sprintf (buffer, "%s", client.get_address()); |
pauloludewig | 9:eb22e90a3c03 | 106 | m_ref.unlock(); |
diego1332 | 11:88cba231c882 | 107 | |
pauloludewig | 9:eb22e90a3c03 | 108 | // print sending message to terminal |
mbedAustin | 7:a5ead1402704 | 109 | printf("Sending message to Client: '%s'\n",buffer); |
diego1332 | 11:88cba231c882 | 110 | |
mbedAustin | 7:a5ead1402704 | 111 | // Echo received message back to client |
diego1332 | 11:88cba231c882 | 112 | //client.send_all(buffer, n); |
diego1332 | 11:88cba231c882 | 113 | // if (n <= 0) break; |
diego1332 | 11:88cba231c882 | 114 | memset(buffer,0,256); |
emilmont | 1:5cebe0e38cd2 | 115 | } |
diego1332 | 11:88cba231c882 | 116 | |
emilmont | 1:5cebe0e38cd2 | 117 | client.close(); |
emilmont | 1:5cebe0e38cd2 | 118 | } |
emilmont | 1:5cebe0e38cd2 | 119 | } |
diego1332 | 11:88cba231c882 | 120 | |
diego1332 | 11:88cba231c882 | 121 | void udp_broadcast () |
diego1332 | 11:88cba231c882 | 122 | { |
diego1332 | 10:2eaab13dec3c | 123 | UDPSocket sock; |
diego1332 | 10:2eaab13dec3c | 124 | sock.init(); |
diego1332 | 10:2eaab13dec3c | 125 | sock.set_broadcasting(); |
diego1332 | 11:88cba231c882 | 126 | |
diego1332 | 10:2eaab13dec3c | 127 | Endpoint broadcast; |
diego1332 | 10:2eaab13dec3c | 128 | broadcast.set_address("255.255.255.255", BROADCAST_PORT); |
diego1332 | 11:88cba231c882 | 129 | |
diego1332 | 10:2eaab13dec3c | 130 | char out_buffer[] = "diego"; |
diego1332 | 11:88cba231c882 | 131 | |
diego1332 | 10:2eaab13dec3c | 132 | while (!conectado) { |
diego1332 | 10:2eaab13dec3c | 133 | printf("Broadcasting...\n"); |
diego1332 | 10:2eaab13dec3c | 134 | sock.sendTo(broadcast, out_buffer, sizeof(out_buffer)); |
pauloludewig | 9:eb22e90a3c03 | 135 | Thread::wait(1000); |
pauloludewig | 9:eb22e90a3c03 | 136 | } |
diego1332 | 11:88cba231c882 | 137 | printf("Broadcast finalizado!\n"); |
pauloludewig | 9:eb22e90a3c03 | 138 | } |
diego1332 | 11:88cba231c882 | 139 | |
diego1332 | 11:88cba231c882 | 140 | void leitura_thread () |
diego1332 | 11:88cba231c882 | 141 | { |
diego1332 | 11:88cba231c882 | 142 | |
pauloludewig | 9:eb22e90a3c03 | 143 | while (true) { |
diego1332 | 10:2eaab13dec3c | 144 | m_dist.lock(); |
diego1332 | 10:2eaab13dec3c | 145 | dist = usensor.getCm(); |
diego1332 | 10:2eaab13dec3c | 146 | dist = dist/RESOL; |
diego1332 | 10:2eaab13dec3c | 147 | dist = dist*RESOL; |
diego1332 | 11:88cba231c882 | 148 | // printf("cm:%ld\n",dist ); |
diego1332 | 10:2eaab13dec3c | 149 | if(dist>DIST_MAX) dist = DIST_MAX; |
diego1332 | 10:2eaab13dec3c | 150 | if(dist<DIST_MIN) dist = DIST_MIN; |
diego1332 | 10:2eaab13dec3c | 151 | m_dist.unlock(); |
diego1332 | 11:88cba231c882 | 152 | |
diego1332 | 10:2eaab13dec3c | 153 | Thread::wait(2); |
pauloludewig | 9:eb22e90a3c03 | 154 | } |
pauloludewig | 9:eb22e90a3c03 | 155 | } |
pauloludewig | 9:eb22e90a3c03 | 156 | |
diego1332 | 11:88cba231c882 | 157 | void controle_thread() |
diego1332 | 11:88cba231c882 | 158 | { |
diego1332 | 11:88cba231c882 | 159 | |
diego1332 | 11:88cba231c882 | 160 | float yant = 0; |
diego1332 | 11:88cba231c882 | 161 | float xant = 0; |
diego1332 | 11:88cba231c882 | 162 | float y = 0; |
diego1332 | 11:88cba231c882 | 163 | float x = 0; |
diego1332 | 11:88cba231c882 | 164 | float k = 60; |
diego1332 | 11:88cba231c882 | 165 | float erro = 0; |
diego1332 | 11:88cba231c882 | 166 | float erroant = 0; |
diego1332 | 11:88cba231c882 | 167 | int motor; |
diego1332 | 11:88cba231c882 | 168 | |
diego1332 | 11:88cba231c882 | 169 | while(true) { |
diego1332 | 11:88cba231c882 | 170 | |
diego1332 | 11:88cba231c882 | 171 | m_dist.lock(); |
diego1332 | 11:88cba231c882 | 172 | x = dist; |
diego1332 | 10:2eaab13dec3c | 173 | |
diego1332 | 11:88cba231c882 | 174 | erro = setpoint - x; |
diego1332 | 11:88cba231c882 | 175 | |
diego1332 | 11:88cba231c882 | 176 | m_dist.unlock(); |
diego1332 | 11:88cba231c882 | 177 | |
diego1332 | 11:88cba231c882 | 178 | y = 0.1*yant + erro*k - erroant*k*0.90; |
diego1332 | 11:88cba231c882 | 179 | |
diego1332 | 11:88cba231c882 | 180 | motor = y + POS_CENTRO; |
diego1332 | 10:2eaab13dec3c | 181 | |
diego1332 | 11:88cba231c882 | 182 | //printf("y: %.01f ",y ); |
diego1332 | 11:88cba231c882 | 183 | //printf("erro: %.01f ",erro ); |
diego1332 | 11:88cba231c882 | 184 | erroant = erro; |
diego1332 | 11:88cba231c882 | 185 | xant = x; |
diego1332 | 11:88cba231c882 | 186 | yant = y; |
diego1332 | 11:88cba231c882 | 187 | |
diego1332 | 11:88cba231c882 | 188 | if(motor>POS_MAX) motor = POS_MAX; |
diego1332 | 11:88cba231c882 | 189 | if(motor<POS_MIN) motor = POS_MIN; |
diego1332 | 11:88cba231c882 | 190 | Servo1.SetPosition(motor); |
diego1332 | 11:88cba231c882 | 191 | //printf("motor: %d\n",motor ); |
diego1332 | 11:88cba231c882 | 192 | |
diego1332 | 11:88cba231c882 | 193 | |
diego1332 | 11:88cba231c882 | 194 | |
diego1332 | 11:88cba231c882 | 195 | Thread::wait(PERIODO); |
pauloludewig | 9:eb22e90a3c03 | 196 | } |
diego1332 | 11:88cba231c882 | 197 | |
diego1332 | 11:88cba231c882 | 198 | } |