來用 LinkIt Smart 7688 做一個輪型機器人吧,還可以用 Android 裝置遙控呢!加裝一個攝影機就可以FPV第一人稱控制,可以從網頁端看到 webcam 的影像。
本範例使用 App Inventor 來編寫手機端程式來控制機器人,除了可看到 webcam 影像之外,還可以根據手機傾斜度來控制兩輪速差來達到轉彎的效果,用這個來辦機器人闖關賽一定超刺激啊!
實際測試的結果,30m 之內的開闊空間(沒有牆)的影像都還挺即時的。來看看是誰入鏡了呢?

本機器人由台科大機械工程研究所黃傑同學與台灣大學大氣系黃偉峻同學製作,由CAVEDU代為寫開箱文,特此註明
硬體組裝
接線方式如下 (圖片引用自聯發科創意實驗室)。將 7688 Duo 的 D2~5 接到 L298N 模組上,馬達的正負引線就接到模組左右兩側的螺絲接頭。
但實際上我們是將模組與 7688 Duo 分開供電,模組採用 8顆3號電池 (8 x 1.5V = 12V )的電池盒,開發板就用行動電源。因為在此採用的馬達為 12V,這樣也是比較好的做法。否則容易因為瞬間電流過大讓板子關機甚至傷害到板子。

使用的馬達驅動模組為 L298N,在露天或一些網路電子材料行不難找
正面照,還真的挺像瓦力,就差兩隻手囉。機身是用雷射切割的木板,不是太堅固。不過外觀有履帶就贏一半了!走起來有履帶嘎嘰嘎嘰的聲音聽起來就很過癮啊。

背面全貌

另一個背面角度可以看到機體分成兩層,上層塞馬達,下層由左到右則是給馬達用的12V電池盒、行動電源、與插在麵包板上的 7688 Duo。黑色的 USB 線是 WebCam,白色則是行動電源供電。下一版應該可以更精巧堅固一點
請注意裝載 webcam 的 servo 現在沒有作用,也就是說機器人的脖子不會轉動


7688端程式
7688 在這個系統中扮演 server 的角色,App Inventor 則是 client 去對 server 發送 POST。
LinkIt Smart 7688 robot - python
#匯入相關函式庫
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()
App Inventor 端程式
App Inventor 端的程式會連線到 7688 AP 之後取得影像,並利用 Web元件來發送指令給 7688 來控制馬達轉向與轉速。
Designer頁面
這是一個橫式握持的介面,這樣觀看影像的效果會比較好,操作機器人只需要右手拇指就可以完成。請注意在此的 WebViewer 是用來取得來自 7688 的 Webcam 即時影像。Web元件則是用來對 7688 下指令。

Blocks頁面
宣告相關變數

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

按鈕控制動作
Button 的 TouchDown (手指觸摸螢幕)與 TouchUp(手指離開螢幕) 事件。請注意 Button.Click 是觸摸又離開,也就是 TouchDown + TouchUp。因此如果我們拆開的話,就可以用一個按鈕來執行兩件事。
以 Button_Forward 前進按鈕來說,TouchDown時會把 action 設為1。以 Button_Backward 後退按鈕來說,則是把 action 設為2。這樣 7688 就知道按下了哪一個按鈕。
放開兩個按鈕(Button的TouchUp事件)時,action變數值即為0,這時 7688 收到的 button變數就是0,機器人就會停止動作。

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

類似的專案還有
Post Views: 2,135
您好,可愛小瓦力此篇7688端程式-python部分網頁都看不到…
是否能開放提供此部分讓我這小小讀者學習!?感恩!
您好,這是網頁套件衝到了,現在應該可以看到囉
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來連線結果卻發生了問題,想請問是我少了什麼東西嗎?
後來是我只擷取到一些而並非是全部的程式碼,問題有解決了
您好,恭喜成功囉
想請問一下為什麼Python程式輸入後不能run
請問出現怎樣的錯誤訊息呢?
我的app無法控制馬達轉動
這樣描述有點模糊啊,可以詳述問題嗎?
python跟appinventor的部分沒問題,但馬達依然無法轉動
請先檢查一下接線,修改python code,把與App Inventor連線的部分拿掉,用單機版來測試馬達是否順利轉動。試試看吧
EN1.write(L_control);
IN1.write(0);
IN2.write(1);
有冇[LinkIt Smart 7688、]FPV第一人稱輪型機器人- 可愛小瓦力的aia檔及LinkIt Smart 7688 的code下載呢?
william你好:
在文章中就有說明完整的程式碼囉
我程式方面照著上面打可是馬達依然不會動,接線方面是看程式內將開發版的D2-D3-D9為通道A,D9為EN-A,D5-D7-D10為通道B,D10為EN-b接到L298N上馬達不會轉,是我接線接錯嗎?
您好,這樣的語法是控制單顆馬達,先寫個簡單程式來測試馬達與接線是否正常?
EN1.write(L_control);
IN1.write(0);
IN2.write(1);
您好 請問Arduino 需要燒入程式嗎?
======= POST VALUES =======
L
0.0
R
1
0,4
都會顯示數值,馬達都沒有動作
您好,不用喔。
EN1.write(L_control);
IN1.write(0);
IN2.write(1);
這樣的寫法就是直接由 openWRT 去控制腳位,不然就會看到類似 ser.write 這種語法來送指令給Arduino。文章中的做法比較簡便,不用再多一層Arduino