2014年7月7日 星期一

eZ430 運動手錶控制樹莓派小車 ( 開迴路控制 )

網頁最後修改時間:2016/05/06

在這個網頁中,主要是展示 L298N 馬達驅動板的使用方法,以及怎麼使用 LPD8806 作為 PWM 訊號產生器控制馬達的轉速。


小車全部用到的零件如下圖所示,小車底部是鋰電池放的地方。


所有的零件組合在一起的照片


小車底部相片 ( 藍色部分是鋰電池 )

下面是全部設置好了之後,使用 eZ430 運動手錶控制小車行進的影片。


影片中,由於沒有使用編碼器做為回授,再加上兩個馬達並不會因為設了同樣的轉速就會產生相同的轉動,因此單純做前進或是後退動作時,小車會偏向,所以如何使用手錶好好的操控就要稍微練習一下;不然就是再加入編碼器回授的功能,增加操控時的控制性。

在進入主題之前,我們先將小車所用到的零件列在下面,讓有興趣的同好做個參考。


所需零件:

  • Raspberry Pi, Model B, Rev2.0

  • 無線網路卡
  • 若沒有無線網路卡,使用有線網路也可以。因為程式不在開機時就啟動,而是之後使用 SSH 連線到無線網路卡 ( AP )進入系統之後再自行啟動。
  • 小車底板,包括:
    • 2 組  [ 直流減速馬達 ] ( 減速比 48:1 )
    • 2 個  [ 車輪 ]
    • 壓克力底盤
    • 其餘固定配件 ( 螺絲、螺帽、六角柱... 等 )
  • eZ430-Chronos-Watch 915MHZTI strore : eZ430-Chronos-Watch )
  • eZ430 運動手錶有三種頻率可供選擇:433MHz、865MHz和 915 MHz;網頁中的是使用 915 MHz 的頻率。若有 433MHz 頻率的,則可以使用賣場中 433MHz 無線套件,不必使用 TI 提供的接收器就可以接收到資料。
  •  LPD8806 ( PWM 信號產生晶片 )
  • 任何可以產生 PWM 信號且可受控制的都可以用來試試,建議 PWM 頻率在 10KHz 以下。
  • 鋰電池
  • 因為鋰電池必須要能提供足夠的電給馬達驅動板用,也要有足夠高的電壓能夠經由降壓穩壓電路板輸出穩定的 5V 電壓給樹莓派用,因此這邊不提供 所用的鋰電池容量,避免限制各位的選擇。
    鋰電池的選用:必須考慮到馬達的驅動電壓,再考慮選用盡量小於降壓穩壓電路輸入的最小可轉換電壓,這樣才能一個電壓兩個部分都可以用。再者,電流部分就必須將樹莓派最小需求電流 700mA 以及兩顆馬達消耗電流加總,然後乘上預計要使用的時間 ( 以小時計 ),這樣就可以得到( 大概的 )鋰電池的電流容量 ( mAH )。
    綜合以上資訊,就可以去網路上找找可用的鋰電池 ( 如果體積是問題的話 )。
  • 降壓穩壓電路板 ( LM2596 )
  • 整台小車使用一顆鋰電池供應電力,在樹莓派主機電力供應上,必須確保電壓穩定且電流夠大可持續供應,所以選用上 ( 以網頁中的小車配件使用上來說 ):電壓要可輸出或是可調到 5V,電流輸出可達 1A 以上,只要能達到需求並不一定要跟網頁中所使用的一樣;實際還是看外部裝置耗電量多寡來決定。
  • 排針、麵包板、杜邦線

準備好零件之後,就可以開始各個部分的接線與程式測試,分為下列幾個部分:


Note:程式撰寫使用 C 語言,並使用 wiringPi 函式庫。若系統中沒有的話,請上 wiringPi 安裝網頁 照網頁中的步驟安裝,或搜尋部落中的文章。


馬達驅動線路的接線:


L298N 馬達驅動板接線:

