針對查詢「按鍵計數器」依關聯性排序顯示文章。依日期排序 顯示所有文章
針對查詢「按鍵計數器」依關聯性排序顯示文章。依日期排序 顯示所有文章

2017年3月24日 星期五

Arduino學習.繼電器控制電磁計數器跳表

Arduino學習.繼電器控制電磁計數器跳表

目標要按下按鈕或感應訊號時,透過繼電器驅動計數器,
並要測試計數器的時間反應極限,
由於此計數器是使用12V電力,而UNO僅輸出5V電力,
故需另接繼電器來驅動計數器跳表,

準備的硬體有
LED燈*1
220或330歐電阻*1
10K或1K電阻*1
開關*1
面包板*1
線材
電磁計數器*1
繼電器*1
DC9~12V電力

可先參考學習130.按鍵控制LED燈,

在開關常態時電阻連接GND,使之接收低電位訊號,
此次積木程式利用了內建P13的LED燈,
在觸發按鍵為高電位訊號後,P13的LED燈快閃10次,
一亮一滅的時間為50ms+50ms,
若沒問題則可連接硬體繼電器及計數器,
 
這次是搭配高電位觸發的繼電器,
腳位分別是+5V,GND,訊號,
而計數器是12V的,但測試9v電池可驅動,
所以一線接電池負,另一線接繼電器,於NO常開腳再接到電池正,
建議P13測試無誤後建議改回P11,
因為UNO板在開啟時P13燈會閃動而觸發繼電器,

完成軟硬體後,按下按鈕使計數器跳表10下,
可修改50ms時間差,測試計數器的時差極限,
測試後14+14=24毫秒已是極限,再快就會出現漏數,







2017年4月11日 星期二

Arduino學習.按鍵計數器

Arduino學習.按鍵計數器

會用按鍵來控制LED燈後,此篇要用按鍵來計算次數,
並顯示在監控螢幕上,準備硬體安裝↓
開關*1
10K或1k電阻*1
接線

外掛ArduBlock找出拼圖↓

上傳後打開監控畫面,並壓下按鍵,正常情形下,在未通路前GND訊號經過電阻到P2,當按鍵被壓下,高電位被傳送到P2腳位時,則變數count+1,並顯示在監控畫面上,此時應會發現,當按鍵一直被壓著,就會一直計算,因此需另多加判斷式,來判斷P2是否放手回復,才算一次↓
設定變數BTS和BTL是按下和放手,二種不同狀態,來判斷P2腳位是否有高位和低位的變化,當有變化時才計一次,沒變化時就不計次,此程式可運用在如光電感應器.近接開關或計算馬達轉速等等計數使用

bool _ABVAR_1_BTS= false ;
bool _ABVAR_2_BTL= false ;
int _ABVAR_3_count = 0 ;

