Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 4930|回復: 11
打印 上一主題 下一主題

mArduino Library

[複製鏈接]
跳轉到指定樓層
1#
發表於 2011-12-27 13:40:14 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最後由 coopermaa 於 2011-12-27 13:42 編輯

分享一下我最近寫的 mArduino Library:

https://github.com/coopermaa/mArduino

mArduino Library 可以讓你控制 I2C bus 上其它台 Arduino,做 pinMode(),
digitalRead(), digitalWrite(), analogRead(), analogWrite() 等動作

I2C bus 串接圖如下:



Slave 用這個程式,可以自行設定 address:


  1. // General_slave.ino
  2. // Refer to master examples for use with this
  3. #include <Wire.h>          // You need to include both Wire.h and mArduino.h
  4. #include "mArduino.h"

  5. const int SLAVE_ADDRESS = 1;

  6. void setup()
  7. {
  8.   mArduino(SLAVE_ADDRESS);    // join I2C bus as a slave with address 1
  9. }

  10. void loop()
  11. {
  12. }
複製代碼



Master 範例::


  1. /*
  2.   Blink - I2C master
  3.   Turns on slave's LED on for one second, then off for one second, repeatedly.
  4.   The slave is connected with master using I2C bus.
  5. */

  6. #include "Wire.h"      // You need to include both Wire.h and mArduino.h
  7. #include "mArduino.h"

  8. const int SLAVE_ADDRESS = 1;
  9. const int ledPin = 13;

  10. void setup()
  11. {
  12.   mArduino();            // join I2C bus as a Master   
  13.   pinMode(SLAVE_ADDRESS, ledPin, OUTPUT);  
  14. }  

  15. void loop() {
  16.   digitalWrite(SLAVE_ADDRESS, ledPin, HIGH);
  17.   delay(100);
  18.   digitalWrite(SLAVE_ADDRESS, ledPin, LOW);
  19.   delay(100);
  20. }
複製代碼

這支 Master 會控制 Slave 的 pin 13,做出 Blink 的效果。
程式的寫法跟 Arduino 原來的 API 幾乎是一致的,只是在呼叫 pinMode(), digitalWrite()
這些函式的時候多了一個 slave_address 的參數。

其它範例可以參考我部落格的說明:
http://coopermaa2nd.blogspot.com/2011/12/marduino-arduino-i2c.html
2#
發表於 2011-12-27 20:59:03 | 只看該作者
很好的 Library,
可惜你這個方式連線,
不能用在Arduino MEGA,
你知道為什麼嗎?
3#
 樓主| 發表於 2011-12-27 23:19:17 | 只看該作者
為什麼?
是不是因為 Arduino MEGA 的 I2C 腳位不一樣?
4#
 樓主| 發表於 2011-12-27 23:23:44 | 只看該作者
我沒有 Arduino Mega,不知道 Mega 有沒有要注意的地方
不過,我看 Mega 的 SDA 是在 pin 20, SCL 是在 pin 21
所以是不是這樣就接就好了?
5#
發表於 2011-12-28 20:42:29 | 只看該作者
回復 4# coopermaa


如果是Arduino Duemilanove跟 arduino mega連,
中間的紅色線可以去掉:

不過我手上也沒Arduino Duemilanove,
沒辦法證實,僅供參考.
6#
發表於 2011-12-28 22:32:31 | 只看該作者
本帖最後由 pizg 於 2011-12-28 22:35 編輯

感謝Cooper Maa提供這麼棒的Libraries.

Master可以對Salve下指令,
那麼Slave如何回傳訊息給Master?

有線傳輸距離是多少米?
7#
 樓主| 發表於 2011-12-29 09:09:16 | 只看該作者
回復  coopermaa


如果是Arduino Duemilanove跟 arduino mega連,
中間的紅色線可以去掉:

不過我 ...
vegewell 發表於 2011-12-28 20:42


我有拿一台 Uno 跟 Duemilanove  試過
Common Vcc 那條好像是可有可無的
Common Ground 就不能沒有

謝謝 vegewell
8#
 樓主| 發表於 2011-12-29 09:17:58 | 只看該作者
回復 6# pizg

謝謝。

Wikiepedia上說,「受限於 400 pF 電容值,I2C 有效傳輸距離只有幾個 meter」
網路上找到一個 I2C bus extender, 據說最大可以把 i2C 傳輸距離延長到 50 meter
9#
 樓主| 發表於 2011-12-29 09:20:38 | 只看該作者
感謝Cooper Maa提供這麼棒的Libraries.

Master可以對Salve下指令,
那麼Slave如何回傳訊息給Master?

...
pizg 發表於 2011-12-28 22:32


I2C-bus 是 Master Slave 的架構,Slave 沒辦法主動傳訊息給 Master.. (應該是這樣吧!?)

其實在 mArduino library 中,slave 也會傳資料給 Master
當 Master 下 digitalRead 或 analogRead 指令的時候
Slave 接著收到 request 就會把資料傳給 Master, 只是 Slave 是被動的
nichal 該用戶已被刪除
10#
發表於 2011-12-30 15:36:29 | 只看該作者
回復 9# coopermaa


玩過紅蘿蔔蹲嗎?
把主控權丟出去就可以讓Slave與Master互換
雖然架構上不變(還是由Master發到Slave)
但是Master會變成另一片板子
有興趣可以試試看~~~
11#
發表於 2012-1-1 11:38:06 | 只看該作者
回復  coopermaa


玩過紅蘿蔔蹲嗎?
把主控權丟出去就可以讓Slave與Master互換
雖然架構上不變(還是由 ...
nichal 發表於 2011-12-30 15:36



您這個idea很棒,
那麼當Master把控制權丟給Salve1時,
是不是也要把"轉移控制權"這件事告訴Slave2~SlaveN?
好讓其它Slave也知道主控權已經轉移了.

前輩您能不能再多一些提示,
在實際撰寫程式時該如何做?
nichal 該用戶已被刪除
12#
發表於 2012-1-2 09:26:43 | 只看該作者
不需要唷~~~
slave從來都不需要知道master是誰的!!
因為會發指令的就一定是master
唯一的重點就是

master把控制權丟出去後
要確認對方有回應變成master了
然後自己再切換到slave模式
而且自己也要有一個ID


這樣的架構
可以避開master死掉就一整個系統不動作的情況
但是如果沒寫好
就會變成有兩個甚至三個master同時運作
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-5-3 19:39 , Processed in 0.115886 second(s), 10 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表