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
Diff: main.cpp
- Revision:
- 0:c490b05d753e
- Child:
- 1:b1c3d31236f8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Fri Sep 28 00:04:25 2018 +0000
@@ -0,0 +1,247 @@
+
+/**
+
+ @file main.cpp
+ @brief Thrust Motor Controller 2018 edition ver. 0.2.0
+ \mainpage Thrust Motor Controller 2018 edition
+ TCPSocket経由でスラスターを制御するプログラムです。
+ DHCPサーバとしては機能しません。
+ 固定IPを割り振る必要があります。
+ \htmlonly
+ <font color="red">mbedの電源を投入する前に,あらかじめクライアントのコンピュータを接続しておく必要があります。</font>
+ \endhtmlonly
+ @sa ethernet_thread
+ @author Wada Suisei Copyright (C) 2018 - All rights reserved
+ @author modified by yukimakura
+
+ @date LastModified:2018 July 2
+*/
+
+/*** Including Libraries ***/
+#include "mbed.h"
+#include "EthernetInterface.h"
+#include "rtos.h"
+
+
+/**
+ * @brief PWMの周期(秒)
+ *
+ */
+#define PWM_FREQ 0.01
+
+/**
+ * @brief 接続のタイムアウト(ミリ秒)
+ *
+ */
+#define TIMEOUT_MS 3000
+
+
+/*** Network Information ***/
+///myIpAddrこのモータドライバのIPアドレスを入力
+const char myIpAddr[] = "192.168.39.10";
+/// myPortこのプログラムで使用するポートを入力
+const uint16_t myPort = 50000;
+/// NetMask このモータドライバ用のネットマスクを入力
+const char NetMask[] = "255.255.255.0";
+/// Gateway このモータドライバ用のゲートウェイを入力
+const char Gateway[] = "192.168.39.1";
+
+
+/*** Instantiation ***/
+//Interruption
+Timeout linkdown_catcher;
+Timer Timeout_timer;
+
+//! PWM信号の差動出力ピンを指定
+PwmOut motor_P(p26);
+//! PWM信号の差動出力ピンを指定
+PwmOut motor_N(p25);
+
+double pipe_pwmduty;
+
+
+//Network
+DigitalOut EthRecv_LED(LED1);
+DigitalOut EthSend_LED(LED2);
+DigitalOut Ethconnect_LED(LED4);
+EthernetInterface eth;
+
+
+
+
+
+/**
+ *
+ * @brief コネクション時に重大なエラーが発生した時に呼び出されます
+ *
+ * pwmをduty比それぞれ50%にしてから、
+ * mbedOSに−1を返します。
+ * \htmlonly
+ * <font color="red">こうなった場合は再起動が必要です。</font>
+ * \endhtmlonly
+ *
+ *
+ */
+void INT_TIMER_LINKDOWN_CATCHER(void){
+ pipe_pwmduty = 0.0;
+ motor_P = 0.5;
+ motor_N = 0.5;
+ exit(-1);
+}
+
+
+
+/**
+ *
+ * @brief TCP/IPソケットでコミュニケーションかつデータ受信を行います
+ *
+ * RTOSによって管理されているスレッドで,
+ * TCPSocketの確立前にデータリンク層あたりでコネクションされていないと
+ * mbedOSに−1を返します。
+ * \htmlonly
+ * <font color="red">mbedの電源を投入する前に,あらかじめクライアントのコンピュータを接続しておく必要があります。</font>
+ * \endhtmlonly
+ */
+void ethernet_thread(void){
+ //Declaration of Local Variables
+ char in_buf[8];
+ char out_buf[10];
+
+ //Initializing Network
+ SocketAddress SockAddr_Receive;
+ eth.set_network(myIpAddr, NetMask, Gateway);
+ if(0 != eth.connect()){
+ exit(-1);
+ }
+ TCPServer srv;
+ TCPSocket sock;
+ srv.open(ð);
+ srv.bind(eth.get_ip_address(), myPort);
+ while (true) {
+
+ printf("waiting for client\r\n");
+ /* Can handle 5 simultaneous connections */
+ int err= srv.listen(1);
+ printf("server listening error : %d\r\n",err);
+
+ Timeout_timer.start();
+ while(1){
+ /* Initialize variables */
+ memset(in_buf, '\0', sizeof(in_buf));
+ memset(out_buf, '\0', sizeof(out_buf));
+ printf("waiting for client connection\r\n");
+ err = srv.accept(&sock, &SockAddr_Receive);
+ Timeout_timer.reset();
+ Ethconnect_LED = 1;
+ //https://docs.mbed.com/docs/vignesh/en/latest/api/group__netsocket.html#ga67a8f07758d2ee2a1809293fa52bdf14
+ switch(err){
+ case NSAPI_ERROR_OK:
+ printf("client connected :%s:%d\r\n", SockAddr_Receive.get_ip_address(), SockAddr_Receive.get_port());
+ while(1){
+ int len = sock.recv(in_buf, sizeof(in_buf));
+ if(Timeout_timer.read_ms() < TIMEOUT_MS){
+
+ if(len > 0){
+ Timeout_timer.reset();
+ in_buf[len] = '\0';
+ //Get data
+ EthRecv_LED = !EthRecv_LED;
+ memcpy(&pipe_pwmduty, &in_buf[0], 8);
+
+
+ /* Send Data */
+ //sock.send(out_buf, sizeof(out_buf));
+ EthSend_LED = !EthSend_LED;
+ }
+ }
+ else{//TIMEOUT
+ printf("Time_out (over %d ms)\n",TIMEOUT_MS);
+ memset(in_buf, '\0', sizeof(in_buf));
+ pipe_pwmduty = 0.0;
+ motor_P = 0.5;
+ motor_N = 0.5;
+ Ethconnect_LED = 0;
+ sock.close();
+ break;
+ }
+ }
+ break;
+ case NSAPI_ERROR_WOULD_BLOCK :
+ printf("NSAPI_ERROR_WOULD_BLOCK\n");
+ memset(in_buf, '\0', sizeof(in_buf));
+ INT_TIMER_LINKDOWN_CATCHER();
+ break;
+ case NSAPI_ERROR_NO_CONNECTION :
+ printf("NSAPI_ERROR_NO_CONNECTION\n");
+ memset(in_buf, '\0', sizeof(in_buf));
+ INT_TIMER_LINKDOWN_CATCHER();
+ break;
+ case NSAPI_ERROR_NO_SOCKET :
+ printf("NSAPI_ERROR_NO_SOCKET\n");
+ memset(in_buf, '\0', sizeof(in_buf));
+ INT_TIMER_LINKDOWN_CATCHER();
+ break;
+ case NSAPI_ERROR_NO_ADDRESS :
+ printf("NSAPI_ERROR_NO_ADDRESS\n");
+ memset(in_buf, '\0', sizeof(in_buf));
+ INT_TIMER_LINKDOWN_CATCHER();
+ break;
+ default:
+ printf("other error");
+ break;
+ }
+ }
+ }
+}
+
+/**
+ * @brief エントリーポイント
+ *
+ * @return OSに返します。
+ */
+int main(){
+ /* Declaration of Local Variables */
+ float pwmduty;
+
+ /* Initializing Variables */
+ EthRecv_LED = 0;
+ EthSend_LED = 0;
+
+ /* Initializing Interruption */
+
+
+
+ /* Initializing PWM Out */
+ motor_P.period (PWM_FREQ);
+ motor_N.period (PWM_FREQ);
+ motor_P = 0.5;
+ motor_N = 0.5;
+
+ /* Start Thread */
+ Thread thread_get(ethernet_thread);
+
+
+ /* Main Routine */
+ while(true){
+ //disconnect timeout
+ if(Timeout_timer.read_ms() > TIMEOUT_MS){
+ pipe_pwmduty = 0.0;
+ EthRecv_LED = 0;
+ EthSend_LED = 0;
+ Ethconnect_LED = 0;
+ //return -1;
+ }
+
+ /* Calculate PWM Duty */
+ pwmduty = pipe_pwmduty / 2.0;
+
+ /* Output PWM */
+ motor_P = (0.5 + pwmduty);
+ motor_N = (0.5 - pwmduty);
+
+
+ }//while(1) END
+
+}//main() END
+
+
