Robofun 機器人論壇

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

RF電路 兩片板子不接同一台PC 傳輸距離變得很短

[複製鏈接]
跳轉到指定樓層
1#
發表於 2013-6-8 13:45:11 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
前情提要:
我想要設計微波電路,讓兩片Arduino板子可以溝通 (我是用Uno)
目前買了這個東西 http://tinyurl.com/k54ehem (益眾科技 - 27MHz ASK RF 數據傳輸模組  型號A06-0001)
然後利用 http://www.glacialwanderer.com/hobbyrobotics/?p=291 的程式及電路
我把兩片Arduino板子用USB連接線,接在同一台PC上,工作狀況良好
有超過1.5公尺的傳輸距離 ((因為我USB線長度有限,不知道更大可以多少

目前問題:
但是,如果我把其中一片Arduino板子的供電改為 "另一台電腦" 或是 "電池"
他的傳輸距離就會突然變得超級短,大概只有10公分以內
我另外再接了一條50歐姆、一公尺的傳輸線之後,才大概有一公尺半的傳輸距離
想請問有沒有人知道這是怎麼樣的狀況呢?


先謝謝大家指教!!!!!



隨文附上使用的 Code


主程式
  1. // Maurice Ribble
  2. // 8-30-2009
  3. // http://www.glacialwanderer.com/hobbyrobotics
  4. // Used Arduino 0017
  5. // This is a simple test app for some cheap RF transmitter and receiver hardware.
  6. // RF Transmitter: http://www.sparkfun.com/commerce/product_info.php?products_id=8945
  7. // RF Receiver: http://www.sparkfun.com/commerce/product_info.php?products_id=8948

  8. // This says whether you are building the transmistor or reciever.
  9. // Only one of these should be defined.
  10. //#define TRANSMITTER
  11. #define RECEIVER

  12. // Arduino digital pins
  13. #define BUTTON_PIN  2
  14. #define LED_PIN     13

  15. // Button hardware is setup so the button goes LOW when pressed
  16. #define BUTTON_PRESSED LOW
  17. #define BUTTON_NOT_PRESSED HIGH

  18. void setup()
  19. {
  20.   pinMode(BUTTON_PIN, INPUT);
  21.   pinMode(LED_PIN, OUTPUT);
  22.   digitalWrite(LED_PIN, LOW);

  23.   Serial.begin(300);  // Hardware supports up to 2400, but 1200 gives longer range
  24. }

  25. #ifdef TRANSMITTER
  26. void loop()
  27. {
  28.   static int prev_button = BUTTON_NOT_PRESSED;  // Previous button press value
  29.   int        cur_button;                        // Current button press value

  30.   cur_button = digitalRead(BUTTON_PIN);

  31.   if ((prev_button == BUTTON_NOT_PRESSED) && (cur_button == BUTTON_PRESSED))
  32.   {
  33.     writeUInt(271); // Put any number you want to send here (71 is just a test)
  34.   }

  35.   delay(50); // Debounce button
  36.   prev_button = cur_button;
  37. }
  38. #endif //TRANSMITTER

  39. #ifdef RECEIVER
  40. void loop()
  41. {
  42.   boolean light_led = false;

  43.   if (readUInt(true) == 271) // Check to see if we got the 71 test number
  44.   {
  45.     light_led = true;
  46.   }
  47.   
  48.   if (light_led)
  49.   {
  50.     digitalWrite(LED_PIN, HIGH);
  51.     delay(1000);
  52.     digitalWrite(LED_PIN, LOW);
  53.   }
  54. }
  55. #endif //RECEIVER
複製代碼




Error_Catching
  1. // Maurice Ribble
  2. // 8-30-2009
  3. // http://www.glacialwanderer.com/hobbyrobotics
  4. // Used Arduino 0017
  5. // This does does some error checking to try to make sure the receiver on this one way RF
  6. //  serial link doesn't repond to garbage

  7. #define NETWORK_SIG_SIZE 3

  8. #define VAL_SIZE         2
  9. #define CHECKSUM_SIZE    1
  10. #define PACKET_SIZE      (NETWORK_SIG_SIZE + VAL_SIZE + CHECKSUM_SIZE)

  11. // The network address byte and can be change if you want to run different devices in proximity to each other without interfearance
  12. #define NET_ADDR 5

  13. const byte g_network_sig[NETWORK_SIG_SIZE] = {0x8F, 0xAA, NET_ADDR};  // Few bytes used to initiate a transfer

  14. // Sends an unsigned int over the RF network
  15. void writeUInt(unsigned int val)
  16. {
  17.   byte checksum = (val/256) ^ (val&0xFF);
  18.   Serial.write(0xF0);  // This gets reciever in sync with transmitter
  19.   Serial.write(g_network_sig, NETWORK_SIG_SIZE);
  20.   Serial.write((byte*)&val, VAL_SIZE);
  21.   Serial.write(checksum); //CHECKSUM_SIZE
  22. }

  23. // Receives an unsigned int over the RF network
  24. unsigned int readUInt(bool wait)
  25. {
  26.   int pos = 0;          // Position in the network signature
  27.   unsigned int val;     // Value of the unsigned int
  28.   byte c = 0;           // Current byte
  29.   
  30.   if((Serial.available() < PACKET_SIZE) && (wait == false))
  31.   {
  32.     return 0xFFFF;
  33.   }
  34.   
  35.   while(pos < NETWORK_SIG_SIZE)
  36.   {
  37.     while(Serial.available() == 0); // Wait until something is avalible
  38.     c = Serial.read();

  39.     if (c == g_network_sig[pos])
  40.     {
  41.       if (pos == NETWORK_SIG_SIZE-1)
  42.       {
  43.         byte checksum;

  44.         while(Serial.available() < VAL_SIZE + CHECKSUM_SIZE); // Wait until something is avalible
  45.         val      =  Serial.read();
  46.         val      += ((unsigned int)Serial.read())*256;
  47.         checksum =  Serial.read();
  48.         
  49.         if (checksum != ((val/256) ^ (val&0xFF)))
  50.         {
  51.           // Checksum failed
  52.           pos = -1;
  53.         }
  54.       }
  55.       ++pos;
  56.     }
  57.     else if (c == g_network_sig[0])
  58.     {
  59.       pos = 1;
  60.     }
  61.     else
  62.     {
  63.       pos = 0;
  64.       if (!wait)
  65.       {
  66.         return 0xFFFF;
  67.       }
  68.     }
  69.   }
  70.   return val;
  71. }
複製代碼

2#
發表於 2013-6-12 03:44:42 | 只看該作者
回復 1# kaiwen789

>>想請問有沒有人知道這是怎麼樣的狀況呢?
會不會是電力不足?
另外地線有沒有連接也要考慮
3#
 樓主| 發表於 2013-6-13 09:22:42 | 只看該作者
呼我自己解決了XD
我想應該是Phase Lock Loop的問題

我原本以為是微波的Phase Lock
但後來想想微波應該是在接收器上面就有做Phase Lock
所以應該是電路Clock的Phase Lock

總之解法就是改用下方這個網站的函式庫就解決了XD
http://www.airspayce.com/mikem/arduino/

也謝謝vegewell網友的回覆=P
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2025-1-31 18:48 , Processed in 0.269919 second(s), 7 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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