void setup()
{
  pinMode( 2 , INPUT);
  pinMode( 13 , OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  _ABVAR_1_BTS = digitalRead(2) ;
  if (( ( _ABVAR_1_BTS ) != ( _ABVAR_2_BTL ) ))
  {
    if (( ( _ABVAR_1_BTS ) == ( HIGH ) ))
    {
      digitalWrite( 13 , HIGH );
      _ABVAR_3_count = ( _ABVAR_3_count + 1 ) ;
      Serial.print(_ABVAR_3_count);
      Serial.println();
    }
  }
  _ABVAR_2_BTL = _ABVAR_1_BTS ;
  digitalWrite( 13 , LOW );
  delay( 50 );
}

求知若渴,虛心若愚

2017年5月15日 星期一

Arduino170513.對射式光電感應模塊FC33測馬達轉速計數器

學習170513.對射式光電感應模塊FC33測馬達轉速計數器

在學習按鍵計數器完成後,要搭配光電感應模塊來測馬達電機轉速,
此模塊主晶片為LM393,響應時間約10uS,腳位為訊號/GND/VCC,
內建帶燈,在有物件遮蔽時輸出高電位內建燈熄,
反之無遮蔽時輸出低電位內建燈亮↓


準備以下硬體並安裝↓
Arduino UNO R3
對射式光電感應模塊FC33
公對母杜邦線
馬達(最好RPM1000以下,此篇安裝TT馬達)
光柵輪盤或風扇片



此篇單純測試轉速,所以馬達另外供電啟動,和Arduino無直接連接↓


和學習"按鍵計數器"一樣的拼圖程式,將閃燈去除,時間修改為10ms,
此模塊反應時間為10us,而1000000us=1秒,即1秒可達100000次,
理論上應可測試RPM60萬轉速,但需Arduino及程式等搭配,
在網上有許多換算過直接顯示RPM的程式,但每個程式測試後的誤差很大,

所以此用簡單的計數程式,不換算轉速,用手動計時的方式,減少UNO板的計算負擔↓

bool _ABVAR_1_BTS= false ;
bool _ABVAR_2_BTL= false ;
int _ABVAR_3_count = 0 ;

void setup()
{
  pinMode( 2 , INPUT);
  Serial.begin(9600);
}

void loop()
{
  _ABVAR_1_BTS = digitalRead(2) ;
  if (( ( _ABVAR_1_BTS ) != ( _ABVAR_2_BTL ) ))
  {
    if (( ( _ABVAR_1_BTS ) == ( HIGH ) ))
    {
      _ABVAR_3_count = ( _ABVAR_3_count + 1 ) ;
      Serial.print(_ABVAR_3_count);
      Serial.println();
    }
  }
  _ABVAR_2_BTL = _ABVAR_1_BTS ;
  delay( 10 );
}


上傳後打開電腦的監視小窗,啟動馬達就會開始計數,除以20格後約180RPM,
為了測試模塊反應時間,將光柵輪盤換成了風扇片,由20格降低為3次,
並接上外接顯示LED,另參考學習螢幕轉接板IIC/I2C↓


因Block積木沒有完美對應外接I2C螢幕,所以手寫修改程式↓

#include <Wire.h>
#include <LiquidCrystal_I2C.h> //務必先安裝資料庫
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //注意0x3F螢幕位址

bool _ABVAR_1_BTS= false ;
bool _ABVAR_2_BTL= false ;
int _ABVAR_3_count = 0 ;

void setup()
{
  pinMode( 2 , INPUT);
  Serial.begin(9600);
  lcd.begin(16, 2); //初始化16字元2行

  for(int i = 0; i < 2; i++) {
    lcd.backlight();
    delay(200);
    lcd.noBacklight();
    delay(200);
  }
  lcd.backlight(); //閃爍2次後點亮背光
  lcd.setCursor(0, 0); //第一行顯示
  lcd.print("0");
}

void loop()
{
  _ABVAR_1_BTS = digitalRead(2) ;
  if (( ( _ABVAR_1_BTS ) != ( _ABVAR_2_BTL ) ))
  {
    if (( ( _ABVAR_1_BTS ) == ( HIGH ) ))
    {
      _ABVAR_3_count = ( _ABVAR_3_count + 1 ) ;
      Serial.print(_ABVAR_3_count);
      Serial.println();
      lcd.clear();
      lcd.print(_ABVAR_3_count);
    }
  }
  _ABVAR_2_BTL = _ABVAR_1_BTS ;
  delay( 5 );
}

經過測試20格的光柵輪盤或3葉風扇片,換算為RPM後誤差不大,
而外接I2C螢幕後計數變慢了,誤差變大,
所以建議還是用電腦監視小窗會較理想,不要再增加程式的負擔,
影片


測試過幾種不同馬達後發現,由於Arduimo的通信速率為9600,
1分鐘為60秒=60000ms/9600=6.25ms,
因此只要快於該速度回傳到電腦監控螢幕就會漏數,
若要測高轉速馬達,建議過減速齒輪或減少轉盤空格,
或是修改程式不要每次高低訊號都回傳電腦螢幕,



www.ee543.com