小車上的減速馬達使用過 DC 3V ~ 12V 做過測試,越高的供應電壓可以使用較低的 PWM Duty 就可以使小車行進;但相對的會使得穩壓電路在降壓時的壓差變大,造成穩壓晶片溫度上升,也會造成轉換效率的降低。

為了避免出現上述問題,且以後會再陸續加上其他東西,小車的續航力要能夠超過 1 個小時,因此小車的鋰電池 ( 7.4V / 2500 mA) 不需要選得非常大,只要夠續航至少兩個小時以上就可以了。

但在全部東西未全部測試完成之前,為了節省鋰電池的電力,建議先使用其他的電源供應器來作為馬達驅動板的驅動電源。像下面的照片就是只使用 DC 12V 的外接電源做為測試之用,記得將樹莓派接地線 ( 黃色線 ) 與馬達 GND 接在一起,所有的短路帽都使用 ( 也就是維持出廠值 )。

全部接好線之後,就可以準備開機進行測試.....慢 !!!

由於馬達轉速是利用 LPD8806 晶片來產生所需要的 PWM 信號,這 PWM 信號產生電路一但完成之後,只需要將 PWM 信號在接到馬達驅動板上就可以了,即便只是單純的正反轉,也可以一併操作,所以程式就一併寫好再做測試。



LPD8806 PWM 信號產生電路:

現在要做的就是,把 PWM 信號產生器電路線接好;若是對這顆晶片不熟的話,可以跳到 LPD8806 介紹網頁 ( 如下連結網址 ) 看使用說明。

連結:LPD8806 晶片的使用說明以及通訊格式的解釋

在 LPD8806 介紹的網頁中,燈串或是展示板所使用的電路常用恒流驅動模式,但是要使用在 PWM 脈衝信號產生電路時,必須使用外掛恆壓驅動模式 ( 就是去掉電晶體那一串電路 ),整個馬達驅動電路與樹莓派的接線圖如下所示。

LPD8806 與 L298N 馬達驅動模組接線圖
LPD8806 與 L298N 馬達驅動模組接線圖

上圖中,VIN 表示外接給 L298N 馬達驅動模組的外接電源,而 VCC 表示外接給晶片以及樹莓派的電源 ( DC 5V )。

還記得在 L298N 馬達驅動線路中的電路圖 (B) 嗎 ? 就是將 LPD8806 的 PWM 輸出訊號:OUT 1 和 OUT 2 ,分別接到 L298N 馬達驅動板 ENA 和 ENB 兩個接腳,就可以控制馬達的轉速。

如下圖所示:A 處若是接上短路帽,表示 L298N 馬達驅動板的馬達電源與板上電源都由外部電源供應,並經降壓晶片轉換為 5V 給板上電源做使用,那麼就不需要 B 處的接線,靠近 A 處的那條紅線也可以不用;但 A 處若是不接短路帽,表示馬達驅動的電源與系統電源分別使用兩個外接電源。使用上要特別注意一下,不要接錯了!

PWM 馬達驅動接線示意圖


馬達驅動電路測試:

馬達的轉向是由 IN1 ~ IN4 極性組合做控制;轉速則是由 ENA 與 ENB 配合 PWM 信號輸入做調整。兩個部分都可獨立控制與組合來變換小車的轉向與速度。因此在開始之前,請先確定已經了解 LPD8806 如何控制 LED 的亮度,然後再繼續往下做。

請輸入下面指令下載馬達測試程式 ( pwmotor.tar.gz ):

pi@raspberrypi ~/Codes $ mkdir L298N_LPD8806
pi@raspberrypi ~/Codes/L298N_LPD8806 $ wget -O - http://goo.gl/KaoeU7 | tar zxvf -
.... << 過程省略 >> ....
pi@raspberrypi ~/Codes/L298N_LPD8806 $ ls -l
總計 28
-rw-r--r-- 1 pi pi  220  Feb 12 00:01 pwm_lpd8806.h
-rw-r--r-- 1 pi pi 2688  Apr 23 15:47 pwm_lpd8806.o
-rwxr-xr-x 1 pi pi 9309  Apr 23 15:45 pwmotor
-rw-r--r-- 1 pi pi 5057  Apr 23 15:45 pwmotor_lpd8806.c
pi@raspberrypi ~/Codes/L298N_LPD8806 $

