[LinkIt Smart 7688] FPV第一人稱輪型機器人- 可愛小瓦力

來用 LinkIt Smart 7688 做一個輪型機器人吧,還可以用 Android 裝置遙控呢!加裝一個攝影機就可以FPV第一人稱控制,可以從網頁端看到 webcam 的影像。

本範例使用 App Inventor 來編寫手機端程式來控制機器人,除了可看到 webcam 影像之外,還可以根據手機傾斜度來控制兩輪速差來達到轉彎的效果,用這個來辦機器人闖關賽一定超刺激啊!

實際測試的結果,30m 之內的開闊空間(沒有牆)的影像都還挺即時的。來看看是誰入鏡了呢?

2015-12-23 14.02.37

 

本機器人由台科大機械工程研究所黃傑同學與台灣大學大氣系黃偉峻同學製作,由CAVEDU代為寫開箱文,特此註明


硬體組裝

接線方式如下 (圖片引用自聯發科創意實驗室)。將 7688 Duo 的 D2~5 接到 L298N 模組上,馬達的正負引線就接到模組左右兩側的螺絲接頭。

但實際上我們是將模組與 7688 Duo 分開供電,模組採用 8顆3號電池 (8 x 1.5V = 12V )的電池盒,開發板就用行動電源。因為在此採用的馬達為 12V,這樣也是比較好的做法。否則容易因為瞬間電流過大讓板子關機甚至傷害到板子。

螢幕快照 2016-01-12 下午6.27.02

使用的馬達驅動模組為 L298N,在露天或一些網路電子材料行不難找

正面照,還真的挺像瓦力,就差兩隻手囉。機身是用雷射切割的木板,不是太堅固。不過外觀有履帶就贏一半了!走起來有履帶嘎嘰嘎嘰的聲音聽起來就很過癮啊。

2016-01-10 22.41.08

背面全貌

2016-01-10 22.41.32

另一個背面角度可以看到機體分成兩層,上層塞馬達,下層由左到右則是給馬達用的12V電池盒、行動電源、與插在麵包板上的 7688 Duo。黑色的 USB 線是 WebCam,白色則是行動電源供電。下一版應該可以更精巧堅固一點

請注意裝載 webcam 的 servo 現在沒有作用,也就是說機器人的脖子不會轉動

2016-01-10 22.42.07

2016-01-10 22.41.51   2016-01-10 22.41.19


 

7688端程式

7688 在這個系統中扮演 server 的角色,App Inventor 則是 client 去對 server 發送 POST。

#匯入相關函式庫
import BaseHTTPServer
import struct, fcntl, os
from pyfirmata import Arduino, util
from time import sleep  


board=Arduino('/dev/ttyS0') #定義Arduino連接埠
led=board.digital[13]       #定義LED腳位

EN1=board.get_pin('d:9:p')
IN1=board.digital[2]
IN2=board.digital[3]

EN2=board.get_pin('d:10:p')
IN3=board.digital[5]
IN4=board.digital[7]
GAIN=25.0   #輪速增益值,可視實際情況修改

def catch(recievedata):
  button=0;
  angle=0;
  num=0;
  try:
    num = recievedata.find(',');
    pass
  except:
    return

  button=int(recievedata[0:num]);  #判斷手機端按了哪個按鈕
  try:
      angle=int(recievedata[num+1:len(recievedata)]);
      pass
  except:
      return
  
  L_control=0;
  R_control=0;
   if angle>=0:
    L_control=(100-angle*GAIN)/100.0; #根據angle控制左輪速
    R_control=1;
  elif angle<0:
    L_control=1;
    R_control=(100+angle*GAIN)/100.0; #根據angle控制右輪速

  #控制上下限
  if L_control<0:
    L_control=0;
  elif L_control>1:
    L_control=1;
  if R_control<0:
    R_control=0;
  elif R_control>1:
    R_control=1;

  #顯示相關訊息
  print 'L'
  print L_control
  print 'R'
  print R_control

  if button==0:   #停止
    led.write(0);
    EN1.write(0);
    IN1.write(0);
    IN2.write(0);

    EN2.write(0);
    IN3.write(0);
    IN4.write(0);
    #pass
  if button==1:   #左轉
    led.write(1);
    EN1.write(L_control);
    IN1.write(0);
    IN2.write(1);

    EN2.write(R_control);
    IN3.write(0);
    IN4.write(1);
    #pass
  if button==2:   #右轉
    EN1.write(L_control);
    IN1.write(1);
    IN2.write(0);

    EN2.write(R_control);
    IN3.write(1);
    IN4.write(0);
    #pass
  pass

