2015年8月29日 星期六

如何使用Arduino 替代 NI USB-6501 DAQ

#Arduino
#DAQ
#Labview
#Arduino UNO
#NI USB-6501

如何使用Arduino 替代 NI USB-6501 DAQ
所需的硬體以及軟體如下:
Arduino UNO
USB to TTL
Arduino IDE
USB to TTL驅動程式
LABVIEW
2011年版本。

這一個Project 最主要的目的是要使用Arduino取代NI USB6501 DAQ
使用Arduino的方案可以節省許多成本。
Labview主程式碼如下圖:

步驟:
1.      建立Arduino的串列埠使他可以透過RS232通信界面藉由USB to TTLLABVIEW溝通。
所需的設定如下:
在這個專案中我設定的鮑率是每秒115200 bits
2.      撰寫 LABVIEW通信的函數
Labview是一種資料流概念的程式語言所以一定要記得下列步驟:
打開-->讀/寫-->關閉
將料寫入RS232送到Arduino
關閉RS232 COM  port

Receive_data :接受來自於LABVIEW的通信命令。
Test_do_data : 處理命令的工作。
/*
Program by Lee Chin Wei
Date : 2015-06-29
這是使用Labview 控制Arduino 來取代NI 的DAQ
Port D 為輸出數位IO
prot C 為類比輸入IO
通信格式:
0x55,0xAA,0xXX,0xXX

*/
#include
//#include // IIC communication 
//#include // LCD 

//#define A0_Command  0x10   //A0采集命令字
//#define A1_Command  0x11   //A1采集命令字
//#define D0_Command  0x20   //D0采集命令字
//#define D1_Command  0x21   //D1采集命令字
#define portb_output 0x0b
#define portc_input 0x0c
#define portd_output 0xd

byte comdata[4]={0};      //定义数组数据,存放串口接收数据

int AD_Value=0;          //AD转换后的数字量
float float_AD_Value;    //数字量换算成浮点电压量
int D_Value=0;           //数字量测量的数据
byte PB_data = 0;
byte PD_data = 0;
byte PC_data = 0;
byte PCACK = 0;
byte comport = 0;
byte pdata = 0;
//LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address定義LCD的腳位

void receive_data(void);      //接收串列資料
void test_do_data(void);         //測試串列資料是否正確並更新資料

void setup()
{
//  lcd.begin(16,2);         // initialize the lcd for 20 chars 4 lines, turn on backlight
//  lcd.backlight(); //點亮背光
  // Print a message to the LCD.
//  lcd.setCursor(2, 0); //設定游標在第2列第0行
//  lcd.print("Reset!! ");
//  lcd.setCursor(2, 1);
//  lcd.print(" ");  // show the Jig version
//delay(2000);    //延遲2秒
//lcd.clear();

  Serial.begin (115200); //(9600);    
//  pinMode(2, INPUT);
//  pinMode(3, INPUT);
  DDRB = 0b00111111;
  DDRC = 0x00;
  DDRD = 0b11111100;

 // DDRD = 0xFF; //setting for output
 // PORTD = 0xFF;  // PORTD OUTPUT 0XFF HIGHT
}
void loop()
{


//          digitalWrite (8,HIGH);

  if  (Serial.available() > 0 )   //不斷的檢查串列埠是否有資料

   {
//        PCACK = Serial.read();
//        if (PCACK == 0x12)
//        {
// lcd.setCursor(2, 0); //設定游標在第2列第0行
// lcd.print(PCACK);

// Serial.println(0x34);
 //         digitalWrite (8,LOW);
         receive_data();            //接收串列的資料
        test_do_data();               //測試資料是否正確並更新
//        }
   }
}

void receive_data(void)    
{
   int i ;
   for(i=0;i < 4;i++)
   {
 //     while (Serial.available() == 0);
      comdata[i] =Serial.read(); //將RS232資料讀進buffer 共4bytes
      //延遲一下,讓串列暫存器準備下一個位元,如果不延遲可能會導致資料遺失。
       delay(2);
   }
         comport = comdata[2];
         pdata = comdata[3];
// lcd.setCursor(5, 1); //設定游標在第2列第0行
// lcd.print(comport);
// lcd.setCursor(7, 1); //設定游標在第2列第0行
// lcd.print(pdata);
 
}

