前往
大廳
主題

關於我事隔兩年又繼續玩nRF24L01的故事

| 2024-04-29 01:22:44 | 巴幣 0 | 人氣 55

經過了一年快兩年
高中畢業了 升上大學
沒繼續比專題比賽
但是進到了機器人實驗室

而我們這組比的是「遙控組」
且使用無線遙控的方式操作
所以我又繼續玩nRF24L01了

不過這次因為之前已經有玩過一整年了
相較於之前 十分熟悉它的特性了
所以在除錯上面時間花的非常少
更甚至我發現了不會讓資料產生「位移」的寫法

由於Arduino 是利用C++的架構寫的
所以我可以利用 struct 來進行資料的「打包」
像是這樣:

struct SomeData {
  byte A;    
  byte B;
  int C;
};
SomeData data;

//中間省略

void loop() {
  radio(data);
}
void radio(SomeData &data) {
  rf24.write(&data, sizeof(SomeData));
}

這樣我就可以一次傳送多筆資料
在接收端那裡收導資料之後
再進行資料調用

struct SomeData {
  byte A;    
  byte B;
  int C;
};
SomeData data;

//中間省略

void loop() {
  if (rf24.available(&pipe)) {
    rf24.read(&data, sizeof(data));
  }
  
Serial.print(data.A);
Serial.print(data.B);
Serial.println(data.C);
}

這樣子在從機的序列埠中
就會顯示從主機傳來的A、B、C的值
而且不會有資料錯亂的問題發生

雖然說 在我發現這種寫法之前
實驗室的學長有跟我說了一個非常陰間的除錯方法
就是將傳送的值
用非常誇張的範圍隔開
再從從機去做 if 修正

但是這樣能傳送的值就會少很多
而且你的從機的程式也會不好維護
像是這樣:

if (A == 9000 && B != 9000) {
  //假如A是功能判斷
  //就把A的值放到功能判斷
  //B放到另外一個地方
} else if (A != 9000 && B == 9000) {
  //假如A是功能判斷
  //就把B的值放到功能判斷
  //A放到另外一個地方
}

(另一個值最大就255)
可讀性極低
非常不好維護
但是在資料少的時候
不得不說 真的有效


想要看元件的 可以到這邊
雖然那也不是在教學

不過如果真的想看我的教學
可以說一下 我應該會整理整理
從接線、Uno板、Mega板 到我遇到的所有問題
但是我只會些許的提到
因為對我來說
能使用就行
所以我沒有深入去了解過Arduino的開發板跟nRF24L01這顆晶片


創作回應

更多創作