2014年6月11日 星期三

用Attiny84A做I2C伺服馬達擴充模組

在使用Arduino Uno + Spider L3S WiFi模組做伺服馬達控制時,因為Atmega328P中斷架構的關係,會讓WiFi模組影響Arduino伺服馬達的Library,讓馬達控制訊號產生Jitter使得馬達抖動。

為了解決這個問題,外掛一顆小MCU專門處理伺服馬達的控制訊號是最簡單的方式了。所以這篇我將介紹如何使用Arduino環境搭配Attiny84A製作I2C伺服馬達擴充模組。

整個擴充模組的概念如下圖所示:



工作也很單純,只是將Arduino送過來的I2C訊號透過Attiny84A與程式轉成控制訊號,接下來只要按照這個架構,把硬體與軟體搭建起來即可成功。

環境需求:
1. Arduino IDE 1.5以上的版本
2. Attiny84A DIP * 1
3. Arduino Uno一片
4. 杜邦跳線數條
5. 麵包板一片
6. Fablab切好的PCB(也可直接在麵包板上接好)


環境架設步驟:
1. 到Github下載資料,並且將zip檔案解壓縮

2. 將Arduino Uno燒錄Arduino ISP的範例程式(參考這篇的把Arduino變成燒錄器這段),並藉由麵包板將Attiny84A與Arduino的腳位互相連接,連接方式為:
  • ATtiny84A Pin 14 接到 Gnd
  • ATtiny84A Pin 1 接到 +5V
  • ATtiny84A Pin 4 (Reset Pin) 接到 Arduino Pin 10
  • ATtiny84A Pin 7 接到 Arduino Pin 11
  • ATtiny84A Pin 8 接到 Arduino Pin 12
  • ATtiny84A Pin 9 接到 Arduino Pin 13
3. 開啟Arduino IDE,並且將IDE的sketchbook location設定到...\TinyServo\sketches路徑下
4. 重新開啟Arduino IDE,設定Tools=>Boards為Attiny84A @ 8Mhz

5. 設定Tools=>Programmer為Arduino as ISP
6. 選擇Tools=>Burn Bootloader,燒錄Attiny84A的Fuse,這樣Attiny就能正確地跑在8Mhz的頻率了。
7. 選擇File=>Sketchbook=>I2C_ServoExp程式

8. 直接將程式upload進Attiny84A

9. 按照...\TinyServo\fabrication\Tiny_Servo_schematic.pdf線路圖接好線路,就可以透過I2C控制Servo motor了。

以上為環境的建立過程,接下來簡單敘述一下要如何對IC下命令,目前IC有支援三個命令,分別為:

1.設定伺服馬達角度,透過Arduino wire.h下命令的範例為:
unsigned int pos = 0;
union{
 unsigned int u16;
 unsigned char u8[2];
}u16_u8;


u16_u8.u16 = pos;
Wire.beginTransmission(0x20); // 傳輸位址為0x20
Wire.write(0x01);             // 設定馬達角度0x01
Wire.write(0x07);             // 設定第8顆馬達
Wire.write(u16_u8.u8[0]);     // 角度設定低位
Wire.write(u16_u8.u8[1]);     // 角度設定高位
Wire.endTransmission();    // 停止傳輸


2.設定伺服馬達最低PPM訊號,透過Arduino wire.h下命令的範例為:
unsigned int lowppm = 600;
union{
 unsigned int u16;
 unsigned char u8[2];
}u16_u8;


u16_u8.u16 = lowppm ;
Wire.beginTransmission(0x20); // 傳輸位址為0x20
Wire.write(0x11);             // 設定馬達最小PPM 0x11
Wire.write(0x07);             // 設定第8顆馬達
Wire.write(u16_u8.u8[0]);     // 最小PPM設定低位
Wire.write(u16_u8.u8[1]);     // 最小PPM設定高位
Wire.endTransmission();    // 停止傳輸


3.設定伺服馬達最大PPM訊號,透過Arduino wire.h下命令的範例為:
unsigned int highppm = 2400;
union{
 unsigned int u16;
 unsigned char u8[2];
}u16_u8;


u16_u8.u16 = highppm;
Wire.beginTransmission(0x20); // 傳輸位址為0x20
Wire.write(0x12);             // 設定馬達最大PPM 0x12
Wire.write(0x07);             // 設定第8顆馬達
Wire.write(u16_u8.u8[0]);     // 最大PPM設定低位
Wire.write(u16_u8.u8[1]);     // 最大PPM設定高位
Wire.endTransmission();    // 停止傳輸

這樣主機就可以透過I2C設定Attiny84A腳位的PPM訊號,只要將伺服馬達接上去就會動了。



沒有留言:

張貼留言