void test_do_data(void)
{
if ((comdata[0] == 0x55)&&(comdata[1] ==0xAA))
{
//      digitalWrite(8,HIGH);
     switch (comport)
     {
         case portb_output :                         // portb for output
              { PB_data = pdata;
               PORTB = PB_data;                      //
//  lcd.setCursor(0, 1); //設定游標在第2列第0行
//  lcd.print(1);
//               Serial.println(0x34);
               break;
              }
       case portc_input :
             {  PC_data = pdata;
               PORTC = PC_data;  //comdata[3];
 // lcd.setCursor(1, 1); //設定游標在第2列第0行
 // lcd.print(2);
//               Serial.println(0x34);
               break; }
       case portd_output :
             {  PD_data = pdata;
               PORTD = PD_data;
  //             digitalWrite (8,LOW);
  //             Serial.println(0x34);
  //lcd.setCursor(2, 1); //設定游標在第2列第0行
  //lcd.print(3);
             
               break; }
        defualt :
        {
//  lcd.setCursor(3, 1); //設定游標在第2列第0行
//  lcd.print("Defual");
//               Serial.println(0x34);
         break;}
       }
}  //if comdata == 0x55&& 0xAA
}



2015年8月28日 星期五

使用LABVIEW截取UT60G三用電錶的數值

#Labview #RS232 #UART
#UT60G
#資料擷取
有時候收集電子信號數據使用便宜一點的傳統工具就可以達到我們的需求但是又該如何做呢?身為工程師就是要想盡辦法盡力解決所遇到的問題。
這裡要介紹的是我本身遇到的狀況,幾個小時內就要將量測數據回報給客人,偏偏他是要連續量測,我所遇到的這一個案例是要量測FSR壓敏電阻的曲線,手頭只有三用電表,人工抄寫也無法達成這個需求,我因此想到使用UT60G三用電表搭配他的RS232傳輸將資料傳到PC處理,但是問題是三用電表所傳到PC的資料是10bytes的文字天書要怎麼轉換,己有幾個小時的時間,要寫C++或是Java都是很艱難,我想了幾個方案,但事都來不及,最後想到使用Labview可能是最佳方案,對我來說他是手頭現有的工具,因此就決定用Labview來完成這個任務。
所需要的軟體及硬體設備:
1.  UT60G電表:
購買這一個電表他會附上一些配件如圖所示,這一些對於擷取量測資料很方便「電壓,電流,電阻,頻率,電容量,溫度。。。」
2.  USB  to RS232 電表與PC的溝通橋樑

在Labview程式中RS232 的configure的設定

包率:19230 這個很重要不要設定錯誤 『很重要』不要設錯了
資料位元設定:7bits 『不是8bits』喔!!
位元檢查:odd
協定:XON/XOFF
這是這個專案的程式我說明程式的架構
處理流程:
設定通信組態à讀取資料à判斷資料是否有效à資料處理à記錄在文字檔
要記住Labview 的口訣:打開-->擷取-->處理-->關閉
這一個流程是:由RS232通信COM PORT 讀進資料
判斷資料有效性根據通信協定檔案所示在第6bytes 1byte判斷如果資料是"8"或者"<"就擷取該筆資料。



資料處理副程式

將處理好的資料記錄於TXT檔案之中
將處理好的資料記錄在文字檔
這樣就可以把擷取好的資料存檔備用了。

2015年8月3日 星期一

五分鐘使用Arduino控制SPI

什麼是SPI?
https://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus
SPI 是一種四線制串列匯流排介面,為主/從結構,四條導線分別為串列時脈(SCLK)、主出從入(MOSI)、主入從出(MISO)和從選(SS)訊號。主元件為時脈提供者,可發起讀取從元件或寫入從元件作業。這時主元件將與一個從元件進行對話。當匯流排上存在多個從元件時,要發起一次傳輸,主元件將把該從元件選擇線拉低,然後分別透過MOSI和MISO線路啟動數據發送或接收。【這一段說明引用自電子工程專輯】請參考下列聯結
http://www.eettaiwan.com/SEARCH/ART/SPI.HTM

詳細的中文介紹請參考台灣WIKI
http://www.twwiki.com/wiki/SPI

廢話不說了介紹Arduino的SPI接法
Arduino UNO內定10,11,12,13為SPI通信界面使用
10 :SS chip select從設備致能信號,由主設備控制
11 : MOSI  主設備數據輸出,從設備數據輸入
12 : MISO  主設備數據輸入,從設備數據輸出
13 : CLOCK 時鐘信號,由主設備產生
首先程式必須包含下列函數:
Arduino的程式中設定如圖所示
這樣就可以打開SPI通信PORT了
資料的移出是MSB先出
SPI mode 設定為MODE1
SPIclock速度是clock/64
#SPI
#五分鐘
#串列通信

