編輯:關於Android編程
馬達是我們經常使用到的電動裝置,它可以將電能轉化成動能,驅動其他東西的運動。聽起來很抽象,舉幾個例子吧。我們小時候玩的四驅車,帶動輪子轉動的那個小裝置就是馬達;夏天讓風扇旋轉帶給我們涼意,也是馬達的功勞。
根據使用電源的不同,可以將馬達分成直流馬達和交流馬達。我們做智能硬件使用的基本都是直流馬達,通過馬達來驅動外接設備運動。
將電能轉化成動能的物理原理,我們在中學已經學過,這裡利用了兩個原理:電磁感應和磁鐵的同性相斥異性相吸。
將一根磁棒放在金屬罩中間,兩端懸上一個金屬柱子,金屬柱子上面有線圈; 當線圈通過電流的時候,就能產生磁場,磁棒根據極性改變位置; 改變電流方向,線圈磁場方向發生調換,磁棒再次根據極性改變位置; 如此往復,磁棒就旋轉了起來。一個馬達的外形大致如此,
馬達加上一些結構,與輪胎結合起來就成了輪子
它有兩個接線的地方,一處接正極,另一處就接負極,
在不超過極限電壓的情況下,對馬達施加的電壓越大,馬達就轉動的越快; 調轉正負極的連接順序,馬達的旋轉方向也發生調轉;馬達的正負極不能直接連接到Arduino開發板的引腳上,必須使用一個轉換電路。否則馬達在轉動的過程中可能會產生強大的電流,擊穿開發板上的元器件。
為此,可以使用專門的馬達擴展板,來連接使用馬達,
也可以使用集成了轉換電路的馬達模塊,例如風扇馬達模塊,
在此我們選用集成了轉換電路的風扇馬達模塊來講解。
該模塊有4個引腳,
因為要調整直流馬達的轉動速度,INA與
INB最好接到具有
PWM功能的接口上,通過設置該引腳的級數數,來調節馬達的轉速。這裡,我們將
INA連接到
D9,
INB連接到
D8,
模塊引腳
連接
Arduino擴展板
INA
<–>
D9組S引腳
INB
<–>
D8組S引腳
VCC
<–>
D8組V引腳
GND
<–>
D8組G引腳
6.3 代碼設計
首先要初始化
INA與
INB連接的接口,讓
Arduino開發板擁有向它們輸出的能力,
//INA使用具有PWM功能的D9引腳
int INA = 9;
//INB使用具有PWM功能的D8引腳
int INB = 8;
void setup() {
//設置引腳為輸出
pinMode(INA, OUTPUT);
pinMode(INB, OUTPUT);
}
將
INA引腳設置成低電平LOW,改變
INB引腳的值,來達到控制馬達轉速的效果,
void setup() {
//設置引腳為輸出
pinMode(INA, OUTPUT);
pinMode(INB, OUTPUT);
digitalWrite(INA, LOW);
}
void loop() {
//從0級到100級
for(int level = 0 ; level < 100+1; level++)
{
//調整INB上的電壓級數,達到改變風扇轉速的效果
analogWrite(INB, level);
delay(100);
}
}
這裡將調整的級數,調整在了
0~100。理論上可以調整的級數應該是
0~255級。但是由於馬達電流負載的原因,設置到高級數時,例如
245級,會讓開發板過載。因此可以把最大級數設置的稍微小一點,例如
230級,
int INA = 9;
int INB = 8;
int START_LEVEL = 0;
int END_LEVEL = 230;
void setup() {
pinMode(INA, OUTPUT);
pinMode(INB, OUTPUT);
digitalWrite(INA, LOW);
}
void loop() {
//從9級慢慢加速到230級
for(int level = START_LEVEL ; level < END_LEVEL+1; level++)
{
analogWrite(INB, level);
delay(100);
}
//從230級慢慢減速到0級
for(int level = END_LEVEL; level > START_LEVEL ; level--)
{
analogWrite(INB, level);
delay(100);
}
}
6.4 結果觀察
馬達開始緩慢的旋轉,越轉越快;達到最快轉速時,又開始減速,直到停止;整個過程周而復始。
6.5 馬達的反轉
如果想修改馬達旋轉的方向,可以將
INB設置為低電平LOW,改變
INA引腳的值,
int INA = 9;
int INB = 8;
int START_LEVEL = 0;
int END_LEVEL = 230;
void setup() {
pinMode(INA, OUTPUT);
pinMode(INB, OUTPUT);
}
void loop() {
//朝著一個方向旋轉,先加速,再減速
//INA設置為LOW
digitalWrite(INA, LOW);
for(int level = START_LEVEL ; level < END_LEVEL+1; level++)
{
//改寫INB的級數
analogWrite(INB, level);
delay(100);
}
for(int level = END_LEVEL; level > START_LEVEL ; level--)
{
//改寫INB的級數
analogWrite(INB, level);
delay(100);
}
//朝著另一個方向旋轉,先加速,再減速
//INB設置為LOW
digitalWrite(INB, LOW);
for(int level = START_LEVEL ; level < END_LEVEL+1; level++)
{
//改寫INA的級數
analogWrite(INA, level);
delay(100);
}
for(int level = END_LEVEL; level > START_LEVEL ; level--)
{
//改寫INA的級數
analogWrite(INA, level);
delay(100);
}
}
如果標題欄過多,超過屏幕的寬度,該怎麼弄,下面我們就來解決一下,效果如下:其實和之前寫的也差不多,我就是在哪個demo裡面添加和修改了一下,就加了幾個title標題,加了
今天在做項目的時候用到了圖表功能,記錄下來achartengine是google的一個開源項目,可以在https://code.google.com/p/acharten
Android實習札記(6)---ViewPager使用詳解 札記(5)中介紹了Fragment構建簡單的底部導航欄,在結尾的時候說要在下一節
前不久搞的Android圖片緩存,剛開始引入開源的框架,用著還行,但是在開發中遇到問題,就比如universal-image-loader-1.9.5.jar