メインコンテンツに移動

GR-COTTON 特設:ボタンスイッチ

概要

GR-COTTONのボタンスイッチを利用してみます。

cotton-sp-button

準備

GR-COTTON、USBケーブル(マイクロBタイプ)の2つを準備します。

GR-COTTONの裏面にある白いジャンパーが3V3、USB側にします。BATT側にある場合は引き抜いて、USB側に差し込んでください。

cotton-sp-prepare
cotton-sp-prepare2

ボタンスイッチでLEDを光らせる

GR-COTTONのボタンスイッチを押すと赤いLEDが点滅するサンプルです。


#include <arduino.h>

void sw_push(){
  digitalWrite(22, LOW);
  delayMicroseconds(10000); // 10ms
  digitalWrite(22, HIGH);
}

void setup() {
  pinMode(2, INPUT_PULLUP);
  attachInterrupt(0, sw_push, FALLING);
   
  pinMode(22, OUTPUT); //red led
  digitalWrite(22, HIGH);
}
  
void loop() {
}


ボタンスイッチを押すまで省電力にする。

前述のサンプルではボタンスイッチが押されるまでマイコンは動き続けていましたが、このサンプルはSTOPモードにして省電力にするサンプルです。

見た目上は前述のサンプルと同じ動き(LEDの色だけ変更)になりますが、電池などの持ち時間が違ってきます。

これはGR-COTTONや、GR-KURUMIの特有の機能になります。


#include <arduino.h>

void sw_push(){
  digitalWrite(23, LOW);
  setPowerManagementMode(PM_NORMAL_MODE);
  delayMicroseconds(10000); // 10ms
  digitalWrite(23, HIGH);
}

void setup() {
  pinMode(2, INPUT_PULLUP);
  attachInterrupt(0, sw_push, FALLING);
   
  pinMode(23, OUTPUT); //green led
  digitalWrite(23, HIGH);
}
  
void loop() {
  setPowerManagementMode(PM_STOP_MODE);
  delay(0xffffffff); // into stop mode
}


ボタンスイッチを押している間、LEDを点灯する。

ボタンスイッチが押されている間、LEDを点灯するサンプルです。

digitalReadを使ってボタンスイッチの状態を見ています。


#include <arduino.h>

void sw_push(){
  digitalWrite(24, LOW);
  setPowerManagementMode(PM_NORMAL_MODE);
  while(digitalRead(2) == LOW);
  digitalWrite(24, HIGH);
}

void setup() {
  pinMode(2, INPUT_PULLUP);
  attachInterrupt(0, sw_push, FALLING);
    
  pinMode(24, OUTPUT); //blue led
  digitalWrite(24, HIGH);
}
   
void loop() {
  setPowerManagementMode(PM_STOP_MODE);
  delay(0xffffffff); // into stop mode
}


ボタンスイッチを押したらメッセージを表示する。

ボタンスイッチが押されたら、シリアルモニターにメッセージを表示するサンプルです。

補足として、ボタンが押された割り込み(スケッチ中のsw_push処理)では、Serialクラスが使用できません。このためグローバル変数g_sw_pushでスイッチが押されたという情報を持ち、loop内でそれを見ています。


#include <arduino.h>

boolean g_sw_push = 0; 
void sw_push(){
  g_sw_push = 1;
  delayMicroseconds(1000); // for cutting chattering
}

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);
  attachInterrupt(0, sw_push, FALLING);
}
   
void loop() {
  if(g_sw_push == 1){
    Serial.println("Hi!");
    Serial.flush();
    g_sw_push = 0;
  }
}