或使用下面連結下載

馬達測試程式下載 ( http://goo.gl/KaoeU7 )

  • pwm_lpd8806.h:pwm_lpd8806.c 的標頭檔。LPD8806 控制的函式都宣告在這裡。

  • pwm_lpd8806.o:pwm_lpd8806.c 的目的檔 ( Obj )。LPD8806 控制函式的編譯目的檔。

  • pwmotor:馬達測試程式編譯之後的執行檔。

  • pwmotor_lpd8806.c:馬達測試主檔案。

下載之後會有四個檔案:pwmotor_lpd8806.c 是主要檔案,可根據自己的需求加以修改。pwm_lpd8806.h 是用來控制 lpd8806 晶片輸出 pwm 訊號函式宣告的地方,使用的方法與 "LPD8806 晶片的使用說明以及通訊格式的解釋" 網頁上的說明一樣。

 pwm_lpd8806.h 中,有四個函式負責控制每個輸出通道的 PWM 值

1 void pwm_lpd8806_init(int sdi, int sclki, int init_status);
2 void pwm_lpd8806_set(int ch, int pwmvalue);
3 int  pwm_lpd8806_get(int ch);
4 void pwm_lpd8806_output(void);

pwm_lpd8806_init ( sdi, sclki, init_status ):sdi 和 sclki 是與樹莓派相接的 GPIO 接腳號碼;init_status 是設定所有的 PWM 通道 ( OUT1 ~ OUT 6 ) 設定的初始值,因為小車一開始是要在停止的狀態,init_status 可以為 0x00 或是 0x80 兩個數值皆可。

pwm_lpd8806_set ( ch, pwmvalue ):每個 PWM 通道在 output 前,可以使用此函示去設定每個通道不同的 PWM 輸出值。ch 是通道名稱,值為 1 ~ 6;pwmvalue 是 PWM 數值,範圍為 0 ~ 255,不過因為 LPD8806 PWM 輸出是 7-bit,輸入數值都要被轉換為 128 ~ 255,這樣子馬達輸出就會由慢至全速而不是全速到慢。使用方式可以看 pwmotor_lpd8806.c 的程式碼就會明白。

pwm_lpd8806_get ( ch ):獲得指定通道的 PWM 數值。回傳的 PWM 數值範圍在 128 ~ 255。

pwm_lpd8806_output ( ):輸出設定之後的 PWM 數值,每個通道都會一起輸出。

pwmotor_lpd8806.c 主程式,用來測試與控制兩個直流馬達的轉速以及轉向,一開始要先設定 樹莓派與 LPD8806 通訊以及 L298N 馬達驅動板的 IN 1 ~ IN4 連接的接腳號碼

1 #define CLOCKPIN    17
2 #define DATAPIN     4
3 
4 #define IN1     25  // Motor 1
5 #define IN2     24  // Motor 1
6 #define IN3     23  // Motor 2
7 #define IN4     18  // Motor 2

main () 一開始將 LPD8806 初始化,其內部程式碼也會一併將 wiringPi 函式庫初始化,所以不需要再做一次。初始化之後緊接著必須輸出執行 pwm_lpd8806_output() 函式,避免誤動作!

1     pwm_lpd8806_init(DATAPIN, CLOCKPIN, 0x80);
2     pwm_lpd8806_output();

接著設定馬達轉向控制接腳 ( IN1 ~ IN4 ) 為輸出,並將兩個馬達的轉向控制設置為停止狀態,就完成了初始化的所有動作。

然後進入到測試介面循環程式部分

 1     while(running)
 2     {
 3         printf("       DC Motor Testing  \n");
 4         printf("------------------------------\n"); 
 5         printf("\n");
 6         printf(" motor 1 speed: %d\n", pwm_lpd8806_get(1));
 7         printf("  1: motor 1, forward\n"); 
 8         printf("  2: motor 1, backward\n");
 9         printf("  3: motor 1, stop\n");
10         printf(" motor 2 speed: %d\n", pwm_lpd8806_get(2));
11         printf("  4: motor 2, forward\n"); 
12         printf("  5: motor 2, backward\n");
13         printf("  6: motor 2, stop\n");        
14         printf("\n");
15         printf("------------------------------\n");  
16         // 取得要調整的通道號碼
17         printf("Select: ");
18         scanf("%d", &choice);
19         fflush(stdin);
20         if(choice > 0 && choice < 7)
21         {
22             if(choice % 3 == 0)
23                 speed = 0;
24             else
25             {
26                 printf("The speed tuning between 0 - 255: ");
27                 scanf("%d", &speed);
28                 fflush(stdin);
29             }
30             if( choice < 4 )  m = 1; else m = 2; 
31             Motor(m, choice, speed | 0x80);            
32         }
33         else
34         {
35             running = 0;
36         }
37         system("clear");  
38     }
39     
40     printf("Done !!\n\n");
41     
42     return 0;
43 }

