相關(guān)商品
【創(chuàng)客學(xué)堂】Arduino+Processing 制作極客風(fēng)格繪圖機(jī)
編輯:Magic2015-08-13 無線電-臧海波 瀏覽次數(shù):4369
面對(duì)到底學(xué)習(xí)哪種編程語(yǔ)言更好的問題,我的觀點(diǎn)是自己感覺簡(jiǎn)單、好用就足夠了。因?yàn)椴徽撃姆N計(jì)算機(jī)語(yǔ)言,起到的也不過是一種人機(jī)對(duì)話的作用,方便程序員編寫程序。真正
讓機(jī)器活起來的角色是算法(數(shù)學(xué))。本文將通過一臺(tái)極客風(fēng)格繪圖機(jī)的設(shè)計(jì)、制作過程,向你展示隱藏在程序背后的算法的巨大力量。
硬件
從結(jié)構(gòu)上看,大多數(shù)繪圖機(jī)不管是滾筒式還是平臺(tái)式,都是建立在直角坐標(biāo)系的基礎(chǔ)上。這種結(jié)構(gòu)對(duì)業(yè)余玩家來說,最大的問題就是造價(jià)過高,因?yàn)槟惚厝粫?huì)用到絲桿、導(dǎo)軌、滑
臺(tái)或同步輪、同步帶這類的零件。很多時(shí)候電機(jī)本身并不貴,但是配上一根精度說得過去的絲桿,成本就會(huì)翻上數(shù)倍,從學(xué)習(xí)、實(shí)驗(yàn)的角度看就得不償失了。有沒有什么好的辦法造一臺(tái)既簡(jiǎn)單又炫酷的繪圖機(jī)呢? 對(duì)極客來說,每個(gè)問題都是一劑激發(fā)創(chuàng)意的催化劑。下面就請(qǐng)讀者跟著筆者扮演一回極客,試試用極客的思路解決問題, 看看能不能用常見的材料制作一臺(tái)繪圖機(jī)。 既然成品絲桿電機(jī)比較貴,就試試別的驅(qū)動(dòng)器吧。模型和機(jī)器人上常用的舵機(jī)就是 一個(gè)選擇,但是舵機(jī)有一個(gè)問題,就是它輸出的是角位移,這樣你就無法照搬常規(guī)繪圖機(jī)的結(jié)構(gòu)和控制思路。這個(gè)問題也不難解決,可以參考工業(yè)機(jī)器人的手臂式結(jié)構(gòu)。既然工廠里的機(jī)器臂可以做到能穿針引線的精度,那么用幾個(gè)舵機(jī)驅(qū)動(dòng)手臂繪圖也一定可行。
為了簡(jiǎn)化制作,我把手臂設(shè)計(jì)成了 3 個(gè)自由度的,1個(gè)舵機(jī)控制筆尖的起落,另外 2 個(gè)舵機(jī)驅(qū)動(dòng)肩關(guān)節(jié)和肘關(guān)節(jié),控制器為 Arduino。因?yàn)槭诸^正好有一套奧松機(jī)器人的百變之星
創(chuàng)意拼裝套件,繪圖機(jī)結(jié)構(gòu)部分的制作變得輕松了許多。
手臂的主要材料是 3 套配支架和 U 形框的標(biāo)準(zhǔn)舵機(jī),如圖 1 所示。此外還有一些 鈑金件和緊固件。
圖 1 單個(gè)關(guān)節(jié)的結(jié)構(gòu)件和組裝工具
為了便于建模和計(jì)算,我制作的是一 條仿生右臂,如圖 2 所示。
圖 2 機(jī)器右臂俯視圖(假設(shè)機(jī)器人在你對(duì)面)
結(jié)構(gòu)上,大臂和小臂的長(zhǎng)度相等,完成后的手臂從肩關(guān)節(jié)到肘關(guān)節(jié)、從肘關(guān)節(jié)到筆尖的長(zhǎng)度均為115mm,如圖 3所示。
圖 3 肩關(guān)節(jié)與肘關(guān)節(jié)的實(shí)測(cè)距離為 115mm
肘關(guān)節(jié)到筆尖的距離可以微調(diào)。落筆舵機(jī)在90°時(shí),筆尖與紙面垂直,減小角度可以使筆尖向外傾斜,增加距離,反之則縮短距離。我設(shè)置的是85°,這樣筆尖稍微向外傾斜,距離正好為115mm,如圖4 所示。如果想自己DIY,一個(gè)要注意的問題是給舵機(jī)加上虛軸,從結(jié)構(gòu)上減小抖舵造成的影響。還可以在關(guān)鍵部位加上一塊泡沫,構(gòu)成減振緩沖墊,減小因手臂擺動(dòng)幅度過大而產(chǎn)生的晃動(dòng),我在機(jī)器人的肘部就加了一塊(見圖 4)。你也可以發(fā)揮想象力,根據(jù)手頭現(xiàn)有的材料設(shè)計(jì)出更好的結(jié)構(gòu)。另一個(gè)要注意的是舵機(jī)的供電問題。 標(biāo)準(zhǔn)舵機(jī)消耗的電流比較大,用Arduino 上自帶的穩(wěn)壓芯片給2 個(gè)舵機(jī)供電是可以的,3 個(gè)就有點(diǎn)勉強(qiáng)了,最好給舵機(jī)單獨(dú)供電。
圖 4 調(diào)節(jié)舵機(jī)落筆角度,校正肘關(guān)節(jié)到筆尖的距離。肘部下面用雙面膠粘了一塊泡沫減振
軟件
系統(tǒng)控制思路非常簡(jiǎn)單,讓手臂隨著鼠標(biāo)的動(dòng)作實(shí)現(xiàn)定位,用鼠標(biāo)的單擊控制筆尖的起落進(jìn)行繪制。繪圖機(jī)的軟件分為 Arduino 和 Processing 兩個(gè)部分。我使用的軟件版本為Arduino-1.6.4 和 Processing-2.2.1。這個(gè)項(xiàng)目主要研究的是算法和編程,為了方便初學(xué)者參考,我會(huì)把各個(gè)步驟盡量細(xì)化并加以說明。
Arduino 部分非常簡(jiǎn)單,只要連接好USB 電纜,在IDE 中選擇對(duì)應(yīng)的板卡和端口, 把示例中的Firmata\ServoFirmata 上傳到控制板就可以了。這個(gè)操作相當(dāng)于把 Arduino 刷成了一個(gè)舵機(jī)控制器,不需要給Arduino 編寫任何程序。
Firmata 是 Arduino 平臺(tái)下的一個(gè)PC 與單片機(jī)通信的協(xié)議,支持多款單片機(jī)和上位機(jī),如Processing、Pure Data、Linux C++。Arduino IDE 中已經(jīng)包含了這個(gè)協(xié)議, 但是我建議把它替換成最新的。從 http:// firmata.org/wiki/Download 可以下載到最新的壓縮包 Firmata_v2.3.6.zip, 解壓后替換掉 Arduino IDE根目錄下的libraries\ Firmata。所有運(yùn)算都在Processing 上實(shí)現(xiàn), 程序跟蹤鼠標(biāo)的移動(dòng)和單擊操作,生成實(shí)時(shí)動(dòng)作組,最后通過Firmata 協(xié)議控制連接在 Arduino 上的3個(gè)舵機(jī)驅(qū)動(dòng)手臂運(yùn)轉(zhuǎn)。 首先要給Processing安裝一個(gè)Arduino庫(kù), 這樣它就可以利用 Firmata 協(xié)議與剛完成的 Arduino舵機(jī)控制器通信了。 庫(kù)的下載地址見 http://playground.arduino.cc/Interfacing/Processing, 把 processing2-arduino.zip 解壓后復(fù)制到Processing 根目錄下的modes\java\libraries。因?yàn)镻rocessing 是基于Java開發(fā)的,你可以發(fā)現(xiàn)這個(gè)庫(kù)的核心是一個(gè)名為arduino的jar包。
圖 5 繪圖機(jī)數(shù)學(xué)模型示意圖 部分為繪圖機(jī)
接下來要在Processing 里給繪圖機(jī)建 立一個(gè)數(shù)學(xué)模型,如圖 5 所示。
Processing 繪制的坐標(biāo)原點(diǎn)位于窗口左上角,即圖5 中的A 點(diǎn),這是一個(gè)直角坐標(biāo)系,x 軸向右為正,y 軸向下為正,1 像素對(duì)應(yīng)現(xiàn)實(shí)世界中的1mm。圖 5中藍(lán)色的兩段手臂,B點(diǎn)為肩部舵機(jī),C 點(diǎn)為肘部舵機(jī),D 點(diǎn)為筆尖落點(diǎn)。為什么不把肩部舵機(jī)放置在 A 點(diǎn)原因很簡(jiǎn)單,我用的舵機(jī)是逆時(shí)針旋轉(zhuǎn)的,從左轉(zhuǎn)到右,對(duì)應(yīng)著 0° ~180°,如果放在 A 點(diǎn), 0°~90°的部分就超出了窗口定義的范圍。 所以先要作一個(gè)坐標(biāo)平移,把基準(zhǔn)點(diǎn)從A 平移到 B,x 坐標(biāo)取窗口寬度的一半,y 坐標(biāo)不變,這樣舵機(jī)的運(yùn)動(dòng)范圍就完全包含在窗口以內(nèi)了。不過這樣一來鼠標(biāo)坐標(biāo)也跟著向右平移了1/2 個(gè)窗口寬度,需要進(jìn)行修正, 最后得出筆尖落點(diǎn) D 的坐標(biāo)為 (mouseX- width/2,mouseY)。
從圖 5 中可以看出,用手臂定位 D 點(diǎn)只需要確定兩個(gè)關(guān)節(jié)旋轉(zhuǎn)的角度就可以了。 角b為肩部舵機(jī)角度,角c為肘部舵機(jī)角度。 下面轉(zhuǎn)到極坐標(biāo)系,以B 為極點(diǎn),Bx 為極軸, 可以用 dist() 函數(shù)計(jì)算出 D 點(diǎn)的極徑,用反正弦函數(shù)計(jì)算出極角d,用反余弦函數(shù)計(jì)算出角a。每段手臂的長(zhǎng)度115mm 是已知的。 有了這些數(shù)據(jù),就可以在屏幕上畫出手臂的仿真圖形。最后,把弧度轉(zhuǎn)換為角度,調(diào)用 Arduino 庫(kù)的 servoWrite() 函數(shù)把角度寫入對(duì)應(yīng)的舵機(jī)就可以了。 別忘了還有一個(gè)控制筆尖起落的舵機(jī),
這個(gè)舵機(jī)的控制是用Processing 對(duì)鼠標(biāo)左鍵單擊的響應(yīng)來實(shí)現(xiàn)的。注意下面程序中涉及圖形繪制部分采用的是弧度制,硬件控制部分采用的是角度制,不要弄混。最后發(fā)送到肩部舵機(jī)的角度 b=180-a-d,肘部舵機(jī)的角c 是手臂圍成的大三角形的外角,因?yàn)閮啥问直坶L(zhǎng)度相等,可以得出 c=2a。
到這里,一些讀者可能會(huì)覺得要實(shí)現(xiàn)這么多功能,程序編寫起來會(huì)有一點(diǎn)難度。 不用擔(dān)心,Processing 是一種基于感官的程序語(yǔ)言,強(qiáng)調(diào)的是實(shí)用和互動(dòng)。舉個(gè)例子,我想在屏幕上畫個(gè)圓,只要敲一行代碼,調(diào)用ellipse() 函數(shù),給出幾個(gè)參數(shù)就可以了。而換成傳統(tǒng)的程序設(shè)計(jì)語(yǔ)言,可能要學(xué)習(xí)半個(gè)學(xué)期,寫數(shù)十行代碼才能實(shí)現(xiàn)。 Arduino 是在Processing 的基礎(chǔ)上開發(fā)的, 因?yàn)檠壍年P(guān)系,你會(huì)發(fā)現(xiàn)它的編程方式和 Arduino 很相似,只是 Arduino 更偏向 C, Processing 更偏向 Java。
接下來按照上面整理的思路給繪圖機(jī)編寫一個(gè) Processing 驅(qū)動(dòng)程序。為了方便閱 讀理解,我把軟件仿真部分標(biāo)為藍(lán)色,把硬件控制部分標(biāo)為紅色。
import processing.serial.*; // 導(dǎo)入串口庫(kù) import cc.arduino.*; // 導(dǎo)入 Arduino 庫(kù) Arduino arduino; // 關(guān)聯(lián)硬件
int servo1pin = 9; // 設(shè)定落筆舵機(jī)端口 int servo2pin = 10; // 設(shè)定肘部舵機(jī)端口 int servo3pin = 11; // 設(shè)定肩部舵機(jī)端口
// 設(shè)定 2 個(gè)關(guān)節(jié)的初始位置為 0°,上電以后,手臂擺動(dòng)到左上角
?oat c = 0; // 肘部舵機(jī)初始角 ?oat b = 0; // 肩部舵機(jī)初始角// 系統(tǒng)初始化 void setup(){
size (800, 600); // 設(shè)定窗口尺寸
smooth(); // 平滑繪制 stroke(0,0,255,20); // 設(shè)定畫線為藍(lán)色透明
arduino = new Arduino(this, Arduino. list()[0]); // 查找可用的 Arduino 硬件
arduino.pinMode(servo1pin, Arduino.
SERVO); // 依次設(shè)定 3 個(gè)端口模式 arduino.pinMode(servo2pin, Arduino.
SERVO);
arduino.pinMode(servo3pin, Arduino.
SERVO);
}
void draw(){
translate(width/2, 0); // 坐標(biāo)向右平移 半個(gè)窗口寬度
?oat penX = mouseX-width/2; // 計(jì)算筆 尖 x 坐標(biāo)
?oat penY = mouseY; // 筆尖 y 坐標(biāo)就是 鼠標(biāo)的 y 坐標(biāo)
// 起落筆控制
if (mousePressed) {
?ll(0);
arduino.servoWrite(servo1pin, 85);
// 落筆,調(diào)節(jié)這個(gè)角度,使肘關(guān)節(jié)至筆尖的 距離為 115mm
}
else {
?ll(255);
arduino.servoWrite(servo1pin, 70);
// 調(diào)節(jié)這個(gè)角度使筆尖離開紙面
}
// 轉(zhuǎn)到極坐標(biāo)系進(jìn)行計(jì)算 ellipse(0, 0, 5, 5); // 繪制極點(diǎn)
ellipse(penX, penY, 5, 5); // 繪制筆尖 line(0, 0, penX, penY); // 繪制極徑
?oat BD = dist(0, 0, penX, penY); //
測(cè)量 D 點(diǎn)極徑
?oat d = asin(penY/BD); // 計(jì)算極角 d
if (penX < 0) { d = PI - d; }
// 物理限位,最長(zhǎng)不能超過 115+115,最短不 能小于 115
if (BD > 230) { BD = 230; }
if (BD < 115) { BD = 115; }
?oat a = acos(BD/2/115); // 計(jì)
算角 a
?oat bc = a + d; // 計(jì)算 BC 的
弧度
// 繪制上臂
rotate(bc); // 旋轉(zhuǎn)極坐標(biāo)
line(0, 0, 115, 0); // 畫線
translate(115, 0); // 坐標(biāo)移動(dòng),
極點(diǎn)從 B 移動(dòng)到 C
?oat cd = - 2 * a; // CD 以 C 為極點(diǎn)順時(shí)針旋轉(zhuǎn),弧度為 cd = TWO_PI - 2 * a = -2 * a
arduino.servoWrite(servo3pin,
180 - round(degrees(bc)));
// 把弧度轉(zhuǎn)換為角度,寫入肩部舵機(jī) delay(30); // 留出舵機(jī)動(dòng)作時(shí)間,
修改數(shù)值可調(diào)節(jié)系統(tǒng)動(dòng)態(tài)特性
// 繪制小臂
rotate(cd); // 旋轉(zhuǎn)極坐標(biāo) line(0, 0, 115, 0); // 畫線 arduino.servoWrite(servo2pin,
- round(degrees(bcd))); // 角度寫入肘部 舵機(jī)
delay(30); // 留出舵機(jī)動(dòng)作時(shí)間,
修改數(shù)值可調(diào)節(jié)系統(tǒng)動(dòng)態(tài)特性
}
測(cè)試
3 個(gè)舵機(jī)的初始位置為肩 0 °、肘 0°、筆 90°。運(yùn)行程序后,手臂會(huì)擺到左側(cè),筆尖為抬起狀態(tài),如圖 6 所示;
圖 6 繪圖機(jī)初始化
屏幕上會(huì)出現(xiàn)一個(gè) 800 像素 ×600 像素的窗口, 緩慢移動(dòng)鼠標(biāo),可以看到機(jī)器人的仿真圖形, 如圖 7 所示。
圖 7 機(jī)器人的仿真圖形,黑色的為鼠標(biāo)單擊 操作,淺藍(lán)色的線條為手臂姿態(tài)
繪圖機(jī)隨著鼠標(biāo)移動(dòng)而開始工作,單擊鼠標(biāo)左鍵控制筆尖落下,就可以開始繪圖了,如圖 8 所示。
圖 8 單擊鼠標(biāo)左鍵放下筆尖,開始繪圖
優(yōu)化
用 Processing 建立的數(shù)學(xué)模型可以精確到1個(gè)像素,與之相對(duì)應(yīng)的繪圖機(jī)硬件可以達(dá)到±1mm 的定位精度,但這只是從單純的數(shù)學(xué)角度得出的結(jié)論。機(jī)器人的實(shí)際運(yùn)行情況會(huì)受到兩個(gè)因素的制約:一個(gè)是鼠標(biāo), 另一個(gè)是舵機(jī)。
這個(gè)系統(tǒng)的核心思路是用 Processing 采集鼠標(biāo)指針坐標(biāo)進(jìn)行運(yùn)算。鼠標(biāo)移動(dòng)的物 理點(diǎn)對(duì)應(yīng)著屏幕上的邏輯點(diǎn)(不一定是單個(gè) 像素)。鼠標(biāo)的操作應(yīng)該盡量放緩,防止動(dòng) 作過于突兀,出現(xiàn)丟點(diǎn)現(xiàn)象。但是即使鼠標(biāo)的分辨率足夠高,這種手工定位的方法也會(huì)產(chǎn)生一定誤差,不能體現(xiàn)出這個(gè)設(shè)計(jì)的真正實(shí)力。最根本的解決辦法是把手動(dòng)換成數(shù)控, 用軟件生成
坐標(biāo),控制繪圖機(jī)運(yùn)轉(zhuǎn),比如下面這段程序。
// 繪圖機(jī)數(shù)控程序,繪制一條阿基米德螺旋線。
import processing.serial.*; import cc.arduino.*; Arduino arduino;
int servo1pin = 9;
int servo2pin = 10;
int servo3pin = 11; ?oat angle = 0.0; ?oat offset = 60; ?oat scalar = 2; ?oat speed = 0.005; void setup() {
size(800,600);
?ll(0);
smooth();
arduino = new Arduino(this, Arduino. list()[0]);
arduino.pinMode(servo1pin, Arduino.
SERVO);
arduino.pinMode(servo2pin, Arduino.
SERVO);
arduino.pinMode(servo3pin, Arduino.
SERVO);
arduino.servoWrite(servo1pin, 70); //
抬筆
delay(300);
}
void draw() { translate(width/2, 0);
float x = offset + cos(angle) * scalar;
?oat y = 100 + offset + sin(angle) *
scalar; // 把初始 y 坐標(biāo)設(shè)定在一個(gè)適中的位置 ellipse( x, y, 2, 2);
angle +=speed; scalar +=speed; ?oat penX = x; ?oat penY = y;
?oat BD = dist(0, 0, penX, penY); //
測(cè)量 D 點(diǎn)極徑
?oat d = asin(penY/BD);
if (penX < 0) { d = PI - d; } if (BD > 230) { BD = 230; }
if (BD < 115) { BD = 115; }
?oat a = acos(BD/2.0/115); ?oat b = PI - a - d;
arduino.servoWrite(servo2pin, round(degrees(2 * a))); // 肘關(guān)節(jié)角度
arduino.servoWrite(servo3pin, 180 -
round(degrees(a + d))); // 肩關(guān)節(jié)角度 arduino.servoWrite(servo1pin, 85); //
落筆
println("b = " + round(degrees(PI - a
- d))); // 肩部舵機(jī)角度回顯,方便調(diào)試
println("c = " + round(degrees(2 * a))); // 肘部舵機(jī)角度回顯,方便調(diào)試
}
繪圖機(jī)的測(cè)試視頻見 http://my.tv.sohu.com/user/234083410。我做了3 次測(cè)試, 你可以看到每修改一次,性能都得到了一定程度的提升。測(cè)試 1 中的舵機(jī)沒有加延遲, 手臂沒作減振處理,抖動(dòng)嚴(yán)重。測(cè)試2 是手臂和程序做了優(yōu)化以后的效果,抖動(dòng)減輕了很多,但是鼠標(biāo)手動(dòng)繪圖的精度還是不夠。測(cè)試 3 是數(shù)控繪制,已經(jīng)可以感受到濃厚的極客味道了。
現(xiàn)在除了原生的 Processing,許多功能強(qiáng)大的計(jì)算機(jī)圖形分析和仿真軟件都加入了對(duì) Arduino 的支持, 比如 MATLAB, 感興趣的讀者可以一試。為了讓程序更通用,可以把手臂的算法打包成一個(gè)函數(shù),調(diào)用時(shí)只需輸入 x、y 坐標(biāo)和筆尖狀態(tài)即可。
這里為了簡(jiǎn)化程序,舵機(jī)采用的是角度控制,Processing 發(fā)送給舵機(jī)的指令只能精確到度。繪圖機(jī)每段手臂的長(zhǎng)度為115mm,由此可以計(jì)算出在手臂完全伸展的極限情況下,筆尖的定位精度為 (115+115)×2×3.14÷360 ≈ 4mm,這個(gè)誤差還是比較大的。另外的問題是舵機(jī)從一個(gè)角度轉(zhuǎn)動(dòng)到另一個(gè)角度需要一定時(shí)間,而程序運(yùn)行的速度比舵機(jī)快出很多, 如果舵機(jī)還沒有到達(dá)預(yù)定角度就又接收到了新的指令,會(huì)因?yàn)橄到y(tǒng)來不及響應(yīng)而造成手臂晃動(dòng)。從圖 9 所示的阿基米德螺旋線繪制效果就可以看出來,線條的平滑度不夠。
一個(gè)優(yōu)化系統(tǒng)動(dòng)態(tài)特性的思路是把舵機(jī)固有的轉(zhuǎn)速降低。一些高級(jí)數(shù)字舵機(jī)自帶編程功能,用戶可以修改舵機(jī)內(nèi)部的多個(gè)參數(shù),包括速度。普通舵機(jī)的調(diào)速就比較麻煩了,可以考慮給每個(gè)舵機(jī)建立一個(gè)數(shù)組,用插值算法讓舵機(jī)平滑過渡到下一個(gè)位置。其實(shí)這個(gè)繪圖機(jī)的算法嚴(yán)格來說應(yīng)該包括兩部分,一部分是手臂的仿真,另一部分是舵機(jī)的精細(xì)控制。網(wǎng)上有很多與舵機(jī)相關(guān)的資料,為了節(jié)省篇幅,文中就不展開討論了。
為了提高繪圖機(jī)的精度,還可以試試用脈寬調(diào)制技術(shù)控制舵機(jī)。標(biāo)準(zhǔn)舵機(jī)的控制脈沖一般為 0.5~2.5ms,內(nèi)部控制電路定義的位置級(jí)數(shù)一般為1024。由此可以計(jì)算出舵機(jī)在 0°~180°范圍下的角位移可以達(dá)到 180° /1024=0.18°,脈寬分辨率為 (2500-500)/1024=2μs。和前面的角度控制比起來,精度可以用恐怖一詞來形容。就是說你可以調(diào)用Arduino 舵機(jī)庫(kù)的writeMicroseconds() 函數(shù)向舵機(jī)發(fā)送精度為2μs 的脈沖,舵機(jī)應(yīng)該能夠識(shí)別并產(chǎn)生動(dòng)作。當(dāng)然,這只是理想狀態(tài)下的結(jié)論, 實(shí)際上受機(jī)械部分的限制,以直流電機(jī)和齒輪減速箱為核心的普通舵機(jī)很難做到這么高的精度。要知道 2 相 4 線步進(jìn)電機(jī)的 1/8 細(xì)分也只能精確到 0.225°。
結(jié)論
這個(gè)項(xiàng)目最大的意義是用比較簡(jiǎn)單的軟硬件實(shí)現(xiàn)了 Arduino 和 Processing 的互動(dòng)式應(yīng)用,說明了算法在其中起到的重要作用, 并且?guī)椭x者加深了對(duì)舵機(jī)的了解。如果你對(duì)計(jì)算機(jī)圖形學(xué)和機(jī)器人藝術(shù)感興趣,又不知道該從哪里下手,它應(yīng)該可以作為一個(gè)不錯(cuò)的入門選擇。
文章來自:無線電雜志-臧海波
相關(guān)文章:
奧松機(jī)器人攜百變之星創(chuàng)意拼裝套件亮相創(chuàng)客星球大型電視眾籌節(jié)目
------------------------------------------------------------------------------------------------------------------
奧松機(jī)器人官網(wǎng):www.robotbase.cn
微信號(hào):搜索公眾號(hào)“奧松機(jī)器人”
QQ群: 271230889(討論,解惑)
微博:@奧松機(jī)器人基地(新+熱)
----------------------------------------------------------------------------------------------------------------
溫馨提示:予人玫瑰,手留余香;如果你喜歡這篇文章,不妨轉(zhuǎn)發(fā)推薦給你身邊的朋友!
用戶評(píng)價(jià)
暫時(shí)還沒有任何用戶評(píng)論