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: EthernetInterface mbed-rtos mbed
Fork of mbed_driver_ver_0_3_0 by
main.cpp@0:c490b05d753e, 2018-09-28 (annotated)
- Committer:
- yukisega
- Date:
- Fri Sep 28 00:04:25 2018 +0000
- Revision:
- 0:c490b05d753e
- Child:
- 1:b1c3d31236f8
init commit
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| yukisega | 0:c490b05d753e | 1 | |
| yukisega | 0:c490b05d753e | 2 | /** |
| yukisega | 0:c490b05d753e | 3 | |
| yukisega | 0:c490b05d753e | 4 | @file main.cpp |
| yukisega | 0:c490b05d753e | 5 | @brief Thrust Motor Controller 2018 edition ver. 0.2.0 |
| yukisega | 0:c490b05d753e | 6 | \mainpage Thrust Motor Controller 2018 edition |
| yukisega | 0:c490b05d753e | 7 | TCPSocket経由でスラスターを制御するプログラムです。 |
| yukisega | 0:c490b05d753e | 8 | DHCPサーバとしては機能しません。 |
| yukisega | 0:c490b05d753e | 9 | 固定IPを割り振る必要があります。 |
| yukisega | 0:c490b05d753e | 10 | \htmlonly |
| yukisega | 0:c490b05d753e | 11 | <font color="red">mbedの電源を投入する前に,あらかじめクライアントのコンピュータを接続しておく必要があります。</font> |
| yukisega | 0:c490b05d753e | 12 | \endhtmlonly |
| yukisega | 0:c490b05d753e | 13 | @sa ethernet_thread |
| yukisega | 0:c490b05d753e | 14 | @author Wada Suisei Copyright (C) 2018 - All rights reserved |
| yukisega | 0:c490b05d753e | 15 | @author modified by yukimakura |
| yukisega | 0:c490b05d753e | 16 | |
| yukisega | 0:c490b05d753e | 17 | @date LastModified:2018 July 2 |
| yukisega | 0:c490b05d753e | 18 | */ |
| yukisega | 0:c490b05d753e | 19 | |
| yukisega | 0:c490b05d753e | 20 | /*** Including Libraries ***/ |
| yukisega | 0:c490b05d753e | 21 | #include "mbed.h" |
| yukisega | 0:c490b05d753e | 22 | #include "EthernetInterface.h" |
| yukisega | 0:c490b05d753e | 23 | #include "rtos.h" |
| yukisega | 0:c490b05d753e | 24 | |
| yukisega | 0:c490b05d753e | 25 | |
| yukisega | 0:c490b05d753e | 26 | /** |
| yukisega | 0:c490b05d753e | 27 | * @brief PWMの周期(秒) |
| yukisega | 0:c490b05d753e | 28 | * |
| yukisega | 0:c490b05d753e | 29 | */ |
| yukisega | 0:c490b05d753e | 30 | #define PWM_FREQ 0.01 |
| yukisega | 0:c490b05d753e | 31 | |
| yukisega | 0:c490b05d753e | 32 | /** |
| yukisega | 0:c490b05d753e | 33 | * @brief 接続のタイムアウト(ミリ秒) |
| yukisega | 0:c490b05d753e | 34 | * |
| yukisega | 0:c490b05d753e | 35 | */ |
| yukisega | 0:c490b05d753e | 36 | #define TIMEOUT_MS 3000 |
| yukisega | 0:c490b05d753e | 37 | |
| yukisega | 0:c490b05d753e | 38 | |
| yukisega | 0:c490b05d753e | 39 | /*** Network Information ***/ |
| yukisega | 0:c490b05d753e | 40 | ///myIpAddrこのモータドライバのIPアドレスを入力 |
| yukisega | 0:c490b05d753e | 41 | const char myIpAddr[] = "192.168.39.10"; |
| yukisega | 0:c490b05d753e | 42 | /// myPortこのプログラムで使用するポートを入力 |
| yukisega | 0:c490b05d753e | 43 | const uint16_t myPort = 50000; |
| yukisega | 0:c490b05d753e | 44 | /// NetMask このモータドライバ用のネットマスクを入力 |
| yukisega | 0:c490b05d753e | 45 | const char NetMask[] = "255.255.255.0"; |
| yukisega | 0:c490b05d753e | 46 | /// Gateway このモータドライバ用のゲートウェイを入力 |
| yukisega | 0:c490b05d753e | 47 | const char Gateway[] = "192.168.39.1"; |
| yukisega | 0:c490b05d753e | 48 | |
| yukisega | 0:c490b05d753e | 49 | |
| yukisega | 0:c490b05d753e | 50 | /*** Instantiation ***/ |
| yukisega | 0:c490b05d753e | 51 | //Interruption |
| yukisega | 0:c490b05d753e | 52 | Timeout linkdown_catcher; |
| yukisega | 0:c490b05d753e | 53 | Timer Timeout_timer; |
| yukisega | 0:c490b05d753e | 54 | |
| yukisega | 0:c490b05d753e | 55 | //! PWM信号の差動出力ピンを指定 |
| yukisega | 0:c490b05d753e | 56 | PwmOut motor_P(p26); |
| yukisega | 0:c490b05d753e | 57 | //! PWM信号の差動出力ピンを指定 |
| yukisega | 0:c490b05d753e | 58 | PwmOut motor_N(p25); |
| yukisega | 0:c490b05d753e | 59 | |
| yukisega | 0:c490b05d753e | 60 | double pipe_pwmduty; |
| yukisega | 0:c490b05d753e | 61 | |
| yukisega | 0:c490b05d753e | 62 | |
| yukisega | 0:c490b05d753e | 63 | //Network |
| yukisega | 0:c490b05d753e | 64 | DigitalOut EthRecv_LED(LED1); |
| yukisega | 0:c490b05d753e | 65 | DigitalOut EthSend_LED(LED2); |
| yukisega | 0:c490b05d753e | 66 | DigitalOut Ethconnect_LED(LED4); |
| yukisega | 0:c490b05d753e | 67 | EthernetInterface eth; |
| yukisega | 0:c490b05d753e | 68 | |
| yukisega | 0:c490b05d753e | 69 | |
| yukisega | 0:c490b05d753e | 70 | |
| yukisega | 0:c490b05d753e | 71 | |
| yukisega | 0:c490b05d753e | 72 | |
| yukisega | 0:c490b05d753e | 73 | /** |
| yukisega | 0:c490b05d753e | 74 | * |
| yukisega | 0:c490b05d753e | 75 | * @brief コネクション時に重大なエラーが発生した時に呼び出されます |
| yukisega | 0:c490b05d753e | 76 | * |
| yukisega | 0:c490b05d753e | 77 | * pwmをduty比それぞれ50%にしてから、 |
| yukisega | 0:c490b05d753e | 78 | * mbedOSに−1を返します。 |
| yukisega | 0:c490b05d753e | 79 | * \htmlonly |
| yukisega | 0:c490b05d753e | 80 | * <font color="red">こうなった場合は再起動が必要です。</font> |
| yukisega | 0:c490b05d753e | 81 | * \endhtmlonly |
| yukisega | 0:c490b05d753e | 82 | * |
| yukisega | 0:c490b05d753e | 83 | * |
| yukisega | 0:c490b05d753e | 84 | */ |
| yukisega | 0:c490b05d753e | 85 | void INT_TIMER_LINKDOWN_CATCHER(void){ |
| yukisega | 0:c490b05d753e | 86 | pipe_pwmduty = 0.0; |
| yukisega | 0:c490b05d753e | 87 | motor_P = 0.5; |
| yukisega | 0:c490b05d753e | 88 | motor_N = 0.5; |
| yukisega | 0:c490b05d753e | 89 | exit(-1); |
| yukisega | 0:c490b05d753e | 90 | } |
| yukisega | 0:c490b05d753e | 91 | |
| yukisega | 0:c490b05d753e | 92 | |
| yukisega | 0:c490b05d753e | 93 | |
| yukisega | 0:c490b05d753e | 94 | /** |
| yukisega | 0:c490b05d753e | 95 | * |
| yukisega | 0:c490b05d753e | 96 | * @brief TCP/IPソケットでコミュニケーションかつデータ受信を行います |
| yukisega | 0:c490b05d753e | 97 | * |
| yukisega | 0:c490b05d753e | 98 | * RTOSによって管理されているスレッドで, |
| yukisega | 0:c490b05d753e | 99 | * TCPSocketの確立前にデータリンク層あたりでコネクションされていないと |
| yukisega | 0:c490b05d753e | 100 | * mbedOSに−1を返します。 |
| yukisega | 0:c490b05d753e | 101 | * \htmlonly |
| yukisega | 0:c490b05d753e | 102 | * <font color="red">mbedの電源を投入する前に,あらかじめクライアントのコンピュータを接続しておく必要があります。</font> |
| yukisega | 0:c490b05d753e | 103 | * \endhtmlonly |
| yukisega | 0:c490b05d753e | 104 | */ |
| yukisega | 0:c490b05d753e | 105 | void ethernet_thread(void){ |
| yukisega | 0:c490b05d753e | 106 | //Declaration of Local Variables |
| yukisega | 0:c490b05d753e | 107 | char in_buf[8]; |
| yukisega | 0:c490b05d753e | 108 | char out_buf[10]; |
| yukisega | 0:c490b05d753e | 109 | |
| yukisega | 0:c490b05d753e | 110 | //Initializing Network |
| yukisega | 0:c490b05d753e | 111 | SocketAddress SockAddr_Receive; |
| yukisega | 0:c490b05d753e | 112 | eth.set_network(myIpAddr, NetMask, Gateway); |
| yukisega | 0:c490b05d753e | 113 | if(0 != eth.connect()){ |
| yukisega | 0:c490b05d753e | 114 | exit(-1); |
| yukisega | 0:c490b05d753e | 115 | } |
| yukisega | 0:c490b05d753e | 116 | TCPServer srv; |
| yukisega | 0:c490b05d753e | 117 | TCPSocket sock; |
| yukisega | 0:c490b05d753e | 118 | srv.open(ð); |
| yukisega | 0:c490b05d753e | 119 | srv.bind(eth.get_ip_address(), myPort); |
| yukisega | 0:c490b05d753e | 120 | while (true) { |
| yukisega | 0:c490b05d753e | 121 | |
| yukisega | 0:c490b05d753e | 122 | printf("waiting for client\r\n"); |
| yukisega | 0:c490b05d753e | 123 | /* Can handle 5 simultaneous connections */ |
| yukisega | 0:c490b05d753e | 124 | int err= srv.listen(1); |
| yukisega | 0:c490b05d753e | 125 | printf("server listening error : %d\r\n",err); |
| yukisega | 0:c490b05d753e | 126 | |
| yukisega | 0:c490b05d753e | 127 | Timeout_timer.start(); |
| yukisega | 0:c490b05d753e | 128 | while(1){ |
| yukisega | 0:c490b05d753e | 129 | /* Initialize variables */ |
| yukisega | 0:c490b05d753e | 130 | memset(in_buf, '\0', sizeof(in_buf)); |
| yukisega | 0:c490b05d753e | 131 | memset(out_buf, '\0', sizeof(out_buf)); |
| yukisega | 0:c490b05d753e | 132 | printf("waiting for client connection\r\n"); |
| yukisega | 0:c490b05d753e | 133 | err = srv.accept(&sock, &SockAddr_Receive); |
| yukisega | 0:c490b05d753e | 134 | Timeout_timer.reset(); |
| yukisega | 0:c490b05d753e | 135 | Ethconnect_LED = 1; |
| yukisega | 0:c490b05d753e | 136 | //https://docs.mbed.com/docs/vignesh/en/latest/api/group__netsocket.html#ga67a8f07758d2ee2a1809293fa52bdf14 |
| yukisega | 0:c490b05d753e | 137 | switch(err){ |
| yukisega | 0:c490b05d753e | 138 | case NSAPI_ERROR_OK: |
| yukisega | 0:c490b05d753e | 139 | printf("client connected :%s:%d\r\n", SockAddr_Receive.get_ip_address(), SockAddr_Receive.get_port()); |
| yukisega | 0:c490b05d753e | 140 | while(1){ |
| yukisega | 0:c490b05d753e | 141 | int len = sock.recv(in_buf, sizeof(in_buf)); |
| yukisega | 0:c490b05d753e | 142 | if(Timeout_timer.read_ms() < TIMEOUT_MS){ |
| yukisega | 0:c490b05d753e | 143 | |
| yukisega | 0:c490b05d753e | 144 | if(len > 0){ |
| yukisega | 0:c490b05d753e | 145 | Timeout_timer.reset(); |
| yukisega | 0:c490b05d753e | 146 | in_buf[len] = '\0'; |
| yukisega | 0:c490b05d753e | 147 | //Get data |
| yukisega | 0:c490b05d753e | 148 | EthRecv_LED = !EthRecv_LED; |
| yukisega | 0:c490b05d753e | 149 | memcpy(&pipe_pwmduty, &in_buf[0], 8); |
| yukisega | 0:c490b05d753e | 150 | |
| yukisega | 0:c490b05d753e | 151 | |
| yukisega | 0:c490b05d753e | 152 | /* Send Data */ |
| yukisega | 0:c490b05d753e | 153 | //sock.send(out_buf, sizeof(out_buf)); |
| yukisega | 0:c490b05d753e | 154 | EthSend_LED = !EthSend_LED; |
| yukisega | 0:c490b05d753e | 155 | } |
| yukisega | 0:c490b05d753e | 156 | } |
| yukisega | 0:c490b05d753e | 157 | else{//TIMEOUT |
| yukisega | 0:c490b05d753e | 158 | printf("Time_out (over %d ms)\n",TIMEOUT_MS); |
| yukisega | 0:c490b05d753e | 159 | memset(in_buf, '\0', sizeof(in_buf)); |
| yukisega | 0:c490b05d753e | 160 | pipe_pwmduty = 0.0; |
| yukisega | 0:c490b05d753e | 161 | motor_P = 0.5; |
| yukisega | 0:c490b05d753e | 162 | motor_N = 0.5; |
| yukisega | 0:c490b05d753e | 163 | Ethconnect_LED = 0; |
| yukisega | 0:c490b05d753e | 164 | sock.close(); |
| yukisega | 0:c490b05d753e | 165 | break; |
| yukisega | 0:c490b05d753e | 166 | } |
| yukisega | 0:c490b05d753e | 167 | } |
| yukisega | 0:c490b05d753e | 168 | break; |
| yukisega | 0:c490b05d753e | 169 | case NSAPI_ERROR_WOULD_BLOCK : |
| yukisega | 0:c490b05d753e | 170 | printf("NSAPI_ERROR_WOULD_BLOCK\n"); |
| yukisega | 0:c490b05d753e | 171 | memset(in_buf, '\0', sizeof(in_buf)); |
| yukisega | 0:c490b05d753e | 172 | INT_TIMER_LINKDOWN_CATCHER(); |
| yukisega | 0:c490b05d753e | 173 | break; |
| yukisega | 0:c490b05d753e | 174 | case NSAPI_ERROR_NO_CONNECTION : |
| yukisega | 0:c490b05d753e | 175 | printf("NSAPI_ERROR_NO_CONNECTION\n"); |
| yukisega | 0:c490b05d753e | 176 | memset(in_buf, '\0', sizeof(in_buf)); |
| yukisega | 0:c490b05d753e | 177 | INT_TIMER_LINKDOWN_CATCHER(); |
| yukisega | 0:c490b05d753e | 178 | break; |
| yukisega | 0:c490b05d753e | 179 | case NSAPI_ERROR_NO_SOCKET : |
| yukisega | 0:c490b05d753e | 180 | printf("NSAPI_ERROR_NO_SOCKET\n"); |
| yukisega | 0:c490b05d753e | 181 | memset(in_buf, '\0', sizeof(in_buf)); |
| yukisega | 0:c490b05d753e | 182 | INT_TIMER_LINKDOWN_CATCHER(); |
| yukisega | 0:c490b05d753e | 183 | break; |
| yukisega | 0:c490b05d753e | 184 | case NSAPI_ERROR_NO_ADDRESS : |
| yukisega | 0:c490b05d753e | 185 | printf("NSAPI_ERROR_NO_ADDRESS\n"); |
| yukisega | 0:c490b05d753e | 186 | memset(in_buf, '\0', sizeof(in_buf)); |
| yukisega | 0:c490b05d753e | 187 | INT_TIMER_LINKDOWN_CATCHER(); |
| yukisega | 0:c490b05d753e | 188 | break; |
| yukisega | 0:c490b05d753e | 189 | default: |
| yukisega | 0:c490b05d753e | 190 | printf("other error"); |
| yukisega | 0:c490b05d753e | 191 | break; |
| yukisega | 0:c490b05d753e | 192 | } |
| yukisega | 0:c490b05d753e | 193 | } |
| yukisega | 0:c490b05d753e | 194 | } |
| yukisega | 0:c490b05d753e | 195 | } |
| yukisega | 0:c490b05d753e | 196 | |
| yukisega | 0:c490b05d753e | 197 | /** |
| yukisega | 0:c490b05d753e | 198 | * @brief エントリーポイント |
| yukisega | 0:c490b05d753e | 199 | * |
| yukisega | 0:c490b05d753e | 200 | * @return OSに返します。 |
| yukisega | 0:c490b05d753e | 201 | */ |
| yukisega | 0:c490b05d753e | 202 | int main(){ |
| yukisega | 0:c490b05d753e | 203 | /* Declaration of Local Variables */ |
| yukisega | 0:c490b05d753e | 204 | float pwmduty; |
| yukisega | 0:c490b05d753e | 205 | |
| yukisega | 0:c490b05d753e | 206 | /* Initializing Variables */ |
| yukisega | 0:c490b05d753e | 207 | EthRecv_LED = 0; |
| yukisega | 0:c490b05d753e | 208 | EthSend_LED = 0; |
| yukisega | 0:c490b05d753e | 209 | |
| yukisega | 0:c490b05d753e | 210 | /* Initializing Interruption */ |
| yukisega | 0:c490b05d753e | 211 | |
| yukisega | 0:c490b05d753e | 212 | |
| yukisega | 0:c490b05d753e | 213 | |
| yukisega | 0:c490b05d753e | 214 | /* Initializing PWM Out */ |
| yukisega | 0:c490b05d753e | 215 | motor_P.period (PWM_FREQ); |
| yukisega | 0:c490b05d753e | 216 | motor_N.period (PWM_FREQ); |
| yukisega | 0:c490b05d753e | 217 | motor_P = 0.5; |
| yukisega | 0:c490b05d753e | 218 | motor_N = 0.5; |
| yukisega | 0:c490b05d753e | 219 | |
| yukisega | 0:c490b05d753e | 220 | /* Start Thread */ |
| yukisega | 0:c490b05d753e | 221 | Thread thread_get(ethernet_thread); |
| yukisega | 0:c490b05d753e | 222 | |
| yukisega | 0:c490b05d753e | 223 | |
| yukisega | 0:c490b05d753e | 224 | /* Main Routine */ |
| yukisega | 0:c490b05d753e | 225 | while(true){ |
| yukisega | 0:c490b05d753e | 226 | //disconnect timeout |
| yukisega | 0:c490b05d753e | 227 | if(Timeout_timer.read_ms() > TIMEOUT_MS){ |
| yukisega | 0:c490b05d753e | 228 | pipe_pwmduty = 0.0; |
| yukisega | 0:c490b05d753e | 229 | EthRecv_LED = 0; |
| yukisega | 0:c490b05d753e | 230 | EthSend_LED = 0; |
| yukisega | 0:c490b05d753e | 231 | Ethconnect_LED = 0; |
| yukisega | 0:c490b05d753e | 232 | //return -1; |
| yukisega | 0:c490b05d753e | 233 | } |
| yukisega | 0:c490b05d753e | 234 | |
| yukisega | 0:c490b05d753e | 235 | /* Calculate PWM Duty */ |
| yukisega | 0:c490b05d753e | 236 | pwmduty = pipe_pwmduty / 2.0; |
| yukisega | 0:c490b05d753e | 237 | |
| yukisega | 0:c490b05d753e | 238 | /* Output PWM */ |
| yukisega | 0:c490b05d753e | 239 | motor_P = (0.5 + pwmduty); |
| yukisega | 0:c490b05d753e | 240 | motor_N = (0.5 - pwmduty); |
| yukisega | 0:c490b05d753e | 241 | |
| yukisega | 0:c490b05d753e | 242 | |
| yukisega | 0:c490b05d753e | 243 | }//while(1) END |
| yukisega | 0:c490b05d753e | 244 | |
| yukisega | 0:c490b05d753e | 245 | }//main() END |
| yukisega | 0:c490b05d753e | 246 | |
| yukisega | 0:c490b05d753e | 247 |