Line 31:馬達的控制程式,宣告在檔案的最上方。可以看到,速度的設定會將輸入範圍在 0 ~ 255 全部轉換為 128 ~ 255。

 1 enum MOTORDIRECTION { FORWARD=1, BACKWARD, STOP };
 2 
 3 enum MOTOR { LEFTMOTOR = 1, RIGHTMOTOR };
 4 
 5 void Motor(enum MOTOR motor, enum MOTORDIRECTION motordirection, int pwm)
 6 {
 7     switch(motordirection)
 8     {
 9         case 1:
10             MOTOR_1_FORWARD;
11         break;
12         case 2:
13             MOTOR_1_BACKWARD;
14         break;
15         case 3:
16             MOTOR_1_STOP;
17         break;
18         case 4:
19             MOTOR_2_FORWARD;
20         break;
21         case 5:
22             MOTOR_2_BACKWARD;
23         break;
24         case 6:
25             MOTOR_2_STOP;
26         break;
27     }
28     
29     if(pwm >= 0 && pwm < 256)
30     {
31         pwm_lpd8806_set(motor, pwm);
32         
33         pwm_lpd8806_output();
34     }
35 }

下面就是執行畫面:

速度輸入 62 ( or 190 )

都會轉換為 190。速度會由慢到快




整體接線與測試:

整個小車的接線就跟 LPD8806 PWM 驅動線路一樣,差別就是在輸入電源使用鋰電池作為馬達與樹莓派的輸入而已,如下所示就是將中間硬體實際接線拉近來看

小車整體接線示意圖

輸入下面指令下載小車控制程式

pi@raspberrypi ~/codes $ mkdir Car_Control
pi@raspberrypi ~/codes $ cd Car_Control/
pi@raspberrypi ~/codes/Car_Control $ wget -O - http://goo.gl/mpjNcC | tar zxvf -
 ... 過程省略 ...
pi@raspberrypi ~/codes/Car_Control $ ls -l
total 68
-rw-r--r-- pi/pi           432 2014-04-23 23:03 ez430watch.h
-rw-r--r-- pi/pi          4332 2014-04-24 16:00 ez430watch.o
-rwxr-xr-x pi/pi         16234 2014-04-25 13:39 ezCar8806
-rw-r--r-- pi/pi          5788 2014-04-25 13:38 ezCar8806.c
-rw-r--r-- pi/pi            70 2014-04-23 23:03 globaldefine.h
-rw-r--r-- pi/pi           385 2014-04-23 23:03 MotorDrive.h
-rw-r--r-- pi/pi          4667 2014-04-23 23:03 MotorDrive.c
-rw-r--r-- pi/pi           235 2014-04-24 18:18 pwmotor1109.h
-rw-r--r-- pi/pi          3552 2014-04-24 16:02 pwmotor1109.o
-rw-r--r-- pi/pi           234 2014-04-23 23:03 pwmotor8806.h
-rw-r--r-- pi/pi          2416 2014-04-24 16:01 pwmotor8806.o

