@@ -17,25 +17,36 @@ import (
1717 "google.golang.org/protobuf/proto"
1818)
1919
20- //ボーレート
20+ // ボーレート
2121const BAUDRATE int = 9600
2222
23- //シリアルポート名 ラズパイ4の場合、"/dev/serial0"
23+ // シリアルポート名 ラズパイ4の場合、"/dev/serial0"
2424const SERIAL_PORT_NAME string = "/dev/serial0"
2525
2626const IMU_TOOFAST_THRESHOULD float64 = 35.0
2727
28+ // ボールセンサー故障検知しきい値。L: OPEN故障、H: CLOSE故障
29+ const BALLSENS_LBREAK_THRESHOULD int = 100
30+ const BALLSENS_HBREAK_THRESHOULD int = 100
31+
32+ // ボールセンサーの反応しきい値。
33+ const BALLSENS_LOW_THRESHOULD int = 100
34+
35+ // バッテリーの低下しきい値。 150 = 15.0V
36+ const BATTERY_LOW_THRESHOULD int = 150
37+ const BATTERY_CRITICAL_THRESHOULD int = 140
38+
2839var sendarray bytes.Buffer //送信用バッファ
2940
30- //受信時の構造体
41+ // 受信時の構造体
3142type RecvStruct struct {
3243 Volt uint8
3344 PhotoSensor uint16
3445 IsHoldBall bool
3546 ImuDir int16
3647}
3748
38- //送信時の構造体
49+ // 送信時の構造体
3950type SendStruct struct {
4051 preamble byte
4152 motor [4 ]uint8
@@ -47,18 +58,71 @@ type SendStruct struct {
4758 emg bool
4859}
4960
50- //受信データ構造体
61+ // 受信データ構造体
5162var recvdata RecvStruct
5263
53- //imu角度
64+ // imu角度
5465var imudegree int16
5566
56- //imu速度超過時のフラグ
67+ // imu速度超過時のフラグ
5768var imuError bool = false
5869
5970var last_recv_time time.Time = time .Now ()
6071
61- //シリアル通信部分
72+ // ポート8080番で待ち受ける。
73+ const PORT string = ":8080"
74+
75+ func RunApi (chapi chan bool , MyID uint32 ) {
76+ //ポートを開く
77+ listener , err := net .Listen ("tcp" , PORT )
78+ if err != nil {
79+ log .Fatal (err )
80+ }
81+ defer listener .Close ()
82+
83+ //接続を待つ
84+ for {
85+ conn , err := listener .Accept ()
86+ if err != nil {
87+ log .Fatal (err )
88+ }
89+ //接続があったら処理を行う
90+ go HandleRequest (conn )
91+ }
92+ }
93+
94+ var isRobotError = false
95+ var isRobotEmgError = false
96+
97+ var RobotErrorCode = 0
98+ var RobotErrorMessage = ""
99+
100+ var ballSensLowCount = 0
101+
102+ // 接続があったら処理を行う
103+ func HandleRequest (conn net.Conn ) {
104+ //200 OKを返す
105+ fmt .Fprintf (conn , "HTTP/1.1 200 OK\r \n " )
106+
107+ //そのまま、recvdataをJson形式で返す
108+ //fmt.Fprintf(conn, "%s", recvdata)
109+
110+ //Json形式で返す
111+ fmt .Fprintf (conn , "{" )
112+ fmt .Fprintf (conn , "\" VOLT\" : %f," , float32 (recvdata .Volt )/ 10.0 )
113+ fmt .Fprintf (conn , "\" PHOTOSENSOR\" :%d," , recvdata .PhotoSensor )
114+ fmt .Fprintf (conn , "\" ISHOLDBALL\" :%t," , recvdata .IsHoldBall )
115+ fmt .Fprintf (conn , "\" IMUDIR\" :%d" , recvdata .ImuDir )
116+ fmt .Fprintf (conn , "\" ERROR \" :%t" , isRobotError )
117+ fmt .Fprintf (conn , "\" ERRORCODE \" :%d" , RobotErrorCode )
118+ fmt .Fprintf (conn , "\" ERRORMESSAGE \" :%s" , RobotErrorMessage )
119+ fmt .Fprintf (conn , "}" )
120+
121+ //接続を閉じる
122+ conn .Close ()
123+ }
124+
125+ // シリアル通信部分
62126func RunSerial (chclient chan bool , MyID uint32 ) {
63127 port , err := serial .Open (SERIAL_PORT_NAME , & serial.Mode {})
64128 if err != nil {
@@ -112,6 +176,55 @@ func RunSerial(chclient chan bool, MyID uint32) {
112176 err = binary .Read (bytes .NewReader (recvbuf ), binary .BigEndian , & recvdata )
113177 CheckError (err )
114178
179+ //////////////////////////////////
180+ ///
181+ /// エラーチェック部分
182+ ///
183+ //////////////////////////////////
184+ //ボールセンサーが低いときにカウントを増やす
185+ if recvdata .PhotoSensor < uint16 (BALLSENS_LOW_THRESHOULD ) {
186+ ballSensLowCount ++
187+ } else {
188+ ballSensLowCount = 0
189+ }
190+
191+ //ボールセンサーが低いときにカウントが一定値(10s)を超えたらエラー
192+ if ballSensLowCount > 600 {
193+ isRobotError = true
194+ RobotErrorCode = 1
195+ RobotErrorMessage = "ボールセンサ異常"
196+ }
197+
198+ //ボールセンサの値が極端に高いときはエラー
199+ if recvdata .PhotoSensor > uint16 (BALLSENS_HBREAK_THRESHOULD ) {
200+ isRobotError = true
201+ RobotErrorCode = 1
202+ RobotErrorMessage = "ボールセンサ異常(回路故障の可能性)"
203+ }
204+
205+ //ボールセンサの値が極端に低いときはエラー
206+ if recvdata .PhotoSensor < uint16 (BALLSENS_LBREAK_THRESHOULD ) {
207+ isRobotError = true
208+ RobotErrorCode = 1
209+ RobotErrorMessage = "ボールセンサ異常(回路故障の可能性)"
210+ }
211+
212+ //バッテリの電圧が一定量を下回ったらエラー
213+ if recvdata .Volt < uint8 (BATTERY_LOW_THRESHOULD ) {
214+ isRobotError = true
215+ RobotErrorCode = 2
216+ RobotErrorMessage = "バッテリ電圧異常"
217+ }
218+
219+ //バッテリの電圧が極端に低いとき(速度に影響を与えるレベル)はエラー
220+ if recvdata .Volt < uint8 (BATTERY_CRITICAL_THRESHOULD ) {
221+ isRobotError = true
222+ RobotErrorCode = 2
223+ RobotErrorMessage = "バッテリ電圧異常(回路故障の可能性)"
224+
225+ isRobotEmgError = true //緊急停止
226+ }
227+
115228 //クライアントで受け取ったデータをバイト列に変更
116229 sendbytes := sendarray .Bytes ()
117230
@@ -172,7 +285,7 @@ func RunSerial(chclient chan bool, MyID uint32) {
172285
173286var imuReset bool = false
174287
175- //GPIO処理部分
288+ // GPIO処理部分
176289func RunGPIO (chgpio chan bool ) {
177290
178291 //ラズパイのGPIOのメモリを確保
@@ -195,7 +308,7 @@ func RunGPIO(chgpio chan bool) {
195308 ledsec := 500 * time .Millisecond
196309 for {
197310 //電圧降下検知
198- if recvdata .Volt <= 132 {
311+ if recvdata .Volt <= 140 {
199312 //高速チカチカ
200313 led2 .High ()
201314 time .Sleep (100 * time .Millisecond )
@@ -224,8 +337,8 @@ var kicker_val uint8 = 0 //キッカーの値
224337var chip_enable bool = false //チップキックの入力のON OFFを定義する
225338var chip_val uint8 = 0 //チップキックの値
226339
227- //キッカーパワーが入力された時に、値を固定する関数
228- //並列での処理が行われる
340+ // キッカーパワーが入力された時に、値を固定する関数
341+ // 並列での処理が行われる
229342func kickCheck (chkicker chan bool ) {
230343 for {
231344 //ストレートキックが入力されたとき
@@ -284,19 +397,22 @@ func main() {
284397 chserial := make (chan bool )
285398 chkick := make (chan bool )
286399 chgpio := make (chan bool )
400+ chapi := make (chan bool )
287401
288402 //各並列処理部分
289403 go RunClient (chclient , MyID , ip )
290404 go RunServer (chserver , MyID )
291405 go RunSerial (chserial , MyID )
292406 go kickCheck (chkick )
293407 go RunGPIO (chgpio )
408+ go RunApi (chapi , MyID )
294409
295410 <- chclient
296411 <- chserver
297412 <- chserial
298413 <- chkick
299414 <- chgpio
415+ <- chapi
300416}
301417
302418func createStatus (robotid int32 , infrared bool , flatkick bool , chipkick bool ) * pb_gen.Robot_Status {
@@ -308,7 +424,7 @@ func createStatus(robotid int32, infrared bool, flatkick bool, chipkick bool) *p
308424 return pe
309425}
310426
311- //RACOON-MWにボールセンサ等の情報を送信するためのサーバ
427+ // RACOON-MWにボールセンサ等の情報を送信するためのサーバ
312428func RunServer (chserver chan bool , MyID uint32 ) {
313429 ipv4 := "224.5.69.4"
314430 port := "16941"
@@ -331,7 +447,7 @@ func RunServer(chserver chan bool, MyID uint32) {
331447
332448}
333449
334- //AIからの情報を受信するクライアント
450+ // AIからの情報を受信するクライアント
335451func RunClient (chclient chan bool , MyID uint32 , ip string ) {
336452
337453 serverAddr := & net.UDPAddr {
0 commit comments