#處理網路通訊
class ServerHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_HEAD(self):
        self.send_response(200)
        self.send_header("Connection","Close")
        self.end_headers()
    def do_GET(self):
        print ("======= GET STARTED =======")
        print (self.headers)

    def do_POST(self):
        self.send_response(200)
        self.send_header("Connection","Close")
        self.end_headers()
        print ("======= POST STARTED =======")
        print (self.headers)
        print ("======= POST VALUES =======")
        length = int(self.headers['content-length'])
        item = self.rfile.read(length)
        catch(item)
        print (item)

class WebServer(BaseHTTPServer.HTTPServer):
    def __init__(self, *args, **kwargs):
        BaseHTTPServer.HTTPServer.__init__(self, *args, **kwargs)
        # Set FD_CLOEXEC flag
        flags = fcntl.fcntl(self.socket.fileno(), fcntl.F_GETFD)
        flags |= fcntl.FD_CLOEXEC
        fcntl.fcntl(self.socket.fileno(), fcntl.F_SETFD, flags)


server_class = WebServer

#29876 是指開出來的http port
httpd = server_class(("", 29876), ServerHandler)

httpd.serve_forever()
LinkIt Smart 7688 robot – python


 

App Inventor 端程式

App Inventor 端的程式會連線到 7688 AP 之後取得影像,並利用 Web元件來發送指令給 7688 來控制馬達轉向與轉速。

Designer頁面

這是一個橫式握持的介面,這樣觀看影像的效果會比較好,操作機器人只需要右手拇指就可以完成。請注意在此的 WebViewer 是用來取得來自 7688 的 Webcam 即時影像。Web元件則是用來對 7688 下指令。

螢幕快照 2016-01-12 下午6.02.01

Blocks頁面

宣告相關變數

螢幕快照 2016-01-12 下午6.01.15

程式初始化

您的手機需要先連到 7688 的 AP,為了怕 IP 變動所以 7688 在此不連到外部網路,IP 皆為預設的 192.168.100.1。程式啟動時會去連上 7688 所開的 http port。Web元件是用來對 7688 發送 POST 指令來控制機器人。WebViewer 元件則是單純取得 7688 的 webcam 影像串流,效果則根據網路通暢度而定。

螢幕快照 2016-01-12 下午6.01.49

按鈕控制動作

Button 的 TouchDown (手指觸摸螢幕)與 TouchUp(手指離開螢幕) 事件。請注意 Button.Click 是觸摸又離開,也就是 TouchDown + TouchUp。因此如果我們拆開的話,就可以用一個按鈕來執行兩件事。

以 Button_Forward 前進按鈕來說,TouchDown時會把 action 設為1。以 Button_Backward 後退按鈕來說,則是把 action 設為2。這樣 7688 就知道按下了哪一個按鈕。

放開兩個按鈕(Button的TouchUp事件)時,action變數值即為0,這時 7688 收到的 button變數就是0,機器人就會停止動作。

螢幕快照 2016-01-12 下午6.01.09

定時發送 request 給 7688

使用 Clock 元件定時發送指令給 7688 來控制機器人。您可以看到 steer 變數值是加速度計 Y軸的四捨五入結果,如果希望再細膩一點的控制的話,可以加到小數點一位。接著把相關 ( steer / action 變數值) 訊息顯示在兩個 Label 上

根據 send flag 使用 Web.PostText 指令把 action 與 steer 變數值以文字格式發送給 7688。

螢幕快照 2016-01-12 下午6.01.29

 

類似的專案還有

About CAVEDU 阿吉 - 雜工 (2521 Articles)
CAVEDU 教育團隊 打雜
Contact: Website

7 Comments on [LinkIt Smart 7688] FPV第一人稱輪型機器人- 可愛小瓦力

  1. 您好,可愛小瓦力此篇7688端程式-python部分網頁都看不到…
    是否能開放提供此部分讓我這小小讀者學習!?感恩!

  2. Exception happened during processing of request from (‘192.168.43.1’, 37044)
    Traceback (most recent call last):
    File “/usr/lib/python2.7/SocketServer.py”, line 295, in _handle_request_noblock
    self.process_request(request, client_address)
    File “/usr/lib/python2.7/SocketServer.py”, line 321, in process_request
    self.finish_request(request, client_address)
    File “/usr/lib/python2.7/SocketServer.py”, line 334, in finish_request
    self.RequestHandlerClass(request, client_address, self)
    File “/usr/lib/python2.7/SocketServer.py”, line 655, in __init__
    self.handle()
    File “/usr/lib/python2.7/BaseHTTPServer.py”, line 340, in handle
    self.handle_one_request()
    File “/usr/lib/python2.7/BaseHTTPServer.py”, line 328, in handle_one_request
    method()
    File “test071301.py”, line 28, in do_POST
    catch(item)
    NameError: global name ‘catch’ is not defined
    按照上面所輸入的程式輸入後再用APP來連線結果卻發生了問題,想請問是我少了什麼東西嗎?

  3. 想請問一下為什麼Python程式輸入後不能run

Leave a comment

Your email address will not be published.


*