pi@raspberrypi ~/codes/Car_Control $

所提供的程式以及使用說明如下

  • ez430watch ( .h, .o ):ez430watch 標頭檔與 OBJ 檔
  • ezCar8806:編譯後的主程式執行檔
  • ezCar8806.c:主檔案
  • globaldefine.h:全局變數的宣告
  • MotorDrive ( .h, .c ):馬達驅動程式的標頭檔以及原始碼
  • pwmotor1109 ( .h, .o ):LPD1109 作為 PWM 訊號輸出使用時的標頭檔
  • pwmotor8806 ( .h, .o ):LPD8806 作為 PWM 訊號輸出使用時的標頭檔

裝好線路之後就可以直接下 sudo ./ezCar8806 執行,看看使用 eZ430 運動手錶操作的情形。

如果要對程式做修改,下面就介紹各標頭檔以及函式的使用方法。

------

globaldefine.h 主要是除錯用的。如果不使用除錯功能,把下面這行註解掉就可以了。

1 #define DEBUG

------

ez430watch.h 取得 eZ430 運動手錶的加速度值,並做 pitch 和 roll 角度的計算後回傳。

 1 typedef struct accdata {
 2     uint16  x;
 3     uint16  y;
 4     uint16  z;
 5     uint8   sign_x;
 6     uint8   sign_y;
 7     uint8   sign_z;
 8     uint8   pitch;
 9     uint8   roll;
10 } ACCDATA;
11 
12 void  ez430watch_init( char * ttyname );
13 void  ez430watch_getaccel( ACCDATA *accdata );
14 void  ex430watch_close(void);

ez430watch_init( ttyname ):ez430 運動手錶初始化。ttyname 為指定 eZ430 Dongle 的 tty 名稱,預設是 /dev/ttyACM0 ;或是依實際系統所取得的名稱做設定。

ez430watch_close():關閉 ez430 運動手錶與系統的連接。

ez430watch_getaccel( accdata ):取得加速度相關的數據。使用之前必須先宣告一個結構指標,傳入之後程式就會回傳,其中:

  • x、y、z:取得的三軸加速度值再經過低通濾波器計算所得的數值,這可避免突然的數據變化,加速度值不會有突波的出現。
  • sign_x、sign_y、sign_z:將上面取得的三軸加速度值,轉換為有正負號的數值,這三個有符號數來判斷 eZ430 運動手表轉動的方向,藉以控制小車的轉向。
  • pitch、roll:分別是手錶前傾、後傾,左右轉動的角度值,並且用這兩個數值來控制馬達的轉向以及速度的設定。

詳細的 ACCDATA 結構數據所使用的方法,請參考 ezCar8806.c 程式碼。


------

pwmotor1109.h

1 void pwmotor1109_init(int sdi, int sclki, int initstatus);
2 void pwmotor1109_set(int ch, int pwmvalue);
3 int  pwmotor1109_get(int ch);
4 void pwmotor1109_send(void);

pwmotor1109_init ( sdi, sclki, initstatus)sdi  sclki 是與樹莓派相接的 GPIO 接腳號碼;initstatus 是設定所有的 PWM 通道設定的初始值,範圍在 0 ~ 255 ( 速度由慢到快 )。

pwmotor1109_set ( ch, pwmvalue ):每個 PWM 通道在 send 前,可以使用此函式去設定每個通道不同的 PWM 輸出值。ch 是通道名稱,值為 1 ~ 9;pwmvalue 是 PWM 數值,範圍為 0 ~ 255。

這邊值得注意的是 ( 這也是一般 LPD1109 燈串設定 LED 輸出時的要注意到的 ) 就是,ch 1 ~ 9 非別對應到 G1、R1、B1、R2、G2、B2、R3、G3、B3;RGB 排列對於第一與第二個 PWM 通道是不一樣的。這也是為什麼 LPD1109 的燈串在設定時,第一個像素點的紅色與綠色要對調設定的原因。

pwmotor1109_get ( ch ):取得指定通道的 PWM 數值。回傳的 PWM 數值範圍在 0 ~ 255。