2015年8月2日 星期日

使用Arduino 五分鐘搞定1602 LCD

對於不懂的Firmware的人要進入Firmware的世界真的很難,現在有一種工具很快就讓人上手使用,我今天要介紹的就是Arduino UNO + I2C LCD模組。

什麼是Arduino?
圖一  Arduino UNO
Arduino,是一個開放原始碼單晶片微控制器,它使用了Atmel AVR單片機,採用了基於開放原始碼的軟硬體平台,建構於簡易輸出/輸入(simple I/O)介面板,並且具有使用類似JavaC語言的Processing/Wiring開發環境。 【資料來自於維基百科】
請參考: https://zh.wikipedia.org/wiki/Arduino
製作這個專題需要下列工具:
1. Arduino UNO 硬體如【圖一】
    購買可以參考下列網址
2. Arduino IDE 開發環境
圖二 Arduino 首頁

3. Notepad++ 文書編輯軟體
圖三 Notepad++首頁

4. IIC IO 板 + 1602 LCD模組
圖四 IIC LCD模組與Arduino UNO接線圖
什麼是IIC?
I²CInter-Integrated Circuit)是內部整合電路的稱呼,是一種串列通訊匯流排,使用內送流量備援容錯機制從架構,由飛利浦公司在1980年代為了讓主機板嵌入式系統手機用以連接低速週邊裝置而發展。I²C的正確讀法為"I-squared-C" ,而"I-two-C"則是另一種錯誤但被廣泛使用的讀法。截至2006年11月1日為止,使用I²C協定不需要為其專利付費,但製造商仍然需要付費以獲得I²C從屬裝置位址。
【請參考維基百科】

圖五 IIC的架構示意圖

圖六 Arduino的程式基本架構
開機之後的基本設定寫在setup() 函數內 這裡的程式碼只有執行一次。
然後一直循環的程式碼寫在loop()函數內。


圖七 LCD 範例

本專案必須使用下列驅動
#include // IIC communication 
#include // LCD

Wire.h 負責IIC通信
LiquidCrystal_I2C.h 負責 IIC LCD的控制。

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

void setup()
{
//*************************
    //****** LCD setting ********
//*************************
  lcd.begin(16,2);         // initialize the lcd for 20 chars 4 lines, turn on backlight
  lcd.backlight(); //點亮背光
  // Print a message to the LCD.
  lcd.setCursor(2, 0); //設定游標在第2列第0行
  lcd.print("Hello !! ");
  lcd.setCursor(2, 1);
  lcd.print("I am IIC LCD");
}
void loop() {


}


基本上寫這幾行程式就可以讓LCD顯示文字了。

# 1602 LCD
# LCD 1602
# IIC
# Arduino
# arduino
# I2C





2015年2月28日 星期六

龍貓彩繪

今年生活苦哈哈,大家想盡辦法要輕鬆一下,今年來彩繪似乎成為一種風氣,在小村莊常常看到大家在自家的牆壁畫上彩繪,漸漸的fb的風行,加速資訊的傳播,很快的大家假日都不會無聊了。
苦中作樂的我依然要擺出pose

QQ最喜歡這一隻TOTORO








二二八紀念文

今天一大早打開電腦看到facebook有兩位同事今天是生日,首先先祝福他們。
再心平氣和聆聽【勇敢的台灣人】這一首歌,緬懷一下先賢先烈。
二二八事件就像1989年大陸的天安門事件那般慘烈,執政者不願意面對自己所犯的錯誤,一味的只怪【暴民】,天底下沒有【暴民】,只有無能的政府,才會引出【暴民】,試想要是大家安居樂業,有誰願意出來當【暴民】,還好現在台灣民主日趨成熟,誰做不好我們就用選票把他fire掉,台灣有今天的進步實在是要感謝先賢的努力,才有今天的成果。
下午睡午覺起來本來想去拍夕陽,但是色溫似乎不配合,只好跑到布袋港【視察】民情。
這個東西也越來越貴了!!吃不起了。。。

漁船進港了,內行的都會直接來這裡買海鮮。

大家在這裡看海鳥在覓食。




WEMOS D1 MINI ESP8266 製作 NTP + 網路斷線自動重置裝置

我的同事建議我將 NTP 加上網路斷線偵測可以重新reset的功能