###### tags: `js-iot` 返回[電子電路實驗與JavaScript物聯網應用](/s/8Q89ww-EQlOg8zy7XSTlCw) # PCA9685、I²C與伺服馬達 **這節將介紹可以一次控制多個輸出的PCA9685,認識其通訊所使用的I²C通訊協定,以及PWM是如何控制伺服馬達運作。** ## 什麼是 PCA9685 ? <center><img src="https://i.imgur.com/xVBJiNf.jpg " width="80%"></img></center> <br> PCA9685是採用**I²C通訊介面**的**16路PWM產生器**,解析度為**12bit**,開關**頻率為24 Hz到1526 Hz**。 雖然具備16路的PWM,但**16路的頻率無法單獨設置**,只能調整各路的duty cycle,所以比較適合應用在**固定頻率但需調整PWM占空比的LED亮度調整**或採用**多軸小型伺服馬達**的機器人。 PCA9685包含一個帶有**內置時鐘的I²C控制PWM驅動器**,每次設置皆會**保持最後一次所設置的參數運作**,**無需連續發送訊號控制**。 :::warning :zap: 圖中左側VCC供電屬邏輯電路電源,在LAB中使用3.3V,而上方V+對應到下方的V+,為供應伺服馬達的電源,在LAB實作中使用12V。 ::: :::info :globe_with_meridians: 參考資訊 - [16路12bit PWM控制器PCA9685](https://frank1025.pixnet.net/blog/post/349725877-%5Barduino-013%5D-16%E8%B7%AF12bit-pwm%E6%8E%A7%E5%88%B6%E5%99%A8pca9685) - [PCA9685 16 Channel 12 Bit PWM Servo Driver](http://wiki.sunfounder.cc/index.php?title=PCA9685_16_Channel_12_Bit_PWM_Servo_Driver) ::: ## 什麼是I²C?  **I²C(Inter-Integrated Circuit)** 是**內部整合電路**的稱呼,是一種**串列通訊匯流排**,由Philips公司在1980年代為了讓主機板、手機及嵌入式系統用以連接低速周邊裝置而發展,主要應用在board-to-board,它的設計並**不能應用到長距離裝置的通訊**。不過,I2C bus 可以被**應用在各種控制架構**上,如系統管理匯流排(System Management Bus, SMBus)、電源管理匯流排(Power Management Bus, PMBus)、智慧平台管理介面(Intelligent Platform Management Interface, IPMI)、顯示數據通道(Display Data Channel, DDC)、先進電信運算架構(Advanced Telecom Computing Architecture, ATCA)。 I²C的參考設計使用一個**7位元長度**的位址空間但**保留了16個位址**,所以在一組匯流排**最多可和112個節點通訊**。常見的I²C匯流排**依傳輸速率的不同而有不同的模式**:標準模式(100 Kbit/s)、低速模式(10 Kbit/s),但時脈頻率可被允許下降至零,這代表可以暫停通訊。而新一代的I²C匯流排可以和更多的節點(支援10位元長度的位址空間)以更快的速率通訊:快速模式(400 Kbit/s)、高速模式(3.4 Mbit/s)。 :::info :bulb: I²C的正確讀法為「I平方C」("I-squared-C"),而「I二C」("I-two-C")則是另一種錯誤但被廣泛使用的讀法。 ::: :::info :globe_with_meridians: 參考資訊 - [I2C - 成大資工Wiki](http://wiki.csie.ncku.edu.tw/embedded/I2C) - [I2C協定原理簡介](https://makerpro.cc/2019/12/intro-to-inter-integrated-circuit/) ::: ## PWM如何控制伺服馬達? <center><img src="https://i.imgur.com/JdbAYJZ.jpg" width="70%"></img></center> <br> 在[PWM與電晶體](/s/iBzaKT_rQb2OzkyF3FJLwA)這個章節中提到PWM是透過**類比訊號轉換成數位訊號**,在**一定的週期內調整PWM的脈波寬度**,而改變輸出的功率。 LAB中所使用到的伺服馬達為**MG996R**,使用**50HZ**的控制頻率,脈寬為**0.5ms ~2.5ms**,**12位元解析度(4096)**,相關精度計算如下: - PWM週期: 1/50 sec = 0.02s = 20ms = 20000us - 時間解析度:20000 us / 4096 = 4.88us - 最大與最小脈寬時間差:2.5ms - 0.5ms = 2ms = 2000us - 最大脈寬時間可分的份數:2000us / 4.88us = 410 - 0-180度的舵機,角度解析度:180度 / 410 = 0.439度 以下圖來看在一個週期內波的寬度對伺服馬達的影響,脈寬為1(0.5)ms時馬達轉角為0度,脈寬為2(2.5)ms時馬達轉角為180度,故脈寬為1.5ms時馬達轉角為90度。  (圖片來源:[howtomechatronics](https://howtomechatronics.com/how-it-works/how-servo-motors-work-how-to-control-servos-using-arduino/)) :::info :globe_with_meridians: 參考資源 - [PCA9685控制Servo伺服馬達](https://atceiling.blogspot.com/2019/10/arduino74pca9685servo.html) - [MG996R DataSheet](https://www.electronicoscaldas.com/datasheet/MG996R_Tower-Pro.pdf) ::: <a class="btn btn-warning" style="width:100%;color:#333333;" href="/s/9ntHyjh0RBWR2NewpjNQLw" role="button"> LAB04 - 控制二軸機械手臂 **⇨** </a> <a class="btn btn-primary" style="width:100%;" href="/s/W436RjpIQQCR6mynrvVRGA" role="button"> **⇦** LAB03 - 電晶體與呼吸燈 </a>
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up