pwmotor1109_send ( ):輸出設定之後的 PWM 數值,每個通道都會一起輸出。

------

pwmotor8806.h

1 void pwmotor8806_init(int sdi, int sclki, int initstatus);
2 void pwmotor8806_set(int ch, int pwmvalue);
3 int  pwmotor8806_get(int ch);
4 void pwmotor8806_send(void);

上面四個對於 LPD8806 的函式設定跟上節 "馬達驅動電路測試" 的說明相同,在此不加以贅述!

------

MotorDrive.h

 1 enum lpd{ LPD8806, LPD1109 };
 2 
 3 enum MOTORDIRECTION{ FORWARD = 1, BACKWARD, STOP };
 4 typedef struct motordrive {
 5                int speed;               
 6     enum MOTORDIRECTION dir;
 7 }MOTORDRIVE;
 8 
 9 void Motor_init( int sdi, int sclki, enum lpd pwmchip, int initstatus );
10 void Motor_run( MOTORDRIVE M1, MOTORDRIVE M2 );

MotorDrive 已經將 LPD8806 與 LPD1109 PWM 通道的驅動封裝在函式之中,因此在使用時不會直接用到,只要簡單的指定通訊接腳以及使用的 PWM 驅動晶片就可以做控制。

Motor_init( sdi, sclki, pwmchip, initstatus )sdi  sclki 是與樹莓派相接的 GPIO 接腳號碼;initstatus 是設定所有的 PWM 通道設定的初始值,初始值設定依照所使用的晶片而有所差異,請參照上面 LPD8806 與 LPD1109 的函式說明。

Motor_run( M1, M2 ): M1 與 M2 分別是小車兩顆馬達轉向與速度的設定,是一個結構的宣告,詳細的使用方法請參照 ezCar8806.c

------

ezCar8806.c這是小車控制的主程式檔,節錄其中重要的程式碼加以說明如下:

1 ACCDATA acc = {0};  /* 要初始化,不然馬達會亂動*/
2 MOTORDRIVE motL = { 0, STOP }; // speed, direction
3 MOTORDRIVE motR = { 0, STOP };

宣告三個全局變數作為取得加速度相關數據以及左右馬達的速度與轉向的控制,並做初始化的設定。

進入到 main ( ) 主函式之後,因為拿掉 LPD8806 與 LPD1109 先行對 wiringPi 初始化的動作,因此必須先對 wiringPi 函式庫做初始化成功後,再初始化 Motor 與 eZ430 運動手錶

 1     // 初始化 wiringPi,並使用 BCM_GPIO 的接腳號碼    
 2     if (wiringPiSetupGpio() == -1)
 3         exit(1);
 4     
 5     //// 馬達初始化
 6     //      - 初始化 PWM 晶片
 7     //
 8     Motor_init( DATAPIN, CLKPIN, LPD8806, 0x80 );
 9     
10     ez430watch_init("/dev/ttyACM0");

其中 DATAPIN 和 CLKPIN 定義為 GPIO #7 與 #8,可以依實際接線再做更改

1 #define CLKPIN      7
2 #define DATAPIN     8

eZ430 dongle 在樹莓派所抓到的裝置名稱為 /dev/ttyACM0,如果抓不到加速度值的資料時要去檢查一下是否裝置名稱與設定不一樣,自己再更改一下。

各裝置初始化都完成之後,就是進入到無窮迴圈裡 ( 要跳出就按下 Ctrl + C  ) 一直取出加速度相關數據,根據這些資料設定左右馬達的轉向以及速度並且作輸出。

程式裡考慮了四種情況:

  1. 行進中轉向
  2. 前進或後退
  3. 原地旋轉轉向
  4. 停止

