arduino python firmate_processing firmata协议及数组训练
要求:
最初想法:繪制一個圖形,通過圖形的變化或者鼠標點擊什么圖案,arduino上面的led燈亮暗變換。
因為想熟練數組的運用,所以在繪制圖形的時候想通過數組來繪制圖形,但是我發(fā)現如果一味的想運用上數組,反而會本末倒置,把繪圖復雜化。(因為在我的想法里,數組在繪圖方面是用來繪制一樣的圖形,不過是它們的大小,位置等可以通過數組來變化,但是在我目前繪制的圖形中,并沒有需要很多個一樣的圖形,所以我把最初的想法放棄了)
然后我就開始想通過數組我能繪制什么,于是我想到了我可以繪制多個圓,并且讓它們旋轉從而增加趣味性。
然后通過數組我可以改變圓的大小。
我還可以改變它們的顏色,于是我就想到了彩虹的七色。然后又可以隨著顏色的變換,arduino上的led燈一個一個亮起來,這就意味者我需要7個燈,但是在擺放燈的時候我放了10個,因為剛好可以布成一個愛心桃。
思路理清楚了 接著我就開始做processing的部分了,因為圓需要旋轉所以得運用到rotate();函數
但是我又需要它不停的旋轉所以我打算在rotate函數里加個自定義變量 即 rotate(i);
然后在后面給i一個增量,圓就可以不停的旋轉了。
不過在旋轉這里我得提一點 就是 rotate(PI/i);是以圓心為軸旋轉 ,這樣達不到我需要的效果 舍棄
而 rotate(i)則是以圓外某一點為軸旋轉 符合我想要的要求。
圓能旋轉了, 但是我得控制它們旋轉軸的具體左邊啊。
這時候就需要translate()函數了, 通過它可以確定中心軸的坐標
通過以上可以得出,結合translate和rorare 再給以一個變量,即可讓一個圖形繞著某點不停的旋轉
接下來就是通過數組繪制7個圓了, 在數組的定義過程中,因為我想改變的是圓的大小,從50到350 以50單位遞增,
所以在定義數組的時候就想運用for函數,這樣就方便許多,。。但是可能是我在定義數組這方面還是不是很了解,所以只能用最笨的方法來定義了。
因為沒有專門截圖,但是下圖
可以看出來我用最笨的方法定義
(圓在背景前面)
這張圖也是我碰到的一個麻煩,就是當我想運用數組畫圓出來的時候,發(fā)現能夠順利輸出,結果卻沒反應。
經過思考過后,發(fā)現會不會是因為把圓放在background前面了,因為之前有學到過,在draw循環(huán)里加個background可以把之前的東西清空,即不會留下一些圖形運動的痕跡。
(放在背景后面)
果然成功了。
上圖只是測試能不能運用數組成功畫出10等大的圓,成功后,我就用了之前所說過的,translate函數把它們選擇的中心軸設置畫布的中心,然后通過調整上圖
ellipse(400,q*10,x[a],x[a])?中的
x軸和y軸可以控制圓之間的距離,即疏密程度。
接下來processing部分沒什么大問題了
接著就是arduino部分了,還有就是firmate協議
先連接好電路,跟之前的有個作業(yè)一樣 我連成了心形,大致物理圖如下
想要將p和a交互起來,在這里用到了firmata協議,首先現在arduino軟件上將協議燒錄進arduino里,
然后我通過processing里面的示例,將里面關于調用協議的內容加入到了我的代碼中,然后達到了交互的效果。
當然在此也碰到了很多小問題,因為對firmata協議的不理解和不熟悉,走了很多彎路,最后也是勉強成功的。
說是勉強成功是因為 我的確可以控制燈亮起來,但是我在里面輸入了low的編碼時,卻暗不下來,而且因為led燈連的端口的不同
9-12號端口的光特別特別暗 也不知道是為什么。 而且隨著燈的編碼變多 processing里的圖案居然會變得延遲。
以下是實際操作代碼:
import
processing.serial.*;?//輸入輸出processing和arduino的數據
import
cc.arduino.*;?//引入firmata協議
Arduino arduino;?//
新建一個arduino的變量
float i=0;?//控制旋轉的變量
float speed=0.001;?//旋轉變量的增量 即旋轉的速度
int [] x = new int[9]; //定義數列X的長度為9
int t=0;?//自定義變量用來控制顏色的變換和燈的變換
void setup(){
size(1000,1000);
x[0]=50;
x[1]=80;
x[2]=120;
x[3]=150;
x[4]=180;
x[5]=210;
x[6]=240;
x[7]=270;
x[8]=300;?//數量里面每個具體的數
arduino = new Arduino(this, Arduino.list()[0],
57600);?//將Arduino里面?zhèn)鱽淼男盘杻Υ嬖谧兞縜rduino中
for (int i = 0; i <= 13; i++)
arduino.pinMode(i, Arduino.OUTPUT); //設置數字輸出端口
}
void draw(){
background(0);
translate(500,500);?//圖形旋轉的中心軸
for(int a=0; a<9;a++){
rotate(i);
ellipse(20,800,50,50); //繪制10個相同大小的圓
ellipse(400,20,50,50); //同上
ellipse(500,20,50,50);//同上
ellipse(20,a*50,x[a],x[a]); //繪制10個等大的圓
i+=speed; // 旋轉的速度
t++;
if(t>2000){fill(255,0,0);} //當t>2000時 填充紅色
if(t>3000){fill(#FF5303);} // 當t>3000s時 填充橙色
if(t>4000){fill(#FF5303);}
if(t>5000){fill(#FFF308);}
if(t>6000){fill(#23FF08);}
if(t>7000){fill(#08FFF1);}
if(t>8000){fill(#0896FF);}
if(t>9000){fill(#7C1AFF);}
if(t>10000){fill(#E000FF);} //當t>10000時 填充紫色
if(t>12000){fill(random(255),random(255),random(255));}
//當t>12000 填充彩色
if(t>14000){fill(random(255));} // 當t>14000 填充黑白頻閃
if(t>16000){t=1000;} // 當t>16000 恢復白色 重新開始顏色輪回
if(t>0){arduino.digitalWrite(3,Arduino.HIGH); } //黑白圓時候
3號端口的燈亮
if(t>2000){arduino.digitalWrite(4,Arduino.HIGH); } //紅色圓時候
4號端口燈亮
//為什么在這里不想做一亮一暗的效果,是因為不知道為什么加了一條Low后
led燈之會暗一點點,真的就一點點,再加上加上Low processing里的動畫效果居然有很大的延遲, 所以舍棄了。
if(t>3000){arduino.digitalWrite(5,Arduino.HIGH);} //原理同上
if(t>4000){arduino.digitalWrite(6,Arduino.HIGH);}
if(t>5000){arduino.digitalWrite(7,Arduino.HIGH);}
if(t>6000){arduino.digitalWrite(8,Arduino.HIGH);}
if(t>7000){arduino.digitalWrite(9,Arduino.HIGH);}
if(t>8000){arduino.digitalWrite(10,Arduino.HIGH);}
if(t>9000){arduino.digitalWrite(11,Arduino.HIGH);}
if(t>10000){arduino.digitalWrite(12,Arduino.HIGH);}//原理同上
}
}
沒有延遲單純processi的視頻
總結
以上是生活随笔為你收集整理的arduino python firmate_processing firmata协议及数组训练的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac os 开启redis_mac o
- 下一篇: websocket python爬虫_p