2015年6月12日 星期五

Linkit one 上面常見的問題

一樣,整理一下作為筆記使用

1.Conctructure 不能再Setup以前使用

      EX: Adafruit MAX31855 library當中,硬體的設定是在constructure裡面設定的
             Linkit one 會出問題,但是把這段code移動到setup就好

2.Timming 不準
      由於Linkit one 上面跑的是RTOS,對於Arduino的Code會被Driver中斷,所以要在Arduino code裡面做到us等級的delay是不準的(還是可以試試)
    
   EX:DHT11,22 用Adafruit的話需要改
          
                                           DHT dht(DHTPIN, DHTTYPE, 13);

       但是就算是改過了,出錯率還是很高,所以不建議Linkit one的Arduino code拿來刻時序要求很精準的通訊.(然後順便婊一下,DHTXX真的很爛,我的觀察啦,我不喜歡用

3.Analog速度的問題
     Linkit one上面Analog不快,大概20ms,所以也不建議拿內建的Analog pin做示波器等級的東西,但是SPI速度超級快(他的基頻高),所以真的要快速的ADC,Ti有很多選擇,用SPI接上就好

4.I2C一次只能送8byte
    如標題,就是在Start後面最多8 byte,但是可以送Repeat Start
5.delay(1)沒有作用
    因為底層的RTOS systick是4.12ms,所以delay(5)以下其實因為小數點的關係會變成delay(0)
    導致delay(1~4)沒有作用,解決辦法就是改用delayMicroseconds(1000)

還有的話這篇文會增加,有解決的話會附註


2015年6月7日 星期日

Bluetooth Sensor node

其實這東西就是LMX9838 + Atmega32U4,也就是Arduino Leonardo

之所以會用LMX9838其中一個理由是因為這東西很小,這一整組不過十元硬幣的大小,
再來就是為啥會用BT 2.0了,因為這個裝置的目標是快速地把資料採樣,所以BLE的速度太慢了,每20ms 20byte絕對不夠用的,所以用傳統的Bluetooth來傳資料.

另外這個東西還有鋰電池充電器,所以上面那個插頭可以直接接鋰電池然後用USB充電這樣,
PCB:https://github.com/will127534/LMX9838-Arduino-board




2015年5月8日 星期五

HDD Motor Driver

總之這是一個三相無刷馬達的控制器,和電變有點像,
不過有幾個地方不一樣:

1.我用的是DRV11873,最大電流2A,電壓12V
2.用Attiny直接輸出PWM

大概就這兩點不一樣,因為硬碟馬達沒有受力的情形下其實電流非常小(不到0.01A)
所以其實用不著買電變來用,自己做一個小小張的就可以了,順帶一提這PCB忘了接最重要的PWM....所以你可以看到有條飛線在那邊

至於為啥不用NE555來生PWM,理由是因為我懶得畫了XDDD
而且Attiny24一個10元買太多了要消耗掉一些才行






2015年5月7日 星期四

FDC1004 With Arduino (Linkit one)



        FDC1004是Ti出的 I2C 電容測量ADC,使用起來滿方便的,體積也很小
        之後應該會拿來做一些Project
       
        電路方面很簡單,I2C和電源(3.3V)接起來就好



我現在的設定是200 sample/s , 4ch , continuous sampling , no offset/gain
Code 如下:

#include <Wire.h> 


int FDAddress = B1010000;


void setup() 

Serial.begin(115200);         

Wire.begin();      

    initFD();    
Serial.println("Setup");


void loop() 
{
  Serial.println(" ===========================================");
       
  for(int i=0; i<4; i++){
        uint32_t cap = ((read2byte(0x00+i*2)<<16)+read2byte(0x01+i*2))>>8;

        Serial.print("Input ");
        Serial.print(i);
        Serial.print(" ==> ");
        Serial.print(cap,HEX);
        Serial.print(" ==> ");
        Serial.print(cap/65536.0,5);
        Serial.println(" pf");


}
   Serial.println(" ===========================================");
        delay(1000);  
}





void initFD(){
for(int i=0; i<4; i++){
    write2byte(0x08+i,0x1C00+0x2000*i);
}
 write2byte(0x0c,0x5F0);  //All enable rate = 100


}

uint16_t read2byte(uint8_t address) {

Wire.beginTransmission(FDAddress);
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(FDAddress, 2);
uint16_t data = Wire.read();
        data = (data<<8)+Wire.read();
return data;
}

void write2byte(uint8_t address,uint16_t data) {

Wire.beginTransmission(FDAddress);
Wire.write(address);
    Wire.write(data>>8);
    Wire.write(data);
Wire.endTransmission();

}