但為了不要讓運動手錶的小偏移就讓小車有所動作,因此宣告了一個常數 GAP 來限定何時動作的邊界值,因此上述四種情況就可定義如下四個判斷條件式,

 1     while(running)
 2     {
 3         ez430watch_getaccel(&acc);
 4         
 5         // 使用 pitch and roll 資料來決定兩個輪子的轉速
 6         //  1. 行進中調整兩輪轉速以控制小車行進方向
 7         //  2. 靜止狀態下,小車做原地旋轉
 8         //
 9         // 考慮下面四種情況
10         //  1. pitch >  GAP && roll  > GAP : 行進中轉向
11         //  2. pitch >  GAP && roll <= GAP : 前進或後退
12         //  3. pitch <= GAP && roll  > GAP : 原地旋轉轉向
13         //  4. pitch <= GAP && roll <= GAP : 停止
14         if( ( abs( acc.pitch ) > GAP ) && ( abs( acc.roll ) > GAP ) )
15         {   // 行進中轉向
16             setmove();
17             setrotation();            
18         }
19         else if( ( abs( acc.pitch ) > GAP ) && ( abs( acc.roll ) <= GAP )  )
20         {   // 前進、後退            
21             setmove();            
22         }
23         else if( ( abs( acc.pitch ) <= GAP ) && ( abs( acc.roll ) > GAP ) )
24         {   // 原地旋轉,速度不要太快
25             if( acc.sign_y == 0 ) // 左轉
26             {
27                 // quadrant 1 and 2
28                 motL.dir    = BACKWARD;
29                 motR.dir    = FORWARD;
30                 motL.speed  = constrain( map(acc.roll, 0, 60, 128, 255), 
31                                             128,  255 );
32                 motR.speed  = motL.speed;
33             }
34             else if( acc.sign_y == 1 )
35             {                
36                 // quadrant 3 and 4
37                 motL.dir    = FORWARD;
38                 motR.dir    = BACKWARD;
39                 motL.speed  = constrain( map(acc.roll, 0, 60, 128, 255), 
40                                             128, 255 );
41                 motR.speed  = motL.speed;
42             }
43             else
44             {
45                 printf("\n\n Wrong direction and speed!!!\n");
46                 printf("x_sg=%d, y_sg=%d, z_sg=%d\n\n", acc.sign_x, 
47                                 acc.sign_y, acc.sign_z);
48             }
49         }
50         else
51         {   // 停止
52             motL.dir = STOP;
53             motR.dir = STOP;
54             motL.speed = 0;
55             motR.speed = 0;
56         }
57         
58         // send command to motor
59         // 
60         // only for lpd8806
61         motL.speed |= 0x80;
62         motR.speed |= 0x80;
63         #ifdef DEBUG
64             printf(", motL.s=%3d, motR.s=%3d \r", motL.speed, motR.speed);
65         #endif
66         Motor_run( motL, motR );        
67     }

不同的條件成立之後,就是開始設定馬達的轉向以及速度,最後再將速度值轉換為 LPD8806 可接受的範圍 128~ 255 驅動馬達,就完成了整個小車的控制。

最後,若是有修改程式碼要重新編譯,編譯的指令如下:

sudo gcc pwmotor8806.o pwmotor1109.o ez430watch.o MotorDrive.c ezCar8806.c -lm -lwiringPi -o ezCar8806

以上,希望這篇文章能幫助到有需要的人!


<< eZ430-Chronos-Watch 部落格系列文章 >>


.

.


<<部落格相關文章>>


.

.

2 則留言:

  1. 請問:
    小車底板,包括:

    2 組 [ 直流減速馬達 ] ( 減速比 48:1 )

    2 個 [ 車輪 ]

    壓克力底盤

    其餘固定配件 ( 螺絲、螺帽、六角柱... 等 )
    這個有package再賣嗎?

    回覆刪除
  2. 沒有 ! 只是剛好手邊有,拿來做馬達驅動板與 LED 驅動晶片的介紹。

    回覆刪除

留言屬名為"Unknown"或"不明"的用戶,大多這樣的留言都會直接被刪除掉,不會得到任何回覆!

發問問題,請描述清楚你(妳)的問題,別人回答前不會想去 "猜" 問題是什麼?

不知道怎麼發問,請看 [公告] 部落格提問須知 - 如何問問題 !